我正在尝试创建一个将Text :: Haml集成到Template Toolkit中的cpan模块。我认为Haml是一种有趣的模板语言,但相当有限,它不支持循环或条件,更不用说更高级的东西了。但我似乎无法让一个非常简单的版本工作。以下是一些测试脚本,可以确保我的逻辑正常工作。
这是我使用Template::Plugin::Filter文档
尝试过滤器模块use strict;
use warnings;
package Template::Plugin::Haml;
use Template::Plugin::Filter;
use parent 'Template::Plugin::Filter';
sub filter {
my ( $self, $text ) = @_;
# thes aren't actually the problem
# my $haml = Text::Haml->new;
# my $html = $haml->render($text);
# return $html;
return $text;
}
1;
和一些使用它的代码
#!/usr/bin/perl
# test0.pl
use strict;
use warnings;
use Template;
my $tt = Template->new;
my $vars = {};
my $output = \do{my $i};
$tt->process(\*DATA, $vars, $output);
print $$output;
__DATA__
[% USE Haml %]
[% FILTER Haml %]
#profile
[% END %]
但我收到此警告Use of uninitialized value in print at test0.pl line 15, <DATA> line 1.
我知道这个错误意味着什么...但我不确定为什么过滤器导致这个。任何帮助将不胜感激
以下是我逻辑的其他部分工作的一些测试脚本,因此我们没有查看错误的代码来解决问题。否则它们对问题不是真正必要的
这显示了如何使用Template :: Toolkit
#!/usr/bin/perl
# test1.pl - show how to use tt
use strict;
use warnings;
use Template;
my $tt = Template->new;
my $vars = {};
my $output = \do{my $i};
$tt->process(\*DATA, $vars, $output);
print $$output; # #profile
__DATA__
#profile
这向我们展示了如何使用Text :: Haml
#!/usr/bin/perl
# test2.pl
use 5.010;
use strict;
use warnings;
use Text::Haml;
my $text = '#profile';
my $haml = Text::Haml->new;
my $html = $haml->render($text);
say $html; # <div id='profile'></div>
更新1
我试过这个(这与markdown插件几乎完全相同,并且几乎与Textile插件完全相同)
use strict;
use warnings;
package Template::Plugin::Haml;
use parent 'Template::Plugin::Filter';
use 'Text::Haml';
sub init {
my $self = shift;
$self->{_DYNAMIC} = 1;
$self->install_filter( $self->{_ARGS}->[0] || 'haml');
$self;
}
sub filter {
my ( $self, $text, $args, $config ) = @_;
my $haml = Text::Haml->new;
return $haml->render($text);
}
1;
更新2
TT初始化时启用DEBUG => 'all',
的输出
[Template::Provider] creating cache of unlimited slots for [ . ]
[Template::Service] process(GLOB(0x1719608), HASH(0x16f1650))
[Template::Context] template(GLOB(0x1719608))
[Template::Context] asking providers for [GLOB(0x1719608)] []
[Template::Provider] _load(GLOB(0x1719608), <no alias>)
[Template::Provider] _compile(HASH(0x1a947a0), <no compfile>)
[Template::Parser] compiled main template document block:
sub {
my $context = shift || die "template sub called without context\n";
my $stash = $context->stash;
my $output = '';
my $_tt_error;
eval { BLOCK: {
#line 1 "input file handle"
$output .= $context->debugging('msg', { 'line' => '1', 'text' => 'USE Haml', 'file' => 'input file handle' }); ## DEBUG ##
#line 1 "input file handle"
# USE
$stash->set('Haml',
$context->plugin('Haml'));
#line 2 "input file handle"
$output .= $context->debugging('msg', { 'line' => '2', 'text' => 'FILTER haml', 'file' => 'input file handle' }); ## DEBUG ##
#line 4 "input file handle"
# FILTER
$output .= do {
my $output = '';
my $_tt_filter = $context->filter('haml')
|| $context->throw($context->error);
$output .= "#profile";
#line 4 "input file handle"
$output .= $context->debugging('msg', { 'line' => '4', 'text' => 'END', 'file' => 'input file handle' }); ## DEBUG ##
&$_tt_filter($output);
};
} };
if ($@) {
$_tt_error = $context->catch($@, \$output);
die $_tt_error unless $_tt_error->type eq 'return';
}
return $output;
}
[Template::Service] PROCESS: Template::Document=HASH(0x1c69ba0)
[Template::Context] process([ Template::Document=HASH(0x1c69ba0) ], <no params>, <unlocalized>)
[Template::Context] template(Template::Document=HASH(0x1c69ba0))
[Template::Context] plugin(Haml, [ ])
[Template::Plugins] fetch(Haml, <no args>, Template::Context=HASH(0x1972040))
[Template::Plugins] loading Template/Plugin/Haml.pm (PLUGIN_BASE)
[Template::Plugins] calling Template::Plugin::Haml->load()
[Template::Plugins] Haml => Template::Plugin::Haml
[Template::Filters] store(haml, ARRAY(0x1c1f4d8))
[Template::Context] filter(haml, [ ]<no alias>)
[Template::Filters] fetch(haml, <no args>, Template::Context=HASH(0x1972040))
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1.
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1.
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1.
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1.
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1.
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1.
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1.
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1.
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1.
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1.
Use of uninitialized value in concatenation (.) or string at /usr/share/perl5/vendor_perl/Text/Haml.pm line 674, <DATA> line 1.
Use of uninitialized value in concatenation (.) or string at /usr/share/perl5/vendor_perl/Text/Haml.pm line 683, <DATA> line 1.
## input file handle line 1 : [% USE Haml %] ##
## input file handle line 2 : [% FILTER haml %] ##
<div id='profile'></div>
<>## input file handle line 4 : [% END %] ##</>
答案 0 :(得分:1)
以下是CPAN Template::Plugin::Haml
上最终产品的链接搞定了
use strict;
use warnings;
package Template::Plugin::Haml;
use parent 'Template::Plugin::Filter';
use Text::Haml;
sub init {
my $self = shift;
$self->{_DYNAMIC} = 1;
$self->install_filter( $self->{_ARGS}->[0] || 'haml');
$self;
}
sub filter {
my ( $self, $text, $args, $config ) = @_;
my $haml = Text::Haml->new;
return $haml->render($text);
}
1;
和test0.pl
#!/usr/bin/perl
# test0.pl
use strict;
use warnings;
use Template;
my $tt = Template->new; #or die $Template::Error, "\n";
my $vars = {};
my $output = \do{my $i};
$tt->process(\*DATA, $vars, $output);
print $$output; # \n\n<div id='profile'></div>\n\n
__DATA__
[% USE Haml %]
[% FILTER haml %]
#profile
[% END %]
似乎我引用了use 'Text::Haml'
并且我需要一些初始化代码。
答案 1 :(得分:0)
好的,我也无法让它发挥作用。
稍微改进测试脚本以消除可能的干扰:
#!/usr/bin/env perl
use strict;
use warnings;
use FindBin qw/$Bin/;
use lib "$Bin/../lib";
use Template;
my $tt = Template->new(
STRICT => 1,
PLUGINS => { MyFilter => 'Template::Plugin::Haml'},
);
$tt->process(\*DATA, {});
__DATA__
Some non haml stuff
[% USE Haml %]
[% FILTER Haml %]
%h1. some haml stuff
[% END %]
当我用perl -Ilib t/01-test.t
(设置了cpan dist)运行它时,我没有输出。但是,如果我在模板中没有HAML块的情况下运行它,我会得到输出:
Some non haml stuff
(如果我注释掉过滤器HAML和END位,那么我也按预期获得完整输出)