Markdown-документ представляет собой текстовый файл с набором элементов разметки, которые описывают структуру и оформление контента. В контексте библиотек Remark и Rehype понимание структуры документа критично для корректной обработки, трансформации и генерации HTML или других форматов.
Заголовки (Heading) Заголовки
определяют иерархию документа и делят его на разделы. В Markdown
заголовки обозначаются символами # от одного до шести:
# H1
## H2
### H3
В абстрактной синтаксической структуре (AST) библиотеки
Remark заголовок представлен узлом типа heading с
полями:
depth: уровень заголовка (1–6)children: массив текстовых или инлайн-узлов,
формирующих содержимое заголовкаАбзацы (Paragraph) Абзацы —
основной блок текста. В AST узел paragraph содержит массив
children, где каждый элемент — текст, эмодзи,
инлайн-разметка или ссылки.
Списки (List) Markdown поддерживает
нумерованные и маркированные списки:
-, *,
+1., 2. и т.д. В AST
list имеет поля:ordered: булево значение, определяющее тип спискаstart: начальный индекс нумерованного спискаspread: определяет, является ли список разнесённым (с
пустыми строками между элементами)children: массив узлов listItemЭлементы списка (ListItem) Каждый
элемент списка представляет собой узел listItem. Он
содержит children, которые могут быть параграфами,
подсписками или другими блоками.
Ссылки и изображения (Link,
Image)
link имеет поля url, title и
массив children с текстом ссылкиimage хранит url, alt и
titleКодовые блоки (Code) Блоки кода
обозначаются тройными обратными кавычками или отступами. Узел
code имеет:
lang: язык кодаvalue: содержимое блокаЦитаты (Blockquote) Узел
blockquote содержит массив children, который
может включать параграфы, списки и другие блоки. Markdown использует для
этого символ >.
Инлайн-элементы формируют содержимое абзацев и заголовков:
Text) — простой текст без
разметкиEmphasis,
Strong) — курсив и жирный текстInlineCode) — инлайновый кодLink,
Image) — упомянутые вышеКаждый инлайн-элемент в AST вложен в родительский блок
(paragraph, heading) через поле
children.
Remark анализирует Markdown и строит дерево узлов (AST, MDAST — Markdown AST). Каждая сущность документа представлена отдельным узлом с типом и метаданными. Пример структуры AST для простого документа:
{
"type": "root",
"children": [
{
"type": "heading",
"depth": 1,
"children": [{"type": "text", "value": "Заголовок"}]
},
{
"type": "paragraph",
"children": [{"type": "text", "value": "Текст абзаца"}]
},
{
"type": "list",
"ordered": false,
"children": [
{
"type": "listItem",
"children": [{"type": "text", "value": "Первый элемент"}]
}
]
}
]
}
Rehype работает с HTML AST (HAST) и применяется после Remark для генерации HTML. Основные узлы HAST:
element — HTML-тег с атрибутами и дочерними узламиtext — текстовый контент внутри элементаcomment — HTML-комментарииRemark и Rehype связаны через плагин remark-rehype, который преобразует MDAST в HAST. Это позволяет применять HTML-специфические плагины, изменять атрибуты элементов и настраивать вывод.
unified для построения конвейера обработки
текста: парсинг → трансформация → генерация.Эта структура обеспечивает строгую типизацию элементов Markdown, делает возможным автоматическое преобразование в HTML и другие форматы, а также позволяет создавать собственные плагины для специфической обработки контента.