組み合わせ自由なツールキット
Template Toolkit,
たとえば,
もちろん差し替えられるのはフロントエンドだけではありません。たとえば,
テンプレート話の3回目となる今回は,
Template::Provider::Encoding
上でも例にあげたTemplate::Provider::Encodingは,
use strict;
use warnings;
use Template;
use Template::Provider;
my $tt = Template->new({
LOAD_TEMPLATES => [ Template::Provider::Encoding->new ],
});
ただし,
このエンコーディング問題についてはTT本体のほうでも対応が進められています。最初にUnicode対応が行われたのは2004年10月リリースのバージョン2.
use strict;
use warnings;
use Template;
my $tt = Template->new({ ENCODING => 'utf8' });
このように内部表現に変換したテンプレートは,
binmode STDOUT => ':utf8';
$tt->process('tmpl.tt', \%vars) or die $tt->error;
# または
$tt->process('tmpl.tt', \%vars, \my $output) or die $tt->error;
print Encode::encode(utf8 => $output);
- ※1
- このパフォーマンス上の問題についてはTTのパーサレベルで対応するハックが知られています。詳しくは宮川達彦氏の記事をご覧ください。
Template:Stash::AutoEscape
TTはもともと汎用のツールキットであるだけに,
この問題に対する対策はいくつか存在しますが,
use strict;
use warnings;
use Template;
use Template::Stash::AutoEscape;
my $tt = Template->new({
STASH => Template::Stash::AutoEscape->new,
});
$tt->process(\(my $tmpl =<<'TMPL'), {tag => '<foo>'}) or die $tt->error;
<div>[% tag %]</div>
<div>[% tag.raw %]</div>
TMPL
Template::Stash::AutoEscapeを使うと,
このrawメソッドはファイルのインクルードやHTMLを含むマクロなどを書くときに重宝しますが,
use strict;
use warnings;
use Template;
use Template::Stash::AutoEscape;
my $tt = Template->new({
STASH => Template::Stash::AutoEscape->new({
ignore_escape => [qw/hl_raw/],
}),
});
$tt->process(\(my $tmpl =<<'TMPL'), {tag => '<foo>'}) or die $tt->error;
[% MACRO hl(s) GET '<span class="highlight">' _ s _ '</span>' -%]
[% MACRO hl_raw(s) GET '<span class="highlight">' _ s.raw _ '</span>' -%]
[% USE hlformat = format('<span class="highlight">%s</span>') -%]
<div>[% hl('searched word').raw %]</div>
<div>[% hl('<foo>searched word</foo>').raw %]</div>
<div>[% hl_raw('<foo>searched word</foo>') %]</div>
<div>[% hlformat('<foo>searched word</foo>').raw %]</div>
TMPL