字符串格式化-Jinja2自动创建前缀空白



在StringTemplate中——我在一些项目中使用过它来发出C代码——空白前缀会自动添加到输出行中:

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

当该模板在StringTemplate中呈现时,空白在多行linesGloballineLocal字符串前加前缀,为所有发射的线复制。生成的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不支持此功能。

然而,,这是一个开放的功能-如果你关心它,请加入那里的讨论。

最新更新