import markdown html = markdown.markdown(text, extensions=['md_in_html'])
text
- разметка Markdown,extensions
- список расширений модуля.Расширение 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-тега 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
в качестве дочерних элементов, и каждый элемент будет проанализирован с использованием указанного поведения.
По умолчанию модуль 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.
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>