テンプレートの構文標準。 最初のステップ

シードおよび実質的な議論には、参照ポイントが必要です。 テンプレートエンジンでは、サポートされている構造の種類、構造化の方法、およびいくつかの機能(コンパイルなしのプレビュー)に関心があります。

テンプレートの出力を制御するための主要なタイプの構造:

  1. 変数
  2. 条件付きステートメント。
  3. ループ演算子。
  4. 包含物、ブロック。
  5. 継承


すでにこれらの設計は、ほとんどのプロジェクトを実現するには十分です。 そしてもちろん、ほとんどすべてのテンプレートエンジンでさまざまな違いや機能を備えています。 しかし、理論でどのような可能性を使用できるか、これらの実装がどのように理想的に見えるかについて考えてみましょう。



テンプレート内のデザインを強調するために、さまざまなフレーミングシンボルが使用されます。 異なるテンプレートエンジンでは、これは異なって見えます。

<TMPL_VAR JOB> {{ namevar }} <% if(question) { %>
      
      





それらの選択のトピックは特別な注意に値し、気を散らさないために、私たちは1つを選択します

 %   %
      
      







1.変数。



最も一般的に使用される設計。 単純な呼び出しに加えて、それほど頻繁ではありませんが、ネストされた変数の値を参照する必要があります。 さらに少ない頻度で、変数の値が別の変数に含まれている場合。 ネストされた要素は、配列またはハッシュのいずれかです。 さて、今説明した条件のすべての可能な組み合わせを想像してください。

Javascript:

 var data = { title: "  ", img : { src: "/img/picture.jpg" }, list : [ '', '', '', '' ], namevar : "theme", noname: { theme : "  " } };
      
      





テンプレート:

 % title % // data.title % img.src % // data.img.src % list.3 % // data.list[3] % noname[ namevar ] % // data.noname[ data.namevar ]
      
      







問題。 美しいjavascriptビューエントリ

 data.list.12 == data['list']['12']; // 
      
      





配列要素またはハッシュ要素のいずれかに一致できます。 ほとんどのサーバー言語は、このような特性を誇っていません。 この可能性を除外するか、要素のタイプをチェックしますか? これはパフォーマンスにどのように影響しますか?

おそらく、変数タイプのシギルの定義が役立つ可能性があります(configからの変数、サービス変数、標準変数)。



2.条件演算子。



2つの質問がありますが、 unless演算子を使用する必要がありますか? そして、有効な論理演算子のリストを定義します。

  1. 一方、 unlessステートメント 、否定を伴うifに簡単に置き換えることできます。 これは小さなものではありますが、これはごちゃ混ぜであると主張できます。 一方、これはおそらくトリミング(たとえばjavascriptではそのような演算子はありません)機能です。
  2. ほとんどの論理演算子は、すべてのプログラミング言語で何らかの形でサポートされています。 しかし、演算子の具体的なステートメントは言語ごとに異なるため、パーサーが目的のオプションに変換する何らかの中間オプションが必要であることが明らかになります。 中間バリアントの必要性は、条件で正規表現を使用する必要性によってもサポートされます。 正規表現の構文はすべてのPLで同じですか? よくわかりませんが、何かがあきらめなければならないことがわかります。




3.サイクル演算子。



それらの多くはありません。 嬉しいです。 for / foreach / while 。 データは、要素の配列、配列の配列、ハッシュの配列にすることができます。 ほとんどの場合、これはハッシュの配列であり、反復ハッシュの要素へのアクセスを最大限容易にするために注意を払う必要があります。 ループの名前をデザインに渡して(他のループ内のネストされた要素を参照するため)、必要に応じて、反復のソース、配列スライス、反復要素のハンドラーのメソッド/関数の名前を渡す必要があります。

 % nameobj => source.array.data [3..5] :loop_handler %
      
      





ここで、 nameobjはオブジェクト名前です。 さらに、要素に目を向けることができます。

 % nameobj.img.src %
      
      





データソースには、任意の変数source.array.dataへのパスを使用できます

時々、3番目から5番目の要素までの配列のスライスが必要になることがあります[3..5]

データを挿入する前に、データをフォーマットする必要がある場合があります;このため、現在の反復可能な要素へのリンクが渡される各反復中に実行される特定のハンドラーを使用できます。



4.包含物、ブロック。



多くの場合、他のテンプレートまたは他のテンプレートの一部をテンプレートに挿入する必要があります。 構文は、引数を包含に渡す可能性を提供する必要があります。

ブロックは、別のファイルにないことを除いて、同じ包含物です。 したがって、ブロックにアクセスするときは、ブロックが配置されているテンプレートの名前を指定する必要があります。

 % nameinclude % % nameinclude => source.data.inc % % var.for.inc => source.for.inc %
      
      





変数を介してインクルードの名前を指定する機会を与える必要があります。これは、継承の代替として役立ちます。



5.継承。



正直なところ、私は常にテンプレートで継承を使用せずに実行しましたが、これはおそらくそのような機会を持つ必要性を排除しません。 しかし、できるだけシンプルにするために。 同時に、継承されたテンプレートから個々のブロックを再定義できるだけでなく、既存の包含/ブロックでブロックを置き換えることもできると便利です。 これは、変数を介して包含名を指定することで解決できます。 はい、実際にはこの方法で継承の問題が解決されます。すべての置き換え可能なブロックを包含として決定し、それらの名前を管理します...



一部のテンプレートでは、YPでコードを直接記述するためにテンプレートで構造を使用できます。 明らかに、そのような決定は私たちが必要とするものではありません。



フレーム化されるシンボルと、コンストラクト内の変数および演算子に使用されるプレフィックスを理解せずに、一部のコンストラクションをより詳細に検討することは困難です。 使用するコンストラクトのリストをコンパイルしたら、フレーミング文字、タグ、シギルの検討に進むことができます。



UPD:自分自身を明確に表明しなかった場合は謝罪します。 例で%記号がフレーミング文字として表されているという事実は、単なる例です。 これは、何かを提供するためだけに、それを使用するという申し出ではありません。



All Articles