1

我想将 Django 的urlize函数与django-markwhatCommonMark过滤器一起使用。

我在想象这样的事情:

{{ "http://example.com"|urlize|commonmark }}

哪个输出<p><a href="http://example.com">http://example.com</a></p>。这里的问题是,已经用 commonmark 标记的 URL,如<http://example.com>,将在它们周围用尖括号呈现。

如果我urlize之后申请commonmark,像这样:

{{ "http://example.com"|commonmark|urlize }}

urlize函数未检测到其中的 url <p>http://example.com</p>(并且在urlize文档中提到它对于 html 输入不会按预期工作)。

我还没有提出解决方案,所以如果您有任何想法,请告诉我。

4

1 回答 1

4

为了完整起见,简单的答案是切换到 Markdown 解析器,它提供您想要的开箱即用行为。存在多个扩展,它们为 Python-Markdown 提供了所需的行为。

但是,如果您希望 CommonMark 的这种行为本身不支持这种行为,那么您将需要创建一个在 HTML 上运行的自定义 urlize 过滤器。幸运的是,Bleach 库提供了一个linkify函数,可以正确处理这个问题。

当然,然后您需要创建一个模板过滤器来包装:

from django import template
import bleach
from html5lib.tokenizer import HTMLTokenizer

register = template.Library()

@register.filter(is_safe=True)
def linkify(value):
    return bleach.linkify(value, skip_pre=True, parse_email=True, tokenizer=HTMLTokenizer)

请注意,我假设您确实想要解析电子邮件地址以及 URL,您不希望解析代码块中的 URL,并且您不希望 CommonMark 的输出被净化。随意查看 Bleach 的文档并进行相应调整。

要使用自定义过滤器,请将上面的代码保存到应用程序目录中命名的文件中(请参阅 Djangolinkify.py文档获取完整说明)。然后在模板中,执行以下操作:templatetags

{% load linkify %}

{{ "http://example.com"|commonmark|linkify }}
于 2015-04-10T19:40:45.420 回答