2 // PukiWiki - Yet another WikiWikiWeb clone.
3 // $Id: html.php,v 1.14 2002/07/02 04:15:10 masui Exp $
4 /////////////////////////////////////////////////
6 // ËÜʸ¤ò¥Ú¡¼¥¸Ì¾¤«¤é½ÐÎÏ
7 function catbodyall($page,$title="",$pg="")
9 if($title === "") $title = strip_bracket($page);
10 if($pg === "") $pg = make_search($page);
12 $body = join("",get_source($page));
13 $body = convert_html($body);
15 header_lastmod($vars["page"]);
16 catbody($title,$pg,$body);
21 function catbody($title,$page,$body)
23 global $script,$vars,$arg,$do_backup,$modifier,$modifierlink,$defaultpage,$whatsnew,$hr;
24 global $date_format,$weeklabels,$time_format,$longtaketime,$related_link;
25 global $HTTP_SERVER_VARS,$cantedit;
27 if($vars["page"] && !arg_check("backup") && $vars["page"] != $whatsnew)
32 $link_add = "$script?cmd=add&page=".rawurlencode($vars["page"]);
33 $link_edit = "$script?cmd=edit&page=".rawurlencode($vars["page"]);
34 $link_diff = "$script?cmd=diff&page=".rawurlencode($vars["page"]);
35 $link_top = "$script?$defaultpage";
36 $link_list = "$script?cmd=list";
37 $link_filelist = "$script?cmd=filelist";
38 $link_search = "$script?cmd=search";
39 $link_whatsnew = "$script?$whatsnew";
40 $link_backup = "$script?cmd=backup&page=".rawurlencode($vars["page"]);
41 $link_help = "$script?cmd=help";
43 if(is_page($vars["page"]) && $is_page)
45 $fmt = @filemtime(get_filename(encode($vars["page"])));
48 if(is_page($vars["page"]) && $related_link && $is_page && !arg_check("edit") && !arg_check("freeze") && !arg_check("unfreeze"))
50 $related = make_related($vars["page"],false);
53 if(is_page($vars["page"]) && !in_array($vars["page"],$cantedit) && !arg_check("backup") && !arg_check("edit") && !$vars["preview"])
59 $longtaketime = getmicrotime() - MUTIME;
60 $taketime = sprintf("%01.03f",$longtaketime);
65 // ¥Æ¥¥¹¥ÈËÜÂΤòHTML¤ËÊÑ´¹¤¹¤ë
66 function convert_html($string)
68 global $result,$saved,$hr,$script,$page,$vars,$top;
69 global $note_id,$foot_explain,$digest,$note_hr;
70 global $user_rules,$str_rules,$line_rules,$strip_link_wall;
74 $string = rtrim($string);
75 $string = preg_replace("/((\x0D\x0A)|(\x0D)|(\x0A))/","\n",$string);
77 $start_mtime = getmicrotime();
79 $digest = md5(@join("",get_source($vars["page"])));
82 $user_rules = array_merge($str_rules,$line_rules);
86 $arycontents = array();
88 $string = preg_replace("/^#freeze\n/","",$string);
90 $lines = split("\n", $string);
92 $foot_explain = array();
96 if(preg_match("/#contents/",$string))
97 $top_link = "<a href=\"#contents\">$top</a>";
99 foreach ($lines as $line)
101 if(!preg_match("/^\/\/(.*)/",$line,$comment_out) && $table != 0)
103 if(!preg_match("/^\|(.+)\|$/",$line,$out))
104 array_push($result, "</table>");
105 if(!$out[1] || $table != count(explode("|",$out[1])))
109 $comment_out = $comment_out[1];
111 if(preg_match("/^(\*{1,3})(.*)/",$line,$out))
113 $result = array_merge($result,$saved); $saved = array();
114 $str = inline($out[2]);
116 $level = strlen($out[1]) + 1;
118 array_push($result, "<h$level><a name=\"content:$content_id\">$str</a> $top_link</h$level>");
119 $arycontents[] = str_repeat("-",$level-1)."<a href=\"#content:$content_id\">".strip_htmltag(make_user_rules($str))."</a>\n";
122 else if(preg_match("/^(-{1,4})(.*)/",$line,$out))
124 if(strlen($out[1]) == 4)
126 $result = array_merge($result,$saved); $saved = array();
127 array_push($result, $hr);
131 back_push('ul', strlen($out[1]));
132 array_push($result, '<li>' . inline($out[2]) . '</li>');
135 else if (preg_match("/^:([^:]+):(.*)/",$line,$out))
138 array_push($result, '<dt>' . inline($out[1]) . '</dt>', '<dd>' . inline($out[2]) . '</dd>');
140 else if(preg_match("/^(>{1,3})(.*)/",$line,$out))
142 back_push('blockquote', strlen($out[1]));
143 array_push($result, ltrim(inline($out[2])));
145 else if (preg_match("/^\s*$/",$line,$out))
147 $i = array_pop($saved);
148 array_push($saved,$i);
149 if($i == '</pre>' && preg_match("/^\s+$/",$line)) {
151 array_push($result, '');
154 $result = array_merge($result,$saved); $saved = array();
155 //array_unshift($saved, "</p>");
156 array_push($result, "<p>");
159 else if(preg_match("/^(\s+.*)/",$line,$out))
162 array_push($result, htmlspecialchars($out[1],ENT_NOQUOTES));
164 else if(preg_match("/^\|(.+)\|$/",$line,$out))
166 $arytable = explode("|",$out[1]);
170 $result = array_merge($result,$saved); $saved = array();
171 array_push($result,"<table class=\"style_table\" cellspacing=\"1\" border=\"0\">");
172 $table = count($arytable);
175 array_push($result,"<tr>");
176 foreach($arytable as $td)
178 array_push($result,"<td class=\"style_td\">");
179 array_push($result,ltrim(inline($td)));
180 array_push($result,"</td>");
182 array_push($result,"</tr>");
185 else if(strlen($comment_out) != 0)
187 array_push($result," <!-- ".htmlspecialchars($comment_out)." -->");
191 array_push($result, inline($line));
194 if($table) array_push($result, "</table>");
196 $result_last = $result = array_merge($result,$saved); $saved = array();
203 foreach($arycontents as $line)
205 if(preg_match("/^(-{1,3})(.*)/",$line,$out))
207 back_push('ul', strlen($out[1]));
208 array_push($result, '<li>'.$out[2].'</li>');
211 $result = array_merge($result,$saved); $saved = array();
213 $contents = "<a name=\"contents\"></a>\n";
214 $contents .= join("\n",$result);
217 $contents = preg_replace("/\[\[([^\]]+)\]\]/","$1",$contents);
221 $result_last = inline2($result_last);
223 $result_last = preg_replace("/^#contents/",$contents,$result_last);
225 $str = join("\n", $result_last);
230 $str .= "$note_hr\n";
232 $str .= join("\n",inline2($foot_explain));
236 $longtaketime = getmicrotime() - $start_mtime;
238 # $str = preg_replace("/&((amp)|(quot)|(nbsp)|(lt)|(gt));/","&$1;",$str);
243 // $tag¤Î¥¿¥°¤ò$level¥ì¥Ù¥ë¤Þ¤ÇµÍ¤á¤ë¡£
244 function back_push($tag, $level)
246 global $result,$saved;
248 while (count($saved) > $level) {
249 array_push($result, array_shift($saved));
251 if ($saved[0] != "</$tag>") {
252 $result = array_merge($result,$saved); $saved = array();
254 while (count($saved) < $level) {
255 array_unshift($saved, "</$tag>");
256 array_push($result, "<$tag>");
260 // ¥ê¥ó¥¯¤ÎÉղ佤ξ
261 function inline($line)
263 $line = htmlspecialchars($line);
265 $line = preg_replace("/(
271 )/ex","make_note(\"$1\")",$line);
276 // ¥ê¥ó¥¯¤ÎÉղ佤ξ2
277 function inline2($str)
279 global $WikiName,$BracketName,$InterWikiName,$vars,$related,$related_link,$script;
280 $cnts_plain = array();
281 $cnts_plugin = array();
284 for($cnt=0;$cnt<count($str);$cnt++)
286 if(preg_match("/^(\s)/",$str[$cnt]))
288 $arykeep[$cnt] = $str[$cnt];
290 $cnts_plain[] = $cnt;
292 else if(preg_match("/^\#([^\(]+)\(?(.*)\)?$/",$str[$cnt],$match))
294 if(exist_plugin_convert($match[1])) {
295 $aryplugins[$cnt] = $str[$cnt];
297 $cnts_plugin[] = $cnt;
302 $str = preg_replace("/
304 (\[\[([^\]]+)\:(https?|ftp|news)(:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\]\])
306 (\[(https?|ftp|news)(:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\s([^\]]+)\])
308 (https?|ftp|news)(:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)
310 ([[:alnum:]\-_.]+@[[:alnum:]\-_]+\.[[:alnum:]\-_\.]+)
312 (\[\[([^\]]+)\:([[:alnum:]\-_.]+@[[:alnum:]\-_]+\.[[:alnum:]\-_\.]+)\]\])
319 )/ex","make_link('$1')",$str);
321 $str = preg_replace("/#related/",make_related($vars["page"],true),$str);
323 $str = make_user_rules($str);
325 $aryplugins = preg_replace("/^\#([^\(]+)$/ex","do_plugin_convert('$1','$2')",$aryplugins);
326 $aryplugins = preg_replace("/^\#([^\(]+)\((.*)\)$/ex","do_plugin_convert('$1','$2')",$aryplugins);
329 $str = preg_replace("/^#norelated$/","",$str);
333 foreach($cnts_plain as $cnt)
334 $str[$cnt] = $arykeep[$cnt];
336 foreach($cnts_plugin as $cnt)
337 $str[$cnt] = $aryplugins[$cnt];
343 function get_list($withfilename)
345 global $script,$list_index,$top,$non_list,$whatsnew;
346 global $_msg_symbol,$_msg_other;
349 $files = get_existpages();
350 foreach($files as $page) {
351 if(preg_match("/$non_list/",$page) && !$withfilename) continue;
352 if($page == $whatsnew) continue;
353 $page_url = rawurlencode($page);
354 $page2 = strip_bracket($page);
355 $pg_passage = get_pg_passage($page);
356 $file = encode($page).".txt";
357 $retval[$page2] .= "<li><a href=\"$script?$page_url\">".htmlspecialchars($page2,ENT_QUOTES)."</a>$pg_passage</li>\n";
360 $retval[$page2] .= "<ul><li>$file</li></ul>\n";
364 $retval = list_sort($retval);
372 foreach($retval as $page => $link)
374 $head = substr($page,0,1);
375 if($head_str != $head && !$etc_sw)
377 $retval2[$page] = "";
379 if(preg_match("/([A-Z])|([a-z])/",$head,$match))
382 $head_nm = "High:$head";
384 $head_nm = "Low:$head";
386 if($head_str) $retval2[$page] = "</ul>\n";
387 $retval2[$page] .= "<li><a href=\"#top:$head_nm\" name=\"$head_nm\"><strong>$head</strong></a></li>\n<ul>\n";
389 if($top_link) $top_link .= "|";
390 $top_link .= "<a href=\"#$head_nm\" name=\"top:$head_nm\"><strong> ".$head." </strong></a>";
392 else if(preg_match("/[ -~]/",$head))
396 if($head_str) $retval2[$page] = "</ul>\n";
397 $retval2[$page] .= "<li><a href=\"#top:symbol\" name=\"symbol\"><strong>$_msg_symbol</strong></a></li>\n<ul>\n";
399 if($top_link) $top_link .= "|";
400 $top_link .= "<a href=\"#symbol\" name=\"top:symbol\"><strong>$_msg_symbol</strong></a>";
406 if($head_str) $retval2[$page] = "</ul>\n";
407 $retval2[$page] .= "<li><a href=\"#top:etc\" name=\"etc\"><strong>$_msg_other</strong></a></li>\n<ul>\n";
409 if($top_link) $top_link .= "|";
410 $top_link .= "<a href=\"#etc\" name=\"top:etc\"><strong>$_msg_other</strong></a>";
413 $retval2[$page] .= $link;
415 $retval2[] = "</ul>\n";
417 $top_link = "<div style=\"text-align:center\"><a name=\"top\">$top_link</a></div><br />\n";
419 array_unshift($retval2,$top_link);
426 return join("",$retval2);
429 // ÊÔ½¸¥Õ¥©¡¼¥à¤Îɽ¼¨
430 function edit_form($postdata,$page,$add=0)
432 global $script,$rows,$cols,$hr,$vars,$function_freeze;
433 global $_btn_addtop,$_btn_preview,$_btn_update,$_btn_freeze,$_msg_help,$_btn_notchangetimestamp;
434 global $whatsnew,$_btn_template,$_btn_load,$non_list,$load_template_func;
436 $digest = md5(@join("",get_source($page)));
440 $addtag = '<input type="hidden" name="add" value="true" />';
441 $add_top = '<input type="checkbox" name="add_top" value="true" /><span class="small">'.$_btn_addtop.'</span>';
444 if($vars["help"] == "true")
445 $help = $hr.catrule();
447 $help = "<br />\n<ul><li><a href=\"$script?cmd=edit&help=true&page=".rawurlencode($page)."\">$_msg_help</a></ul></li>\n";
450 $str_freeze = '<input type="submit" name="freeze" value="'.$_btn_freeze.'" accesskey="f" />';
452 if($load_template_func)
456 $files = get_existpages();
457 foreach($files as $pg_org) {
458 if($pg_org == $whatsnew) continue;
459 if(preg_match("/$non_list/",$pg_org)) continue;
460 $name = strip_bracket($pg_org);
461 $vals[$name] = " <option value=\"$pg_org\">$name</option>";
465 $template = " <select name=\"template_page\">\n"
466 ." <option value=\"\">-- $_btn_template --</option>\n"
469 ." <input type=\"submit\" name=\"template\" value=\"$_btn_load\" accesskey=\"r\" /><br />\n";
471 if($vars["refer"]) $refer = $vars["refer"]."\n\n";
475 <form action="'.$script.'" method="post">
477 <table cellspacing="3" cellpadding="0" border="0">
485 <input type="hidden" name="page" value="'.htmlspecialchars($page).'" />
486 <input type="hidden" name="digest" value="'.htmlspecialchars($digest).'" />
487 <textarea name="msg" rows="'.$rows.'" cols="'.$cols.'" wrap="virtual">
488 '.htmlspecialchars($refer.$postdata).'</textarea>
493 <input type="submit" name="preview" value="'.$_btn_preview.'" accesskey="p" />
494 <input type="submit" name="write" value="'.$_btn_update.'" accesskey="s" />
496 <input type="checkbox" name="notimestamp" value="true" /><span style="small">'.$_btn_notchangetimestamp.'</span>
502 <form action="'.$script.'?cmd=freeze" method="post">
504 <input type="hidden" name="page" value="'.htmlspecialchars($vars["page"]).'" />
513 function make_related($page,$_isrule)
515 global $related_str,$rule_related_str,$related,$_make_related,$vars;
517 $page_name = strip_bracket($vars["page"]);
519 if(!is_array($_make_related))
521 $aryrelated = do_search($page,"OR",1);
523 if(is_array($aryrelated))
525 foreach($aryrelated as $key => $val)
527 $new_arylerated[$key.md5($val)] = $val;
531 if(is_array($related))
533 foreach($related as $key => $val)
535 $new_arylerated[$key.md5($val)] = $val;
539 @krsort($new_arylerated);
540 $_make_related = @array_unique($new_arylerated);
545 if(is_array($_make_related))
547 foreach($_make_related as $str)
549 preg_match("/<a\shref=\"([^\"]+)\">([^<]+)<\/a>(.*)/",$str,$out);
551 if($out[3]) $title = " title=\"$out[2] $out[3]\"";
553 $aryret[$out[2]] = "<a href=\"$out[1]\"$title>$out[2]</a>";
560 $aryret = $_make_related;
563 if($_isrule) $str = $rule_related_str;
564 else $str = $related_str;
566 return @join($str,$aryret);
570 function make_note($str)
572 global $note_id,$foot_explain;
574 $str = preg_replace("/^\(\(/","",$str);
575 $str = preg_replace("/\)\)$/","",$str);
577 $str= str_replace("\\'","'",$str);
579 $str = make_user_rules($str);
581 $foot_explain[] = "<a name=\"notefoot:$note_id\" href=\"#notetext:$note_id\" class=\"note_super\">*$note_id</a> <span class=\"small\">$str</span><br />\n";
582 $note = "<a name=\"notetext:$note_id\" href=\"#notefoot:$note_id\" class=\"note_super\">*$note_id</a>";
589 function make_link($name)
591 global $BracketName,$WikiName,$InterWikiName,$InterWikiNameNoBracket,$script,$link_target,$interwiki_target;
592 global $related,$show_passage,$vars,$defaultpage;
594 $aryconv_htmlspecial = array("&","<",">");
595 $aryconv_html = array("&","<",">");
599 if(preg_match("/^\[\[([^\]]+)\:((https?|ftp|news)([^\]]+))\]\]$/",$name,$match))
601 return "<a href=\"$match[2]\" target=\"$link_target\">$match[1]</a>";
603 else if(preg_match("/^\[((https?|ftp|news)([^\]\s]+))\s([^\]]+)\]$/",$name,$match))
605 return "<a href=\"$match[1]\" target=\"$link_target\">$match[4]</a>";
607 else if(preg_match("/^(https?|ftp|news).*?(\.gif|\.png|\.jpeg|\.jpg)?$/",$name,$match))
610 return "<a href=\"$name\" target=\"$link_target\"><img src=\"$name\" border=\"0\"></a>";
612 return "<a href=\"$name\" target=\"$link_target\">$page</a>";
614 else if(preg_match("/^\[\[([^\]]+)\:([[:alnum:]\-_.]+@[[:alnum:]\-_]+\.[[:alnum:]\-_\.]+)\]\]/",$name,$match))
616 return "<a href=\"mailto:$match[2]\">$match[1]</a>";
618 else if(preg_match("/^([[:alnum:]\-_]+@[[:alnum:]\-_]+\.[[:alnum:]\-_\.]+)/",$name))
620 return "<a href=\"mailto:$name\">$page</a>";
622 else if(preg_match("/^(.+?)>($InterWikiNameNoBracket)$/",strip_bracket($name),$match))
625 $name = '[['.$match[2].']]';
626 $percent_name = str_replace($aryconv_htmlspecial,$aryconv_html,$name);
627 $percent_name = rawurlencode($percent_name);
629 return "<a href=\"$script?$percent_name\" target=\"$interwiki_target\">$page</a>";
631 else if(preg_match("/^($InterWikiName)$/",$name))
633 $page = strip_bracket($page);
634 $percent_name = str_replace($aryconv_htmlspecial,$aryconv_html,$name);
635 $percent_name = rawurlencode($percent_name);
637 return "<a href=\"$script?$percent_name\" target=\"$interwiki_target\">$page</a>";
639 else if(preg_match("/^($BracketName)|($WikiName)$/",$name))
641 if(preg_match("/^(.+?)>(.+)$/",strip_bracket($name),$match))
646 if(!preg_match("/^($BracketName)|($WikiName)$/",$page))
648 if(!preg_match("/^($BracketName)|($WikiName)$/",$name))
651 if(preg_match("/^\[\[\.\/([^\]]*)\]\]/",$name,$match))
654 $name = $vars["page"];
656 $name = "[[".strip_bracket($vars["page"])."/$match[1]]]";
658 else if(preg_match("/^\[\[\..\/([^\]]+)\]\]/",$name,$match))
660 for($i=0;$i<substr_count($name,"../");$i++)
661 $name = preg_replace("/(.+)\/([^\/]+)$/","$1",strip_bracket($vars["page"]));
663 if(!preg_match("/^($BracketName)|($WikiName)$/",$name))
666 if($vars["page"]==$name)
667 $name = "[[$match[1]]]";
669 $name = "[[".strip_bracket($name)."/$match[1]]]";
671 else if($name == "[[../]]")
673 $name = preg_replace("/(.+)\/([^\/]+)$/","$1",strip_bracket($vars["page"]));
675 if(!preg_match("/^($BracketName)|($WikiName)$/",$name))
677 if($vars["page"]==$name)
678 $name = $defaultpage;
681 $page = strip_bracket($page);
682 $pagename = htmlspecialchars(strip_bracket($name));
683 $percent_name = str_replace($aryconv_htmlspecial,$aryconv_html,$name);
684 $percent_name = rawurlencode($percent_name);
686 $refer = rawurlencode($vars["page"]);
689 $str = get_pg_passage($name,false);
690 $tm = @filemtime(get_filename(encode($name)));
691 if($vars["page"] != $name)
692 $related[$tm] = "<a href=\"$script?$percent_name\">$pagename</a>$str";
695 $str_title = "title=\"$pagename $str\"";
697 return "<a href=\"$script?$percent_name\" $str_title>$page</a>";
700 return "<span class=\"noexists\">$page<a href=\"$script?cmd=edit&page=$percent_name&refer=$refer\">?</a></span>";
708 // ¥æ¡¼¥¶ÄêµÁ¥ë¡¼¥ë(¥½¡¼¥¹¤òÃÖ´¹¤¹¤ë)
709 function user_rules_str($str)
713 $arystr = split("\n",$str);
715 // ÆüÉÕ¡¦»þ¹ïÃÖ´¹½èÍý
716 foreach($arystr as $str)
718 if(substr($str,0,1) != " ")
720 foreach($str_rules as $rule => $replace)
722 $str = preg_replace("/$rule/",$replace,$str);
728 return join("\n",$retvars);
731 // ¥æ¡¼¥¶ÄêµÁ¥ë¡¼¥ë(¥½¡¼¥¹¤ÏÃÖ´¹¤»¤º¥³¥ó¥Ð¡¼¥È)
732 function make_user_rules($str)
736 foreach($user_rules as $rule => $replace)
738 $str = preg_replace("/$rule/",$replace,$str);
744 // HTML¥¿¥°¤ò¼è¤ê½ü¤¯
745 function strip_htmltag($str)
747 //$str = preg_replace("/<a[^>]+>\?<\/a>/","",$str);
748 return preg_replace("/<[^>]+>/","",$str);
751 // ¥Ú¡¼¥¸Ì¾¤«¤é¥Ú¡¼¥¸Ì¾¤ò¸¡º÷¤¹¤ë¥ê¥ó¥¯¤òºîÀ®
752 function make_search($page)
754 global $script,$WikiName;
756 $page = htmlspecialchars($page);
757 $name = strip_bracket($page);
758 $url = rawurlencode($page);
760 //WikiWikiWeb like...
761 //if(preg_match("/^$WikiName$/",$page))
762 // $name = preg_replace("/([A-Z][a-z]+)/","$1 ",$name);
764 return "<a href=\"$script?cmd=search&word=$url\">$name</a> ";