15

3 年多来,我一直在使用模板工具包来扩展现有的特定领域语言(verilog)。虽然总的来说我对此感到满意,但主要的刺激因素是,当出现语法/ undef 错误时,错误消息不包含用于调试错误的正确行号信息。

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

TT3似乎无限期地处于开发中

我对大师的问题是有没有比 TT 更好的选择。我的要求是

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

5 回答 5

20

我只能在这里推荐Text::Xslate。它在各方面都比 TT 好,并且也击败了大多数竞争对手。最后,它符合您的所有要求。字面上地。他们都是。

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

Xslate 与 TT 相比:

  • 更快的启动
  • 更快的处理
  • 默认为严格模​​式
  • 更高级的严格模式,不仅可以捕获“var is undef”之外的不一致
  • 显示准确模板位置的详细错误
  • 自动 HTML 实体转义(XSS 安全)
  • 积极维护,而不是任其憔悴
  • 语法是直接的和现代的 perl

对于您的特殊情况需要注意两点:

  1. 当您从 TT 移植时,您可能希望传递syntax => 'TTerse'给构造函数以获取设计为尽可能接近 TT 的语法。
  2. 生成非 HTML 时,您希望传递type => 'text'给构造函数以禁用html_escape插值。
于 2013-01-10T14:46:49.830 回答
12

我目前正在试验Template::Alloy,它似乎是 TT 的替代品。 Template::Alloy::TT列出了 TT 和 Alloy 的区别,其中大部分是“This works/is allowed in Alloy, but not in TT”的形式。针对您的具体问题,该列表包括:

  • 合金有更好的线路信息

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

解析错误实际上知道它们发生在什么行和字符上。

于 2013-01-09T18:25:02.347 回答
10

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;
于 2013-01-14T15:08:46.433 回答
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 at "ADDITIONAL FEATURES"

编辑:关于报告运行时错误:不幸的是,H::T::C 也不会报告在运行时发生的错误的模板行号,因为它将模板编译为 perl 代码(我想我曾经尝试过操纵行号,也许我会再看看)。使用正确的行号报告模板语法错误。

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
于 2013-01-09T15:21:29.273 回答
2

看看Template::Semantic用于纯模板抽象

于 2013-01-13T09:07:39.777 回答