利用可能な資料から1分の汎用テンプレートエンジン

模様



テンプレートエンジンが本格的なプログラミング言語であることは誰にとっても秘密ではありません。



テンプレートの使用はWEBに限定されるものではないことを忘れないでください。

これは、さまざまな種類のレポートの生成、さまざまな言語でのプログラムコードの生成、処理用の入力データの生成などです。

一般に、多くのテキストと小さなロジックがあるすべての場所にテンプレートを適用したいと思います。



考えてみると、より速く、より安価に行うには、「はい、静的なテキストがあり、帽子をかぶるだけです」、「カウンターが必要です」、「印刷するだけです」などの考えで自分を欺くべきではありません。日付など

まず、ヘッダーとカウンター、次にブロックの条件付き挿入(if)があり、次にテーブルの生成が必要になり(ここではループと配列が必要)、次に文字列操作と通常のプログラミング言語の他のすべての構造がプルされます。



ソリューションを検索する



プログラミング言語を発明するつもりはなかったので、迅速かつ安価にしたいので、perlの正規表現を開始し、 <?=value?>



And <? code ?>



などのタグを使用して出力を生成し始めました<? code ?>



<? code ?>





コードは次の形式でした

 print "text";print $value; code
      
      





一方、二重引用符がどのように置換されるかを見て、私は自分の前にすでに行ったことを実行していることに気付きました:perlコンパイラ自体は、テキストを解析するときに、フォームの行を置き換えます
 "abc $var cde"
      
      



 "abc ".$var." cde"
      
      





また、$ varを使用して値を挿入し、evalで結果を取得することもできます。

これはすでに戦いの半分です。変数と配列要素をテンプレートに挿入できます。

コードをどうするかを決めるのは残っています。



ここで、配列の補間が助けになります。
 print "5*5 = @{[5*5]}"
      
      



もたらすでしょう

5*5 = 25







おそらくこのハックには明確化が必要です。

補間するとき、@は配列を出力することを意味します。 さらに、{}は配列自体を周囲のテキストから分離し、[]は参照によって配列を挿入することを示しています。

ただし、配列の内容は、そこで置換されるコードで既に生成されています。 そして、これは将来覚えておく必要があります。ここで象限括弧内で行うことはすべて、配列コンテキストを持っています。



つまり、作業のメカニズム:配列(多くの場合1つの要素)を作成し、それにリンクを作成してから、この配列を参照によって出力します。 そのためには最適ではありません-それは動作します。



したがって、コードを行に挿入することもできます。

もう少し-そして...



解決策



 #!/usr/bin/perl -w use strict; { local $/ = undef; $txt = <>; } print eval qq{<< "__END_OF_TEMPLATE"\n$txt\n__END_OF_TEMPLATE\n}; die $@ if $@;
      
      





それだけです

これがテンプレートエンジンです。

必要に応じて、perl -eの同じ行に収まります。



それは何で、なぜ



これは、これまで見た中で最も短くて簡単なテンプレートエンジンです。 perlがあればどこでも実行でき、同時にダウンロード、アセンブル、インストールの必要はありません-場合によってはこれはかなり大きな問題です。



$を介した値の置換、@ {[]}を介したperlコードの実行、正しい行番号を使用した正しいエラー出力があります。 モジュール性もあります。重要で、頻繁に使用される長い機能は、個別のモジュールまたはソースコードのみに分割され、それぞれuseまたはdo自体から接続されます。

ほとんど何もしなかったので、必要なものはほぼすべて手に入りました。



テンプレートは次のようになります。

!

: @{[''.localtime]}.

PID: $$

\@INC path: @INC

Environment:

@{[join "\n", map {".... $_ => $ENV{$_}"} sort keys %ENV]}

@{[do{use IO::File; IO::File->new("<tail.inc")->getlines()}]}







ほとんど変更なしで、いくつかのタスクで使用しました。

•特定の自己記述httpサーバーでは、ページは(途中で)ハッシュに含まれ、同じメカニズムを使用して結果が計算され、クライアントに返されました。

•複雑な構造と依存関係を持つ生成されたC ++コード。データは深い分岐perl構造で記述されました-ハッシュと配列にXSLTの類似物がありました。

•Makefileを生成するためのautotoolsの代替を作成しました。

多くの小さな用途は言うまでもありません。

ここでの普遍性は、生成されるコンテンツへのバインディングがどこにも存在しないという事実にあり、特定の機能を任意のアプリケーションに対して作成することができます。



一般に、何も持っておらず、テンプレート内の何かを緊急に置き換える必要がある場合、この方法が最適です。



クライアントからコードを受け入れたい場合は、 Safeopsなどのモジュールの方向を見ることができますが、すぐに使えるソリューションはここでは提供しません。



どこで使用する必要はありません:

•デザイナーに提供しようとせず、この形式のテンプレートを要求する必要はありません。 HTML(または他の何か)のように見えますが、これは実際にはPERLプログラムであることを忘れないでください。

•深刻な修正がなければ、そこにいるユーザーからコンテンツを直接突いてはいけません。これはおそらくローカルコードの実行とハッキングにつながるでしょう。

•バイナリデータは生成できますが、少なくとも最後のラインフィードをどうするかを考える必要があります(おそらくそれを切り取ります)。

•タスクに合わせて調整された「正しい」テンプレートエンジンが既にある場合は、この松葉杖も必要ありません。



この標準化の方法を使用した分野では、この方法は優れていることが証明されており、一部の場所でまだ機能しています。



それらが発生した場合、私はすべての質問に答えます。



All Articles