Xslateのインストール
それではいよいよXslateの解説に入ります。まず、
Xslateの基本的な使い方
基本的な使い方は、
名前 | デフォルト値 | 説明 |
---|---|---|
cache | 1 | 0:キャッシュ 1:キャッシュが古くなければ使用する 2:可能な限りキャッシュを使用する |
cache_ | ※2参照 | キャッシュを置くディレクトリ |
type | html | HTMLでないテキストを生成するときは、 |
footer | [ ] | 自動的に追加されるフッタのリスト |
function | { } | テンプレート内にエクスポートする関数 |
header | [ ] | 自動的に追加されるヘッダのリスト |
input_ | :utf8 | openに渡すオプション:encoding(cp932)など |
line_ | : | 1行テンプレートコードの開始文字列 |
module | [ ] | 関数をインポートするモジュール |
path | ["."] | テンプレートファイルを検索する場所。ディレクトリ名ないしハッシュリファレンスのリスト |
syntax | Kolon | テンプレートの構文 |
tag_ | <: | テンプレートタグの開始文字列 |
tag_ | :> | テンプレートタグの終端文字列 |
verbose | 1 | 0:警告をなるべく発しない 1:明らかな誤りのみ警告を発する 2:誤りの可能性をすべて警告する |
※1)
※2)
※3)
use strict;
use Text::Xslate;
my %vpath = (
header => "- - - - - - - - - - -\n",
footer => "- - - - - - - - - - -\n",
hello => "Hello, Xslate world!\n",
);
my $tx = Text::Xslate->new(
path => \%vpath,
header => ['header'],
footer => ['footer'],
);
print $tx->render('hello');
# =>
# - - - - - - - - - - -
# Hello, Xslate world!
# - - - - - - - - - - -
以降でそれぞれの構文について説明していきますが、
Kolon Perl 6ライクな独自構文
Xslateは複数の構文をサポートしており、<: ... :>
で囲ったインラインコードと、:
で始まる1行コードを埋め込むことができます。コメントはPerlと同じく#
から行末までです。
テンプレート式
テンプレート式はPerl 5をベースにTT2やPerl 6からいくつかの機能を取り込んだ形になっています。
単純な変数の参照は、$
」@
や%
は使いません
(1) 変数の参照
<: $foo :>
(2) フィールドの参照
<: $obj.bar # Perl: $obj->bar() :>
<: $hashref.bar # Perl: $hashref->{bar} :>
<: $arrayref.0 # Perl: $arrayref->[0] :>
(3) フィールドの参照(添え字の使用)
<: $value["baz"] # $value.bazと同じ :>
<: $value[0] # $value.0と同じ :>
(4) メソッドの呼び出し
<: $obj.method(foo => 'bar') :>
<: $obj.method({ foo => [42] }) :>
(5) メソッドの呼び出し(組み込みメソッド)
<: $arrayref.sort(-> $a, $b { $a <=> $b }).join(" ") :>
<: $hashref.keys().join(", ") :>
(6) フィールドの参照と組み込みメソッドの呼び出しの区別
<: $hashref.keys # "keys"フィールドを参照する :>
<: $hashref.keys() # ハッシュキーのリストを返す :>
(7) Perl 5由来の演算子
<: defined $a
? "a is defined"
: "a is undefined" :>
<: $a == "foo" # $aが"foo"と等しいかどうか :>
<: $a == nil # $aが未定義かどうか(defined $aと同じ):>
<: $v != ($i + 10) # 複雑な演算も可能 :>
(8) Perl 6由来の演算子
<: "foo" ~ "bar" # 文字列連結 :>
<: 10 min 20 # 小さいほう: 10 :>
<: [10, 20, 30].reduce(-> $a, $b { $a max $b }) # 30 :>
(9) defined-or演算子
:# $a定義がされていれば$a、未定義ならば"default"
<: $a // "default" :>
(10) フィルタの適用
<: $a | dump # dump($a) と同じ :>
<: $x | f | g # g(f($x)) と同じ :>
フィールドアクセスはTT2に似ており、
フィールドアクセスに任意の式を使いたいときは、
オブジェクトに対しては任意のメソッドを呼び出すことができます。このとき、
オブジェクトでない値に対してメソッドを起動するとオートボックスperldoc Text::Xslate::Manual::Builtin
に一覧があります。なお、
テンプレート式では演算も行えます。演算子はPerl 5のものがほぼそのまま使えます==
は少し特殊で、
Perl 5.//
は、
TT2由来のフィルタ演算子|
も使えます。これは関数呼び出しのシンタックスシュガー
制御文
制御文はif、-> $var
)
:# ifの括弧は不要
:if $count >= 10 {
$countは10以上です。
: }
:# $itを使わないならトピック変数は省略できる
:given $a -> $it {
: when "foo" {
$aは"foo"です。
: }
: when $it == "bar" or $it == "baz" {
$aは"bar"ないし"baz"です。
: }
: default {
$aは"foo"でも"bar"でも"baz"でもありません。
: }
:}
:# whileはイテレータに対して使用可能
:# 以下はwhile(defined(my $row = $dbh.fetch())) と同じ
: while defined $dbh.fetch() -> $row {
<: $row.join(" ") :>
: }
forループもPerl 6風です。また、
:# forではトピック変数の省略はできない
: for $arrayref -> $item {
<: $item # 一つ一つの要素 :>
<: $~item # ループカウンタ(0 origin):>
<: $~item.count # ループカウンタ(1 origin):>
<: $~item.max_index # Perlの $#{$arrayref} と同じ :>
<: $~item.is_first # $~item == 0 :>
<: $~item.is_last # $~item == $~item.max_index :>
<: $~item.cycle("even", "odd")
# even -> odd -> even -> ... :>
: }
テンプレートカスケーディング
Kolonはテンプレートカスケーディング
TT2のユーザであればWRAPPERという機能をご存じかもしれません。これは、
カスケードはTT2のWRAPPERのスーパーセットであり、
Template Toolkit 2のWRAPPER機能
それではまず、
WRAPPERを使うには基本となるベーステンプレートを用意します
<!doctype html>
<html>
<head><title>[% title %]</title></head>
<body>
[% content -%]
</body>
</html>
次に、
[% WRAPPER "base.tt" WITH title = "Welcome to my site!" -%]
<p>Hello, world!</p>
[% END -%]
これを処理すると、
<!doctype html>
<html>
<head><title>Welcome to my site!</title></head>
<body>
<p>Hello, world!</p>
</body>
</html>
Xslateのテンプレートカスケーディング
それでは、
まずベーステンプレートでは、
<!doctype html>
<html>
<head><title><: $title :></title></head>
<body>
: block content -> { "default content" }
</body>
</html>
そしてサブテンプレートでは、
: cascade base { title => 'Welcome to my site!' };
: override content -> {
<p>Hello, world!</p>
: }
出力は、
カスケードがWRAPPERより優れている点は、