我想将Django的urlize功能与django-markwhat的CommonMark过滤器一起使用。
我想象这样的事情:
{{ "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输入)。
我还没有提出解决方案,所以如果您有任何想法,请告诉我。
答案 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 }}