拥有自动转义属性(我想保持这种方式),我希望用户能够输入一些自定义标记,以便有机会格式化文本。例如,[s][/s]
将被翻译成<strong></strong>
。我相信正确的方法是编写自定义 Jinja2 过滤器。但以下方法不起作用:
@app.template_filter()
@evalcontextfilter
def mark2html(eval_ctx, value):
result = escape(value).replace('[s]','<strong>')
if eval_ctx.autoescape:
result = Markup(result)
return result
当应用于像这样的文本时
<div>{{ custom_markup_text|mark2html }}</div>
When [s]
在字符串中遇到,存储在自定义标记文本,它应该转换为<strong>
标签。 AFAIK,Markup()函数确保我们信任这个特定的字符串,这样 HTML 就不会在那里被转义。过滤器已成功应用,[s]
被替换为<strong>
,但还是逃脱了。
显然,自动转义已经完成after这个自定义过滤器。另一方面,Jinja2 文档中的示例过滤器工作得很好:
@app.template_filter()
@evalcontextfilter
def nl2br(eval_ctx, value):
result = u'\n\n'.join(u'<p>%s</p>' % p.replace('\n', '<br>\n') \
for p in _paragraph_re.split(escape(value)))
if eval_ctx.autoescape:
result = Markup(result)
return result
我究竟做错了什么?
发现问题了。这是双重转义字符串——相当愚蠢。
这段代码可以完美运行:
@app.template_filter()
@evalcontextfilter
def mark2html(eval_ctx, value):
result = value.replace('[s]',u'<strong>')
result = result.replace('[/s]',u'</strong>')
if eval_ctx.autoescape:
result = Markup(result)
return result
Note, value不应转义,因为自动转义属性已打开。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)