在StringTemplate中——我在一些项目中使用过它来发出C代码——空白前缀会自动添加到输出行中:
PrintCFunction(linesGlobal, linesLocal) ::= <<
void foo() {
if (someRuntimeFlag) {
<linesGlobal>
if (anotherRuntimeFlag) {
<linesLocal>
}
}
}
>>
当该模板在StringTemplate中呈现时,空白在多行linesGlobal和lineLocal字符串前加前缀,为所有发射的线复制。生成的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)}}
}
}
但这可能很糟糕,因为我需要手动计算空白对于我发出的每一个字符串。。。
金贾2肯定提供了一种我所缺少的更好的方式吗?
目前还没有答案,因为很简单,Jinja2不支持此功能。
然而,是,这是一个开放的功能-如果你关心它,请加入那里的讨论。