Сообщить об ошибке.

Расширение md_in_html модуля markdown в Python

Markdown внутри HTML-тегов

Синтаксис:

import markdown

html = markdown.markdown(text, extensions=['md_in_html'])

Параметры:

  • text - разметка Markdown,
  • extensions - список расширений модуля.

Возвращаемое значение:

  • текст в формате HTML.

Описание:

Расширение markdown.extensions.md_in_html анализирует Markdown внутри HTML-тегов.

По умолчанию модуль markdown игнорирует любой контент в необработанном элементе уровня блока HTML. При включенном расширении md-in-html содержимое необработанного элемента уровня блока HTML может быть проанализировано как разметка Markdown путем включения атрибута markdown в открывающий тег. Этот атрибут будет удален из вывода, в то время как все остальные атрибуты будут сохранены.

Следующие теги всегда игнорируются, независимо от какого-либо атрибута HTML-тега markdown: canvas, math, option, pre, script, style, и textarea. Все остальные необработанные теги HTML обрабатываются как теги уровня span и не затрагиваются этим расширением.

Атрибуту HTML-тега markdown можно присвоить одно из трех значений: "1", "block", или "span".

markdown="1".

Если атрибут markdown="1", то синтаксический анализатор будет использовать поведение по умолчанию для этого конкретного тега.

Следующие теги имеют поведение блока по умолчанию: article, aside, blockquote, body, colgroup, details, div, dl, fieldset, figcaption, figure, footer, form, group, header, hgroup, hr, iframe, main, map, menu, nav, noscript, object, ol, output, progress, section, table, tbody, tfoot, thead, tr, ul и video.

Например, следующее:

<div markdown="1">
This is a *Markdown* Paragraph.
</div>

Отображается как:

<div markdown="1">
This is a *Markdown* Paragraph.
</div>

Следующие теги по умолчанию имеют поведение как у HTML-тега <span>: address, dd, dt, h[1-6], legend, li, p, td, и th`.

Например, следующее:

<p markdown="1">
This is not a *Markdown* Paragraph.
</p>

Отображается как:

<p markdown="1">
This is not a *Markdown* Paragraph.
</p>

markdown="block".

Если атрибут markdown="block", то синтаксический анализатор будет вызывать поведение блока для содержимого элемента, если это один из тегов block или span.

Содержимое элемента блока разбирается на содержимое уровня блока. Другими словами, текст отображается как абзацы, заголовки, списки, цитаты и т. д. Любой встроенный синтаксис в этих элементах также обрабатывается.

Например, следующее:

<section markdown="block">
# A header.

A *Markdown* paragraph.

* A list item.
* A second list item.

</section>

Отображается как:

<section>
<h1>A header.</h1>
<p>A <em>Markdown</em> paragraph.</p>
<ul>
<li>A list item.</li>
<li>A second list item.</li>
</ul>
</section>

Предупреждение. Принуждение к синтаксическому анализу элементов как блочных элементов, если они не являются ими по умолчанию, может привести к недопустимому HTML. Например, можно заставить элемент p быть вложенным в другой элемент p. В большинстве случаев рекомендуется использовать поведение по умолчанию markdown='1'. Явная установка markdown='block' должна быть зарезервирована для опытных пользователей, которые понимают спецификацию HTML и то, как браузеры анализируют и отображают HTML.

markdown="span".

Если для атрибута markdown=span, то синтаксический анализатор будет вызывать поведение HTML-тега <span> для содержимого элемента, если это один из тегов block или span.

Содержимое элемента span не анализируется на содержимое уровня блока. Другими словами, контент не будет отображаться как абзацы, заголовки и т. д. Будет отображаться только встроенный допустимый синтаксис HTML-тега <span>.

Например, следующее:

<div markdown="span">
# *Not* a header
</div>

Отображается как:

<div>
# <em>Not</em> a header
</div>

Вложении нескольких уровней HTML-элементов.

При вложении нескольких уровней необработанных HTML-элементов, атрибут HTML-тега markdown должен быть определен для каждого элемента уровня блока. Для любого блочного элемента, не имеющего атрибута markdown, все внутри этого элемента игнорируется, включая дочерние элементы с атрибутами markdown.

Например, следующее:

<article id="my-article" markdown="1">
# Article Title

A Markdown paragraph.

<section id="section-1" markdown="1">

## Section 1 Title

<p>Custom raw **HTML** which gets ignored.</p>

</section>
<section id="section-2" markdown="1">

## Section 2 Title

<p markdown="1">**Markdown** content.</p>

</section>
</article>

Отображается как:

<article id="my-article">
<h1>Article Title</h1>
<p>A Markdown paragraph.</p>
<section id="section-1">
<h2>Section 1 Title</h2>
<p>Custom raw **HTML** which gets ignored.</p>
</section>
<section id="section-2">
<h2>Section 2 Title</h2>
<p><strong>Markdown</strong> content.</p>
</section>
</article>

Когда значение атрибута markdown HTML-элемента является более разрешительным, чем его родитель, то применяется более строгое поведение родителя. Например, блочный элемент, вложенный в элемент span, будет проанализирован с использованием поведения span. Однако если значение атрибута markdown HTML-элемента совпадает с родительским или является более ограничительным, чем его родительское значение, то поведение дочернего элемента будет следующим: например, блочный элемент может содержать либо блочные элементы, либо элементы span в качестве дочерних элементов, и каждый элемент будет проанализирован с использованием указанного поведения.

Нормализация HTML-тегов.

По умолчанию модуль markdown не изменяет необработанный HTML, но это расширение анализирует содержимое необработанных HTML-элементов, и оно будет выполнять некоторую нормализацию тегов элементов блочного уровня. Например, следующий необработанный HTML:

<div markdown="1">
<p markdown="1">A Markdown paragraph with *no* closing tag.
<p>A raw paragraph with *no* closing tag.
</div>

Отображается как:

<div>
<p>A Markdown paragraph with <em>no</em> closing tag.
</p>
<p>A raw paragraph with *no* closing tag.
</p>
</div>

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

Чтобы избежать какой-либо нормализации, HTML-элемент не должен быть потомком любого элемента уровня блока, для которого определен атрибут markdown.

Предупреждение. Не следует полагаться на это расширение для нормализации и генерации действительного HTML. Для достижения наилучших результатов всегда включайте действительный необработанный HTML (с открывающими и закрывающими тегами) в документы Markdown.

Пример обработки Markdown внутри HTML-тегов.

import markdown
text = """
<section markdown="block">
# A header.

A *Markdown* paragraph.

* A list item.
* A second list item.

</section>
"""
html = markdown.markdown(text, extensions=['md_in_html'])
print(html)
# <section>
# <h1>A header.</h1>
# <p>A <em>Markdown</em> paragraph.</p>
# <ul>
# <li>A list item.</li>
# <li>A second list item.</li>
# </ul>
# </section>