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:
into the following one:
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
'<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
'<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 "<";
else if ($thing == ">") return ">";
// 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');
?>
// 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 "<";
else if ($thing == ">") return ">";
// 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:
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"])));
}
{
$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
'<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
}
{
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
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).
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.