将 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 }}
我想使用 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 }}