使用Django与CommonMark的urlize

时间:2015-04-08 02:26:10

标签: python django markdown urlize commonmark

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

我想象这样的事情:

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

哪个输出<p><a href="http://example.com">http://example.com</a></p>。这里的问题是,已经在公共标记中标记的网址(如<http://example.com>)将使用围绕它们的斜角括号进行渲染。

如果我在urlize之后应用commonmark,请执行以下操作:

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

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

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

1 个答案:

答案 0 :(得分:3)

为了完整起见,简单的答案是切换到Markdown解析器,它提供您想要开箱即用的行为。存在多个extensions,它为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)

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

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

{% load linkify %}

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