Могу ли я добавить теги белого списка в Python Markdown? - PullRequest
0 голосов
/ 28 сентября 2018

Вопрос

Я бы хотел указать список тегов, которые должны быть добавлены в белый список при конвертации.Например, если я хочу преобразовать только <p>, <ol>, <li> и несколько других тегов, но игнорировать все остальные, тогда получим значение, подобное этому:

### Header

This is a paragraph.

    # Code snippet
    def spam():
        pass

1. One
2. Two
3. Three

, я быхочу, чтобы это было точно преобразовано в:

### Header

<p>This is a paragraph.</p>

    # Code snippet
    def spam():
        pass

<ol>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ol>

Я понимаю, что мог бы использовать Отбеливатель , чтобы очистить теги, которые мне не нужны, но я бы предпочел не конвертировать их в первомместо, если возможно.

Примечание:

Я имею в виду https://pypi.org/project/Markdown/

1 Ответ

0 голосов
/ 28 сентября 2018

Нет, вы не можете "занести в белый список" теги, но вы можете использовать Extension API для изменения различных частей синтаксического анализатора.Тем не менее, вы, вероятно, в действительности не хотите этого.

Например, если вы не хотите анализировать заголовки и блоки кода, вы можете удалить эти процессоры:

from markdown.extensions import Extension

class MyExtension(Extension):
    def extendMarkdown(self, md):
        md.parser.blockprocessors.deregister('hashheader')
        md.parser.blockprocessors.deregister('setextheader')
        md.parser.blockprocessors.deregister('code')

Однако это не даст вам желаемого результата, так как анализатор вернется к обертыванию этого текста в тег <p>.Фактически это присуще синтаксису Markdown.Все, что не распознается как что-то еще, считается абзацем.

Следовательно, ваш ввод может привести к следующему выводу:

<p>### Header</p>

<p>This is a paragraph.</p>

<p>    # Code snippet
    def spam():
        pass</p>

<ol>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ol>

Еще одним осложнением является обработка HTML "незначительные пробелы. "В частности, за исключением тех случаев, когда прямо указывается не делать этого (например, в блоке кода), все пустые места уплотняются в одно пространство при рендеринге HTML в браузере.Следовательно, ваш абзац, содержащий блок непарсированного кода, будет нечитаемым:

# Фрагмент кода def spam (): pass

Если это не то, что вам нужно,тогда вам, вероятно, придется заменить существующие процессоры собственными процессорами, которые распознают блоки кода и заголовки, но возвращают что-то отличное от HTML по умолчанию, чтобы избежать их оборачивания в теги <p>.Тем не менее, это будет включать в себя замену большей части синтаксического анализатора.

Кроме того, не будучи обернутым в какие-либо теги, простой текст будет сведен в один абзац.Например, этот ввод:

# Header 1

    # code snippet
    def spam():
        pass

## Header 2

будет отображаться так:

# Заголовок 1 # фрагмент кода def spam (): pass ## Заголовок 2

Что, вероятно, не то, что вы хотите.Заключение текста в теги <p> на самом деле является более желательным результатом, так как это, по крайней мере, выдает:

# Заголовок 1

# Фрагмент кода def spam (): pass

## Header 2

Кстати, именно поэтому анализаторы Markdown не предоставляют опцию «белого списка».Результаты не соответствуют ожиданиям тех, кто хочет получить эту опцию.

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

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