ziguzagu.org

HTML::TemplateからTemplateToolkitへ

TemplateToolkitを勉強中ですが、基本的なところを理解していないような気がするので、HTML::Templateでサポートしている構文を全部書いてみたりします。HTML::Templateは知ってるけど、TemplateToolkitはまだ未挑戦 or 基本理解してないかも、な人用(>自分)。

#!/usr/bin/perl
use strict;
use warnings;

my $usingTT = shift;

my %param = (
    var   =>  q{test},
    html  =>  q{&<>'"},
    url   =>  q{ +/'"},
    js    => qq{\n\r'"},
    bool  =>  1,
    array => [
        { name => 'omae', job => 'pg'      },
        { name => 'tim',  job => 'oreilly' },
        { name => 'aaaa', job => 'neat'    },
    ],
);

if ($usingTT) {
    require Template;
    my $tt = Template->new();
    $tt->process(\*DATA, \%param) or die $tt->error(), "\n";
}
else {
    require HTML::Template;
    my $tmpl = HTML::Template->new(filehandle => *DATA
                                   , died_on_bad_params => 0
                                   , loop_context_vars  => 1);
    $tmpl->param(\%param);
    print $tmpl->output();
}

__DATA__
<TMPL_VAR NAME="var">
[% GET var %]
[% var %]

--------------------------------------------

<TMPL_VAR NAME="var2" DEFAULT="default, ok">
[% var2 %]
[% DEFAULT var2="default" %][% var2 %]

--------------------------------------------

<TMPL_VAR ESCAPE=HTML NAME="html">
[% html FILTER html %]
[% html | html %]

--------------------------------------------

<TMPL_VAR ESCAPE=URL NAME="url">
[% url FILTER uri %]
[% url | uri %]

--------------------------------------------

<TMPL_VAR ESCAPE=JS NAME="js">
わからん ↓教えてもらったTemplate::Plugin::JavaScript
[% USE JavaScript %]
document.write("[% js | js %]");
document.write("[% FILTER js %]
Here's some text going on.
[% END %]");

--------------------------------------------

<TMPL_INCLUDE NAME="filename.tmpl">
[% INCLUDE filename.tmpl %]

--------------------------------------------

<TMPL_IF NAME="bool">
it's true
</TMPL_IF>
[% IF bool %]
it's true
[% END %]

--------------------------------------------

<TMPL_IF NAME="bool2">
it's true
<TMPL_ELSE>
it's false
</TMPL_IF>
[% IF bool2 %]
it's true
[% ELSE %]
it's false
[% END %]

--------------------------------------------

<TMPL_LOOP NAME="array">
Name: <TMPL_VAR NAME="name">
Job : <TMPL_VAR NAME="job">
</TMPL_LOOP>
[% FOREACH array %]
Name: [% name %]
Job : [% job %]
[% END %]

--------------------------------------------

<TMPL_LOOP NAME="array">
**********
<TMPL_IF NAME="__first__">@first</TMPL_IF>
<TMPL_IF NAME="__last__">@last</TMPL_IF>
<TMPL_IF NAME="__inner__">@inner</TMPL_IF>
<TMPL_IF NAME="__odd__">@odd</TMPL_IF>
No. : <TMPL_VAR NAME="__counter__">
Name: <TMPL_VAR NAME="name">
Job : <TMPL_VAR NAME="job">
**********
</TMPL_LOOP>
[% FOREACH array %]
**********
[% IF loop.first %]@first[% END %]
[% IF loop.last %]@last[% END %]
[% "@inner" IF !loop.first && !loop.last %]
[% "@odd" IF loop.count / 2 == 1 %]
No. : [% loop.count %]
Name: [% name %]
Job : [% job %]
**********
[% END %]

そして、謎ポイントと微妙にはまりポイント。

  • JavaScriptのescapeがよくわからず(正確にはJavaScriptも知らない)
  • そういえば、Cacheの指定ってどうしたらいいんだろうか?
  • loopオブジェクトを知らなかった(Template::Iteratorね)

とか。

とりあえずCache系がわかれば、HTML::TemplateじゃなくてTTを主に使うようになれるかな…。もう少しがんばりましょう。

参考:Template Toolkit Manual -テンプレートツールキット和訳マニュアル-

追記:JavaScriptのescapeにはTemplate::Plugin::JavaScriptが使えます(thanks to 海賊たろさん)。あと、Template::Plugin::JavaScript::Compactorというのも。