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行目)。
より実践的なコードは、writebackのstory
サブルーチンや、僕の作成したback_and_forthのhead
サブルーチンあたりで見ることが出来ます。
blosxomのtemplate
サブルーチンを利用した独自flavourを利用するようにプラグインを作成すると、ユーザーに優しいプラグインになると思います。一方で説明が面倒になることも否定はしないですが。