<?php
define('TAG_PARA',' ');
define('TAG_INDENTPARA',':');
define('TAG_OL','#'); /* OL and UL need to be the */
define('TAG_UL','*'); /* same as the Wiki-code */
define('TAG_INDENT','>');
define('TAG_CENTER','|');
/* The TINDENT and TCENTER tags denote tags that should be closed when
* the paragraph closes.
*/
define('TAG_TINDENT','I');
define('TAG_TCENTER','C');
/* The list syntax allows one blank line without breaking the list.
* The LINEMARK tag is a dummy tag to note that that line has been found.
*/
define('TAG_LINEMARK','L');
/* The OLDREV and NEWREV tags denote text deleted and added in this
* revision, respectively.
*/
define('TAG_OLDREV','O');
define('TAG_NEWREV','N');
function open_tag(&$outtext, &$neststate, $tags) {
for ($i = 0; $i < strlen($tags); $i++) {
$tag = $tags{$i};
$neststate .= $tag;
switch($tag) {
case TAG_ITALICS:
$outtext .= "<i>";
break;
case TAG_BOLD:
$outtext .= "<b>";
break;
case TAG_PARA:
$outtext .= "<p>\n";
break;
case TAG_INDENTPARA:
$outtext .= "<p class='text'>\n";
break;
case TAG_OL:
$outtext .= "<ol>\n";
break;
case TAG_UL:
$outtext .= "<ul>\n";
break;
case TAG_INDENT:
case TAG_TINDENT:
$outtext .= "<div class='indent'>";
break;
case TAG_CENTER:
case TAG_TCENTER:
$outtext .= "<div class='center'>";
break;
case TAG_LINEMARK:
break;
case TAG_OLDREV:
$outtext .= "<div class='oldrev'>";
break;
case TAG_NEWREV:
$outtext .= "<div class='newrev'>";
break;
default:
$neststate = substr($neststate,0,strlen($neststate)-1);
break;
}
}
}
function close_tag(&$outtext, &$neststate, $tagset=null) {
if ($neststate == "")
return false;
if ($tagset === null) {
$tag = $neststate{strlen($neststate)-1};
$neststate = substr($neststate,0,strlen($neststate)-1);
switch($tag) {
case TAG_ITALICS:
$outtext .= "</i>";
break;
case TAG_BOLD:
$outtext .= "</b>";
break;
case TAG_PARA:
case TAG_INDENTPARA:
$outtext .= "\n</p>";
break;
case TAG_OL:
$outtext .= "</ol>\n";
break;
case TAG_UL:
$outtext .= "</ul>\n";
break;
case TAG_INDENT:
case TAG_CENTER:
case TAG_TINDENT:
case TAG_TCENTER:
case TAG_OLDREV:
case TAG_NEWREV:
$outtext .= "</div>";
break;
case TAG_LINEMARK:
break;
}
return true;
}
if (strcspn($neststate,$tagset) == strlen($neststate))
return false;
while (strlen($neststate)>1 &&
strpos($tagset,$neststate{strlen($neststate)-1}) === false)
close_tag($outtext, $neststate);
close_tag($outtext, $neststate);
return true;
}
function close_all_tags(&$outtext, &$neststate) {
while(close_tag($outtext, $neststate))
;
}
function close_all_of_tags(&$outtext, &$neststate, $tagset) {
while($neststate && strcspn($neststate, $tagset) != strlen($neststate))
close_tag($outtext, $neststate);
}
function close_all_but_tags(&$outtext, &$neststate, $tagset) {
while($neststate && strspn($neststate, $tagset) != strlen($neststate))
close_tag($outtext, $neststate);
}
function is_standalone_indent($line) {
if (!$line)
return false;
if (strlen($line) % 3 != 0)
return false;
if (substr($line,strlen($line)-3) == "|||")
$line = substr($line,0,strlen($line)-3);
if (strspn($line,'>') == strlen($line))
return true;
if (strspn($line,'<') == strlen($line))
return true;
return false;
}
function list_state($neststate) {
$liststate = "";
for ($i = 0; $i < strlen($neststate); $i++) {
if ($neststate{$i} == TAG_OL || $neststate{$i} == TAG_UL)
$liststate .= $neststate{$i};
}
return $liststate;
}
function encode_line(&$outtext, &$neststate, $line, $curpage=null, &$isbold=false, &$isitalic=false) {
$line = rtrim($line);
$isbold = false;
$isitalic = false;
if ($line == "-") {
close_all_but_tags($outtext, $neststate, TAG_INDENT.TAG_CENTER.TAG_OLDREV.TAG_NEWREV);
$outtext .= "\n<hr class='narrow' />\n\n";
} elseif ($line == "--") {
close_all_but_tags($outtext, $neststate, TAG_INDENT.TAG_CENTER.TAG_OLDREV.TAG_NEWREV);
$outtext .= "\n<hr class='medium' />\n\n";
} elseif ($line == "---") {
close_all_but_tags($outtext, $neststate, TAG_INDENT.TAG_CENTER.TAG_OLDREV.TAG_NEWREV);
$outtext .= "\n<hr class='wide' />\n\n";
} elseif ($line == "") {
if (strcspn($neststate, TAG_OL.TAG_UL) != strlen($neststate)) {
if (close_tag($outtext, $neststate, TAG_LINEMARK)) {
close_all_of_tags($outtext, $neststate, TAG_OL.TAG_UL);
$outtext .= "<br />\n";
} else
open_tag($outtext, $neststate, TAG_LINEMARK);
} elseif (close_tag($outtext, $neststate, TAG_PARA.TAG_INDENTPARA)) {
close_all_of_tags($outtext, $neststate, TAG_TINDENT.TAG_TCENTER);
} else {
$outtext .= "<br />\n";
}
} elseif (is_standalone_indent($line)) {
close_all_but_tags($outtext, $neststate, TAG_INDENT.TAG_CENTER.TAG_OLDREV.TAG_NEWREV);
for ($i = 0; $i < strlen($line); $i += 3) {
if ($line{$i} == '>') {
close_all_of_tags($outtext, $neststate, TAG_CENTER);
open_tag($outtext, $neststate, TAG_INDENT);
} elseif ($line{$i} == '<') {
close_all_of_tags($outtext, $neststate, TAG_CENTER);
close_tag($outtext, $neststate, TAG_INDENT);
} elseif ($line{$i} == '|') {
if (!close_tag($outtext, $neststate, TAG_CENTER))
open_tag($outtext, $neststate, TAG_CENTER);
}
}
} elseif (strspn($line,"#*") > 0 &&
(strspn($line,"#*") == strlen($line) ||
$line{strspn($line,"#*")} == " ")) {
if(close_tag($outtext, $neststate, TAG_LINEMARK))
$outtext .= "<br />\n";
$liststate = list_state($neststate);
for ($i = 0; $i < strspn($line,"#*"); $i++) {
if ($i >= strlen($liststate))
open_tag($outtext, $neststate, $line{$i});
elseif ($line{$i} != $liststate{$i}) {
for ($j = strlen($liststate)-1; $j >= $i; $j--)
close_tag($outtext, $neststate, $liststate{$j});
$liststate = substr($liststate,0,$i);
open_tag($outtext, $neststate, $line{$i});
}
}
for ($j = strlen($liststate)-1; $j >= $i; $j--)
close_tag($outtext, $neststate, $liststate{$j});
$outtext .= "<li>" . format_text(substr($line,$i), $curpage, $isbold, $isitalic) . "\n";
} elseif (strspn($line,"=") > 0 &&
(strspn($line, "=") == strlen($line) ||
$line{strspn($line,"=")} == " ")) {
if(close_tag($outtext, $neststate, TAG_LINEMARK))
$outtext .= "<br />\n";
$liststate = list_state($neststate);
/*if (strlen($liststate) == strspn($line,"="))
$outtext .= "<BR>";
else */{
for ($i = strlen($liststate); $i < strspn($line,"="); $i++)
open_tag($outtext, $neststate, TAG_UL);
for ($i = strlen($liststate); $i > strspn($line,"="); $i--)
close_tag($outtext, $neststate, TAG_OL.TAG_UL);
}
$outtext .= "<li class='blank'>" . format_text(substr($line, strspn($line,"=")), $curpage, $isbold, $isitalic) . "\n";
} else {
close_all_of_tags($outtext, $neststate, TAG_OL.TAG_UL);
if (strcspn($neststate,TAG_PARA.TAG_INDENTPARA) == strlen($neststate))
$beginpara = true;
else
$beginpara = false;
while (substr($line,0,3) == ">>>") {
if ($beginpara)
open_tag($outtext, $neststate, TAG_TINDENT);
$line = substr($line,3);
}
if (substr($line,0,3) == "|||") {
if ($beginpara)
open_tag($outtext, $neststate, TAG_TCENTER);
$line = substr($line,3);
}
if ($beginpara) {
if (substr($line,0,3) == " ")
open_tag($outtext, $neststate, TAG_INDENTPARA);
else
open_tag($outtext, $neststate, TAG_PARA);
} else
$outtext .= "<br />\n";
$outtext .= format_text($line, $curpage, $isbold, $isitalic);
}
}
function encode_text($text, $curpage=null) {
$neststate = "";
$outtext = "";
$lines = explode("\n",$text);
foreach ($lines as $line) {
encode_line($outtext, $neststate, $line, $curpage);
}
close_all_tags($outtext, $neststate);
return $outtext;
}
function encode_diff($diffarray, $curpage=null) {
$neststate = "";
$outtext = "";
$leftoverline = "";
$isbold = false;
$isitalic = false;
for ($diffidx = 0; $diffidx < count($diffarray); $diffidx++) {
if ($diffarray[$diffidx][1] === null) {
$lines = explode("\n",$diffarray[$diffidx][0]);
for ($line = array_shift($lines); count($lines) > 0; $line = array_shift($lines)) {
if ($leftoverline === null)
$outtext .= format_text($line, $curpage, $isbold, $isitalic);
else
encode_line($outtext, $neststate, $line, $curpage);
$leftoverline = "";
}
if ($diffidx < count($diffarray) - 1 && (
(strpos($diffarray[$diffidx+1][0], "\n") !== false &&
(strpos($diffarray[$diffidx+1][0], "\n") !=
strlen($diffarray[$diffidx+1][0]) - 1 || !trim($line))) ||
(strpos($diffarray[$diffidx+1][1], "\n") !== false &&
(strpos($diffarray[$diffidx+1][1], "\n") !=
strlen($diffarray[$diffidx+1][1]) - 1 || !trim($line)))
)) {
if ($leftoverline === null) {
$outtext .= format_text($line, $curpage, $isbold, $isitalic);
$leftoverline = "";
} else
$leftoverline = $line;
} else {
encode_line($outtext, $neststate, $line, $curpage, $isbold, $isitalic);
$leftoverline = null;
}
} else {
if ($leftoverline === null) {
if (trim($diffarray[$diffidx][0])) {
$outtext .= "<span class='oldrev'>";
$outtext .= format_text($diffarray[$diffidx][0], $curpage, $isbold, $isitalic);
$outtext .= "</span>";
}
if (trim($diffarray[$diffidx][1])) {
$outtext .= "<span class='newrev'>";
$outtext .= format_text($diffarray[$diffidx][1], $curpage, $isbold, $isitalic);
$outtext .= "</span>";
}
} else {
$savestate = $neststate;
close_all_tags($outtext, $neststate);
if (trim($diffarray[$diffidx][0])) {
open_tag($outtext, $neststate, TAG_OLDREV . $savestate);
$lines = explode("\n", $diffarray[$diffidx][0]);
$line = $leftoverline . array_shift($lines);
while (count($lines) > 0) {
encode_line($outtext, $neststate, $line, $curpage);
$line = array_shift($lines);
}
if (trim($line))
encode_line($outtext, $neststate, $line, $curpage);
close_all_tags($outtext, $neststate);
} elseif(trim($leftoverline)) {
open_tag($outtext, $neststate, TAG_OLDREV . $savestate);
encode_line($outtext, $neststate, $leftoverline, $curpage);
close_all_tags($outtext, $neststate);
}
if (trim($diffarray[$diffidx][1])) {
open_tag($outtext, $neststate, TAG_NEWREV . $savestate);
$lines = explode("\n", $diffarray[$diffidx][1]);
$line = $leftoverline . array_shift($lines);
while (count($lines) > 0) {
encode_line($outtext, $neststate, $line, $curpage);
$line = array_shift($lines);
}
if (trim($line))
encode_line($outtext, $neststate, $line, $curpage);
close_all_tags($outtext, $neststate);
} elseif(trim($leftoverline)) {
open_tag($outtext, $neststate, TAG_NEWREV . $savestate);
encode_line($outtext, $neststate, $leftoverline, $curpage);
close_all_tags($outtext, $neststate);
}
open_tag($outtext, $neststate, $savestate);
}
}
}
close_all_tags($outtext, $neststate);
return $outtext;
}
function format_title($text, $isitalic=false) {
$outtext = "";
if ($isitalic)
$outtext .= "<i>";
while ($text) {
$len = strcspn($text, "'");
$outtext .= encode_html_chars(substr($text, 0, $len));
$text = substr($text, $len);
if (substr($text,0,2) == "''") {
$outtext .= $isitalic ? "</i>" : "<i>";
$isitalic = !$isitalic;
$text = substr($text, 2);
} else {
$outtext .= $text{0};
$text = substr($text, 1);
}
}
if ($isitalic)
$outtext .= "</i>";
return $outtext;
}
function format_text($text, $curpage=null, &$isbold=false, &$isitalic=false) {
$outtext = "";
if ($isbold)
$outtext .= "<b>";
if ($isitalic)
$outtext .= "<i>";
$curpage = normalize($curpage);
while ($text) {
$len = strcspn($text, "'{[");
$outtext .= encode_html_chars(substr($text, 0, $len));
$text = substr($text, $len);
if (substr($text,0,5) == "'''''" && $isbold && $isitalic) {
$outtext .= "</i></b>";
$isbold = false;
$isitalic = false;
$text = substr($text, 5);
} elseif (substr($text,0,3) == "'''") {
if (!$isitalic)
$outtext .= $isbold ? "</b>" : "<b>";
else
$outtext .= "</i>" . ($isbold ? "</b>" : "<b>") . "<i>";
$isbold = !$isbold;
$text = substr($text, 3);
} elseif (substr($text,0,2) == "''") {
$outtext .= $isitalic ? "</i>" : "<i>";
$isitalic = !$isitalic;
$text = substr($text, 2);
} elseif (substr($text,0,2) == "[[") {
$outtext .= "[";
$text = substr($text, 2);
} elseif (substr($text,0,2) == "{{") {
$outtext .= "{";
$text = substr($text, 2);
} elseif ($text{0} == "[") {
$len = strcspn($text,"]") - 1;
$link = substr($text, 1, $len);
$text = substr($text, $len + 2);
if (substr($link, 0, 7) != "http://" &&
substr($link, 0, 6) != "ftp://")
$link = "http://$link";
$linktext = encode_html_chars($link);
$rawlink = strtr(rawurlencode($link), array("%2F"=>"/","%3A"=>":"));
$outtext .= "<a href=\"$rawlink\" class='ext'>$linktext</a>";
} elseif ($text{0} == "{") {
$len = strcspn($text,"}") - 1;
$link = substr($text, 1, $len);
$text = substr($text, $len + 2);
if ($link{0} == '-') {
$link = "$curpage/" . substr($link, 1);
} elseif ($link{0} == '=') {
$curdir = $curpage;
while($link{0} == "=" && strrpos($curdir,"/") !== false) {
$curdir = substr($curdir,0,strrpos($curdir,"/"));
$link = substr($link,1);
}
if ($link{0} != "=")
$link = "$curdir/$link";
}
$nlink=normalize($link);
if($nlink)
$addlink=true;
else
$addlink=false;
if(check_page("$nlink")||check_files("$nlink"))
$exists=true;
else
$exists=false;
if ($isitalic)
$outtext .= "</I>";
if($addlink)
$outtext.="<a href=\"/".($exists?$nlink:strtr(rawurlencode($link),array("%2F"=>"/"))."?edit").
"\" class='".($exists?"int'>":"broken'>");
$outtext.=format_title(get_title($link),$isitalic);
if($addlink)
$outtext.="</a>";
if ($isitalic)
$outtext .= "<i>";
} else {
$outtext .= $text{0};
$text = substr($text, 1);
}
}
if ($isitalic)
$outtext .= "</i>";
if ($isbold)
$outtext .= "</b>";
return $outtext;
}
?>
Notes: