python-markdownを追加して“ urlify”にするにはどうすればよいですかプレーンテキストをフォーマットする際のリンク?
質問
Markdownは、プレーンテキストをきれいなhtmlにフォーマットするための優れたツールですが、プレーンテキストリンクをURLに自動的に変換しません。このように:
テキストのブロックをフォーマットするときにURLにタグを追加するためにマークダウンを取得するにはどうすればよいですか
解決
superjoe30の正規表現をコンパイルできなかったため、プレーンダウンURL(Markdownテキスト内)をMarkdown互換に変換するように彼のソリューションを適合させました。
変更されたフィルター:
urlfinder = re.compile('^(http:\/\/\S+)')
urlfinder2 = re.compile('\s(http:\/\/\S+)')
@register.filter('urlify_markdown')
def urlify_markdown(value):
value = urlfinder.sub(r'<\1>', value)
return urlfinder2.sub(r' <\1>', value)
テンプレート内:
<div>
{{ content|urlify_markdown|markdown}}
</div>
他のヒント
マークダウンの拡張機能を作成できます。このコードをmdx_autolink.py
として保存しますimport markdown
from markdown.inlinepatterns import Pattern
EXTRA_AUTOLINK_RE = r'(?<!"|>)((https?://|www)[-\w./#?%=&]+)'
class AutoLinkPattern(Pattern):
def handleMatch(self, m):
el = markdown.etree.Element('a')
if m.group(2).startswith('http'):
href = m.group(2)
else:
href = 'http://%s' % m.group(2)
el.set('href', href)
el.text = m.group(2)
return el
class AutoLinkExtension(markdown.Extension):
"""
There's already an inline pattern called autolink which handles
<http://www.google.com> type links. So lets call this extra_autolink
"""
def extendMarkdown(self, md, md_globals):
md.inlinePatterns.add('extra_autolink',
AutoLinkPattern(EXTRA_AUTOLINK_RE, self), '<automail')
def makeExtension(configs=[]):
return AutoLinkExtension(configs=configs)
次に、テンプレートで次のように使用します。
{% load markdown %}
(( content|markdown:'autolink'))
更新:
このソリューションで問題が見つかりました:マークダウンの標準リンク構文が使用され、表示される部分が正規表現と一致する場合:
[www.google.com](http://www.yahoo.co.uk)
奇妙なことになります: www.google.com
しかし、誰がそれをしたいのですか?!
ベストケースシナリオ、マークダウンを編集して&lt; &gt; URLの周り。これにより、リンクがクリック可能になります。唯一の問題は、ユーザーまたはマークダウンの作成者を教育する必要があることです。
これはMarkdownの機能ではありません。URLに似たパターンを探すテキストに対してポストプロセッサを実行する必要があります。 Googleアプリエンジンのサンプルコード- AutoLink
変換を参照してください。
Djangoフレームワークを使用していました。これには、urlizeと呼ばれるフィルターがあります。 。ただし、プレーンテキストでのみ機能するため、マークダウンの出力を介して渡すことはできませんでした。 このガイドに従って、urlify2というカスタムフィルターを作成しましたこれはhtmlで機能し、このフィルターにテキストを渡します:
<div class="news_post">
{% autoescape off %}
{{ post.content|markdown|urlify2}}
{% endautoescape %}
</div>
urlify2.pyフィルター:
from django import template
import re
register = template.Library()
urlfinder = re.compile("([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}|((news|telnet|nttp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+):[0-9]*)?/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\),\\\"]")
@register.filter("urlify2")
def urlify2(value):
return urlfinder.sub(r'<a href="\1">\1</a>', value)
python-markdown2にはこのための追加機能があります:
http://code.google.com/p/python-markdown2 / wiki / LinkPatterns
この質問はほぼ10年前のものですが、markdown-urlizeは、URLの前にhttp(s)://を必要とせず、(google。 com)
、&lt; google.com&gt;
から山括弧を削除し、コードブロック内のURLを無視します。
https://github.com/r0wb0t/markdown-urlize
pipのインストールはありませんが、これをwgetできます:
https://raw.githubusercontent.com/r0wb0t/markdown -urlize / master / mdx_urlize.py
次に、上記のファイルをpythonパスに配置するか(最初のオプション)、または配置しないで(2番目のオプション)、次のいずれかを使用します。
markdown.markdown(text, extensions=['urlize'], safe_mode=True)
markdown.markdown(text, extensions=['path.to.mdx_urlize'], safe_mode=True)