TTerse Template Toolkit互換の構文
KolonはXslateの機能を引き出すのに最適な構文です。しかしXslateでは、
TTerseの使い方
TTerseを使うには、
use Text::Xslate;
my $tx = Text::Xslate->new(
syntax => 'TTerse',
module => ['Text::Xslate::Bridge::TT2Like'],
);
my $template = 'Hello, [% $lang | upper %] world!';
my $result = $tx->render_string(
$template,
{ lang => 'Template' },
);
print $result, "\n";
# => 'Hello, TEMPLATE world!'
TT2とTTerseの違い
TTerseは既存のTT2テンプレートを置き換えることを目的としており、
また、
[%# TT2: FORに続く"="は"IN"と同じ意味になる
# TTerse: "="は常に代入演算子なので構文エラー %]
[% FOR item = data %]...[% END %]
[%# TT2: INCLUDEの引数のクォートは以下のように省略できる
# TTerse: INCLUDEの引数のクォートは必須である。なぜなら
# foo.ttはfoo変数のttフィールドを参照している
# とみなすからである。よって以下は実行時エラー
[% INCLUDE foo.tt %]
TTerseを使うことの利点は、
Text::Clevery Smarty互換の構文
Text::CleveryはPHPのSmartyというテンプレートエンジンと互換性のある構文です。大規模な拡張なので別のディストリビューションにしていますが、
Cleveryを使用するときは、
use Text::Clevery;
my $tc = Text::Clevery->new();
my %env = (QUERY_STRING => 'lang=Clevery');
print $tc->render_string(<<'TPL', {}, env => \%env);
Hello, {$smarty.get.lang} world!
TPL
# => Hello, Clevery world!
CleveryもやはりSmartyと異なる点がいくつかあるものの、
Xslateの拡張
組み込み関数やメソッドについては、
モジュールを使う
カレントディレクトリを得るCwd.
use Text::Xslate;
my $tx = Text::Xslate->new(
module => [
'Cwd', # デフォルトのimportを使う
'JSON' => ['decode_json'], # 関数を指定
],
);
# 以下はカレントディレクトリを表示する
print $tx->render_string('<: cwd() :>'), "\n";
関数を追加する
クラスメソッドを使うインタフェースを備えたモジュールを使うには、
リスト21はfunctionオプションを使用する一例です。
use Text::Xslate;
use Text::Xslate::Util qw(html_escape html_builder);
use URI (); # クラスライブラリ
use CGI qw(p); # HTMLを生成するモジュール
my %funcs = (
URI => sub { URI->new(@_) },
p => html_builder {
my($text) = @_;
# 引数はエスケープされないので手動でする
return p( html_escape($text) );
},
);
my $tx = Text::Xslate->new(
function => \%funcs,
);
print $tx->render_string(<<'T', { foo => '<foo>'});
<: URI("http://example.com/foo/").host :>
<: p($foo) :>
T
# => example.com
# <p><foo></p>
メソッドを追加する
オブジェクトについては、perldoc Text::Xslate::Bridge
を参照してください。なお、
落穂拾い
最後に、
UTF-8の扱い
Xslateの文字列の扱いは、
テンプレートファイルのエンコーディングはデフォルトではUTF-8とみなしますが、
xlsateコマンド
Xslateをインストールすると、
詳細はperldoc xslate
を参照してください。
マクロ
Xslateはマクロもサポートしています。マクロはKolonとTTerseで利用でき、
詳細はperldoc Text::Xslate::Syntax::Kolon
およびperldoc Text::Xslate::Syntax::TTerse
を参照してください。
Data::Section::Simpleとの連携
Text::Xslate->new()メソッドのpathオプションにハッシュリファレンスを渡せることはすでに述べました。この機能と__
以下のデータを構造化するData::Section::Simpleを組み合わせると、
具体例はperldoc Text::Xslate::Manual::Cookbook
にあります。
デバッグ
テンプレートのデバッグにはdumpフィルタが使えます。これは、perldoc Text::Xslate::Manual::Debugging
にまとめてあります。
おわりに
本記事では、
次回の執筆者は奥一穂さんで、