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

标签 python filter escaping flask jinja2

启用 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>标签。据我所知,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

请注意, 不应转义,因为自动转义属性已启用。

关于python - Jinja2 过滤器将自定义标记转换为 html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10870081/

相关文章:

python - 将复杂的 json 对象插入到 sql 模式中

python - 为什么使用 ThreadPoolExecutor 时并发不起作用?

javascript - AngularJS 过滤器唯一删除 ng-options 中的重复项

regex - groovy:如何在 textarea 中转义 "("正则表达式等?

c# - 如何在 c# Windows 8 中实现自定义转义序列相关的新行?

python - 使用 boto3 解析 AWS S3 中的文件

python - 向 HSM 发送命令时出现问题

javascript - 如何从 JavaScript 中的字符串数组中删除字符模式?

asp.net-mvc - 使用授权过滤器区分 Controller 操作

c# - 如何在 C# 中将\symbol 添加到字符串的末尾