Blosxom

HTML::Template を使うプラグイン

デフォルトの interpolate 手続きを上書きして、 HTML::Template でフレーバーを記述できるようにするプラグインです。


たとえば、 $plugin::param という変数の内容を表示させたいときは、 <TMPL_VAR NAME=plugin/param> と書きます。 「::」を「/」に置き換えるのがみそです。

これで、条件分岐やループなどもすっきり書けるようになるはず。

ただし、 すでにあるフレーバーを書き換えるのは面倒なので、 もともとの $plugin::param という形式もそのまま使えるようにしています。

# -*- perl -*-

package html_template;

use HTML::Template;

sub start { 1 }

sub interpolate {
    \&_do_interpolate;
}

sub _do_interpolate {
    my $text = shift;

    my $template = HTML::Template->new_scalar_ref (\$text,
						   die_on_bad_params => 0,
						   filter => \&_template_filter,
						   );

    my @params = $template->param ();

    for my $p (@params) {
	my $type = $template->query (name => $p);
	my ($plugin, $name) = split (m[/], $p);

	if ($type eq 'VAR') {
	    $template->param ($p => eval "\$${plugin}::${name}");
	} elsif ($type eq 'LOOP') {
	    $template->param ($p => eval "\\\@${plugin}::${name}");
	} else {
	    die "param \"$p\": unknown type: $type";
	}
    }

    $template->output;
}

sub _template_filter {
    my $ref = shift;

    $$ref =~ s|\$(\w+)::(\w+)|<TMPL_VAR NAME=$1/$2>|g;
    $$ref =~ s|\$(\w+)(?!::)|<TMPL_VAR NAME=blosxom/$1>|g;
}

1;

Comments