Backslant-スリムスタイルテンプレートエンジン

テンプレートエンジンを作成して、スリムタグが自動的に閉じるようにしたいなど。 美しくそう:
html head title - yield "!" + "  !" 


しかし、これは私には十分ではありません、私は自分自身の誤解を持ちたくない、私はちょうどPythonデザインが欲しいです。 そして、誰が自分自身を撃ち、ビジネスロジックをテンプレートに積み込みたいのですか?これは初心者にとって問題です、なぜビューコードをutils、template_tagsなどのフォルダに塗りつけて苦しむ必要があるのですか?

そして、ところで、あなたはそれを燃やすことができます-Python 3の新しいインポートメカニズムを通してテンプレートを拡張させます。 また、別のテンプレートから何かを挿入する必要がある場合は、それも機能させます。

そして、各テンプレートをジェネレーターにしましょう!



github.com/Deepwalker/backslantをご覧ください 。 彼はまだ完全には完成していませんが、フィードバックを得る必要があります。

5つのbase.bsを試してみましょう。

 !doctype/ html html head title | Page Title body h1 {'class': ' '.join(['main', 'content'], 'ng-app': 'Application'} "Page Header" div.content - yield from options['content_block']() div.footer "Backslant © 2015" 


ここにあるものdoctype/で終わるため、タグは</doctype>閉じてはいけません。

これまでの行は"で始まります。タグの本文の直後に後でできるように、文法を終了する必要があります。

h1引数は通常のpython dict渡されます。この辞書内で、ディクショナリ宣言にdictことができる任意のコード。

さらに興味深い-いくつかのoptionsある特定のcontent_block呼び出しからのyield from 。 私が言えることは-ここにはテンプレートパラメータの宣言がないため、 optionskwargsです。 たぶん、無駄なことではないでしょうか。

したがって、 content_blockについて-パラメーターでコールバックが提供されることを期待し、そこにジェネレーターがあると思います-すべてのテンプレートジェネレーターがあります。 これは、ある種のテンプレートがbase.bsを使用したいことを意味し、そのレンダーを呼び出し、そこにコールバックを渡します。

そして、これはindex.bsになります:

 - from . import base :call base.render(*options) :content_block - for i in range(10): p - yield 'Paragraph {}'.format(i) :footer_block p "Index page" 


ここでは、関数だけを正直に宣言して渡すのではなく、少し砂糖を使用します。 :callは、その子ノードを反復処理し、それらがすべて関数宣言であることを確認し、それらをパラメーターにポップします。 A :content_blockは、 content_blockという名前の引数なしの関数を宣言するだけで、同じ名前の:callを使用すると、引数に関数が送信されます。
そして、Pythonコードで使用できます:

 import backslant sys.meta_path.insert(0, backslant.PymlFinder('./templates', hook='backslant_import')) from backslant_import.home import index for chunk in index.render(title='The Real Thing'): print(chunk) 


狂った。 構文で追加するもの-関数を直接宣言できます- def func(a=True)など。 forifelifelseは純粋なpythonです。 もちろん、 yieldおよびyield from使用できます。 必要なものをインポートして、好きなように使用できます。
サポートされていない- try: except: ... パーサーの現在のバージョンはあまりフレンドリーではないため、解析をやり直す必要があります。

次はジェネレーターです。 そして、ジェネレータは、知っているように、 nextだけでなく、 send方法も知っています。 あなたはこれから得ることができるのは本当です、私は知りません、あなたは夢を見ることができます。 何らかの方法でデータをフィードし、出力に一部を与えることができます。

速度はjinja2と同じです。 おそらくどういうわけかオーバークロックを試すことができますが、基本的にはコードはyieldyield fromで構成され、 astを介してコンパイルさyield from 、最適化するものはほとんどありません。

だからここに。 構文はまだ完了できますが、いくつかのアイデアを紹介します。

ところでアイデアはありますか? 議論しましょう。 それまでの間、プロジェクトを見ることができます。例github.com/Deepwalker/backslant/tree/master/example

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


All Articles