Wikka-markup in Comments

Working for 1.1.6.0 to 1.1.6.4 (latest)
To make comments a little bit more flexible, why don't add a part of wikkas markup?

I thought about: italic, bold, monospace, strikethough, underlined, notes, WikiWords and InterWikiLinks


1. Problem

There is no backwards compatibility to older comments now because of the following problem:
Since a formatter for comments does not exist, "handlers/page/addcomment.php", uses nl2br to store the html in the table itself. So older commenst will show up "<br />" at the end of every line.

If you have a wiki without older comments, everything will work fine.

The Code


0. In handlers/page/addcomments.php change the line:
    $body = nl2br($this->htmlspecialchars_ent(trim($_POST["body"])));  

into the following one:
    $body = $this->htmlspecialchars_ent(trim($_POST["body"]));


Remaining problem: the <br /> in the already existing comments remain, and will show up now (see above).

1. Search in handlers/page/show.php for display comments themselves:

There you can find these lines:
                        echo '<div class="comment">'."\n".
                            '<span id="comment_'.$comment['id'].'"></span>'.$comment['comment']."\n".
                            "\t".'<div class="commentinfo">'."\n-- ";
                        echo ($this->LoadUser($comment['user']))? $this->Format($comment['user']) : $comment['user']; // #84


change these statements into these ones!
                        echo '<div class="comment">'."\n".
                            '<span id="comment_'.$comment['id'].'"></span>'.$this->Format($comment['comment'], 'comments')."\n".
                            "\t".'<div class="commentinfo">'."\n-- ";
                        echo ($this->LoadUser($comment['user']))? $this->Format($comment['user'],'comments') : $comment['user']; // #84


2. Save the following as formatters/comments.php:
<?php

// This may look a bit strange, but all possible formatting tags have to be in a single regular expression for this to work correctly. Yup!

//#dotmg [many lines] : Unclosed tags fix! For more info, m.randimbisoa@dotmg.net ((only indents? --NilsLindenberg))
if (!function_exists("comments2callback"))
{
    function comments2callback($things)
    {
        $thing = $things[1];
        $result='';
       
        static $trigger_bold = 0;
        static $trigger_italic = 0;
        static $trigger_underline = 0;
        static $trigger_monospace = 0;
        static $trigger_notes = 0;
        static $trigger_strike = 0;
        static $trigger_sup = 0;
        static $trigger_sub = 0;
        static $br = 1;        

        global $wakka;

            if ((!is_array($things)) && ($things == 'closetags'))
        {
        if ($trigger_bold % 2) echo('</strong>');
        if ($trigger_italic % 2) echo('</em>');
        if ($trigger_underline % 2) echo('</span>');
        if ($trigger_monospace % 2) echo('</tt>');
        if ($trigger_notes % 2) echo ('</span>');
        if ($trigger_strike % 2) echo ('</span>');
        if ($trigger_sup % 2) echo '</sup>';
        if ($trigger_sub % 2) echo '</sub>';

        $trigger_bold = $trigger_italic = $trigger_underline = $trigger_monospace = $trigger_notes = $trigger_strike = $trigger_sup = $trigger_sub = 0;
        return;
        }

        // convert HTML thingies
        if ($thing == "<") return "&lt;";
        else if ($thing == ">") return "&gt;";

        // bold
        else if ($thing == "**")
        {
        return (++$trigger_bold % 2 ? "<strong>" : "</strong>");
        }
       
        // italic
        else if ($thing == "//")
        {
        return (++$trigger_italic % 2 ? "<em>" : "</em>");
        }
       
        // underlinue
        else if ($thing == "__")
        {
        return (++$trigger_underline % 2 ? "<span class=\"underline\">" : "</span>");
            }

        // monospace
        else if ($thing == "##")
        {
        return (++$trigger_monospace % 2 ? "<tt>" : "</tt>");
        }
       
        // notes
        else if ($thing == "''")
        {
        return (++$trigger_notes % 2 ? "<span class=\"notes\">" : "</span>");
        }

          // strikethrough
        else if ($thing == "++")
        {
        return (++$trigger_strike % 2 ? "<span class=\"strikethrough\">" : "</span>");
        }

                   /*
        // superscript
        else if ($thing == "^^")
        {
        return (++$trigger_sup % 2 ? "<sup>" : "</sup>");
        }
       
        // subscript
        else if ($thing == "vv")
        {
        return (++$trigger_sub % 2 ? "<sub>" : "</sub>");
        }
                  */
 

        // interwiki links!
        else if (preg_match("/^[A-ZÄÖÜ][A-Za-zÄÖÜßäöü]+[:]\S*$/s", $thing))
        {
        return $wakka->Link($thing);
        }

        // wiki links!
        else if (preg_match("/^[A-ZÄÖÜ]+[a-zßäöü]+[A-Z0-9ÄÖÜ][A-Za-z0-9ÄÖÜßäöü]*$/s", $thing))
        {
        return $wakka->Link($thing);
        }

        // new lines
        else if ($thing == "\n")
        {
        $result .= ($br ? "<br />\n" : "\n");
        $br = 1;
        return $result;
        }

        // if we reach this point, it must have been an accident.
        return $thing;
    }
}

$text = str_replace("\r\n", "\n", $text);

// replacing part of urls so the don't get italic
$text = preg_replace('#://#', "DUMPTEXT", $text);

$text = preg_replace_callback(
    "/(".
    "\[\[[^\[]*?\]\]|".                                                                     # forced link
    "<|>|".                                                                                 #html-tags
    "\*\*|\'\'|\#\#|\+\+|__|<|>|\/\/|".                                                     # Wiki markup                    
    "\b[A-ZÄÖÜ][A-Za-zÄÖÜßäöü]+[:](?![=_])\S*\b|".                                            # InterWiki link
    "\b([A-ZÄÖÜ]+[a-zßäöü]+[A-Z0-9ÄÖÜ][A-Za-z0-9ÄÖÜßäöü]*)\b|".                                # CamelWords
    "\n".
    ")/ms", "comments2callback", $text);

// we're cutting the last <br />
$text = preg_replace("/<br \/>$/","", $text);

// re-replacing the url-part
$text = ereg_replace("DUMPTEXT", "://", $text);

// $text = $this->Typography($text); // only needed for SmartyPants in comments (see there)
echo ($text);
comments2callback('closetags');
?>

Configurable comment markup

1. Add the following line to wikka.config.php:
    "markup_comments" => "1",


where '1' means to allow markup and '0' means to disallow it.

2. In handlers/page/addcomments.php change the line:
    $body = nl2br($this->htmlspecialchars_ent(trim($_POST["body"])));  

into the following statement:
    if (($this->GetConfigValue('markup_comments') == 1) && file_exists('formatters/comments.php'))
    {
        $body = $this->htmlspecialchars_ent(trim($_POST["body"]));
    }
    else {
        $body = nl2br($this->htmlspecialchars_ent(trim($_POST["body"])));  
    }


3. Search in handlers/page/show.php for display comments themselves:

There you can find these lines:
                        echo '<div class="comment">'."\n".
                            '<span id="comment_'.$comment['id'].'"></span>'.$comment['comment']."\n".
                            "\t".'<div class="commentinfo">'."\n-- ";
                        echo ($this->LoadUser($comment['user']))? $this->Format($comment['user']) : $comment['user']; // #84


change these statements into these ones!
                        if (($this->GetConfigValue('markup_comments') == 1) && file_exists('formatters/comments.php'))
                        {
                            echo '<div class="comment">'."\n".
                                '<span id="comment_'.$comment['id'].'"></span>'.$this->Format($comment['comment'], 'comments')."\n".
                                "\t".'<div class="commentinfo">'."\n-- ";
                            echo ($this->LoadUser($comment['user']))? $this->Format($comment['user'],'comments') : $comment['user']; // #84
                        }
                        else {
                            echo '<div class="comment">'."\n".
                                '<span id="comment_'.$comment['id'].'"></span>'.$comment['comment']."\n".
                                "\t".'<div class="commentinfo">'."\n-- ";
                            echo ($this->LoadUser($comment['user']))? $this->Format($comment['user']) : $comment['user']; // #84
                        }

3. Use the comments.php from above.

CategoryUsercontributions
Comments
Comment by GmBowen
2005-02-14 16:27:03
I'm interested in seeing how you accomplish this. I tried to add formatting by "adding" individual formatting functions but I couldn't get it to work (searching ** and replacing with <bold></bold> in the output for instance). I ended up in some of my developed actions doing $this->Format($output) and stripping out the functionality that I didn't want (by searching out the formatting characters & replacing them with blanks or no characters)....you can see this in the blog action actually. I think my efforts are documented on the programminghelp page.
Comment by NilsLindenberg
2005-02-15 13:59:07
ah, that was your question. I have to admit that i understood this wrong, otherwise i would have respondend at programminghelp:

The easier way doing this is calling $this->Format($output, "myformatter") in which case formatters/myformatter.php would be used (so you can make your on "slim" variant as i did, see above).
Comment by GmBowen
2005-02-15 15:18:21
oh, hmmm...okay. Thanks. Maybe I'll re-visit what I did....although what I ended up doing doesn't impact processing all that much (um, and doesn't involve regular expressions which are kinda a mystery to me)....come to think of it, your code above is kinda a mystery to me....I'll have to look at it in more detail. Thanks Nils.
Comment by MasinAlDujaili
2006-06-20 18:14:22
This needs to be updated for 1.1.6.2 ... don't know, where the error lies. At least, it still works normal ... but without <br /> :-/
Comment by NilsLindenberg
2006-06-20 18:32:08
What error?
Comment by MasinAlDujaili
2006-06-21 01:43:34
No error, not really, it's more some kind of ... 'insubordination' or non-formatting.

I followed the documentation as best as I could; I guess, my mistake might lie in the modifications of show.php: Every print statement (as stated in the docs above) has been replaced by one echo statement concatenated by '.'. Every string in this statement is enclosed by single quotes as opposed to double qoutes (exception: escape strings) -- there might be my mistake.

But nonetheless, I won't be the only one, trying to get this run and some people might have greater problems than me navigating through PHP code ... I will try tonight to get it run (in about 10h) and update it.
Comment by MasinAlDujaili
2006-06-21 05:55:37
Found the error -- it was one missing '.' in between ... :-(. I'll upload the 1.1.6.2 version of this extension ...
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki