XslateのMacroをXslateを利用して作る

最終更新日 : 2010-11-11 18:03:07

XslateはMacroに対応しているのですが、INCLUDE先では利用できないという制約があります。
その対応が以下実際のコード。 INCLUDE先でも利用できるようになった際の移行を考慮して実装しています。

kazeburo++

package Golgo::Admin::View::MacroSection;

use strict;
use warnings;
use base qw/Exporter/;
use Data::Section::Simple;
use Text::Xslate;

our @EXPORT = qw(
   paginate
);

my $XSLATE;

__PACKAGE__->create_xslate();


sub paginate {
    my $args = {};
    ( $args->{pager} , $args->{my_uri} ) = @_;
    render('paginate', $args );
}


sub create_xslate {
    my $reader = Data::Section::Simple->new(__PACKAGE__);
    my $templates = $reader->get_data_section;

    my $tx = Text::Xslate->new(
            module => [ 'Text::Xslate::Bridge::TT2Like'],
            syntax => 'TTerse',
            path => [ $templates ]
            );
    $XSLATE = $tx;
}

sub render {
    my ($name , $args ) =@_;
    Text::Xslate::Util::mark_raw($XSLATE->render($name,$args));
}

1;

__DATA__
@@ paginate
[% IF pager %]
[% CALL pager.uri(my_uri) %]
[% IF pager.last_page != pager.first_page %]
<div class="pager">
<span>全件数 [% pager.total_entries %]</span>
[%- IF pager.previous_page %]<a href="[% pager.build_uri(pager.previous_page) %]" class="prev">前</a>[% END %]
[%- FOR p IN pager.pages_in_navigation(10) %]
[%- IF p == pager.current_page %]<span>[% p %]</span>[% ELSE %]<a href="[% pager.build_uri(p) %]" class="number">[% p %]</a>[% END -%]
[%- END %]
[%- IF pager.next_page %]<a href="[% pager.build_uri(pager.next_page) %]" class="next">次</a>[% END %]
</div><!-- /pager -->
[% END # over 1 page %]
[% END # has pager %]


こんな感じで利用。
    my $tx = Text::Xslate->new(
    module => [ 'Text::Xslate::Bridge::TT2Like','Golgo::Admin::View::MacroSection'],
            syntax => 'TTerse',
    );

[% paginate(pager, c.req.uri ) %]

実際には、MACRO じゃなくて moduleとして擬似的に実装なんだけどね
  • カテゴリ:
  • Tech