Блочные правила (block rules) в Markdown-it определяют, как исходный текст разбивается на отдельные блоки, которые затем рендерятся в HTML-элементы. Они формируют основу парсинга Markdown, поскольку именно блочные элементы задают структуру документа: заголовки, списки, блоки кода, цитаты, горизонтальные линии и абзацы.
Markdown-it использует двухэтапный процесс обработки текста:
Каждое блочное правило описывается функцией, которая:
Блочные правила обрабатываются по порядку, и Markdown-it использует механизм «раннего выхода», останавливая проверку, если правило успешно применено.
Абзацы (paragraph)
Абзац формируется из последовательных строк текста, разделенных
пустой строкой. Markdown-it создает токен paragraph_open в
начале и paragraph_close в конце.
Особенности обработки:
Заголовки (heading)
Markdown поддерживает два вида заголовков:
# (от одного до шести символов).=== (h1) или --- (h2).Markdown-it создает токены heading_open и
heading_close с атрибутом hLevel, указывающим
уровень заголовка.
Блоки цитат (blockquote)
Начинаются с символа > и продолжаются до пустой
строки или другого блочного элемента. Блок цитаты может содержать
вложенные абзацы, списки и другие блоки.
Принципы обработки:
blockquote_open и
blockquote_close.Списки (list)
Списки бывают маркированные (-,
*, +) и нумерованные
(1., 2., …). Внутри списка могут быть
вложенные списки или другие блочные элементы.
Важные моменты:
bullet_list_open,
ordered_list_open, list_item_open,
list_item_close.Горизонтальные линии (hr)
Определяются строками, содержащими как минимум три символа
-, * или _, без других символов.
Создаются одиночные токены hr.
Блоки кода (fenced code и
indented code)
code_block.``` или ~~~. Токен fence включает
информацию о языке программирования.Markdown-it позволяет добавлять новые или модифицировать существующие
блочные правила через плагины. Для этого используется
массив md.block.ruler:
md.block.ruler.before('paragraph', 'custom_block', customBlockRule, { alt: [] });
Параметры:
before – указывает, перед каким правилом вставить
новое.'custom_block' – уникальный идентификатор правила.customBlockRule – функция, реализующая логику
распознавания блока.alt – массив альтернативных правил, которые будут
проверяться, если текущее не сработало.Функция правила получает:
state – объект состояния, включающий текущие строки и
позицию.startLine и endLine – границы
анализируемого блока.silent – режим проверки без генерации токенов
(используется для предварительной проверки возможности применения
правила).Блочные правила могут содержать вложенные блоки. Например:
> Заголовок
> - Список
> - Элемент
Markdown-it разбивает блок цитаты на отдельные токены:
blockquote_openheading_open / heading_closebullet_list_openlist_item_open / list_item_close (для
каждого элемента)bullet_list_closeblockquote_closeРекурсивный разбор обеспечивает корректное вложение HTML-элементов и сохранение структуры документа.
silent режима для
предварительной оценки производительности.Каждый блочный токен включает:
type – тип блока (paragraph_open,
heading_open и др.).tag – соответствующий HTML-тег.map – массив [startLine, endLine]
исходного текста.level – глубина вложенности.content – текстовое содержимое (для токенов типа
inline или code_block).children – массив токенов для вложенных элементов.Блочные токены служат основой для дальнейшего анализа inline-правил, которые отвечают за обработку ссылок, эмфазы, изображений и кода внутри текста.
Блочные правила позволяют создавать:
Эти возможности делают Markdown-it гибким инструментом для генерации HTML из Markdown с полной поддержкой кастомизации структуры документа.