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



。 私が言えることは-ここにはテンプレートパラメータの宣言がないため、 options



kwargs



です。 たぶん、無駄なことではないでしょうか。



したがって、 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)



など。 for



if



elif



else



は純粋なpythonです。 もちろん、 yield



およびyield from



使用できます。 必要なものをインポートして、好きなように使用できます。

サポートされていない- try: except: ...



パーサーの現在のバージョンはあまりフレンドリーではないため、解析をやり直す必要があります。



次はジェネレーターです。 そして、ジェネレータは、知っているように、 next



だけでなく、 send



方法も知っています。 あなたはこれから得ることができるのは本当です、私は知りません、あなたは夢を見ることができます。 何らかの方法でデータをフィードし、出力に一部を与えることができます。



速度はjinja2と同じです。 おそらくどういうわけかオーバークロックを試すことができますが、基本的にはコードはyield



yield from



で構成され、 ast



を介してコンパイルさyield from



、最適化するものはほとんどありません。



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



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



All Articles