Вы можете использовать Python-Markdown Extension API и разработать плагин, который изменяет атрибут src
всех изображений.
В этом конкретном случае вы можете переопределить встроенные процессоры image_link
и image_reference
, создав подклассы классов ImageInlineProcessor
и ReferenceInlineProcessor
.Но нет необходимости изменять поведение парсера.Вам нужно только изменить атрибут src
всех тегов img
.Это было бы проще всего с TreeProcessor .
from markdown.treeprocessors import Treeprocessor
from urllib.parse import urljoin
BASE = 'https://media.mydomain.com/'
class ImgBaseTreeprocessor(Treeprocessor):
def run(self, root):
# Loop through all img elements
for img in root.getiterator('img'):
# Join base to the src URL
img.set('src', urljoin(BASE, img.get('src'))
Теперь вам нужно рассказать классу Markdown
о вашем новом Treeprocessor с подклассом Extension
:
from markdown.extensions import Extension
class ImgBase(Extension):
def extendMarkdown(self, md, md_globals):
# register the new treeprocessor with priority 15 (run after 'inline')
md.treeprocessors.register(ImgBaseTreeprocessor(md), 'imgbase', 15)
Наконец, вы должны указать Markdown использовать ваше новое расширение:
from markdown import markdown
html = markdown(text, extensions=[ImgBase()])
Есть несколько вещей, которые вы можете сделать для улучшения расширения, которые оставлены в качестве упражнения для читателя:
- Добавьте параметр конфигурации к расширению, чтобы задать базовый URL-адрес, а не жестко его кодировать.
- Выполните некоторую проверку ошибок при присоединении к базе, чтобы убедиться, что существующий URL-адрес не работает.У вас уже нет базы.
- Оберните ее в пакет Python для распространения и обмена с другими.