Comment faire en sorte que python-markdown ajoute des liens «urlify» lors du formatage de texte brut?

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

  •  03-07-2019
  •  | 
  •  

Question

Markdown est un excellent outil pour formater du texte brut en joli HTML, mais il ne transforme pas automatiquement les liens en texte brut en URL. Comme celui-ci:

http://www.google.com/

Comment faire en sorte que Markdown ajoute des balises aux URL lorsque je formate un bloc de texte?

Était-ce utile?

La solution

Je ne pouvais pas compiler l'expression régulière de superjoe30, j'ai donc adapté sa solution pour convertir les URL simples (dans le texte de Markdown) afin qu'elles soient compatibles avec Markdown.

Le filtre modifié:

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)

Dans le modèle:

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

Autres conseils

Vous pouvez écrire une extension à démarquer. Enregistrez ce code sous le nom 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)

Ensuite, utilisez-le dans votre modèle comme ceci:

{% load markdown %}

(( content|markdown:'autolink'))

Mise à jour:

J'ai trouvé un problème avec cette solution: lorsque la syntaxe de lien standard de Markdown est utilisée et que la partie affichée correspond à l'expression régulière, par exemple:

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

devient étrangement:      www.google.com

Mais qui voudrait faire ça quand même?!

Dans le meilleur des cas, modifiez le markdown et mettez simplement < > autour des URL. Cela rendra le lien cliquable. Seul problème, il faut éduquer vos utilisateurs, ou quiconque écrit le démarquage.

Ceci n'est pas une fonctionnalité de Markdown - vous devez exécuter un post-processeur en regard du texte à la recherche d'un motif semblable à une URL. Il existe un bon exemple dans le exemple de code du moteur d'application Google - voir la transformation AutoLink .

J'utilisais le framework Django , qui dispose d'un filtre appelé urlize, qui fait exactement ce que je voulais. . Cependant, cela ne fonctionne que sur du texte brut, je ne pouvais donc pas passer par la sortie de markdown. J'ai suivi ce guide pour créer un filtre personnalisé appelé urlify2. qui fonctionne sur html, et a passé le texte à travers ce filtre:

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

Le filtre 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)

Il y a un extra pour cela dans python-markdown2:

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

Je sais que cette question date de près de dix ans, mais markdown-urlize couvre tous les cas d’utilisation possibles auxquels je pourrais penser, y compris le fait de ne pas exiger http (s): // avant une URL, laissant la parenthèse dans (google. com) , en supprimant les chevrons de < google.com > , en ignorant les URL dans les blocs de code, etc. Je n'avais pas pensé à:

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

Il n'y a pas d'installation de pip, mais vous pouvez utiliser ceci:

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

puis placez le fichier ci-dessus sur le chemin d'accès python (première option) ou non (deuxième option), puis utilisez l'un des éléments suivants:

markdown.markdown(text, extensions=['urlize'], safe_mode=True)
markdown.markdown(text, extensions=['path.to.mdx_urlize'], safe_mode=True)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top