blosxomのプラグインを作成する時に、エントリごとのページを閲覧している場合のみに動かしたいと考えることは良くあると思います。僕の作った物の中では、one_year_agoなんかがそうですね。その判定はどうやるのかということですよ。
プラグインの挙動にもよりますが、大抵の場合はstart
サブルーチンで、$blosxom::path_info
をチェックすることによって判定することになると思います。$blosxom::path_info
にはエントリごとのページを閲覧している場合、
foo/bar.html
というようなものになるので、
sub start {
if ($blosxom::path_info !~ /\./) {
return 0;
}
return 1;
}
一番単純に考えると、こんな感じでしょう。$blosxom::path_info
にピリオド(.)が含まれるかどうかをチェックしており、含まれなかった場合は0を返し、プラグインを停止させています。コレは単純明快で良いのですが、場合によっては不具合があります。具体的な例を挙げると、「.を含むディレクトリでカテゴリを掘っている場合」です。例えば、
$datadir/programming/ms.net
などという、Microsoft .NET関連のエントリを格納するカテゴリとして、ディレクトリを掘ったとすると、このカテゴリごとのページを閲覧している場合でも$blosxom::path_info
にピリオド(.)が含まれることになります。
programming/ms.net
などとなり、一見してエントリごとのページを閲覧している場合と判別できません。この判定には.$blosxom::flavour
で終わるかどうかというチェックが必要になります。
また、$blosxom::path_info
は$ENV{PATH_INFO}
をちょっと加工したものなので、この両者は似て非なるものです。その違いはindex.htmlなどは含まれないことや最初と最後のスラッシュ(/)が削除されることなどで、そのあたりのチェックは無用だったりします。
以上を踏まえると、エントリごとのページを閲覧している場合かどうかを判定するコードは、
sub start {
if ($blosxom::path_info !~ /\.$blosxom::flavour$/) {
return 0;
}
return 1;
}
となると思います。これでも万能ではなく、いろいろ考えるとメンドウなので、最初に書いたコードでも良いかも知れません。
おもむろに連載物になりそうなものを始めてみる。BPTは「blosxom plugin tips」の頭字語。「#1」とか付けたので、引っ込みがつかなさそうな気がするけど、流れが速いので書かなければバレナイ気がする。経験則100%で書いているので、ツッコミは大歓迎です。