list($comment) = get_source($page); // list() に空の array() が渡るとNotice
PukiWiki 1.5.0 のタイミングで、以上の修正を含まないソースコードにロールバックしています。 1.5.1 にも入っていなかったので改めて修正を行いました。
ls2 プラグインには、ページの内容をスキャンする必要のある、title とinclude のオプションがあります。
しかし、これらのオプションを使わない時にもget_source() を呼んでいるため、無駄が多くなっています。
この無駄を省くことで、上のオプションを使わない時の速度をls プラグインと同等に
なるようにしましょう。
cvs:plugin/ls2.inc.php (1.25) をベースに
function plugin_ls2_get_headings($page, & $params, $level, $include = FALSE) { (中略) $ret .= '<a id="list_' . $params["page_$page"] . '" href="' . $href . '" title="' . $title . '">' . $s_page . '</a>'; array_push($params['result'], $ret); - $anchor = PLUGIN_LS2_ANCHOR_ORIGIN; - $matches = array(); - foreach (get_source($page) as $line) { - if ($params['title'] && preg_match('/^(\*{1,3})/', $line, $matches)) { - $id = make_heading($line); - $level = strlen($matches[1]); - $id = PLUGIN_LS2_ANCHOR_PREFIX . $anchor++; - plugin_ls2_list_push($params, $level + strlen($level)); - array_push($params['result'], - '<li><a href="' . $href . $id . '">' . $line . '</a>'); - } else if ($params['include'] && - preg_match('/^#include\((.+)\)/', $line, $matches) && - is_page($matches[1])) - { - plugin_ls2_get_headings($matches[1], $params, $level + 1, TRUE); - } - } + if ($params['title'] || $params['include']) { + $anchor = PLUGIN_LS2_ANCHOR_ORIGIN; + $matches = array(); + foreach (get_source($page) as $line) { + if ($params['title'] && preg_match('/^(\*{1,3})/', $line, $matches)) { + make_heading($line); + $level = strlen($matches[1]); + $id = PLUGIN_LS2_ANCHOR_PREFIX . $anchor++; + plugin_ls2_list_push($params, $level + 1); + array_push($params['result'], + '<li><a href="' . $href . $id . '">' . $line . '</a>'); + } else if ($params['include'] && + preg_match('/^#include\((.+)\)/', $line, $matches) && + is_page($matches[1])) + { + plugin_ls2_get_headings($matches[1], $params, $level + 1, TRUE); + } + } + } }
同じページを複数回参照したときに抜け出す条件が、if ($params['title'] && $is_done) となっていて、titleを指定せずにincludeを指定した場合に、ソースを読みに行って無限ループする可能性があります。
そこで、すでにページを読み取ったかだけで判定するようにしてみました。あと、あらかじめ$params["page_$page"] を初期化しないようにして、isset だけで表示したかどうかを判定できるように手順を変えてみました。
if ($params['reverse']) $pages = array_reverse($pages); - foreach ($pages as $page) { - $params['page_ ' . $page] = 0; - } - $params['result'] = $params['saved'] = array(); foreach ($pages as $page) { plugin_ls2_get_headings($page, $params, 1); } return join("\n", $params['result']) . join("\n", $params['saved']); } function plugin_ls2_get_headings($page, & $params, $level, $include = FALSE) { static $_ls2_anchor = 0; - // ページが未表示のとき - $is_done = (isset($params["page_$page"]) && $params["page_$page"] > 0); - if (! $is_done) $params["page_$page"] = ++$_ls2_anchor; $r_page = rawurlencode($page); $s_page = htmlspecialchars($page); $title = $s_page . ' ' . get_pg_passage($page, FALSE); $href = get_script_uri() . '?cmd=read&page=' . $r_page; plugin_ls2_list_push($params, $level); $ret = $include ? '<li>include ' : '<li>'; - if ($params['title'] && $is_done) { + if ($isset($params["page_$page"]) { $ret .= '<a href="' . $href . '" title="' . $title . '">' . $s_page . '</a> '; $ret .= '<a href="#list_' . $params["page_$page"] . '"><sup>↑</sup></a>'; array_push($params['result'], $ret); return; } + // ページが未表示のとき + $params["page_$page"] = ++$_ls2_anchor; $ret .= '<a id="list_' . $params["page_$page"] . '" href="' . $href . '" title="' . $title . '">' . $s_page . '</a>';
BugTrack/2449 に移動しました
BugTrack/2450 に移動しました
... また、include を見つけた場合に、notitleなどのパラメータが含まれている場合や、相対パスを考慮していないので、存在しないページと判定されスキップされる場合があります。
lib/file.php (1.91) への修正案 // Open pkwk_touch_file($file); $fp = fopen($file, 'r+') or die_message('Cannot open ' . 'CACHE_DIR/' . PKWK_MAXSHOW_CACHE); set_file_buffer($fp, 0); flock($fp, LOCK_EX); // Read (keep the order of the lines) $recent_pages = $matches = array(); - foreach(file_head($file, $maxshow + PKWK_MAXSHOW_ALLOWANCE) as $line) { + foreach(file_head($file, $maxshow + PKWK_MAXSHOW_ALLOWANCE, FALSE) as $line) { if (preg_match('/^([0-9]+)\t(.+)/', $line, $matches)) {AutoLink がON の時はput_lastmodified() へ逃げるので、このトラブルは発生しないでしょう。 -- 2007-10-28 (日) 17:16:04