bugtrack プラグインのサマリに、&を含む文字列を入力して追加します。
bugtrack_list プラグインで一覧を表示すると、サマリ中の&が、&となります。
BugTrack2で、BugTrack2/18のサマリを見ると、現象を確認できます。
plugin_bugtrack_list_convert() の戻り値までは、正常だったのですが、その戻り値に対して、どこかで htmlspecialchars を多重に実行しているのだと思いますが、見つける事が出来ませんでした。
// $Id: bugtrack.inc.php,v 1.25 2005/04/03 03:33:47 henoheno Exp $ (中略) function plugin_bugtrack_list_pageinfo($page, $no = NULL, $recurse = TRUE) { global $WikiName, $InterWikiName, $BracketName, $_plugin_bugtrack; (中略) $body = join("\n", $source); foreach(array('summary', 'name', 'priority', 'state', 'category') as $item) { $regex = '/-\s*' . preg_quote($_plugin_bugtrack[$item], '/') . '\s*:(.*)/'; if (preg_match($regex, $body, $matches)) { if ($item == 'name') { $$item = strip_bracket(trim($matches[1])); } else { $$item = trim($matches[1]); } } else { $$item = ''; // Data not found } } if (preg_match("/\*([^\n]*)/", $body, $matches)) { $summary = $matches[1]; make_heading($summary); } return array($page, $no, $summary, $name, $priority, $state, $category); }$summary とそれ以外の大きな違いが、make_heading を使っているかどうかでした。そこで、試しに
if (preg_match("/\*([^\n]*)/", $body, $matches)) { $summary = $matches[1]; make_heading($summary, FALSE);としてみました。その結果、注釈が一覧に表示されるようになったものの、htmlspecialchars の多重実行は解消されました。
// $Id: bugtrack.inc.php,v 1.25 2005/04/03 03:33:47 henoheno Exp $ (中略) function plugin_bugtrack_list_pageinfo($page, $no = NULL, $recurse = TRUE) { - global $WikiName, $InterWikiName, $BracketName, $_plugin_bugtrack; + global $WikiName, $InterWikiName, $BracketName, $_plugin_bugtrack, $NotePattern; (中略) if (preg_match("/\*([^\n]*)/", $body, $matches)) { - $summary = $matches[1]; + $summary = preg_replace($NotePattern, '', $matches[1]); - make_heading($summary); + make_heading($summary, FALSE); } return array($page, $no, $summary, $name, $priority, $state, $category); }たぶん問題ないと思いますが、確認をお願いします。 -- 2007-05-04 (金) 13:49:11
// $Id: html.php,v 1.59 2007/02/11 05:53:30 henoheno Exp $ (中略) function make_heading(& $str, $strip = TRUE) { (中略) // Cut footnotes and tags if ($strip === TRUE) $str = strip_htmltag(make_link(preg_replace($NotePattern, '', $str))); return $id; }make_heading には、htmlspecialchars が無かったので、次にmake_link を見てみました。
// $Id: make_link.php,v 1.35 2006/09/30 02:10:50 henoheno Exp $ (中略) // Hyperlink decoration function make_link($string, $page = '') { global $vars; static $converter; if (! isset($converter)) $converter = new InlineConverter(); $clone = $converter->get_clone($converter); return $clone->convert($string, ($page != '') ? $page : $vars['page']); } // Converters of inline element class InlineConverter { var $converters; // as array() var $pattern; var $pos; var $result; (中略) function convert($string, $page) { $this->page = $page; $this->result = array(); $string = preg_replace_callback('/' . $this->pattern . '/x', array(& $this, 'replace'), $string); $arr = explode("\x08", make_line_rules(htmlspecialchars($string))); $retval = ''; while (! empty($arr)) { $retval .= array_shift($arr) . array_shift($this->result); } return $retval; }結論だけを書くためにかなり省略してますが、function convert の中にある
$arr = explode("\x08", make_line_rules(htmlspecialchars($string)));の部分で1回実行していたようです。