"1", "01", "001" のように、数値の羅列に見えるページ名で、数値としては同一であるように見えるページが複数あった場合、これらが全て同一であるとみなされてしまっています。
これはPHPの文字列の比較に関する仕様を考慮できていないのが原因です。two numerical strings (数字の羅列に見える文字列型の値二つ) を比較する時は、 == ではなく === 演算子を使って比較しなければ(意図した結果にはならず) それぞれが 数値として 比較されてしまいます。
メニューバーでrecent プラグインを利用した時、今見ているページ以外のページまでリンクされなくなってしまいます。
この現象が発生するのは、整数のみで構成されたページ名で以下のような場合です。
最新の20件 2007-05-17 001 <= 例えばこれを表示しているとき 020 20 01 <= これと 1 <= これもリンクされなくなってしまう 00 0この例で、「1」というページを今見ているとすると、「01」と、「001」というページもリンク対象から外れてしまいます。
BugTrack2/235 の修正をする前の環境(1.4.7_notb)で試しても同じ結果になったので、原因は別の場所にあるようです。
整数値を文字列と比較する際、文字列が 数値に変換されます。 数値形式の文字列を比較する場合、それは整数として比較されます。後半部分が、今回recent プラグインで該当しているようです。
// $Id: recent.inc.php,v 1.24 2006/09/30 02:18:23 henoheno Exp $ (中略) function plugin_recent_convert() { (中略) if($page == $vars['page']) { // No need to link to the page you just read, or notify where you just read $items .= ' <li>' . $s_page . '</li>' . "\n"; } else { $r_page = rawurlencode($page); $passage = $show_passage ? ' ' . get_passage($time) : ''; $items .= ' <li><a href="' . $script . '?' . $r_page . '"' . ' title="' . $s_page . $passage . '">' . $s_page . '</a></li>' . "\n"; } (以降、省略)上で、$page がリストに載っているページ名、$vars['page'] は今見ているページ名です。
"If you compare two numerical strings, they are compared as integers."
lib/file.php(92): if ($autoalias && $page == $aliaspage) { lib/file.php(285): if (PKWK_READONLY || $limit == 0 || $page == '' || $recentpage == '' || lib/file.php(422): if ($page != $whatsnew && ! check_non_list($page)) lib/file.php(723): $links[$page] = ($page == $vars['page']) ? $related : array(); lib/html.php(85): $is_page = (is_pagename($_page) && ! arg_check('backup') && $_page != $whatsnew); lib/html.php(184): if ($_page == $whatsnew || check_non_list($_page)) lib/html.php(201): if (isset($vars['refer']) && $vars['refer'] != '') lib/link.php(70): $_obj->name == $page || $_obj->name == '') lib/link.php(117): if ($_page != $page) lib/link.php(152): if ($page == $whatsnew) continue; lib/link.php(158): $_obj->name == $page || $_obj->name == '') lib/link.php(208): if ($ref_page != $page) $ref .= $line; lib/link.php(235): if ($ref_page != $page) { lib/make_link.php(21): return $clone->convert($string, ($page != '') ? $page : $vars['page']); lib/make_link.php(782): if ($page == '') return '<a href="' . $anchor . '">' . $s_alias . '</a>'; lib/make_link.php(785): $r_refer = ($refer == '') ? '' : '&refer=' . rawurlencode($refer); lib/make_link.php(787): if (! isset($related[$page]) && $page != $vars['page'] && is_page($page)) plugin/attach.inc.php(98): if ($refer != '' && is_pagename($refer)) { plugin/attach.inc.php(127): if ($page == '' || ! is_page($page)) { plugin/attach.inc.php(326): $msg = $_attach_messages[($refer == '') ? 'msg_listall' : 'msg_listpage']; plugin/attach.inc.php(327): $body = ($refer == '' || isset($obj->pages[$refer])) ? plugin/attach.inc.php(810): $page_pattern = ($page == '') ? '(?:[0-9A-F]{2})+' : preg_quote(encode($page), '/'); plugin/attach.inc.php(833): if ($page != '') { plugin/backup.inc.php(25): if ($page == '') return array('msg'=>$_title_backuplist, 'body'=>plugin_backup_get_list_all()); plugin/calendar.inc.php(34): if ($page == '') { plugin/calendar_viewer.inc.php(310): if ($vars['page'] != '') $return_vars_array['msg'] .= '/'; plugin/edit.inc.php(96): if ($page == NULL) $page = ''; plugin/include.inc.php(111): if ($page == $menubar) { plugin/lastmod.inc.php(15): if ($page == ''){ plugin/lookup.inc.php(51): if ($page == '') return FALSE; // Do nothing plugin/map.inc.php(23): if ($refer == '' || ! is_page($refer)) { plugin/menu.inc.php(50): } else if ($vars['page'] == $page) { plugin/navi.inc.php(103): if ($page == $current) break; plugin/navi.inc.php(130): if ($_page != '') { plugin/navi.inc.php(157): if ($page != $home) plugin/newpage.inc.php(42): if ($vars['page'] == '') { plugin/pcomment.inc.php(263): if ($refer != '') pkwk_touch_file(get_filename($refer)); plugin/popular.inc.php(47): $page == $whatsnew || check_non_list($page) || plugin/popular.inc.php(80): if ($page == $vars['page']) { plugin/random.inc.php(50): if ($page != '') $vars['refer'] = $page; plugin/related.inc.php(22): if ($_page == '') $_page = $defaultpage; plugin/related.inc.php(29): if ($page == $whatsnew || plugin/rename.inc.php(42): if ($refer == '') { plugin/rename.inc.php(48): } else if ($refer == $whatsnew) { plugin/rename.inc.php(51): } else if ($page == '' || $page == $refer) { plugin/rename.inc.php(83): if ($page != '') $body = sprintf($body, htmlspecialchars($page)); plugin/rename.inc.php(139): if ($page == '') $page = $refer; plugin/rename.inc.php(384): if ($page == '') $page = PLUGIN_RENAME_LOGPAGE; plugin/rename.inc.php(397): if ($name == $page) continue; plugin/rename.inc.php(409): if ($_page == $whatsnew) continue; plugin/rename.inc.php(411): $selected = ($_page == $page) ? ' selected' : ''; plugin/template.inc.php(60): } else if ($page != '' && ! $is_pagename) { plugin/template.inc.php(65): $s_page = ($page == '') ? str_replace('$1', $s_refer, $_msg_template_page) : $_page; plugin/topicpath.inc.php(34): if ($page == '' || $page == $defaultpage) return ''; skin/tdiary.skin.php(693): if ($_page != '') { skin/tdiary.skin.php(699): if ($page != '') {多分、変更しなくても問題のない、空文字列('')との比較も一応載せてあります。
変更すべきか、などの優先順位をこちらで付けられない*1ので、確認をお願いします*2。
ステータスを「完了」ではなく、調査開始という意味で「着手」にすればよかった、とちょっと後悔してたり。 -- 2007-05-19 (土) 14:32:38
// Copyright (C) 2003-2006, 2007 PukiWiki Developers Team
// 2003-2005, 2007 PukiWiki Developers Team
// 2002-2005, 2007 PukiWiki Developers Team