BPT #2: 独自flavourを利用する方法

blosxomの出力に、プラグインで生成した何か(大抵の場合はHTMLとか)を追加したいことは良くあること、というか半分以上のプラグインはそういった類いの機能が目的なモノだと思います。この場合、ごく単純なもの(単なるリストとか)を生成する場合にはプラグインのコードに直接HTMLなりなんなりをガリガリ書いてしまえば良いのですが、それなりにユーザーに出力いじれるようにするためには何かしらのテンプレート・システムを採用する必要があります。そのシステムはプラグイン内で独自に作り上げてやっても、HTML::Templateなりを利用しても良いのですが、blosxomにはせっかくflavourという仕組みがあるのでそれを利用しない手は無いでしょう。

プラグインから独自のflavourを利用するには、blosxomのtemplateというサブルーチンを呼んでやります。ここで注意するのは、プラグインでtemplateサブルーチンを利用するのではないということ。プラグインのドキュメントに、

The template subroutine offers the plugin the chance to swap in a replacement for the default template subroutine (the one that brings in your flavour templates).

とあるように、プラグインでtemplateサブルーチンを利用するという事が意味するのは、デフォルトのテンプレートを差し替えるということです(よくわからない説明になってますけど、察してください)。

blosxomのtemplateサブルーチンは、

my $tmpl = &$blosxom::template($path, $chunk, $flavour);

という形で呼び、$tmplには、$datadir/$path/$chunk.$flavourというファイルの中味がそのまま格納されます。$path$blosxom::path_infoなどをそのまま渡してやり、$chunkはプラグイン名などを利用、$flavour$blosxom::flavourをそのまま渡すと、blosxomの挙動を真似することが出来、わかりやすく(ユーサーにもデベロッパーにも)ます。実際のコードを書いてみると、

package foo;

use strict;
use vars qw($bar);

my $hoge = 'hogehoge';

sub start {
  $bar = &$blosxom::template($blosxom::path_info, 'foo', $blosxom::flavour);
  $bar =~ s/\$foo::hoge/$hoge/ge;

  return 1;
}

1;

という感じになります。これでhead.htmlなどで$foo::barと書いておくと、その場所にfoo.htmlというflavourの中味が入ることになります。blosxomのtemplateサブルーチンは、blosxomのinterpolateサブルーチンが呼ばれないので、独自flavour内のblosxomスタイルの変数は自前で処理してやる必要があります(10行目)。

より実践的なコードは、writebackstoryサブルーチンや、僕の作成したback_and_forthheadサブルーチンあたりで見ることが出来ます。

blosxomのtemplateサブルーチンを利用した独自flavourを利用するようにプラグインを作成すると、ユーザーに優しいプラグインになると思います。一方で説明が面倒になることも否定はしないですが。