15

私は、既存のドメイン固有言語 (verilog) を拡張するためにテンプレート ツールキットを 3 年以上使用しています。全体的に満足していますが、大きな問題は、構文/未定義エラーが発生した場合に、エラーをデバッグするための正しい行番号情報がエラー メッセージに含まれていないことです。

たとえば、ファイル内の複数の場所で [%x.0%] と同様の構造を使用すると、どの行に問題があるかを特定することが難しくなるため、「0 が定義されていません」というメッセージが表示されます。

TT3は無期限に開発中のようです

専門家への私の質問は、TT に代わるより良い方法があるかどうかです。私の要件は

  1. 複雑なデータ構造のサポート
  2. 優れたエラー報告とデバッグ機能。
  3. 安定していて実証済み (アルファ/ベータレベルのエンジンなし)
  4. 拡張可能(プラグインなど)
  5. 特定の言語 (html など) に限定しないでください。
  6. IF/Else、ループ (foreach while)、ループ インデックスなどのサポート。
  7. できればパール
  8. テンプレート内からのデータダンパーまたは同等のプラグインのサポートはプラスです
4

5 に答える 5

20

ここではText::Xslateのみをお勧めします。あらゆる点で TT よりも優れており、ほとんどの競合他社にも勝っています。最後に、すべての要件に適合します。文字通り。それらのすべて。

世界のトップ 100 の Web サイトの 1 つと日本のトップ 10 の Web サイトの 1 つであるLivedoorで使用されているため、実際の使用でも証明されています。

Xslate と TT の比較:

  • より速い起動
  • より高速な処理
  • デフォルトで厳格モード
  • 「var is undef」だけでなく、矛盾をキャッチする、より高度な厳密モード
  • テンプレートの正確な位置を示す詳細なエラー
  • HTML エンティティの自動エスケープ (XSS セーフ)
  • 積極的に維持され、衰退するだけではありません
  • 構文は簡単でモダンな perl

特別な場合に注意すべき 2 つの点:

  1. syntax => 'TTerse'TT から移植する場合、可能な限り TT に近いように設計された構文を取得するためにコンストラクターに渡したい場合があります。
  2. 非 HTML を生成するときは、補間type => 'text'を無効にするためにコンストラクターに渡します。html_escape
于 2013-01-10T14:46:49.830 に答える
12

私は現在Template::Alloyを試していますが、概して、TT のドロップイン代替品のようです。 Template::Alloy::TTは、TT と Alloy の違いを一覧表示します。そのほとんどは、「これは Alloy では動作/許可されていますが、TT では許可されていません」という形式です。特定の問題に対処するために、リストには次のものが含まれます。

  • 合金はより良いライン情報を持っています

debug dirs がオンの場合、コロンで区切られた異なる行のディレクティブは、一般的な行範囲ではなく、現在の行を示します。

解析エラーは、実際に発生した行と文字を認識しています。

于 2013-01-09T18:25:02.347 に答える
10

Mojoliciousには、独自のテンプレート システムMojo::Templateが付属しています。軽量で、モジョリシャス システム外でも使用できます。ドキュメントの例を次に示します。

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と完全に互換性がありますが、追加機能があります。

複雑なデータ構造のサポート

はい

優れたエラー報告およびデバッグ機能。

キャッシュのヒット、ミスをデバッグし、出力にテンプレートファイル名を自動的に追加し、stash内の現在の変数(または任意の変数)にフィルター「DUMP」を使用できます。実装が簡単な場合は、さらに便利なデバッグを追加します。

安定して実績のある(アルファ/ベータレベルのエンジンなし)

文書化された制限/バグ(たとえばquery())で、今は安定していると思います

拡張可能(プラグインなど)

エスケープ(フィルター)プラグインなどをサポートしますが、後者はまだ十分に文書化されていません。

特定の言語(htmlなど)に制限されるべきではありません

はい

IF / Else、ループ(foreach while)、ループインデックスなどのサポート。

はい

できればperl

はい

テンプレート内からのデータダンパーまたは同等のプラグインのサポートはプラスです

上記のように、escape=dumpを使用します

すべての追加機能は、ドキュメントにリストされています: https : //metacpan.org/release/HTML-Template-「追加機能」でコンパイル

編集:実行時エラーの報告に関して:残念ながら、H :: T :: Cは、テンプレートをperlコードにコンパイルするため、実行時に発生するエラーのテンプレート行番号も報告しません(行番号の操作を一度実験したと思いますが、多分私は別の外観を持っているでしょう)。テンプレート構文エラーは、正しい行番号で報告されます。

edit2:新しいオプションの警告とline_infoの例を次に示します。

t / templates / 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 に答える