tokuhirom's Blog

first impression for Text::Xslate

僕がつくってるフレームワークであるところの Amon に Xslate 対応をいれてみた。

かなり TT とおなじ感覚でつかえるかんじ。テンプレートの継承が追加されてるぐらいで、基本は TT とおなじかんじか。

フレームワークにくみこむときはこんなかんじ。

package Amon::V::Xslate;
use strict;
use warnings;
use base qw/Amon::V::TemplateBase/;
use File::Spec ();
use Scalar::Util ();
use Text::Xslate 0.001_08 ();

sub import {
    my $class = shift;
    if (@_>0 && shift eq '-base') {
        my $caller = caller(0);
        no strict 'refs';
        unshift @{"${caller}::ISA"}, $class;
    }
}

sub new {
    my ($class, $c, $conf) = @_;
    $conf->{path} ||= [ File::Spec->catdir($c->base_dir, 'tmpl') ];
    my $xslate = Text::Xslate->new( $conf );
    my $self = bless {context => $c, xslate => $xslate}, $class;
    return $self;
}

sub render {
    my ($self, $input, $params) = @_;
    my $output = $self->{xslate}->render($input, { c => $self->{context}, %{ $params || +{}} });
    return $output;
}

1;


base.tx が

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <meta http-equiv="Content-Script-Type" content="text/javascript" />
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>NoPaste</title>
    <link href="<:= $c.uri_for('/static/css/main.css') :>" rel="stylesheet" type="text/css" media="screen" />
</head>
<body>
    <div id="Container">
        <div id="Header">
            <a href="<:= $c.uri_for('/') :>">Yet Another NoPaste Site</a>
        </div>
        <div id="Content">
: block content -> {
'body here'
: }
</div>
        <div id="FooterContainer"><div id="Footer">
            <div class="about">OreOre::NoPaste, powered by <a href="http://amon.64p.org/">Amon</a></div>
            <div class="copyright">Copyright (C) 2009 64p.org</div>
        </div></div>
    </div>
</body>
</html>

index.tx がこんなん。

: cascade 'base.tx';

: around content -> {

<form method="post" action="<:= $c.uri_for('/post') :>" class="nopaste">
<p class="nm"><textarea name="body" rows="20" cols="60"></textarea></p>
<p class="nm submit-btn"><input type="submit" value="post" /></p>
</form>

: }

感覚としては、かなり TT にちかいので、TT が好きな人だったら結構いけるっぽい。

TT にくらべると格段にはやいし。

インターフェイスなどがオレの感覚でつかいにくいなーとおもったところについては、もろもろかえてもらったので、あたらしいバージョンではよりつかいやすくなってんじゃないかとおもうっす。


まだ production でつかうにははやいとおもうけど、いろいろつかってみてあげるといいんじゃないかとおもうです。そこそこもうつかえるかんじ。