Perl Hackers Hub

第5回 Xslate 次世代テンプレートエンジン(3)

この記事を読むのに必要な時間:およそ 3 分

TTerse Template Toolkit互換の構文

KolonはXslateの機能を引き出すのに最適な構文です。しかしXslateでは,TT2からの移行を容易にするために,TT2のサブセットであるTTerseという構文も用意しています。

TTerseの使い方

TTerseを使うには,Text::Xslate->new()メソッドのsyntaxオプションに「TTerse」を渡します。別のディストリビューションとして配布しているText::Xslate::Bridge::TT2Likeを使うと,TT2組み込みのメソッドやフィルタを使えるようにもなりますリスト17)⁠

リスト17 TTerseの使い方(tterse.pl)

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の仕様は非常に大きく複雑なため,すべての機能を実装しているわけではありません。テンプレートの外部環境へアクセスするUSEディレクティブや,任意のPerlコードを実行するための構文など,機能の制約というコンセプトから逸脱しているために意図的に取り除いている機能もあります。リスト7のようにテンプレート式を自動エスケープする点もTT2とは異なります。ただしこれに関しては,二重エスケープを防止するメカニズムによって,htmlフィルタの適用結果はTT2とほぼ等しくなります。

また,TT2は記号の意味がコンテキストによって異なることがありますが,TTerseではそのようなケースをなくし,可能な限り意味が一意になるようにしています。そのような非互換な例としては,リスト18のようなものがあります。

リスト18 TTのあいまいな構文(ambiguous.tt)

[%# TT2:    FORに続く"="は"IN"と同じ意味になる
  # TTerse: "="は常に代入演算子なので構文エラー %]
[% FOR item = data %]...[% END %]

[%# TT2:    INCLUDEの引数のクォートは以下のように省略できる
  # TTerse: INCLUDEの引数のクォートは必須である。なぜなら
  #         foo.ttはfoo変数のttフィールドを参照している
  #         とみなすからである。よって以下は実行時エラー
[% INCLUDE foo.tt %]

TTerseを使うことの利点は,TT2に親しんだエンジニア/デザイナであれば,わずかな違いを覚えるだけで済むことです。その一方で,Xslateの大きな特徴の一つであるカスケードは利用できません。

Text::Clevery Smarty互換の構文

Text::CleveryはPHPのSmartyというテンプレートエンジンと互換性のある構文です。大規模な拡張なので別のディストリビューションにしていますが,CPANにアップロードしてあるので,Text::Xslate同様にCPANクライアントでインストールできます。Cleveryは既存のSmartyアプリケーションをPerlに移植することを想定しています。ただしSmartyの微妙な挙動を再現するために,実行速度はKolonやTTerseより若干遅くなる傾向があります。

Cleveryを使用するときは,リスト19のようにrender()にPSGI リクエストを渡すことで,$smarty.getや$smarty.postが使用できるようになります。

リスト19 Cleveryの使い方(clevery.pl)

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と異なる点がいくつかあるものの,Smartyに親しんだエンジニア/デザイナであればすぐに使いこなせるでしょう。しかしSmartyに慣れているのでなければ,あえてCleveryを選択する理由はありません。

Xslateの拡張

組み込み関数やメソッドについては,Xslateのコアは必要最小限に絞っています。しかし拡張性は確保しているため,関数やメソッドを追加することは簡単です。Xslateの拡張はperldoc Text::Xslate::Manual::Cookbookでもいくつか紹介しているため,そちらも参考にしてください。

モジュールを使う

カレントディレクトリを得るCwd.pmやJSONデータの操作に使うJSON.pmのような関数インタフェースを備えたモジュールは,リスト20のようにmoduleオプションで利用できます。

リスト20 moduleオプションの使い方(module.pl)

use Text::Xslate;
my $tx = Text::Xslate->new(
    module => [
        'Cwd', # デフォルトのimportを使う
        'JSON' => ['decode_json'], # 関数を指定
    ],
);
# 以下はカレントディレクトリを表示する
print $tx->render_string('<: cwd() :>'), "\n";

著者プロフィール

藤吾郎(ふじごろう)

ソフトウェアエンジニア。DeNAでスマートフォンアプリのミドルウェアやJSXなどを開発している。Perlとの付き合いも長く,Shibuya.pmやYAPC::Asiaにスピーカーとして参加もしている。

ブログ:http://d.hatena.ne.jp/gfx/

ハンドルネーム:gfx

コメント

コメントの記入