「Histone」-新しいオープンソースのクロスプラットフォームテンプレートエンジン

はじめに

MegaFonは、通信サービスの提供だけに仕事が限定されないダイナミックなテクノロジー企業です。 たとえば、当社の資産の中には、顧客がさまざまな情報やサービスを受け取る多数のインターネットサイトがあります。 Webプロジェクトを改善および開発するプロジェクトの一環として、他の開発者に役立つ製品を作成しています。 今日、それらの最初のものを紹介したいと思います-Histoneテンプレートエンジンは、Apache Software License 2.0の下で配布されるオープンソースプロジェクトです。 しかし、まず最初に。

ヒストンとは?

あなたの多くは、Webアプリケーションを作成するときにさまざまなテンプレートエンジンを使用します。 状況は、特定の形式で提示されたデータから、変換のルールを定義するテンプレートを使用してHTMLコードを生成する必要がある場合です。 数年前、サーバー上でHTMLコードを生成するためにテンプレートエンジンが積極的に使用され( SmartyFreeMarkerVelocity )、今日ではブラウザーで直接HTMLコードを生成する必要が増えています。 このようなテンプレートエンジンの例には、 TrimPathテンプレートMustacheGoogle Closure Templateなどが含まれます。

さまざまなプラットフォームで動作するように作成されたさまざまなソリューションをすべて備えているため、サーバーとWebブラウザーの両方で実行できるテンプレートエンジンは多くありません。 それぞれに利点と重大な欠点があります。 私たちの意見では、これらの欠点のいくつかは重大であり、サーバーとWebブラウザーの両方で機能するテンプレートエンジンのすべての利点を十分に活用することはできません。

Histoneプロジェクトは、Java、JavaScript、およびPHPの実装で新しいオープンソースのクロスプラットフォームテンプレートエンジンを作成する試みです。 独自のソリューションの開発を開始する前に、既存のクロスプラットフォームテンプレートエンジンの利点と欠点を調査しました。 最新のWebアプリケーションの構築に広く使用されている人気のあるテンプレートエンジンのみを分析し、関心のある3つの実装(Java、JavaScript、PHP)のうち少なくとも2つを持たないソリューションは考慮しませんでした。
長所短所
Google閉鎖テンプレート-テンプレートのソースコードはJavaScriptでコンパイルされるため、処理が高速化されます。-テンプレートを使用するには、特別なユーティリティを使用して前処理する必要があります。 テンプレートへの変更はすべて再コンパイルする必要があるため、これはブラウザベースのアプリケーションの開発を大幅に複雑にします。

-テンプレートの構文は複雑すぎます。これはプログラマーには理解されますが、テンプレート設計者には必然的に困難をもたらします。

-独自の拡張機能を作成するための複雑なメカニズム。 JavaScriptバージョンの機能を増やすことはできません。これにより、テンプレートをクロスプラットフォームで使用する場合に拡張メカニズムが適用できなくなります。

-PHPバージョンなし
口ひげ-多くのプログラミング言語のあらゆるバリエーションに存在します。-デザイナーが理解するのが難しい型破りな構文。

-テンプレート言語には、いくつかの重要な設計が欠けているため、一部のプロジェクトの状況では、このテンプレートエンジンを使用することができません(少なくとも些細ではありません)。

-拡張メカニズムの文書化は非常に不十分です。

既存の製品を分析した後、私たちのチームは、上記の製品の長所を備えた新しいテンプレートエンジンを作成し、私たちにとって重要な短所と短所を修正することにしました。 その結果、開発の基礎となった主要なアイデアのリストが作成されました。


建築

テンプレートエンジンの一部として、相互に関連する3つのコンポーネントを区別できます。


明らかに、正規表現と再帰降下パーサーに基づく字句解析器を使用することは、そのようなシステムを構築するための最も効果的なアプローチではありませんが、これは私たちの主要なタスクがテンプレート解釈プロセスの最大速度を保証することであったという事実によって正当化されます。 実際の条件では、テンプレートのソースコードを使用した作業はプロジェクトの開発中にのみ行われるため、パブリックアクセスのWebアプリケーションはソースコードの代わりにテンプレートの抽象構文ツリーを使用できるため、字句解析と構文解析を完全に排除できます。

テンプレートの構文

テンプレートは、テンプレート処理中にテンプレートエンジンによってコンテンツが実行される特別なテンプレートタグが挿入されたテキストドキュメントです。 テンプレートタグは、{{and}}文字で囲まれたテンプレート言語の構造です。 これらの文字以外のテキストドキュメントの断片は、テンプレートを変更せずに処理した結果に転送されます。

構文の基本
説明
コメント{{*コメント*}}
加工防止{{%{{2 * 2}}%}}
プロパティ値または変数値を表示する{{myValue}}
{{myProp.foo.bar}}
{{myObject ["foo"]。bar}}
関数とマクロの呼び出し{{loadText( "file.txt")}}
{{global.min(10、20、30)}}
{{myMacro( "foo"、 "bar")}}
メソッド呼び出し{{"String" .toUpperCase()}}
{{123.isNumber()}}

データ型
説明
定義されていない値{{undefined}}
値なし{{null}}
ブール値{{true}}
{{false}}
数字{{10}}
{{3.14}}
{{12E-4}}
{{"String"}}
{{'string'}}
配列{{[1、2、3]}}
{{["Foo": "bar"]}}

運営
説明
追加{{10 + 2}}
減算{{10-2}}
乗算{{10 * 2}}
部門{{10/2}}
除算の残り{{10 mod 2}}
単項マイナス{{-10}}
同様に{{10は10}}
等しくない{{10 isNot 2}}
もっと{{10> 2}}
少ない{{2 <10}}
より大きいか等しい{{10> = 2}}
より小さいか等しい{{2 <= 10}}
論理的な「OR」{{trueまたはfalse}}
論理的な「および」{{true and false}}
論理的な「NOT」{{not true}}
三項演算子{{true? true:false}}

構造
説明
変数宣言{{var myVar = 10}}

{{var myVar}}
...
{{/ var}}
状態{{trueの場合}}
...
{{elseif 42}}
...
{{else}}
...
{{/ if}}
サイクル{{値の値について}}
...
{{/ for}}

{{キーの場合:値の値}}
...
{{/ for}}
マクロ{{マクロmyMacro(arg1、arg2)}}
...
{{/マクロ}}
インポートテンプレート{{import "common.tpl"}}
関数またはマクロの呼び出し{{call myProc( "arg1"、 "arg2")}}
arg3
{{/ call}}

おわりに

この記事では、新しいオープンソースのクロスプラットフォームテンプレートエンジンの主な機能を簡単に説明しようとしました。 テンプレートの内部構造と基本構文に精通しています。 Histoneが動作するテクノロジーの詳細な説明に興味がある場合は、次の投稿でそれを伝えることができます。この投稿では、使用する字句解析プログラムの動作を調べます。

プロジェクトの開発に積極的に参加し、リソースに適用できます。 私たちのチームはすべての質問にお答えします。

参照資料

Source: https://habr.com/ru/post/J151061/


All Articles