Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:模板工具包的替代方案_Perl_Templates_Template Engine_Template Toolkit - Fatal编程技术网

Perl:模板工具包的替代方案

Perl:模板工具包的替代方案,perl,templates,template-engine,template-toolkit,Perl,Templates,Template Engine,Template Toolkit,我已经使用模板工具包来扩展现有的领域特定语言(verilog)三年多了。虽然总的来说我对此很满意,但主要的问题是,当出现语法/undef错误时,错误消息不包含正确的行号信息来调试错误 e、 g.我将收到一条消息,指示“0未定义”,因为我将在文件中的多个位置使用[%x.0%]和类似的构造,很难确定哪一行有问题 TT3似乎正在无限期地开发中 我向大师们提出的问题是,有没有更好的选择来替代TT。我的要求是 支持复杂的数据结构 良好的错误报告和调试功能 稳定且经验证(无α/β级发动机) 可扩展(插件等)

我已经使用模板工具包来扩展现有的领域特定语言(verilog)三年多了。虽然总的来说我对此很满意,但主要的问题是,当出现语法/undef错误时,错误消息不包含正确的行号信息来调试错误

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

TT3似乎正在无限期地开发中

我向大师们提出的问题是,有没有更好的选择来替代TT。我的要求是

  • 支持复杂的数据结构
  • 良好的错误报告和调试功能
  • 稳定且经验证(无α/β级发动机)
  • 可扩展(插件等)
  • 不应仅限于给定的语言(html等)
  • 支持IF/Else、循环(foreach-while)、循环索引等
  • 最好是perl
  • 支持模板中的数据转储程序或等效插件是一个加号

  • 我可以建议HTML::Template:Compiled(但请注意,我是作者;-)

    它与HTML::Template非常兼容,但具有其他特性

    支持复杂的数据结构

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

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

    稳定且经验证(无α/β级发动机)

    我认为它是稳定的,有文件化的限制/错误(例如Quices())

    可扩展(插件等)

    支持escape(filter)插件等,尽管后者还没有很好的文档记录

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

    支持IF/Else、循环(foreach-while)、循环索引等

    最好是perl

    支持模板中的数据转储程序或等效插件是一个加号

    如上所述,使用escape=dump

    文档中列出了所有其他功能: 在“附加功能”中

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

    编辑2: 下面是一个新选项“警告”和“行信息”的示例:

    t/templates/line_info1.html:

    test
    test2
    test3
    foo:<%= foo %> undef line 4
    test4
    

    我目前正在试验,总的来说,它似乎是TT的替代品。列出TT和Alloy之间的差异,其中大多数是“Alloy中允许/但TT中不允许”的形式。针对您的具体问题,该列表包括:

    • 合金具有更好的线条信息
    当debug dirs处于启用状态时,不同行上的指令以 冒号表示它们所在的行,而不是一般的行范围

    解析错误实际上知道它们发生在哪一行和哪一个字符上

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

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

    Xslate与TT的比较:

    • 更快的启动
    • 更快的处理
    • 默认情况下为严格模式
    • 更高级的严格模式,它捕获的不一致性不仅仅是“var未定义”
    • 显示精确模板位置的详细错误
    • 自动HTML实体转义(XSS安全)
    • 不仅仅是
    • 语法是直接的和现代的perl

    对于您的特殊情况,需要注意两件事:

  • 当您从TT进行移植时,您可能希望将
    syntax=>'TTerse'
    传递给构造函数,以获得尽可能接近TT的语法
  • 生成非HTML时,您希望将
    type=>'text'
    传递给构造函数以禁用
    HTML\u escape
    插值
  • 看看纯模板抽象

    有自己的模板系统。它重量轻,甚至可以在Mojolicous系统之外使用。以下是文档中的一个示例:

    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;
    
    使用Mojo::Template;
    我的$mt=Mojo::Template->new;
    #简单的
    
    我的$output=$mt->render(render)(这是一个旧的writeup。我认为它不完整(例如不包括xslate),但可能仍然对您有帮助:tinita,很遗憾,我希望离开TT,只是因为它没有报告错误的正确行号:(@vijayvithal:我又看了一眼,似乎可以通过为WARN添加一个SIG处理程序和通过#line指令操纵行号来实现。test suite suceeds.噢,我根本不需要SIG处理程序。我想在下一个版本中添加一个选项来激活此功能。@vijayvithal:我上传了1.000#004。添加了选项“Warning”和“line_info”(虽然忘记更新更改文件)今天测试了模板::Alloy。Debug_dirs不适合我的用途,因为它假定我正在生成HTML并插入HTML样式的注释。对于x=[]/*empty array*/在模板模板中的某处后跟x.0 template::Alloy相对更有用,因为它给出了完整的消息x.0未定义,而TT2说0未定义…明天将尝试XSLTE。如果我使用template::Alloy和DEBUG=>DEBUG\u DIRS,我会得到“var.undef error-undefined variable:bar in ln.tt”.但这是米
    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;