Как мне заставить 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'))
Обновлять:
Я нашел проблему с этим решением:Когда используется стандартный синтаксис ссылок Markdown и отображаемая часть соответствует регулярному выражению, например:
[www.google.com](http://www.yahoo.co.uk)
странно становится: www.google.com
Но кто вообще захочет это сделать?!
В лучшем случае отредактируйте уценку и просто поместите < > вокруг URL-адресов.Это сделает ссылку кликабельной.Единственная проблема в том, что это требует обучения ваших пользователей или того, кто пишет уценку.
Это не особенность Markdown — вам следует запустить постпроцессор для текста в поисках шаблона, похожего на URL.Есть хороший пример в Пример кода движка приложений Google -- см. AutoLink
трансформировать.
я использовал Фреймворк Джанго, в котором есть фильтр 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 для этого есть дополнительная информация:
Я знаю, что этому вопросу уже почти десять лет, но markdown-urlize охватывает все возможные варианты использования, которые я мог придумать, в том числе не требовать http(s):// перед URL-адресом, оставляя круглые скобки в (google.com)
, сняв угловые скобки с <google.com>
, игнорирование URL-адресов в блоках кода и многое другое, о чем я не подумал:
https://github.com/r0wb0t/markdown-urlize
Здесь нет установки pip, но вы можете получить это:
https://raw.githubusercontent.com/r0wb0t/markdown-urlize/master/mdx_urlize.py
а затем либо поместите указанный выше файл в путь Python (первый вариант), либо нет (второй вариант), а затем используйте одно из следующих действий:
markdown.markdown(text, extensions=['urlize'], safe_mode=True)
markdown.markdown(text, extensions=['path.to.mdx_urlize'], safe_mode=True)