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

How to disable Jinja2 whitespace trimming after comment?

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

foo{# comment #}
bar

启用 trim_blocks 时,模板呈现为:

foobar

我希望模板呈现如下:

foo
bar

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

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

您可以更改评论块的词法规则

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

在注释后使用{{ "\n" }}简单地输出一个换行符:

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

理想情况下,您可以将渲染代码更改为不去除注释,但如果不能,这将保留所需的 输出