((2))。
フィールドアクセスに任意の式を使いたいときは、[]演算子を使います。Perlと異なり、ハッシュに対するアクセスでも{}は使いません((3))。
オブジェクトに対しては任意のメソッドを呼び出すことができます。このとき、Perlと同様にハッシュリファレンスや配列リファレンスのリテラルを書くこともできます((4))。
オブジェクトでない値に対してメソッドを起動するとオートボックス[5]が働きます((5))。組み込みメソッドについてはperldoc Text::Xslate::Manual::Builtin
に一覧があります。なお、フィールドの参照とあいまいになることを避けるため、オートボックスによるメソッド呼び出しには括弧を必須にしています((6))。
テンプレート式では演算も行えます。演算子はPerl 5のものがほぼそのまま使えます((7))。また、Perl 6由来の演算子もいくつかあります((8))。機能や優先順位は元になった演算子とほぼ同じです。ただし比較演算子==
は少し特殊で、nil[6]を特別扱いし、文字列にも適用できます。
Perl 5.10から使用可能となったdefined-or演算子//
は、たとえXslateがPerl 5.8上で動いているとしても使用できます((9))。
TT2由来のフィルタ演算子|
も使えます。これは関数呼び出しのシンタックスシュガー(糖衣構文)です((10))。
制御文
制御文はif、given-when、for、whileをサポートしています。これらはPerl 6と同様に括弧を使わなくて済むようになっています。また、for、given、whileは、リスト10のようにポインティ構文(-> $var
)でトピック変数[7]を指定できますが、これもPerl 6から拝借したものです。
forループもPerl 6風です。また、これはKolonの独自仕様ですが、リスト11のようにループコンテキストにアクセスするための特殊な記法を用意しています。なお、forループで使用できるのは配列リファレンスだけなので、配列以外の値は配列リファレンスに変換する必要があります。ハッシュリファレンスであれば、keys()やvalues()などの組み込みメソッドが配列のリファレンスを返すのでこの用途に使えます。
テンプレートカスケーディング
Kolonはテンプレートカスケーディング(以下カスケード)という機能を持っています。カスケードは、複数のテンプレートファイルを組み合わせて1つの出力を得る機能です。これはちょうど、カスケーディングスタイルシート(CSS)のように、ベースとなるテンプレートにコンポーネントを重ね合わせて表現を追加していくことから名付けました[8]。
TT2のユーザであればWRAPPERという機能をご存じかもしれません。これは、ベースとなるテンプレートで基本的な枠組みを作り、サブテンプレートでその枠組みの内容を埋めるというやり方でテンプレートを構築する機能です。これは基本的にヘッダ・フッタとページの内容を分離するための機能です。ヘッダとフッタを同じファイルに入れることができるため、HTMLタグの整合性を保つことができ、ほかのテンプレートエンジンでよく見られるincludeで分割するやり方よりもメンテナンスしやすいと言われています。
カスケードはTT2のWRAPPERのスーパーセットであり、WRAPPERで実現できることはカスケードでも実現できます[9]。
Template Toolkit 2のWRAPPER機能
それではまず、TT2でWRAPPERを使ってみましょう。
WRAPPERを使うには基本となるベーステンプレートを用意します(リスト12)。このファイルから見ると、contentキーワードにWRAPPERの呼び出し元(サブテンプレート)のブロックが入ります。そのほかのテンプレート変数は通常どおり参照できます。
次に、ページ内容を入れたサブテンプレートを用意し、WRAPPERディレクティブを使います(リスト13)。このファイルから見ると、WRAPPERディレクティブの行がヘッダに、ENDキーワードの行がフッタに置き換わる、と見ることができます。また、WRAPPERと共にWITHキーワードで新たなテンプレート変数を導入できます[10]。
これを処理すると、出力はリスト14のようになります。
Xslateのテンプレートカスケーディング
それでは、このWRAPPER機能をカスケードで実装してみます。
まずベーステンプレートでは、content変数を参照する代わりに、blockキーワードで置き換え可能なブロックを定義します(リスト15)。WRAPPERと異なり、ブロックの名前や数には制限がありません。リスト15ではTT2に合わせてtitleをテンプレート変数で表現していますが、これもブロックにすることができます。
そしてサブテンプレートでは、ブロック修飾子キーワードを使ってベーステンプレートのブロックを修飾します(リスト16)。ブロック修飾子はoverride、around、before、afterがあり、overrideとaroundは元のブロックを置き換えるために[11]、beforeとafterは元のブロックの前後に内容を追加するために使います。
出力は、WRAPPER版のリスト14とまったく同じです。
カスケードがWRAPPERより優れている点は、置換ブロックが1つに制限されないこと、置換ブロックにデフォルト値を設定できること、ベーステンプレートの置き換えブロックをサブテンプレートから参照できることです。