[英]Perl: Alternatives to template toolkit
我一直在使用模板工具包扩展现有的域特定语言(verilog)超过3年。 虽然整体而言我很满意,但主要的刺激是当出现语法/ undef错误时,错误消息不包含正确的行号信息来调试错误。
例如,我会得到一条消息,指示“0未定义”,因为我将使用[%x.0%]和文件中多个位置的类似结构,确定哪一行有问题变得困难。
TT3似乎无限期地在开发中
我对大师的问题是有更好的替代TT。 我的要求是
我只能在这里推荐Text :: Xslate 。 它在各方面都优于TT,也击败了大部分比赛。 最后,它符合您的所有要求。 从字面上看。 他们都是。
它在实践中得到了证明,因为它被全球100强网站之一和日本十大网站之一使用: Livedoor
Xslate与TT相比:
特殊情况需要注意两点:
syntax => 'TTerse'
传递给构造函数,以获得尽可能接近TT的语法。 type => 'text'
传递给构造函数以禁用html_escape
插值。 我目前正在试验Template :: Alloy ,它似乎总体上是TT的直接替代品。 Template :: Alloy :: TT列出了TT和Alloy之间的差异,其中大多数的形式为“这样可以在合金中使用,但在TT中不允许”。 针对您的具体问题,该清单包括:
- Alloy有更好的生产线信息
当debug dirs打开时,由冒号分隔的不同行上的指令显示它们所在的行而不是一般行范围。
解析错误实际上知道它们出现在哪个行和字符处。
Mojolicious带有自己的模板系统Mojo :: Template 。 它重量轻,甚至可以在mojolicious系统之外使用。 以下是文档中的示例:
use Mojo::Template;
my $mt = Mojo::Template->new;
# Simple
my $output = $mt->render(<<'EOF');
% use Time::Piece;
<!DOCTYPE html>
<html>
<head><title>Simple</title></head>
% my $now = localtime;
<body>Time: <%= $now->hms %></body>
</html>
EOF
say $output;
和另一个
# More advanced
my $output = $mt->render(<<'EOF', 23, 'foo bar');
% my ($number, $text) = @_;
%= 5 * 5
<!DOCTYPE html>
<html>
<head><title>More advanced</title></head>
<body>
test 123
foo <% my $i = $number + 2; %>
% for (1 .. 23) {
* some text <%= $i++ %>
% }
</body>
</html>
EOF
say $output;
我可以推荐HTML :: Template:Compiled(但请注意我是作者;-)
它与HTML :: Template完全兼容,但具有其他功能。
支持复杂的数据结构
是
良好的错误报告和调试功能。
您可以调试缓存命中,未命中,自动将模板文件名添加到输出,并可以使用过滤器“DUMP”作为存储(或任何变量)中的当前变量。 如果它易于实现,我将很乐意添加更多有用的调试。
稳定且经过验证(没有alpha / beta级引擎)
我现在认为它稳定,有记录的限制/错误(例如query())
可扩展(插件等)
支持转义(过滤)插件等等,虽然后者尚未得到很好的记录。
不应限于给定的语言(HTML等)
是
支持IF / Else,循环(foreach while),循环索引等。
是
优选perl
是
从模板中支持数据转储器或等效插件是一个优点
如上所述,使用escape = dump
文档中列出了所有其他功能: https ://metacpan.org/release/HTML-Template-编译为“附加功能”
编辑:关于报告运行时错误:遗憾的是,H :: T :: C也没有报告运行时发生的错误的模板行号,因为它将模板编译为perl-code(我想我曾经尝试过操作一次行号,也许我会再看看)。 使用正确的行号报告模板语法错误。
edit2:所以这是一个带有新选项警告和line_info的示例:
T /模板/ line_info1.html:
test
test2
test3
foo:<%= foo %> undef line 4
test4
脚本:
use HTML::Template::Compiled;
my $t = HTML::Template::Compiled->new(
filename => "t/templates/line_info1.html",
warnings => 1,
line_info => 1,
);
say $t->output;
__END__
Use of uninitialized value in concatenation (.) or string at t/templates/line_info1.html line 4.
test
test2
test3
foo: undef line 4
test4
看一下Template :: Semantic的纯模板抽象
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.