如何在评论后禁用Jinja2空格修剪?

时间:2015-12-29 21:06:57

标签: whitespace jinja2 template-engine

我有一个像这样的Jinja 2模板:

foo{# comment #}
bar

启用trim_blocks后,模板呈现为:

foobar

我希望模板呈现如下:

foo
bar

我尝试使用+#}语法在评论后禁用修剪,但它没有用。我怎样才能做到这一点?我不想在模板中的每个评论后添加额外的换行符。

编辑:我无法控制呈现模板的代码,因此任何解决方案都必须位于模板本身内。

2 个答案:

答案 0 :(得分:1)

您可以更改评论块的lexing规则

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

答案 1 :(得分:1)

只需在评论后使用{{ "\n" }}输出换行符:

foo{# comment about foo #}{{ "\n" }}
bar

理想情况下,您可以更改渲染代码以不删除评论,但如果您不能,则会保留所需的输出