Jinja2的过滤器,自定义标记转换为HTML(Jinja2 filter to convert c

2019-09-17 17:40发布

有对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>标记。 据我所知, 标记()函数确保我们相信这个特殊的字符串,使HTML是没有逃过那里。 该过滤器是成功的应用, [s]是通过取代<strong>但它仍然逃脱。

显然,autoescaping这是自定义过滤器进行。 在另一方面,从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

我究竟做错了什么?

Answer 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

注意, 不应逃脱,autoescape属性上。



文章来源: Jinja2 filter to convert custom markup to html