【问题标题】:How to disable Jinja2 whitespace trimming after comment?评论后如何禁用 Jinja2 空白修剪?
【发布时间】:2015-12-29 21:06:56
【问题描述】:
我有一个这样的 Jinja 2 模板:
foo{# comment #}
bar
启用trim_blocks 时,模板呈现为:
foobar
我希望模板呈现如下:
foo
bar
我尝试使用+#} 语法在注释后禁用修剪,但它不起作用。我怎样才能做到这一点?我不想在模板中的每条评论之后都添加额外的换行符。
编辑:我无法控制呈现模板的代码,因此任何解决方案都必须在模板本身内。
【问题讨论】:
标签:
whitespace
jinja2
template-engine
【解决方案1】:
只需在注释后使用{{ "\n" }} 输出换行符:
foo{# comment about foo #}{{ "\n" }}
bar
理想情况下,您可以将渲染代码更改为不剥离 cmets,但如果您不能这样做,这将保留所需的输出。
【解决方案2】:
您可以更改评论块的词法规则
import re
from jinja2 import Environment
from jinja2.lexer import TOKEN_COMMENT, TOKEN_COMMENT_BEGIN, TOKEN_COMMENT_END, Failure
env = Environment()
env.trim_blocks = True
c = lambda x: re.compile(x, re.M | re.S)
e = re.escape
comment_block_suffix_re = ''
env.lexer.rules[TOKEN_COMMENT_BEGIN] = [
(c(r'(.*?)((?:\-%s\s*|%s)%s)' % (
e(env.comment_end_string),
e(env.comment_end_string),
comment_block_suffix_re
)), (TOKEN_COMMENT, TOKEN_COMMENT_END), '#pop'),
(c('(.)'), (Failure('Missing end of comment tag'),), None)
]
详见词法分析模块的source code