configプラグイン動かねぇ!

blosxomのパワフルなプラグインのひとつに、configプラグインという、グローバルな設定($blog_titleとか)を、カテゴリごとやフレーバーごと、さらにはあるカテゴリのあるフレーバーに限って書き換えることができるようになるものがあるのですが、設定の説明がMLのアーカイブにしかないことや、検索しようにもconfigとかいう非常に一般的な単語なのでなかなか引っ掛けづらく、利用には結構壁があるかもしれませんね。

どうにかこうにか、

package blosxom;

$blog_title = 'FooBarBlosxom';

1;

とか書いて、configとかconfig.htmlとかいうファイル名でファイルを作ってやれば良いということまでは理解できました。

しかし、動きません。

まず第一の原因は、どうやらheadサブルーチンで設定ファイルを読んでいることにあるようです。プラグインを読み込む順番によっては、うまく読んでくれないことがあるかもしれないとか。これに対しての解はheadサブルーチンからfilterサブルーチンに変更してやるか、configプラグインを最初に読み込むように00configなどと名前を変更してやるだけです。

次の原因は、entries_indexとの兼ね合いっぽいです。blosxomはエントリのファイルをリストアップする際に、エントリ・ファイルとみなす拡張子以外のファイルを%othersというハッシュに格納するので、configプラグインの設定ファイルはこちらに格納されることになります。また、configプラグインでは、その%othersに格納されているかどうかで、設定ファイルの存在を確認しています。通常はこれで問題ないのですが、entries_indexでは、この%othersをまるごと吹っ飛ばしているっぽいので、configプラグインで設定ファイルの存在を検知できていないような。なので、その部分をちょっと書き換えてやる必要があるかもないかも。本格的な対策はentries_indexを書き換えるべきなんでしょうけど、あれのコードはかなりトリッキーで僕にはちょっと正確に読めないです。configプラグインの

$blosxom::others{"$blosxom::datadir$path/config.$blosxom::flavour"}
  and eval { require "$blosxom::datadir$path/config.$blosxom::flavour" }
  and ( $@ ? warn $@ : last );
$blosxom::others{"$blosxom::datadir$path/config"}
  and eval { require "$blosxom::datadir$path/config" }
  and ( $@ ? warn $@ : last );

となっている部分を、

-e $blosxom::datadir$path/config.$blosxom::flavour
  and eval { require "$blosxom::datadir$path/config.$blosxom::flavour" }
  and ( $@ ? warn $@ : last );
-e $blosxom::datadir$path/config
  and eval { require "$blosxom::datadir$path/config" }
  and ( $@ ? warn $@ : last );

と、ファイルテスト演算子で存在確認するようにしたらちゃんと動作するようになりました。適当過ぎな改造ですので、あまり参考にしないほうが良いです。ていうか、正確に挙動をつかめてないですしね。

ちなみに、entries_indexを大幅に拡張したentries_cacheの方では、%othersをきちんと扱っているようなので、そのままでうまく動くような気がします。entries_indexはパフォーマンス的にも機能的にもちょっと落ちるので、entries_cacheが使える環境の場合はこちらを使った方が良いような気も。

blosxomの抱える大きな問題のひとつは、こういったプラグイン同士の相性かなぁ。基本的に多くのプラグインを使うことが多いでしょうしね。まぁ、大概はよーくコードを眺めてみれば解決できたりするわけなんですが(構造上巨大なプラグインというのはそう無いですし)。