¿Cómo obtengo python-markdown para además "urlificar" enlaces al formatear texto sin formato?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Markdown es una gran herramienta para formatear texto plano en bastante html, pero no convierte los enlaces de texto plano en URL automáticamente. Como este:

http://www.google.com/

¿Cómo obtengo un descuento para agregar etiquetas a las URL cuando formateo un bloque de texto?

¿Fue útil?

Solución

No pude obtener la expresión regular de superjoe30 para compilar, así que adapté su solución para convertir URL simples (dentro del texto de Markdown) para que sea compatible con Markdown.

El 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 de la plantilla:

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

Otros consejos

Podría escribir una extensión para rebajar. Guarde este 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)

Luego utilícelo en su plantilla de esta manera:

{% load markdown %}

(( content|markdown:'autolink'))

Actualización:

He encontrado un problema con esta solución: cuando se usa la sintaxis de enlace estándar de markdown y la parte que se muestra coincide con la expresión regular, por ejemplo:

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

extrañamente se convierte en:      www.google.com

¿Pero quién querría hacer eso de todos modos?

En el mejor de los casos, edite el descuento y simplemente ponga < > alrededor de las URL. Esto hará que se pueda hacer clic en el enlace. El único problema es que requiere educar a sus usuarios o a quien escriba la rebaja.

Esta no es una característica de Markdown: lo que debe hacer es ejecutar un postprocesador contra el texto en busca de un patrón similar a una URL. Hay un buen ejemplo en el código de ejemplo del motor de la aplicación de Google : vea la transformación AutoLink .

Estaba usando el Django framework , que tiene un filtro llamado urlize, que hace exactamente lo que quería . Sin embargo, solo funciona en texto plano, por lo que no pude pasar es a través de la salida de Markdown. Seguí esta guía para crear un filtro personalizado llamado urlify2 que funciona en html y pasó el texto a través de este filtro:

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

El 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)

Hay un extra para esto en python-markdown2:

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

Sé que esta pregunta tiene casi una década, pero markdown-urlize cubre todos los casos de uso posibles en los que podría pensar, incluyendo no requerir http (s): // antes de una url, dejando el paréntesis en (google. com) , quitando los corchetes angulares de < google.com > , ignorando las URL en los bloques de código, y más en lo que no había pensado:

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

No hay instalación de pip, pero puede hacer esto:

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

y luego coloque el archivo anterior en la ruta de Python (primera opción) o no (segunda opción) y luego use uno de los siguientes:

markdown.markdown(text, extensions=['urlize'], safe_mode=True)
markdown.markdown(text, extensions=['path.to.mdx_urlize'], safe_mode=True)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top