Проверьте URL изображения с помощью python-markdown - PullRequest
5 голосов
/ 09 мая 2011

На создаваемом мной веб-сайте я использую Python-Markdown для форматирования новостных сообщений. Чтобы избежать проблем с неработающими ссылками и проблемами HTTP-контента-на-HTTPS-странице, мне требуется, чтобы редакторы загрузили все изображения на сайт, а затем внедрили их (я использую редактор уценок, который я пропатчил, чтобы облегчить внедрение из этих изображений с использованием стандартного синтаксиса уценки).

Однако я бы хотел применить в своем коде политику отсутствия внешних изображений.

Одним из способов было бы написать регулярное выражение для извлечения URL-адресов изображений из исходного кода уценки или даже запустить его через средство визуализации уценок и использовать DOM-анализатор для извлечения всех атрибутов src из тегов img.

Однако мне любопытно, есть ли какой-нибудь способ подключиться к Python-Markdown, чтобы извлечь все ссылки на изображения или выполнить пользовательский код (например, вызвать исключение, если ссылка является внешней) во время синтаксического анализа.

Ответы [ 2 ]

8 голосов
/ 12 мая 2011

Один из подходов - перехватить узел <img> на более низком уровне сразу после того, как Markdown проанализирует и создаст его:

import re
from markdown import Markdown
from markdown.inlinepatterns import ImagePattern, IMAGE_LINK_RE

RE_REMOTEIMG = re.compile('^(http|https):.+')

class CheckImagePattern(ImagePattern):

    def handleMatch(self, m):
        node = ImagePattern.handleMatch(self, m)
        # check 'src' to ensure it is local
        src = node.attrib.get('src')
        if src and RE_REMOTEIMG.match(src):
            print 'ILLEGAL:', m.group(9)
            # or alternately you could raise an error immediately
            # raise ValueError("illegal remote url: %s" % m.group(9))
        return node

DATA = '''
![Alt text](/path/to/img.jpg)
![Alt text](http://remote.com/path/to/img.jpg)
'''

mk = Markdown()
# patch in the customized image pattern matcher with url checking
mk.inlinePatterns['image_link'] = CheckImagePattern(IMAGE_LINK_RE, mk)
result = mk.convert(DATA)
print result

Вывод:

ILLEGAL: http://remote.com/path/to/img.jpg
<p><img alt="Alt text" src="/path/to/img.jpg" />
<img alt="Alt text" src="http://remote.com/path/to/img.jpg" /></p>
0 голосов
/ 28 февраля 2019

Обновлено с Python 3 и Python-Mardown 3

import re
from markdown import Markdown
from markdown.inlinepatterns import Pattern, IMAGE_LINK_RE

RE_REMOTEIMG = re.compile('^(http|https):.+')

class CheckImagePattern(Pattern):

    def handleMatch(self, m):
        node = Pattern.handleMatch(self, m)
        # check 'src' to ensure it is local
        src = node.attrib.get('src')
        if src and RE_REMOTEIMG.match(src):
            print 'ILLEGAL:', m.group(9)
            # or alternately you could raise an error immediately
            # raise ValueError("illegal remote url: %s" % m.group(9))
        return node

DATA = '''
![Alt text](/path/to/img.jpg)
![Alt text](http://remote.com/path/to/img.jpg)
'''

mk = Markdown()
# patch in the customized image pattern matcher with url checking
mk.inlinePatterns['image_link'] = CheckImagePattern(IMAGE_LINK_RE, mk)
result = mk.convert(DATA)
print result

Надеюсь, это полезно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...