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というのも。