Замените теги заголовка Markdown на пользовательские в Python Markdown - PullRequest
1 голос
/ 24 марта 2019

Мы хотим заменить стандартные теги h, введенные при уценке с использованием #, на собственные теги HTML.Для парсинга Markdown в HTML мы используем библиотеку Python Markdown .

. Мы попытались зарегистрировать расширение, использующее регулярное выражение H1.Это расширение использует регулярное выражение (#) (.*) для обнаружения элементов H1.

import markdown
from markdown.extensions import Extension
from markdown.inlinepatterns import SimpleTagPattern

class CustomHeadings(Extension):
    def extendMarkdown(self, md, md_globals):
        H1_RE = r'(#) (.*)'

        h1_tag = SimpleTagPattern(H1_RE, 'span class="h1"')
        md.inlinePatterns['h1'] = h1_tag

md_extensions = [CustomHeadings()]

# [...]

def ds_custom_markdown_parse(value):
    return markdown.markdown(value, extensions=md_extensions)

Мы хотим, чтобы h{1-6} элементы были span class="h{1-6}".Но синтаксический анализатор Markdown по-прежнему соответствует строке # This is a h1 - <h1>This is a h1</h1>.Мы ожидаем, что выход будет <span class="h1">This is a h1</span>

1 Ответ

2 голосов
/ 24 марта 2019

Заголовки являются элементами уровня блока и поэтому не анализируются inlinePatterns. Перед запуском inlinePatterns Python-Markdown запускает BlockParser , который преобразует все элементы уровня блока документ в ElementTree объект. Каждый элемент уровня блока затем пропускается через inlinePatterns по одному, и элементы уровня охвата анализируются.

Например, учитывая ваш заголовок # This is a h1, BlockParser уже преобразовал его в тег H <h1>This is a h1</h1>, а inlinePatterns видит только текстовое содержимое этого тега This is a h1.

У вас есть несколько вариантов решения этой проблемы:

  1. Вы можете переопределить BlockProcessor s, которые разбирают заголовки, чтобы они создавали элементы, которые вы хотите получить с самого начала.
  2. Или вы можете оставить существующий анализатор блоков на месте и создать TreeProcessor , который проходит через завершенный объект ElementTree и изменяет элементы, переопределяя имена тегов в соответствующих элементах.

Вариант 2 должен быть намного проще и, по сути, является методом, используемым несколькими существующими расширениями.

Полное раскрытие: я ведущий разработчик проекта Python-Markdown.

...