簡體   English   中英

Perl:模板工具包的替代品

[英]Perl: Alternatives to template toolkit

我一直在使用模板工具包擴展現有的域特定語言(verilog)超過3年。 雖然整體而言我很滿意,但主要的刺激是當出現語法/ undef錯誤時,錯誤消息不包含正確的行號信息來調試錯誤。

例如,我會得到一條消息,指示“0未定義”,因為我將使用[%x.0%]和文件中多個位置的類似結構,確定哪一行有問題變得困難。

TT3似乎無限期地在開發中

我對大師的問題是有更好的替代TT。 我的要求是

  1. 支持復雜的數據結構
  2. 良好的錯誤報告和調試功能。
  3. 穩定且經過驗證(沒有alpha / beta級引擎)
  4. 可擴展(插件等)
  5. 不應限於給定的語言(HTML等)
  6. 支持IF / Else,循環(foreach while),循環索引等。
  7. 優選perl
  8. 從模板中支持數據轉儲器或等效插件是一個優點

我只能在這里推薦Text :: Xslate 它在各方面都優於TT,也擊敗了大部分比賽。 最后,它符合您的所有要求。 從字面上看。 他們都是。

它在實踐中得到了證明,因為它被全球100強網站之一和日本十大網站之一使用: Livedoor

Xslate與TT相比:

  • 更快的啟動
  • 更快的處理
  • 嚴格模式默認情況下
  • 更高級的嚴格模式,捕獲不一致,而不僅僅是“var is undef”
  • 顯示確切模板位置的詳細錯誤
  • 自動HTML實體轉義(XSS-safe)
  • 積極維護 ,而不僅僅是萎靡不振
  • 語法是直截了當的現代perl

特殊情況需要注意兩點:

  1. 當您從TT移植時,您可能希望將syntax => 'TTerse'傳遞給構造函數,以獲得盡可能接近TT的語法。
  2. 生成非HTML時,您希望將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM