Perl: TTerse テンプレート文法

TTerse ではテンプレート用のタグは [% %] で囲います。
[%- -%] とすると、このタグの前後の改行を省略できます。

変数の作成

[% SET hash = { data = ['hoge', 'hage'] } %]

SET キーワードは無くても OK。

演算

[% 2014 + 2 + 24 %]

文字列連結

[% 'kani'_'miso' %]

IF

[% IF today.strftime('%m%d') == '01/01' %]
正月
[% ELSIF today.wday() == 1 or today.wday() == 7 %]
土日
[% ELSE %]
その他
[% END %]

SWITCH

[% SWITCH lang %]
[% CASE 'ja' %]こんにちは
[% CASE 'en' %]Hello
[% CASE DEFAULT %]ギャアアアア
[% END %]

FOREACH

[% arrayref = ['あ','い','う','え','お'] %]
[% FOREACH item IN arrayref %]
    [%- IF loop.is_first -%]
    (はじまるよー
    [%- END -%]
    ---
    * [% loop.index             # index値: 0 スタート %]
    * [% loop.count             # カウント: 1 スタート %]
    * [% loop.body[loop.index]  # 中身 %]
    * [% loop.size              # 配列の大きさ %]
    * [% loop.max_index         # 最大 index (loop.size - 1) %]
    * [% loop.peek_next         # 次の内容 loop.body[ loop.index + 1 ] なければ空 %]
    * [% loop.peek_prev         # 前の内容 loop.body[ loop.index - 1 ] なければ空 %]
    [%- IF loop.is_last -%]
    おわるよー)
    [%- END -%]
[% END %]

INCLUDE

[% INCLUDE 'views/child.tt' WITH word = 'ワード' %]

TTerse: child.tt

[% word %]

WRAPPER

コンテンツをラップする共通タグ部分を、コンテンツ側から呼び出す仕組みです。

TTerse: content.tt

[% WRAPPER 'views/wrapper.tt' WITH title='Hello', class='page__hello' %]
<h1>こんにちは</h1>
[% END %]

TTerse: wrapper.tt

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>[% title %]</title>
</head>
<body class="[% class %]">
[% content %]
</body>
</html>

Perl: Xslate レンダー部分

my $html = $template->render('views/content.tt', {});
print Encode::encode('utf-8', $html);

FILTER

関数呼び出しのことです。

HTML エスケープする

[% user_name | html %]

普通っぽい書き方もできる

[% html(user_name) %]

Xslate ではデフォルト HTML エスケープされるが、type=>text にするとされなくなる

URI エスケープする

[% profile_uri | uri %]

データをダンプする

[% data | dump %]

カスタム FILTER

自分で Perl で定義した関数を呼び出すことができます。

JSON 化する FILTER

TTerse: content.tt

[% links | json %]

Perl: Xslate レンダー+初期化部分

use strict;
use warnings;
use utf8;

use Encode;
use Text::Xslate;
use JSON;

my $template = Text::Xslate->new(syntax => 'TTerse', function => {
    json => sub {
        my $hashref = shift;
        my $json = JSON->new->encode($hashref);
        return Text::Xslate::mark_raw($json);
    }
});

my $html = $template->render('views/content.tt', {
    links => [
        { text => '<blog>', href => 'http://feb19.jp/blog' },
        { text => 'Twitter: <@feb19>' },
    ],
});
 
print Encode::encode('utf-8', $html);