2

一部のプロジェクトで C コードを出力するために使用した StringTemplate では、空白のプレフィックスが出力行に自動的に追加されます。

PrintCFunction(linesGlobal, linesLocal) ::= <<
void foo() {
    if (someRuntimeFlag) {
        <linesGlobal>
        if (anotherRuntimeFlag) {
            <linesLocal>
        }
    }
}
>>

このテンプレートが StringTemplate でレンダリングされると、複数行のlinesGlobalおよびlinesLocal文字列の先頭にある空白が、出力されるすべての行にコピーされます。生成された C コードは次のとおりです。

void foo() {
    if (someRuntimeFlag) {
        int i;
        i=1;   // <=== whitespace prefix copied in 2nd
        i++;   // <=== and 3rd line
        if (anotherRuntimeFlag) {
            int j=i;
            j++; //  <=== ditto
        }
    }
}

私はJinja2を初めて使用します-これを複製して、Python/Jinja2を使用して同じことを実行できるかどうかを確認しました:

#!/usr/bin/env python
from jinja2 import Template

linesGlobal='\n'.join(['int i;', 'i=1;'])
linesLocal='\n'.join(['int j=i;', 'j++;'])

tmpl = Template(u'''\
void foo() {
    if (someRuntimeFlag) {
        {{linesGlobal}}
        if (anotherRuntimeFlag) {
            {{linesLocal}}
        }
    }
}
''')

print tmpl.render(
    linesGlobal=linesGlobal,
    linesLocal=linesLocal)

...しかし、これが生成されるのを見ました:

void foo() {
    if (someRuntimeFlag) {
        int i;
i=1;
        if (anotherRuntimeFlag) {
            int j=i;
j++;
        }
    }
}

...これは私が望むものではありません。これで出力に適切な空白プレフィックスを出力させることができました:

...
if (someRuntimeFlag) {
    {{linesGlobal|indent(8)}}
    if (anotherRuntimeFlag) {
        {{linesLocal|indent(12)}}
    }
}

...しかし、出力するすべての文字列の空白を手動でカウントする必要があるため、これは間違いなく悪いことです...

確かにJinja2は私が見逃しているより良い方法を提供していますか?

4

1 に答える 1