web-dev-qa-db-ja.com

Jinjaはincludeまたはmacroでインデントを維持します

ファイル内にインクルードまたはマクロを追加するときに、jinjaでインデントを維持する方法があるかどうか疑問に思っています。 jinjaを使用してコードファイルを生成したいと思います。例は

ファイル:class.html

class MyClass:
     def someOp():
         pass

     {% include "someOp.html" %}

ファイル:someOp.html

def someOp2():
    pass

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

class MyClass:
     def someOp():
         pass

     def someOp2():
         pass

インクルードファイルの各行のインデントタグの前にjinjaにインデントを追加する方法はありますか?または、これを行うためにjinjaをカスタマイズする方法はありますか?

31
Razvi

1つの方法は、インクルードをマクロでラップすることです。マクロは関数であるため、その出力をインデントフィルターに渡すことができます。

class MyClass:
    def someOp():
        pass

    {% macro someop() %}{% include "someOp.html" %}{% endmacro %}
    {{ someop()|indent }}

デフォルトでは、「indent」は4つのスペースをインデントし、最初の行をインデントしません。たとえば、次のように使用できます。さらにインデントするには「indent(8)」を参照してください。詳細については、 http://jinja.pocoo.org/docs/templates/#list-of-builtin-filters を参照してください。

含めるものが最初にマクロとして定義されている場合は、それ以上のラッパーマクロは必要なく、インデントフィルターの使用に直接ジャンプできます。

20
AmirS

私は同じことを達成するためにJinja2を探していましたが、複数行のブロックインデントを元のJinjaステートメントに合わせることが現在不可能であるという結論に達しました。

新しい構文を追加するために、Jinjaに小さなPRを投稿しました{%* ... %}および{{* ... }}まさにこれを行います。詳細については、PRを参照してください。

https://github.com/pallets/jinja/pull/919

2
wigwam