Perl Hackers Hub

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

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

本連載では第一線のPerlハッカーが回替わりで執筆していきます。今回は藤吾郎さんで,テーマはXslateです。

はじめに

PerlとWebアプリケーションとの相性の良さは周知のとおりです。そして,Web開発にはテンプレートエンジンが欠かせません。テンプレートエンジンは,プレゼンテーションとロジックを分離し,デザイナとプログラマの分業を可能にし,MVCModel-View-Controller)のV(Viewを担う重要な要素です。

今回は,そんなテンプレートエンジンンの一つであり,筆者が開発しているXslateを紹介します。Xslateは2010年4月に開発を始めた新しいモジュールですが,速度・安定性・機能ともに高い水準になってきました。また,牧大輔氏や松野徳大氏をはじめとしたShibuya.pmの面々に多くのアドバイスをいただき,既存のテンプレートエンジンを置き換えられるくらい実用的になってきました。

なお,本記事のコードはPerl 5.8.1以上で動作します。また,Text::Xslateのバージョン0.2000に基づいています。

テンプレートエンジンとは

Xslateの解説に入る前に,テンプレートエンジン一般について概説します。テンプレートエンジンは基本的に,文字列に変数を埋め込むために使います。つまり,根本的な目的は組み込み関数のsprintf()と同じです。

たとえばリスト1のようなsprintf()を使ったコードがあるとします。単純な変数の埋め込みではこれで十分なのですが,sprintf()では埋め込む変数に名前を付けることができないため,この方法で大きなテキストやHTMLを生成するのは難しいでしょう。

リスト1 sprintf()でテキスト生成(use_sprintf.pl)

my $template = 'Hello, %s world!';
my $result   = sprintf $template, 'Template';
print $result, "\n"; # => 'Hello, Template world!'

そこでテンプレートエンジンを使うと,リスト2のように埋め込む変数に名前を付けることができます。コード量は増えてしまいましたが,これならば大きなテキストに大量の変数を埋め込むことが簡単にできます。

リスト2 Xslateでテキスト生成(use_xslate.pl)

use Text::Xslate;
my $tx       = Text::Xslate->new();
my $template = 'Hello, <: $lang :> world!';
my $result   = $tx->render_string(
    $template,
    { lang => 'Template' },
);
# => 'Hello, Template world!'

ほかにも一般的なテンプレートエンジンには,テンプレートをファイルから読み込んだり,配列などのコレクションを展開したりする機能がありますリスト3)。

リスト3 テンプレートの基本機能(basic_template.pl)

use Text::Xslate;
my $tx       = Text::Xslate->new();
my $template = <<'TMPL';
:# 配列をforループで展開する
: for $data -> $item {
    <: $~item.count :>. <: $item :>
: }
TMPL
my %vars     = (
    data => [qw(Apple Banana Pear)],
);
# ファイルから読み込んでレンダリング
print $tx->render_string($template, \%vars);
# =>
#    1. Apple
#    2. Banana
#    3. Pear

Webアプリケーションのような最終的にテキストを生成するアプリケーションでは,テンプレートエンジンが非常に役に立ちます。

Xslateに至る道

さて,PerlがWebアプリケーション開発に使われるようになったころから,無数のテンプレートエンジンが開発されてきました。古くからあるものとしてはHTML::TemplateやHTML::Masonなどがあり,またWebアプリケーションフレームワーク(以下WAF)が独自のテンプレートエンジンを実装していることも珍しくありません。

特に,以降で紹介する2つのテンプレートエンジン,Template Toolkit 2(以下TT2)Text::MicroTemplate(以下TMT)は,高機能で現在でもよく使われています。

Template Toolkit 2

TT2は非常に多機能で人気のあるテンプレートエンジンです。Catalystなど多数のWAFから利用できますし,TT2を解説する書籍も出版されています。TT2はPerlにおける事実上の標準テンプレートエンジンと言っても過言ではありません。TT2の基本的な使い方はリスト4のようになります。

リスト4 TT2の基本的な使い方(hello_tt2.pl)

use Template;
my $tt       = Template->new();
my $template = 'Hello, [% lang | html %] world!' . "\n";
$tt->process(\$template, { lang => '<TT2>' }, \*STDOUT)
    or die $tt->error;
# => 'Hello, &lt;TT2&gt; world!'

しかし,TT2は豊富な機能を持つ一方で,実行速度が遅いことがしばしば指摘されています。Template::TinyやTemplate::Alloyなど,TT2互換の軽量な実装がいくつか開発されていることは,TT2の人気と実行速度への不満の双方の特徴を表していると言えるでしょう。

また,TT2をHTML生成に使用する場合,安全なテンプレートを書くのが難しいというセキュリティ面での問題があります。リスト4では,htmlフィルタによってHTMLのメタ文字を手動でエスケープしているのにお気づきでしょうか。TT2ではテンプレート式のエスケープを常に意識しなければならないため,「エスケープ漏れ」による事故を防ぐのが難しいのです。

著者プロフィール

藤吾郎(ふじごろう)

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

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

ハンドルネーム:gfx

コメント

コメントの記入