python – Jinja2过滤器将自定义标记转换为html

拥有autoescape属性(我希望保持这种方式),我希望用户能够输入一些自定义标记,以便有机会格式化文本.例如,[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>

当在字符串中遇到[s]并存储在custom_markup_text中时,应将其转换为< strong>标签. AFAIK,Markup()函数确保我们信任这个特定的字符串,以便HTML不会在那里进行转义.成功应用了过滤器,[s]被< strong>取代,但它仍然被转义.

显然,自动转换是在此自定义过滤器之后完成的.另一方面,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

请注意,不应转义值,因为启用了autoescape属性.

上一篇:如何使javascript打印json对象(从ruby发送)而不将其解释为html?


下一篇:php – 没有连接的多字节mysql_real_escape_string?