В ядре библиотеки Markdown-it лежит концепция токенов. Токен — это абстрактный объект, который представляет собой структурный элемент документа. Все элементы Markdown, будь то заголовки, списки, ссылки или кодовые блоки, при разборе превращаются в токены. Каждый токен несёт информацию о своём типе, содержимом и позиционировании в исходном тексте.
У любого токена есть несколько ключевых свойств:
type — тип токена, определяющий семантику
элемента (paragraph_open, inline,
heading_open, fence и т.д.).
tag — HTML-тег, который будет сгенерирован
(p, h1, ul, code и
т.п.).
attrs — массив атрибутов в формате
[ключ, значение], которые будут применены к тегу.
map — массив из двух чисел
[startLine, endLine], указывающий диапазон строк исходного
документа.
nesting — показатель уровня вложенности:
1 — открывающий токен (например, начало параграфа
<p>),0 — одиночный токен (например, инлайн-элемент
<img>),-1 — закрывающий токен (например, конец параграфа
</p>).level — числовое значение глубины вложенности, которое помогает при построении дерева токенов.
children — массив вложенных токенов (только для
токенов с типом inline).
Markdown-it выделяет несколько категорий токенов в зависимости от их назначения:
Блочные токены (Block tokens) Блочные токены формируют структуру документа на уровне блоков. К ним относятся:
paragraph_open / paragraph_close —
параграфы.heading_open / heading_close — заголовки
всех уровней.blockquote_open / blockquote_close —
цитаты.list_item_open / list_item_close —
элементы списков.bullet_list_open / bullet_list_close и
ordered_list_open / ordered_list_close —
списки.fence — многострочный код.hr — горизонтальная линия.Инлайн-токены (Inline tokens) Эти токены находятся внутри блочных элементов и описывают текст и его форматирование:
text — простой текст.code_inline — инлайн-код.em_open / em_close — выделение
курсивом.strong_open / strong_close — выделение
жирным.link_open / link_close — ссылки.image — вставка изображений.softbreak / hardbreak — переносы
строк.Специальные токены Используются для управления парсингом и рендерингом:
inline — контейнер для вложенных токенов.html_block / html_inline — сырой
HTML.footnote_reference / footnote_block_open —
сноски.math_block / math_inline — математические
выражения (если подключены соответствующие плагины).Markdown-it позволяет создавать токены программно с помощью
конструктора Token:
const Token = require('markdown-it/lib/token');
const paragraphOpen = new Token('paragraph_open', 'p', 1);
paragraphOpen.attrs = [['class', 'text-block']];
paragraphOpen.map = [0, 1];
const text = new Token('text', '', 0);
text.content = 'Пример текста внутри параграфа.';
const paragraphClose = new Token('paragraph_close', 'p', -1);
const tokens = [paragraphOpen, text, paragraphClose];
В этом примере создаётся параграф с классом text-block и
текстом внутри. Последовательность токенов полностью соответствует
структуре HTML: открывающий тег, содержимое, закрывающий тег.
Каждый токен имеет свой уровень вложенности (level) и
связь с родительскими или дочерними элементами через массив
children. Для блочных элементов children
обычно пустой, а для инлайн-токенов — содержит токены текста и
форматирования. Это позволяет строить дерево документа и облегчает
рендеринг в HTML или другие форматы.
Токены широко применяются для:
Краткая схема ключевых свойств токена:
| Свойство | Назначение |
|---|---|
| type | Семантика элемента |
| tag | HTML-тег |
| attrs | Атрибуты HTML |
| map | Диапазон строк исходного документа |
| nesting | Вложенность (открывающий/закрывающий/одиночный) |
| level | Глубина вложенности |
| children | Вложенные токены для инлайн-элементов |
| content | Содержимое текста (для text,
code_inline) |
Понимание типов токенов и их свойств является основой для работы с Markdown-it на профессиональном уровне, позволяя гибко управлять разбором Markdown и рендерингом в различные форматы.