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 さんのこの記事が。
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 固有の処理を、どうやって対処するのが適切なのかは考えどころかな?
などなどと思っています。
で、速いの?
むずかしいことはよくわかりませんがすごくはやいみたいです><