はちゅにっき

こっちのブログはまったり更新

Xslate に入門しつつ Tiffany とか Ark とか

最近はもっぱら PHP を書いている magicalhat です。
それでもやっぱり Perl が好き。

というわけで、id:gfx さんの新作 Xslate という新しいテンプレートエンジンが登場したとか、それがすごく速いとか、そんなウワサを耳にしたので入門してみることに。
ついでなので、最近鋭意お勉強中の Ark から Xslate を使ってみることにしました。
参考にしたのは、id:punitan さんが Blog で紹介されていた http://xslate.org/intro.html のサンプルプログラムです。
# いつものことですが、参考というよりもパクりです

Ark::View::Xslate をつくってみる

Ark が標準でサポートしているのは JSON / MT (Text::MicroTemplate::Extended) / TT (Template-Toolkit) のみなので、新しく Ark::View::Xslate をつくってみることに。
といっても、既存の Ark::View::MT をそのままコピーペして。。。
↓こんなかんじで完成。

Ark からつかってみる

作成した Ark::View::Xslate を使って http://xslate.org/intro.html のサンプルと同じ出力を得るための Ark のアプリケーションはこんな (↓) かんじに*1

Ark から Xslate してみる版
http://github.com/magicalhat/p5-axtest/tree/xslate

いまどき Controller にロジックを書くひとって。。。

なんかスマートじゃないよね。。。

何も考えずに Ark::View::MT を参考にコピペしてしまったので、なんか設定項目がたくさんあってスマートじゃないよねぇ。とか考えていたら

http://twitter.com/__gfx__/status/20446194779
http://twitter.com/__gfx__/status/20446202825

まったくもってその通りですね!
というわけで、options だけを残して。。。
と思っていたら、id:tokuhirom さんのこの記事が。

Tfall あらため Tiffany
http://d.hatena.ne.jp/tokuhirom/20100809/1281350651

Tiffany をつかってみる

ちょうどいいタイミングだし使ってみよう。
というわけで、今度は Ark::View::Tiffany を作ってみました。
↓こんなかんじ

この機会にちょっと Ark のソースコードを追いかけてみたりもしました。
が、それはまたの機会に。

Tiffany から Xslate / MT してみる

Tiffany は決して Template Engine を切り替えるものではない*2ので、使い方としては間違っている気がしますが、とりあえず Tiffany の機能を堪能するために、MT と Xslate が同じ View クラス (Ark::View::Tiffany) から利用できることを確認してみることに。
こんなかんじ↓ *3

Ark から Tiffany 経由で Xslate / MT してみる版
http://github.com/magicalhat/p5-axtest/tree/tiffany

Tiffany を使うことによるメリットは、WAF ごとにいちいち WAF::View::TemplateEngine を作成しなくても、いろんな Template Engine を利用できることですね。
実際に、今回の例だと Ark::View::Xslate を作らずに Xslate に対応することができ、また Ark::View::MT を利用することなく、MT の Template Engine を利用することができました。
Ark(::View::Tiffany) を使う場合は以下のように設定をすれば、(Tiffany が対応している) 好きな Template Engine を利用できます。
たぶん TT とかでも使えるとおもうけど、確認はしてないです。

MyApp.pm
package MyApp;
use Ark;
our $VERSION = '0.01';

use_model 'MyApp::Models';
my $home = MyApp::Models->get('home');

# Xslate を使う場合
config 'View::Tiffany' => {
    view => 'Text::Xslate',
    extension => '.tx',
    options => {
        path => $home->subdir('root', 'tmpl'),
        cache_dir => $home->subdir('tmp', 'xslate_cache'),
    },
};

# MT を使う場合はこっちを有効に
#config 'View::Tiffany' => {
#    view => 'Text::MicroTemplate::Extended',
#    options => {
#        include_path => [ $home->subdir('root', 'tmpl') ],
#        template_args => {
#            stash => sub { __PACKAGE__->context->stash },
#        },
#    },
#};

1;
MyApp::View

View 側は Tiffany がよしなにしてくれるので、名前を確保するだけ。
うん。スッキリ。

package MyApp::View;
use Ark 'View::Tiffany';

1;

完成?

とりあえずは完成したっぽいけれど、Ark::View::MT には、Form の Action がある場合には HTML をエスケープせずに、そのまま出力するように特殊な処理が入っており、この辺の Template Engine 固有の処理を、どうやって対処するのが適切なのかは考えどころかな?
などなどと思っています。

で、速いの?

むずかしいことはよくわかりませんがすごくはやいみたいです><

*1:Module をそろえて plackup すれば http://localhost:5000/ からアクセスできるよ

*2:イベントループ系のモジュールに対する AnyEvent みたいな立場?

*3:plackup して http://localhost:5000/xslate にアクセスすると Xslate で、http://localhost:5000/mt にアクセスすると MT で表示するよ