2 /////////////////////////////////////////////////
3 // PukiWiki - Yet another WikiWikiWeb clone.
5 // $Id: html.php,v 1.18 2004/12/02 13:05:02 henoheno Exp $
9 function catbody($title,$page,$body)
11 global $script, $vars, $arg, $defaultpage, $whatsnew, $help_page, $hr;
12 global $related_link, $cantedit, $function_freeze, $search_word_color, $_msg_word;
13 global $foot_explain, $note_hr, $head_tags;
14 global $trackback, $trackback_javascript, $referer, $javascript;
15 global $_LANG, $_LINK, $_IMAGE;
17 global $html_transitional; // FALSE:XHTML1.1 TRUE:XHTML1.0 Transitional
18 global $page_title; // ¥Û¡¼¥à¥Ú¡¼¥¸¤Î¥¿¥¤¥È¥ë
19 global $do_backup; // ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¹Ô¤¦¤«¤É¤¦¤«
20 global $modifier; // ÊÔ½¸¼Ô¤Î¥Û¡¼¥à¥Ú¡¼¥¸
21 global $modifierlink; // ÊÔ½¸¼Ô¤Î̾Á°
23 if (! file_exists(SKIN_FILE) || ! is_readable(SKIN_FILE))
24 die_message('SKIN_FILE is not found');
26 $_LINK = $_IMAGE = array();
28 // Add JavaScript header when ...
29 if ($trackback && $trackback_javascript) $javascript = 1; // Set something If you want
30 if (! PKWK_ALLOW_JAVASCRIPT) unset($javascript);
32 $_page = isset($vars['page']) ? $vars['page'] : '';
33 $r_page = rawurlencode($_page);
35 // Set $_LINK for skin
36 $_LINK['add'] = "$script?cmd=add&page=$r_page";
37 $_LINK['backup'] = "$script?cmd=backup&page=$r_page";
38 $_LINK['copy'] = "$script?plugin=template&refer=$r_page";
39 $_LINK['diff'] = "$script?cmd=diff&page=$r_page";
40 $_LINK['edit'] = "$script?cmd=edit&page=$r_page";
41 $_LINK['filelist'] = "$script?cmd=filelist";
42 $_LINK['freeze'] = "$script?cmd=freeze&page=$r_page";
43 $_LINK['help'] = "$script?" . rawurlencode($help_page);
44 $_LINK['list'] = "$script?cmd=list";
45 $_LINK['new'] = "$script?plugin=newpage&refer=$r_page";
46 $_LINK['rdf'] = "$script?cmd=rss&ver=1.0";
47 $_LINK['recent'] = "$script?" . rawurlencode($whatsnew);
48 $_LINK['refer'] = "$script?plugin=referer&page=$r_page";
49 $_LINK['reload'] = "$script?$r_page";
50 $_LINK['rename'] = "$script?plugin=rename&refer=$r_page";
51 $_LINK['rss'] = "$script?cmd=rss";
52 $_LINK['rss10'] = "$script?cmd=rss&ver=1.0"; // Same as 'rdf'
53 $_LINK['rss20'] = "$script?cmd=rss&ver=2.0";
54 $_LINK['search'] = "$script?cmd=search";
55 $_LINK['top'] = "$script?" . rawurlencode($defaultpage);
57 $tb_id = tb_get_id($_page);
58 $_LINK['trackback'] = "$script?plugin=tb&__mode=view&tb_id=$tb_id";
60 $_LINK['unfreeze'] = "$script?cmd=unfreeze&page=$r_page";
61 $_LINK['upload'] = "$script?plugin=attach&pcmd=upload&page=$r_page";
63 // Compat: Skins for 1.4.4 and before
64 $link_add = & $_LINK['add'];
65 $link_new = & $_LINK['new']; // New!
66 $link_edit = & $_LINK['edit'];
67 $link_diff = & $_LINK['diff'];
68 $link_top = & $_LINK['top'];
69 $link_list = & $_LINK['list'];
70 $link_filelist = & $_LINK['filelist'];
71 $link_search = & $_LINK['search'];
72 $link_whatsnew = & $_LINK['recent'];
73 $link_backup = & $_LINK['backup'];
74 $link_help = & $_LINK['help'];
75 $link_trackback = & $_LINK['trackback']; // New!
76 $link_rdf = & $_LINK['rdf']; // New!
77 $link_rss = & $_LINK['rss'];
78 $link_rss10 = & $_LINK['rss10']; // New!
79 $link_rss20 = & $_LINK['rss20']; // New!
80 $link_freeze = & $_LINK['freeze'];
81 $link_unfreeze = & $_LINK['unfreeze'];
82 $link_upload = & $_LINK['upload'];
83 $link_template = & $_LINK['copy'];
84 $link_refer = & $_LINK['refer']; // New!
85 $link_rename = & $_LINK['rename'];
87 // ¥Ú¡¼¥¸¤Îɽ¼¨»þTRUE(¥Ð¥Ã¥¯¥¢¥Ã¥×¤Îɽ¼¨¡¢RecentChanges¤Îɽ¼¨¤ò½ü¤¯)
88 $is_page = (is_pagename($_page) && ! arg_check('backup') && $_page != $whatsnew);
90 // ¥Ú¡¼¥¸¤ÎÆɤ߽Ф·»þTRUE
91 $is_read = (arg_check('read') && is_page($_page));
93 // ¥Ú¡¼¥¸¤¬Åà·ë¤µ¤ì¤Æ¤¤¤ë¤È¤TRUE
94 $is_freeze = is_freeze($_page);
96 // ¥Ú¡¼¥¸¤ÎºÇ½ª¹¹¿·»þ¹ï(ʸ»úÎó)
97 $lastmodified = $is_read ? get_date('D, d M Y H:i:s T', get_filetime($_page)) .
98 ' ' . get_pg_passage($_page, FALSE) : '';
100 // ´ØÏ¢¤¹¤ë¥Ú¡¼¥¸¤Î¥ê¥¹¥È
101 $related = ($is_read && $related_link) ? make_related($_page) : '';
103 // źÉÕ¥Õ¥¡¥¤¥ë¤Î¥ê¥¹¥È
104 $attaches = ($is_read && exist_plugin_action('attach')) ? attach_filelist() : '';
107 ksort($foot_explain, SORT_NUMERIC);
108 $notes = ! empty($foot_explain) ? $note_hr . join("\n", $foot_explain) : '';
110 // <head>Æâ¤ËÄɲ乤륿¥°
111 $head_tag = ! empty($head_tags) ? join("\n", $head_tags) ."\n" : '';
114 // ¥Ú¡¼¥¸¤ÎºÇ½ª¹¹¿·»þ¹ï(UNIX timestamp)
115 $fmt = $is_read ? get_filetime($_page) + LOCALZONE : 0;
118 if ($search_word_color && isset($vars['word'])) {
119 $body = '<div class="small">' . $_msg_word . htmlspecialchars($vars['word']) .
121 $words = array_flip(array_splice(
122 preg_split('/\s+/', $vars['word'], -1, PREG_SPLIT_NO_EMPTY),
125 foreach ($words as $word=>$id) {
126 $keys[$word] = strlen($word);
128 arsort($keys, SORT_NUMERIC);
129 $keys = get_search_words(array_keys($keys), TRUE);
131 foreach ($keys as $key=>$pattern)
133 $s_key = htmlspecialchars($key);
134 $pattern = "/<[^>]*>|($pattern)|&[^;]+;/";
135 $callback = create_function(
137 'return (count($arr) > 1) ? "<strong class=\"word' . $id++ . '\">{$arr[1]}</strong>" : $arr[0];'
139 $body = preg_replace_callback($pattern, $callback, $body);
140 $notes = preg_replace_callback($pattern, $callback, $notes);
144 $longtaketime = getmicrotime() - MUTIME;
145 $taketime = sprintf('%01.03f', $longtaketime);
150 // ¥¤¥ó¥é¥¤¥óÍ×ÁǤΥѡ¼¥¹ (obsolete)
151 function inline($line, $remove = FALSE)
155 $line = htmlspecialchars($line);
157 $line = preg_replace($NotePattern, '', $line);
162 // ¥¤¥ó¥é¥¤¥óÍ×ÁǤΥѡ¼¥¹ (¥ê¥ó¥¯¡¢¸«½Ð¤·°ìÍ÷) (obsolete)
163 function inline2($str)
165 return make_link($str);
168 // ÊÔ½¸¥Õ¥©¡¼¥à¤Îɽ¼¨
169 function edit_form($page, $postdata, $digest = 0, $b_template = TRUE)
171 global $script, $vars, $rows, $cols, $hr, $function_freeze;
172 global $_btn_addtop, $_btn_preview, $_btn_repreview, $_btn_update, $_btn_cancel,
173 $_btn_freeze, $_msg_help, $_btn_notchangetimestamp;
174 global $whatsnew, $_btn_template, $_btn_load, $non_list, $load_template_func;
176 $refer = $template = $addtag = $add_top = '';
178 if ($digest == 0) $digest = md5(join('', get_source($page)));
180 $checked_top = isset($vars['add_top']) ? ' checked="checked"' : '';
181 $checked_time = isset($vars['notimestamp']) ? ' checked="checked"' : '';
183 if(isset($vars['add'])) {
184 $addtag = '<input type="hidden" name="add" value="true" />';
185 $add_top = "<input type=\"checkbox\" name=\"add_top\" value=\"true\"$checked_top /><span class=\"small\">$_btn_addtop</span>";
188 if($load_template_func && $b_template) {
189 $_pages = get_existpages();
191 foreach($_pages as $_page) {
192 if ($_page == $whatsnew || preg_match("/$non_list/", $_page))
194 $s_page = htmlspecialchars($_page);
195 $pages[$_page] = " <option value=\"$s_page\">$s_page</option>";
198 $s_pages = join("\n", $pages);
200 <select name="template_page">
201 <option value="">-- $_btn_template --</option>
204 <input type="submit" name="template" value="$_btn_load" accesskey="r" />
208 if (isset($vars['refer']) && $vars['refer'] != '')
209 $refer = '[[' . strip_bracket($vars['refer']) ."]]\n\n";
212 $r_page = rawurlencode($page);
213 $s_page = htmlspecialchars($page);
214 $s_digest = htmlspecialchars($digest);
215 $s_postdata = htmlspecialchars($refer . $postdata);
216 $s_original = isset($vars['original']) ? htmlspecialchars($vars['original']) : $s_postdata;
217 $b_preview = isset($vars['preview']); // ¥×¥ì¥Ó¥å¡¼ÃæTRUE
218 $btn_preview = $b_preview ? $_btn_repreview : $_btn_preview;
221 <form action="$script" method="post">
222 <div class="edit_form">
225 <input type="hidden" name="cmd" value="edit" />
226 <input type="hidden" name="page" value="$s_page" />
227 <input type="hidden" name="digest" value="$s_digest" />
228 <textarea name="msg" rows="$rows" cols="$cols">$s_postdata</textarea>
230 <input type="submit" name="preview" value="$btn_preview" accesskey="p" />
231 <input type="submit" name="write" value="$_btn_update" accesskey="s" />
233 <input type="checkbox" name="notimestamp" value="true"$checked_time />
234 <span style="small">$_btn_notchangetimestamp</span>
235 <input type="submit" name="cancel" value="$_btn_cancel" accesskey="c" />
236 <textarea name="original" rows="1" cols="1" style="display:none">$s_original</textarea>
241 if (isset($vars['help'])) {
242 $body .= $hr . catrule();
245 "<ul><li><a href=\"$script?cmd=edit&help=true&page=$r_page\">$_msg_help</a></li></ul>";
252 function make_related($page, $tag = '')
254 global $script, $vars, $related, $rule_related_str, $related_str, $non_list;
255 global $_ul_left_margin, $_ul_margin, $_list_pad_str;
257 $links = links_get_related($page);
266 foreach ($links as $page=>$lastmod) {
267 if (preg_match("/$non_list/", $page)) continue;
269 $r_page = rawurlencode($page);
270 $s_page = htmlspecialchars($page);
271 $passage = get_passage($lastmod);
273 "<a href=\"$script?$r_page\" title=\"$s_page $passage\">$s_page</a>" :
274 "<a href=\"$script?$r_page\">$s_page</a>$passage";
277 if (empty($_links)) return '';
279 if ($tag == 'p') { // ¹ÔƬ¤«¤é
280 $margin = $_ul_left_margin + $_ul_margin;
281 $style = sprintf($_list_pad_str, 1, $margin, $margin);
282 $retval = "\n<ul$style>\n<li>" . join($rule_related_str, $_links) . "</li>\n</ul>\n";
284 $retval = join($rule_related_str, $_links);
286 $retval = join($related_str, $_links);
292 // ¥æ¡¼¥¶ÄêµÁ¥ë¡¼¥ë(¥½¡¼¥¹¤ÏÃÖ´¹¤»¤º¥³¥ó¥Ð¡¼¥È)
293 function make_line_rules($str)
296 static $pattern, $replace;
298 if (! isset($pattern)) {
299 $pattern = array_map(create_function('$a', 'return "/$a/";'), array_keys($line_rules));
300 $replace = array_values($line_rules);
304 return preg_replace($pattern, $replace, $str);
307 // HTML¥¿¥°¤ò¼è¤ê½ü¤¯
308 function strip_htmltag($str)
310 global $_symbol_noexists;
312 $noexists_pattern = '#<span class="noexists">([^<]*)<a[^>]+>' .
313 preg_quote($_symbol_noexists, '#') . '</a></span>#';
315 $str = preg_replace($noexists_pattern, '$1', $str);
316 //$str = preg_replace('/<a[^>]+>\?<\/a>/', '', $str);
317 return preg_replace('/<[^>]+>/', '', $str);
320 // ¥Ú¡¼¥¸Ì¾¤«¤é¥Ú¡¼¥¸Ì¾¤ò¸¡º÷¤¹¤ë¥ê¥ó¥¯¤òºîÀ®
321 function make_search($page)
323 global $script, $WikiName;
325 $s_page = htmlspecialchars($page);
326 $r_page = rawurlencode($page);
328 //WikiWikiWeb like...
329 //if(preg_match("/^$WikiName$/", $page))
330 // $name = preg_replace("/([A-Z][a-z]+)/", "$1 ", $name);
332 return "<a href=\"$script?cmd=search&word=$r_page\">$s_page</a> ";
335 // ¸«½Ð¤·¤òÀ¸À® (µÓÃí¤äHTML¥¿¥°¤ò½üµî)
336 function make_heading(& $str, $strip = TRUE)
343 if (preg_match('/^(\*{0,3})(.*?)\[#([A-Za-z][\w-]+)\](.*?)$/m', $str, $matches)) {
344 $str = $matches[2] . $matches[4];
347 $str = preg_replace('/^\*{0,3}/', '', $str);
350 // Cut footnotes and tags
352 $str = strip_htmltag(make_link(preg_replace($NotePattern, '', $str)));
357 // Separate a page-name(or URL or null string) and an anchor
358 // (last one standing) without sharp
359 function anchor_explode($page, $strict_editable = FALSE)
361 $pos = strrpos($page, '#');
362 if ($pos === FALSE) return array($page, '', FALSE);
364 // Ignore the last sharp letter
365 if ($pos + 1 == strlen($page)) {
366 $pos = strpos(substr($page, $pos + 1), '#');
367 if ($pos === FALSE) return array($page, '', FALSE);
370 $s_page = substr($page, 0, $pos);
371 $anchor = substr($page, $pos + 1);
373 if($strict_editable === TRUE && preg_match('/^[a-z][a-f0-9]{7}$/', $anchor)) {
374 return array ($s_page, $anchor, TRUE); // Seems fixed-anchor
376 return array ($s_page, $anchor, FALSE);
380 // Check header()s were sent already, or
381 // there're blank lines or something out of php blocks
382 function pkwk_headers_sent()
384 if (PKWK_OPTIMISE) return;
386 if (version_compare(PHP_VERSION, '4.3.0', '>=')) {
387 if (headers_sent($file, $line)) {
388 print('Headers already sent at ' .
389 htmlspecialchars($file) .
390 ' line ' . $line . '.');
394 if (headers_sent()) {
395 print('Headers already sent.');