我正在尝试实现这个 Jinja nl2br过滤器.它正常工作,除了<br>它添加的它被转义.这对我来说很奇怪,因为<p>它们没有被转义并且它们都在同一个字符串中.
我正在使用烧瓶,因此autoescape启用了Jinja .当我发现这个人说autoescape并且escape(value)可能导致双重逃逸时,我真的很有希望,但删除escape()没有帮助.
这是我修改过的代码及其输出:
@app.template_filter()
@evalcontextfilter
def nl2br(eval_ctx, value):
_paragraph_re = re.compile(r'(?:\r\n|\r(?!\n)|\n){2,}')
result = u'\n\n'.join(u'<p>%s</p>' % escape(p.replace(u'\r\n', u'<br>\n')) for p in _paragraph_re.split(value))
if eval_ctx.autoescape:
result = Markup(result)
return result
Run Code Online (Sandbox Code Playgroud)
输入:
u'1\r\n2\r\n\r\n3\r\n4\r\n\r\n5\r\n6\r\n7'
Run Code Online (Sandbox Code Playgroud)
输出:
<p>1<br>
2</p>
<p>3<br>
4</p>
<p>5<br>
6<br>
7</p>
Run Code Online (Sandbox Code Playgroud)
期望的输出:
<p>1<br>2</p>
<p>3<br>4</p>
<p>5<br>6<br>7</p>
Run Code Online (Sandbox Code Playgroud)
什么可能导致<br>逃脱,但允许<p>的?