Hail2u

BPT #1: エントリごとのページの閲覧かどうかを判定する方法

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%で書いているので、ツッコミは大歓迎です。