Perl:模板工具包的替代品

时间:2013-01-09 13:28:55

标签: perl templates template-engine template-toolkit

我一直在使用模板工具包扩展现有的域特定语言(verilog)超过3年。虽然总体而言我很满意,但主要的刺激是当出现语法/ undef错误时,错误消息不包含正确的行号信息来调试错误。

e.g。我会得到一条消息,指示“0未定义”,因为我将使用[%x.0%]和文件中多个位置的类似结构,确定哪一行有问题变得困难。

TT3似乎无限期地开发

我对大师的问题是有更好的替代TT。我的要求是

  1. 支持复杂的数据结构
  2. 良好的错误报告和调试功能。
  3. 稳定且经过验证(没有alpha / beta级引擎)
  4. 可扩展(插件等)
  5. 不应限于给定的语言(html等)
  6. 支持IF / Else,循环(foreach while),循环索引等。
  7. 优选perl
  8. 从模板中支持数据转储器或等效插件是一个加号

5 个答案:

答案 0 :(得分:20)

我只能在这里推荐Text::Xslate。它在各方面都优于TT,也击败了大部分比赛。最后,它符合您的所有要求。从字面上看。所有这些。

它在实践中得到了证明,因为它被全球100强网站之一和日本十大网站之一使用:Livedoor

Xslate与TT相比:

  • 更快启动
  • 加快处理速度
  • 默认情况下为严格模式
  • 更高级的严格模式,可以捕获不仅仅是“var is undef”
  • 之类的不一致
  • 显示确切模板位置的详细错误
  • 自动HTML实体转义(XSS-safe)
  • actively maintained而不只是left to languish
  • 语法是直截了当的现代perl

特殊情况需要注意两点:

  1. 当您从TT移植时,您可能希望将syntax => 'TTerse'传递给构造函数,以获得尽可能接近TT的语法。
  2. 生成非HTML时,您希望将type => 'text'传递给构造函数以禁用html_escape插值。

答案 1 :(得分:11)

我目前正在试验Template::Alloy,而且它似乎总体上是TT的替代品。 Template::Alloy::TT列出了TT和Alloy之间的差异,其中大多数的形式为“这种工作/允许合金,但不允许使用TT”。针对您的具体问题,该列表包括:

  
      
  • Alloy有更好的生产线信息
  •   
     

当调试dirs打开时,不同行上的指令被分隔   冒号显示它们所在的线而不是一般的线范围。

     

解析错误实际上知道它们出现在哪个行和角色。

答案 2 :(得分:9)

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;

答案 3 :(得分:5)

我可以推荐HTML :: Template:Compiled(但请注意我是作者; - )

它与HTML :: Template完全兼容,但具有其他功能。

  

支持复杂的数据结构

  

良好的错误报告和调试功能。

您可以调试缓存命中,未命中,自动将模板文件名添加到输出,并可以使用过滤器“DUMP”作为存储(或任何变量)中的当前变量。 如果它易于实现,我将很乐意添加更多有用的调试。

  

稳定且经过验证(没有alpha / beta级引擎)

我认为它现在稳定,有记录的限制/错误(例如query())

  

可扩展(插件等)

支持转义(过滤)插件等等,虽然后者尚未得到很好的记录。

  

不应限于给定的语言(html等)

  

支持IF / Else,循环(foreach while),循环索引等。

  

优选perl

  

从模板中支持数据转储器或等效插件是一个加号

如上所述,使用escape = dump

文档中列出了所有其他功能: https://metacpan.org/release/HTML-Template-Compiled 在“附加功能”

编辑:关于报告运行时错误:遗憾的是,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

答案 4 :(得分:2)

查看Template::Semantic的纯模板抽象