« TechnoratiのTag検索ページをみて思った。 | メイン | Femoに設定機能がつきました。 »

HTML::Template 2.8 Release でHTML::Template::Plugin::Dotを再テスト

HTML::Templateのバージョン2.8がリリースされました
いくつか変更点はあるのですが、

- Bug Fix: Changed HTML::Template to help sub-classes by called _new_from_loop() via ref($self) rather than hard-coding the package name. [Mark Stosberg]

とある通り、HTML::Templateとハードコーディングされているところがなくなって、サブクラスが作りやすくなってます。んで、このpatchを出していたMark Stosbergさんが作っているHTML::Template::Plugin::Dotが正しく使えるようになってます。

以前試した時は、HTML::Templateにpatchをあてるか、メソッドを上書き必要がありました。

サンプルはあまり面白くないのでソースだけで、
CGI::Appベースのアプリケーションで

sub dispatch_index{
    my $self = shift;
    $self->stash->{test}="sample data";
    $self->stash->{tags}=[
        {tag=>'foo',fsize=>10},
        {tag=>'bar',fsize=>18},
        {tag=>'baz',fsize=>14}
    ];
    my $tmpl=$self->tmpl_plugindot_load(
        'index.tmpl.html',
        die_on_bad_params=>0,
        loop_context_vars=>1,
        associate=>$self->query
    );
    $tmpl->param('c',$self);
    return $tmpl->output;
}

こんなようなrun_modeを作成。
stashはCGI::Application::Plugin::Stashを利用してます。
tmpl_plugindot_loadはCGI::Application::Plugin::HTDotが使いにくいので適当にでっちあげたプラグインのメソッド。

テンプレートは、

<h2><!-- TMPL_VAR NAME=c.stash.test ESCAPE=HTML --></h2>
<!-- TMPL_LOOP NAME=c.stash.tags:tag --><!-- TMPL_IF NAME=__FIRST__ --><ul>
<!-- /TMPL_IF --><li style="font-size:<!-- TMPL_VAR NAME=tag.fsize ESCAPE=HTML -->pt;"><!-- TMPL_VAR NAME=tag.tag ESCAPE=HTML --></li>
<!-- TMPL_IF NAME=__LAST__ --></ul><!-- /TMPL_IF --><!-- /TMPL_LOOP -->


こんな感じで、実行すると。

<h2>sample data</h2>
<ul>
<li style="font-size:10pt;">foo</li>
<li style="font-size:18pt;">bar</li>
<li style="font-size:14pt;">baz</li>
</ul>


こう想定通りなりました。

うまく動いたけど、 これを使う機会はなかなかないだろうなぁ。。。