2013-02-14 33 views
2

在StringTemplate的 - 我已經在某些項目用於發射的C代碼 - 空白前綴中,輸出線在自動添加:Jinja2的自動創建前綴空白

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

當該模板在StringTemplate的呈現,空白 在多行行的前綴全局行本地字符串 被複製爲發出的所有行。生成的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提供了一種我錯過的更好的方式嗎?

回答