2015-04-08 69 views
0

我想使用Django的urlize函數連同django-markwhatCommonMark過濾器。使用Django的URL與CommonMark

我想象這樣的事情:

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

其輸出<p><a href="http://example.com">http://example.com</a></p>。這裏的問題在於已經標記爲共同標記的網址(例如<http://example.com>)將在其周圍使用斜角括號進行渲染。

如果我申請urlizecommonmark後,像這樣:

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

urlize功能不檢測URL中<p>http://example.com</p>(和它在urlize文檔提到,如預期的HTML,它不會工作輸入)。

我還沒有拿出一個解決方案,所以讓我知道你是否有任何想法。

+0

我很困惑。 CommonMark不會將[自動鏈接](http://spec.commonmark.org/0.18/#autolinks)(帶有尖括號的鏈接)轉換爲正確的鏈接?他們不需要urlize過濾器。在我看來,像你的第一個例子應該工作得很好。它給出了什麼輸出? – Waylan

+0

CommonMark的自動鏈接版本工作正常,這是正確的。在我的應用程序中,我甚至希望鏈接不被'<' and '>'包圍,轉換爲''標籤。我意識到這不是在CommonMark規範中,但網站通常會自動標記已識別的鏈接,一個示例實現是https://github.com/jch/html-pipeline – nnyby

+0

我的第一個示例適用於未標記的鏈接, up鏈接,例如'http:// example.com'。它會打斷降價自動鏈接,比如'',在鏈接周圍加上多餘的括號,比如'<

http://example.com

>' – nnyby

回答

3

爲了完整起見,簡單的答案是切換到Markdown解析器,該解析器提供您想要的開箱即用行爲。存在多個extensions,它們使Python-Markdown成爲所需的行爲。

但是,如果您希望CommonMark的這種行爲不支持這種行爲本身,那麼您將需要創建一個自定義的urlize過濾器,它可以在HTML上運行。幸運的是,The 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,並且不希望CommonMark的輸出被清理。隨時審查Bleach的文檔並進行相應調整。

要使用自定義過濾器,上面的代碼保存到你的應用程序一個templatetags目錄中名爲linkify.py文件(見Django的docs更全面的解釋)。然後在一個模板中,執行以下操作:

{% load linkify %} 

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