如何使python降价为“额外”;urlify“;格式化纯文本时的链接?

如何使python降价为“额外”;urlify“;格式化纯文本时的链接?,python,django,markdown,Python,Django,Markdown,Markdown是一个将纯文本格式化为漂亮html的好工具,但它不会自动将纯文本链接转换为URL。像这个: 当我格式化文本块时,如何获得标记以向URL添加标记?这不是标记的一个功能--您应该对文本运行后处理器,以查找类似URL的模式。在中有一个很好的例子——请参见自动链接转换。在python-markdown2中有一个额外的例子: 我使用的是,它有一个名为urlize的过滤器,它正是我想要的。但是,它只对纯文本有效,所以我无法通过markdown的输出传递。我随后创建了一个名为URLIF2的自

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


当我格式化文本块时,如何获得标记以向URL添加标记?

这不是标记的一个功能--您应该对文本运行后处理器,以查找类似URL的模式。在中有一个很好的例子——请参见
自动链接
转换。

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

我使用的是,它有一个名为urlize的过滤器,它正是我想要的。但是,它只对纯文本有效,所以我无法通过markdown的输出传递。我随后创建了一个名为URLIF2的自定义过滤器,该过滤器可用于html,并通过此过滤器传递文本:

<div class="news_post">
  {% autoescape off %}
    {{ post.content|markdown|urlify2}}
  {% endautoescape %}
</div>

{%autoescape off%}
{{post.content | markdown | urlifi2}}
{%endautoescape%}
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)
来自django导入模板的

进口稀土
register=template.Library()
(0-9)0-9{{{1,3 3}{{1,3}}[1,3}[0-9{{1,3}[1,3}[1,3}[1,3}[0-9”0-9[1,3}[1,3}[1,3}[1,3,3)再。编译(((([0-9-9-9-9[0-9[0-9[1,3)1,3}[1,3}[1,3)上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述人士人士(1,1,1,1,1,1,3,1,3,3,3,3,3,3,3,3)上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述的)):@&=\?/~\\\\\\%]*[^]'\\.}>\\),\\\“]”)
@register.filter(“urlify2”)
def urlify2(值):
返回urlfinder.sub(r'',值)

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

我无法编译superjoe30的正则表达式,所以我调整了他的解决方案以转换纯URL(在标记文本中)与降价兼容

修改后的过滤器:

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)
urlfinder=re.compile('^(http:\/\/\S+))
urlfinder2=re.compile('\s(http:\/\/\s+))
@register.filter('urlify\u markdown')
def urlify_降价(值):
value=urlfinder.sub(r'',值)
返回urlfinder2.sub(r'',值)
在模板中:

<div>
    {{ content|urlify_markdown|markdown}}
</div>

{{content | urlify | markdown}

您可以编写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)
更新:

我发现这个解决方案存在一个问题:当使用markdown的标准链接语法并且显示的部分与正则表达式匹配时,例如:

[www.google.com](http://www.yahoo.co.uk)
奇怪的是:


但是谁会想这么做呢?!

我知道这个问题已经有十年历史了,但是markdown urlize涵盖了我能想到的所有可能的用例,包括不需要http://在url之前,在
中留下括号(google.com)
,删除
中的尖括号,忽略代码块中的URL,以及我没有想到的更多内容:

没有pip安装,但您可以设置:

然后将上述文件放在python路径上(第一个选项)或不放在python路径上(第二个选项),然后使用以下选项之一:

markdown.markdown(text, extensions=['urlize'], safe_mode=True)
markdown.markdown(text, extensions=['path.to.mdx_urlize'], safe_mode=True)

(如果您对匹配许多实际URL的优化正则表达式感兴趣,可以在上面的代码中使用以下代码:)不适用于包含html锚的内容,也不适用于代码块中存在链接的情况。后处理器将不得不忽略
中的链接,这将使代码块中不需要的链接URL化,还将使html锚加倍URL化。>但谁会想这么做?!钓鱼者?这是现在的及其
linkpatterns
extra(记录在Wiki中)正是这样做的,并保持现有的HTML和标记格式链接不变。我尝试过的其他方法都没有令人满意的效果。
markdown.markdown(text, extensions=['urlize'], safe_mode=True)
markdown.markdown(text, extensions=['path.to.mdx_urlize'], safe_mode=True)