読者です 読者をやめる 読者になる 読者になる

Mojolicious::Liteで、Text::XSlateを使えるようにする

perl

(2010/12/03 追記)
__DATA__部分が読み込まれない件に関しては、gfxさんが対応していただいたようです。
http://d.hatena.ne.jp/gfx/20101103/1288801272
(追記終わり)



Text::Xslateというモジュールをチラチラ見かけて気になったので、
Mojolicious::Liteで使うようにしてみました。


Mojoliciousでは、Text::XSlateを使うためにMojoX::Renderer::Xslateというプラグインがあります。
これをcpanmなどでインストールします。

$ cpanm MojoX::Renderer::Xslate


プラグインの読み込みは、下記のようになります。

use Mojolicious::Lite
plugin 'xslate_renderer';


renderメソッドなどでは「handler => 'tx'」を引数に渡します。

sub '/' => sub { 
    my $self = shift;
    $self->render(handler => 'tx');
} => 'index';

__DATA__

@@ index.html.tx
<html>
...
</html>

実際に動かしてみたのが次のコードになります。

#!/usr/bin/perl
use Mojolicious::Lite;

plugin 'xslate_renderer';

get '/' => sub {
    my $self = shift;
    $self->render(
        hander => 'tx',
        title  => 'A list of books',
        books  => [
           { title => 'Islands in the stream' },
           { title => 'Programming Perl' },
    ],
    );
} => 'index';

app->start;


__DATA__

@@ index.html.tx
<html>
<head>
<title><: $title :></title>
</head>
<body>
<h1><: $title :></h1>
<ul>
: for $books -> $book {
    <li><: $book.title :></li>
: }
</ul>
</body>
</html>


上記では、__DATA__にあるデータを読み込むようにしていますが、デフォルトの設定だとうまく読み込まれませんでした。
テンプレートファイルを外部ファイルにした場合はうまくいきました。
__DATA__の方のデータを読み込ませるために、プラグイン読み込み時にData::Section::Simpleモジュールのインスタンスを渡すようにしました。これが正しい対処なのかわかりません。

use Mojolicious::Lite;
use Data::Section::Simple;

my $vpath = Data::Section::Simple->new()->get_data_section();
plugin 'xslate_renderer' => {
    template_options => { path => [$vpath] },
};


下記が、実際に動かしてみたコードです。

#!/usr/bin/perl                                                                                
use Mojolicious::Lite;
use Data::Section::Simple;

my $vpath = Data::Section::Simple->new()->get_data_section();
plugin 'xslate_renderer' => {
    template_options => { path => [$vpath] },
};


get '/' => sub {
    my $self = shift;
    $self->render(handler => 'tx',
                  title => 'A list of books',
                  books => [
                  { title => 'Islands in the stream' },
              { title => 'Programming Perl' },
              ],
              ); 
} => 'index';

app->start;


__DATA__

@@ index.html.tx
<html>
<head>
<title><: $title :></title>
</head>
<body>
<h1><: $title :></h1>
<ul>
    : for $books -> $book {
        <li><: $book.title :></li>
    : }
</ul>
</body>
</html>