テンプレートの記述もPerlで - Template::Declareを使う

こんにちは、Perl担当の西山です。
これまでJifty::DBI、Template::WWW::DeclareとWebフレームワークJiftyの周辺モジュールについて書きましたが、今回はViewに関わる部分であるTemplate::Declareというモジュールを取り上げようと思います。
特徴
Template::Declare(以下TD)は、HTML::MASONやTemplate::Toolkitなどに並ぶテンプレートエンジンですが、他のものには無い特徴を持っています。- すべてのテンプレートは100% Pure Perlで記述する
- 宣言的なシンタックス
- Mixinや継承などのオブジェクト指向の機能を利用可能(Perlなので)
- HTML/XUL/RDF/XMLなどの形式に対応(その他の形式も拡張可能)
簡単な例でPerlではデファクトのテンプレートエンジンであるTemplate::Toolkit(以下TT)と比較してみましょう。
配列データを元にHTMLでリストを出力するような場合、
TTでは以下のように書くと思います。
<ul>
[% FOREACH a IN array %]
<li>[% a %]</li>
[% END %]
</ul>
TTに限らず、HTMLなどのデザインを主としてそれに対してロジックを組み込むようなタイプのテンプレートエンジンでは、記法の多少の違いはあれど大体上記のような書き方になるのではないでしょうか。
一方TDでは以下のようになります。
template list => sub {
ul {
for my $a (@array) {
li { $a }
}
}
};
使い方は・・・と思いましたが、結構見たままですよね。
"list"という名前でHTMLのリスト構造をテンプレートとして定義していて、
その後は以下のようにshow関数を使って名前でテンプレートを呼び出すことができます。
show 'list'
HTMLのタグはすべて同名の関数として用意されていて、通常のPerlコードと同じように使えます。
※Perlにもともとtrという名前の演算子が用意されている関係でtr/tdタグのみそれぞれrow/cellという別の名称の関数にマッピングされています。
TTなど他のテンプレートエンジンはロジック部分にそれぞれ(しかも結構独特な)文法を用意していて、メインの言語とは別に覚えないといけないですが、
TDならば変数への値の格納やループ処理はそのままPerlの文法で書けます。
外部モジュールを使う場合もいちいちテンプレート用のプラグインを作る必要も無いです。





最近のコメント
eil on lightboxをカスタマイズしてみよう(中編)- 角丸対応ライブラリとCanvas: 上のコメントと同じで
エイミイ on lightboxをカスタマイズしてみよう(中編)- 角丸対応ライブラリとCanvas: Lightview導
bokutin on JiftyでWebアプリをつくる - ログイン機能を作る: おいしそうなJift
yattokoSattoko on JiftyでWebアプリをつくる - Windowsにインストール: 貴重なご指導感謝しま
junya on Ruby on Rails を使ってひとりでサービスを作ってみよう: Ubuntu なかな
ryu on Ruby on Rails を使ってひとりでサービスを作ってみよう: おや、マジでUbun
junya on Ruby on Rails を使ってひとりでサービスを作ってみよう: yuki さん、 コ
yuki on Ruby on Rails を使ってひとりでサービスを作ってみよう: 「Getting R