加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:28:23 所属栏目:Python 来源:网络整理
导读:拥有autoescape属性(我希望保持这种方式),我希望用户能够输入一些自定义标记,以便有机会格式化文本.例如,[s] [/ s]将被翻译为 strong / strong.我认为正确的方法是编写自定义的Jinja2过滤器.但以下不起作用: @app.template_filter()@evalcontextfilterdef m
拥有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'nn'.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属性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读