Markdown-it — это высокопроизводительный парсер Markdown для JavaScript, разработанный с модульной архитектурой, где встроенные правила играют ключевую роль. Правила определяют, как исходный текст интерпретируется и преобразуется в токены, которые затем рендерятся в HTML. Встроенные правила делятся на несколько категорий: блоковые, строчные и специальные правила для inline-синтаксиса.
Блоковые правила отвечают за обработку элементов Markdown, которые занимают отдельные строки или блоки текста. Основные блоковые элементы включают заголовки, списки, блоки кода и цитаты.
Markdown-it поддерживает два типа заголовков:
#.= или -.Парсер проходит текст построчно и применяет правило
heading для распознавания заголовка, создавая токены типа
heading_open, inline,
heading_close. Каждому заголовку присваивается уровень
(h1, h2 и т.д.), что позволяет корректно
рендерить HTML.
Markdown-it различает упорядоченные и
неупорядоченные списки. Для их обработки используется
правило list, которое анализирует маркеры (*,
-, + для unordered, цифры с точкой для
ordered). В процессе парсинга формируются токены:
bullet_list_open / ordered_list_openlist_item_openinlinelist_item_closebullet_list_close /
ordered_list_closeКаждый элемент списка проходит вложенный inline-парсинг, что позволяет внутри списка использовать ссылки, выделения и другие inline-элементы.
Существуют два типа блоков кода:
или тильд~~~`.Markdown-it создает токены fence для fenced code blocks
с параметрами content (содержимое блока) и
info (опциональный язык программирования для подсветки
синтаксиса).
Правила для блоков цитат анализируют строки, начинающиеся с
>. Создаются токены blockquote_open,
inline, blockquote_close. Все содержимое
цитаты проходит дальнейший парсинг для inline-элементов.
Inline правила отвечают за обработку текста внутри блоков. Основные inline-элементы включают ссылки, изображения, выделения, код и автоматические URL.
Markdown-it поддерживает:
**
или __* или
_~~Токены для этих элементов: strong_open,
em_open, s_open с соответствующими
*_close.
Ссылки и изображения создаются через правила link и
image. Синтаксис Markdown:
[текст ссылки](URL "title")

Токены для ссылок:
link_open с атрибутами href и
titleinline для текста ссылкиlink_closeДля изображений генерируется токен image с атрибутами
src, alt и title.
Inline-код создается при помощи одиночных обратных кавычек
`. Markdown-it создает токен code с содержимым
внутри кавычек.
Markdown-it поддерживает автоматическое преобразование URL и
email-адресов в ссылки через правило autolink. Например,
http://example.com автоматически преобразуется в
<a href="/goto/?url=http://example.com" target="_blank">http://example.com</a>.
Markdown-it включает поддержку таблиц через отдельный модуль
markdown-it-table. Таблицы парсятся по строкам с
разделителями | и создают токены table_open,
thead_open, tr_open, td_open,
inline и соответствующие закрывающие токены.
Горизонтальная линия определяется как строка, содержащая три и более
символов *, - или _. Генерируется
токен hr.
Markdown-it использует правило escape для обработки
обратного слэша \, что позволяет вставлять спецсимволы
Markdown без их интерпретации.
Markdown-it строит дерево токенов, применяя блоковые правила сначала, а затем inline-правила к каждому блоку. Это позволяет комбинировать элементы, например:
[ссылками](URL)Каждое правило имеет приоритет и условия срабатывания, что позволяет создавать расширения или отключать встроенные правила для кастомного поведения парсера.
Markdown-it позволяет управлять встроенными правилами через методы
enable(), disable() и настройку
rules. Пример отключения HTML-тегов:
const md = require('markdown-it')({
html: false
});
md.disable(['html_block', 'html_inline']);
Также можно подключать пользовательские правила с помощью
md.core.ruler.push() или
md.inline.ruler.before(), что обеспечивает гибкость и
расширяемость парсера без модификации исходного кода встроенных
правил.
Каждое правило Markdown-it преобразует исходный текст в последовательность токенов с полями:
type — тип токена (например,
paragraph_open)tag — HTML-тег для рендерингаattrs — массив атрибутовcontent — текст для inline-токеновchildren — вложенные токены для inline-парсингаlevel — глубина вложенностиЭта структура позволяет не только рендерить HTML, но и создавать альтернативные представления, например, JSON-дерево или AST для дальнейшей обработки.