Не отображать изображение с незарегистрированных хостов в python markdown - PullRequest
0 голосов
/ 02 апреля 2019

Я использую Python-Markdown для визуализации сгенерированного пользователем контента. Я хочу изменить изображения из внешних источников на ссылки.

Итак, у меня есть список хранилищ:

storages = ['foo.com', 'bar.net']

и мне нужно заменить

![](http://external.com/image.png)

что-то вроде:

[http://external.com/image.png](http://external.com/image.png)

если хост не находится в хранилищах.

Я пытался редактировать текст уценки перед сохранением в базу данных, но это не очень хорошее решение, так как пользователь может захотеть отредактировать свои данные и обнаружить, что данные были изменены. Поэтому я хочу сделать эту замену при рендере.

1 Ответ

2 голосов
/ 04 апреля 2019

Одно решение вашего вопроса продемонстрировано в этом руководстве :

from markdown.treeprocessors import Treeprocessor
from markdown.extensions import Extension
from urllib.parse import urlparse


class InlineImageProcessor(Treeprocessor):
    def __init__(self, md, hosts):
        self.md = md
        self.hosts = hosts

    def is_unknown_host(self, url):
        url = urlparse(url)
        return url.netloc and url.netloc not in self.hosts

    def run(self, root):
        for element in root.iter('img'):
            attrib = element.attrib
            if self.is_unknown_host(attrib['src']):
                tail = element.tail
                element.clear()
                element.tag = 'a'
                element.set('href', attrib.pop('src'))
                element.text = attrib.pop('alt')
                element.tail = tail
                for k, v in attrib.items():
                    element.set(k, v)


class ImageExtension(Extension):
    def __init__(self, **kwargs):
        self.config = {'hosts' : [[], 'List of approved hosts']}
        super(ImageExtension, self).__init__(**kwargs)

    def extendMarkdown(self, md):
        md.treeprocessors.register(
            InlineImageProcessor(md, hosts=self.getConfig('hosts')),
           'inlineimageprocessor',
           15
        )

Тестирование:

>>> import markdown
>>> from image-extension import ImageExtension
>>> input = """
... ![a local image](/path/to/image.jpg)
... 
... ![a remote image](http://example.com/image.jpg)
... 
... ![an excluded remote image](http://exclude.com/image.jpg)
... """
>>> print(markdown.markdown(input, extensions=[ImageExtension(hosts=['example.com'])]))
<p><img alt="a local image" src="/path/to/image.jpg"/></p>
<p><img alt="a remote image" src="http://example.com/image.jpg"/></p>
<p><a href="http://exclude.com/image.jpg">an excluded remote image</a></p>

Полное раскрытие: я ведущий разработчикPython-Markdown.Нам понадобился другой учебник, который продемонстрировал некоторые дополнительные функции API расширения.Я видел этот вопрос и думал, что он станет хорошим кандидатом.Поэтому я написал учебник, в котором описан процесс разработки, который приведёт к приведенному выше результату.Спасибо за вдохновение.

...