【问题标题】:Jinja2 filter to convert custom markup to htmlJinja2 过滤器将自定义标记转换为 html
【发布时间】:2012-06-07 20:43:41
【问题描述】:

启用 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中,应该转换为&lt;strong&gt;标签。 AFAIK,Markup() 函数确保我们信任这个特定的字符串,因此 HTML 不会在那里转义。过滤器申请成功,[s]&lt;strong&gt;替换,但还是被转义了。

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

我做错了什么?

【问题讨论】:

    标签: python filter escaping flask jinja2


    【解决方案1】:

    发现问题。这是双重转义字符串 - 相当愚蠢。 这段代码完美无缺:

    @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
    

    注意,value 不应转义,因为 autoescape 属性已开启。

    【讨论】:

    猜你喜欢
    • 2021-02-24
    • 2012-01-10
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多