2015/02/03(火)見出しタイトル化のバグと続・PukiWiki bodycache patch副作用:id重複
見出しタイトル化のバグ
タイトルプラグイン(PukiWiki)導入に合わせて、最初に出現したレベル1見出しをタイトル扱いにする改造を行いましたが、バグがあったようです。(季節イベントページをみていて気づきました。)
- 発生条件: includeプラグインが使われており、includeで参照しているページにレベル1見出しが含まれている
- 現象: レベル1見出しが含まれる最後のincludeがタイトルとして使われてしまう。
- 原因: includeを使うとconvert_htmlが複数回呼ばれることを考慮していなかった。その結果、後で呼び出されたconvert_htmlにより見出しから抽出したタイトルが上書きされていた。
- 修正前: Heading->Heading() 内の改造箇所
if( $this->level === 1 && !isset( $root->title ) ){ $root->title = preg_replace('|\s*\[.*|', '', $text); $root->title = preg_replace('|^\*\s*|', '', $root->title); }
- 修正後: Heading->Heading() 内の改造箇所
//初回呼び出し時は $root->id は 1 if( $this->level === 1 && !isset( $root->title ) && $root->id === 1 ){ $root->title = preg_replace('|\s*\[.*|', '', $text); $root->title = preg_replace('|^\*\s*|', '', $root->title); }
また、includeプラグインの参照先ページにtitleプラグインが含まれている場合も、同様にincludeしたページのタイトルが優先されてしまうと思われます。ただ、このような使い方はたぶんしないと思うので、こちらの問題はそのままにしておこうかと思います。
続・PukiWiki bodycache patch副作用:id重複
PukiWiki bodycache patch副作用:id重複で適用した修正ですが、不十分だったようです^^;
原因は、やはりconvert_htmlが複数回呼ばれることを考慮していなかったことで、
function convert_html($lines) { //省略 static $contents_id = 0; global $bodycache_status; if ( $bodycache_status === 'cached' ) { //bodycacheから取得済み ++$contents_id; } //省略 $body = & new Body(++$contents_id); //省略 }
この修正では、includeによる2回目のconvert_html出力と、メニューバーの$contents_idが共に2になってid重複してしまいます。
ものすごく場当たり的ですが、以下のように再修正しました。
if ( $bodycache_status === 'cached' ) { //bodycacheから取得済み $contents_id += 90 ; //これだけ足せばきっと重複しない・・・(^_^;) }
いっそ、メニューバーでは見出しの自動id生成をやめた方が良い気もしてきましたが、メニューバーだけ自動id生成をやめる方が修正は面倒そうです。(もしかしたら、本文も自動id要らないかも?)