将 Django 的 urlize 与 CommonMark 一起使用

Using Django's urlize with CommonMark

我想使用 Django 的 urlize function together with django-markwhat's CommonMark 过滤器。

我正在想象这样的事情:

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

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

如果我在 commonmark 之后应用 urlize,像这样:

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

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

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

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

但是,如果您希望 CommonMark 具有此行为,而 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 的文档并进行相应调整。

要使用您的自定义过滤器,请将上述代码保存到应用程序 templatetags 目录中名为 linkify.py 的文件中(有关完整说明,请参阅 Django docs)。然后在模板中执行以下操作:

{% load linkify %}

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