メッセージ

2015年02月03日の記事

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要らないかも?)

2015/02/03(火)bodycache patch 2重include対応

pukiwiki bodycache patch 2重include対応

bodycache 2重include

以前、#includeを含んだページで更新時にキャッシュが再生成されるような改良を行いましたが、この改良では上図のように#includeや#pcommentが2重に使われていると、キャッシュが正しく再生成されないことが分かりました。

bodycache 2重include 修正前

このような場合、一番深いページを更新したときに、最上位のページのキャッシュが再生成されずに残ってしまいます。これは、キャッシュを再生成するページを探すときに、#includeや#pcommentを更新されたページから1段しかたどっていないために発生する現象です。

そこで、更新時に2段までページをたどってキャッシュを再生成するように変更しました。これで、2重include/pcommentまでなら正しくキャッシュが再生成されるようになります。

bodycache 3重include 修正後

ただし、3重include/pcommentには未対応です。対応は難しくありませんが、たどる段数を増やすとその分負荷も増えるので、2重までの対応としています。