5

Markdown 是一个很好的工具,可以将纯文本格式化为漂亮的 html,但它不会自动将纯文本链接转换为 URL。像这个:

http://www.google.com/

格式化文本块时,如何获取降价以向 URL 添加标签?

4

7 回答 7

6

你可以写一个markdown的扩展。将此代码另存为 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

但是谁愿意这样做呢?!

于 2009-11-03T05:36:24.327 回答
4

最佳情况下,编辑降价并在 URL 周围放置 < >。这将使链接可点击。唯一的问题是它需要教育您的用户或编写降价的人。

于 2008-10-18T23:35:33.173 回答
3

在 python-markdown2 中有一个额外的:

http://code.google.com/p/python-markdown2/wiki/LinkPatterns

于 2008-10-15T07:55:15.090 回答
2

这不是 Markdown 的一个特性——你应该做的是对文本运行一个后处理器来寻找一个类似 URL 的模式。Google 应用引擎示例代码中有一个很好的示例——请参阅AutoLink转换。

于 2008-10-15T06:28:50.507 回答
2

我使用的是Django 框架,它有一个名为 urlize 的过滤器,它完全符合我的要求。但是,它只适用于纯文本,所以我无法通过 markdown 的输出。我按照本指南创建了一个名为 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)
于 2008-10-15T21:05:13.577 回答
2

我无法编译 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>
于 2009-05-06T07:42:34.763 回答
1

我知道这个问题已经有将近十年的历史了,但是 markdown-urlize 涵盖了我能想到的所有可能的用例,包括在 url 之前不需要 http(s)://,将括号留在 中(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)
于 2017-02-06T04:02:46.747 回答