Como faço para obter python-markdown para além disso “urlify” links quando a formatação de texto simples?

StackOverflow https://stackoverflow.com/questions/203859

  •  03-07-2019
  •  | 
  •  

Pergunta

Markdown é uma grande ferramenta para a formatação de texto simples em muito html, mas ele não liga ligações de texto simples em URLs automaticamente. Como esta:

http://www.google.com/

Como faço para me markdown para adicionar tags para URLs quando eu formatar um bloco de texto?

Foi útil?

Solução

Eu não conseguia expressão regular das superjoe30 para compilar, então eu adaptou sua solução para converter URLs simples (dentro do texto Markdown) ser Markdown compatível.

O filtro modificado:

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)

Dentro do modelo:

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

Outras dicas

Você poderia escrever uma extensão para remarcação. Salve esse código como 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)

Em seguida, usá-lo em seu modelo como este:

{% load markdown %}

(( content|markdown:'autolink'))

Update:

Eu encontrei um problema com esta solução: Quando a sintaxe do link padrão de remarcação é utilizada ea parte exibida corresponde à expressão regular, por exemplo:

[www.google.com](http://www.yahoo.co.uk)

estranhamente torna-se: www.google.com

Mas quem iria querer fazer isso de qualquer maneira?!

Melhor cenário, editar a remarcação e basta colocar <> em torno das URLs. Isso fará com que o link clicável. O único problema é que ele requer educar seus usuários, ou quem escreve a remarcação.

Esta não é uma característica do Markdown - o que você deve fazer é executar um pós-processador contra o texto à procura de um URL semelhante a padrão. Há um bom exemplo no Google exemplo de código app engine -. ver transformar o AutoLink

Eu estava usando o Django quadro, que tem um filtro chamado urlize, que faz exatamente o que eu queria . No entanto, ele só funciona em texto puro, então eu não poderia passar é através da saída de remarcação. Segui este guia para criar um filtro personalizado chamado urlify2 que funciona em html, e passou o texto através deste filtro:

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

O filtro 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)

Há um extra para isso em python-markdown2:

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

Eu sei que esta pergunta é quase uma década de idade, mas as tampas remarcação-urlize cada caso de uso possível que eu poderia pensar incluindo não requerem HTTP (S): // antes de uma url, deixando o parêntese na (google.com), removendo os colchetes de <google.com>, ignorando urls em blocos de código, e mais eu não tinha pensado:

https://github.com/r0wb0t/markdown-urlize

Há instalar nenhum pip, mas você pode wget isto:

https://raw.githubusercontent.com/r0wb0t/markdown -urlize / master / mdx_urlize.py

e em seguida, colocar o arquivo acima no caminho python (primeira opção) ou não (segunda opção) e, em seguida, usar um dos seguintes procedimentos:

markdown.markdown(text, extensions=['urlize'], safe_mode=True)
markdown.markdown(text, extensions=['path.to.mdx_urlize'], safe_mode=True)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top