【问题标题】:How do I get python-markdown to additionally "urlify" links when formatting plain text?格式化纯文本时,如何让 python-markdown 额外“urlify”链接?
【发布时间】:2010-09-17 06:14:49
【问题描述】:

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

http://www.google.com/

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

【问题讨论】:

    标签: python django markdown


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      我使用的是Django framework,它有一个名为 urlize 的过滤器,它完全符合我的要求。但是,它只适用于纯文本,所以我无法通过 markdown 的输出。我跟着this guide 创建了一个名为 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)
      

      【讨论】:

      • 这将 urlify 代码块内不需要的链接,也将双 urlify html 锚。
      【解决方案3】:

      你可以为 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

      但谁愿意这样做呢?!

      【讨论】:

      • > 但是谁愿意这样做呢?!网络钓鱼者?
      【解决方案4】:

      我无法编译 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>
      

      【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 现在在github.com/trentm/python-markdown2 和它的link-patterns extra(记录在 Wiki 中)正是这样做的,并保持现有的 HTML 和 Markdown 格式链接不变。我尝试过的任何其他方法都无法令人满意。
        【解决方案7】:

        这不是 Markdown 的一个特性——你应该做的是对文本运行一个后处理器来寻找一个类似 URL 的模式。 Google app engine example code 中有一个很好的例子——参见 AutoLink 转换。

        【讨论】:

        • 后处理器将不得不忽略 和 <pre></pre> 中的链接
        猜你喜欢
        • 1970-01-01
        • 2022-01-18
        • 2021-07-18
        • 2019-11-11
        • 1970-01-01
        • 2010-10-20
        • 2021-12-24
        • 1970-01-01
        • 2017-04-15
        相关资源
        最近更新 更多