2

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

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

当此模板在 StringTemplate 中呈现时,为所有发出的行复制多行linesGloballinesLocal字符串前缀的空格。生成的 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

1

There's no answer (yet), because quite simply, Jinja2 doesn't support this functionality.

There is, however, an open ticket for this feature - if you care about it, join the discussion there.

于 2014-11-20T16:41:13.623 回答