Рендерер в библиотеке Markdown-it является ядром процесса преобразования Markdown-разметки в HTML. Его задача — пройтись по дереву токенов, сформированному лексером, и корректно преобразовать каждый элемент в соответствующий HTML-код. Рендерер работает в тесной связке с парсером и лексером: лексер превращает исходный текст в поток токенов, парсер структурирует их в иерархию блоков и inline-элементов, а рендерер превращает эту структуру в конечный результат.
В основе рендерера лежит объект Renderer, который
реализует методы для обработки различных типов
токенов:
const md = require('markdown-it')();
const tokens = md.parse('**Пример текста**', {});
Здесь tokens представляет собой массив объектов, где
каждый объект описывает отдельный токен — например, открытие или
закрытие тега для выделенного текста.
Каждый токен имеет набор ключевых полей, определяющих его роль в рендеринге:
type — тип токена (paragraph_open,
text, strong_open и т.д.).tag — HTML-тег, соответствующий токену (p,
strong, em и т.д.).nesting — уровень вложенности: 1 для
открытия, 0 для самостоятельного элемента, -1
для закрытия.attrs — массив атрибутов [name, value],
применяемых к тегу.content — текстовое содержимое, если токен
текстовый.children — массив вложенных токенов, применяемый для
inline-элементов.Такое разделение позволяет рендереру универсально и модульно обрабатывать любой Markdown, независимо от уровня вложенности и сложности разметки.
Рендерер проходит массив токенов последовательно, вызывая для каждого токена соответствующий метод рендеринга. Внутри этих методов учитываются тип токена и вложенность, что обеспечивает правильное формирование HTML-структуры.
const html = md.renderer.render(tokens, md.options, {});
Метод render является ключевым. Он получает три
параметра:
tokens — массив токенов для рендеринга.options — опции Markdown-it, влияющие на
рендеринг.env — объект окружения, позволяющий передавать
дополнительные данные между рендерингом разных токенов.Каждый токен имеет ассоциированную функцию
рендеринга в объекте renderer.rules. Если для типа
токена не задано правило, рендерер использует стандартное поведение:
md.renderer.rules.strong_open = (tokens, idx, options, env, self) => {
return '';
};
Это позволяет переопределять рендеринг отдельных элементов без вмешательства в остальную систему.
Для inline-токенов рендерер рекурсивно вызывает
renderInline или renderToken для их детей,
обеспечивая корректное преобразование сложных конструкций, таких как
смешанные форматы текста
(**_жирный курсив_**).
Markdown-it предоставляет гибкий механизм для модификации рендеринга:
renderer.rules — позволяет задать функции для отдельных
типов токенов.renderer.renderInline — метод для рендеринга
inline-токенов.renderer.renderAttrs — вспомогательная функция для
преобразования атрибутов в строку HTML.Пример добавления пользовательского рендеринга для заголовков:
md.renderer.rules.heading_open = (tokens, idx) => {
const level = tokens[idx].tag.slice(1);
return ``;
};
Рендерер автоматически закроет тег при обработке соответствующего
токена heading_close.
Markdown-it имеет набор стандартных правил рендеринга, которые покрывают все базовые элементы Markdown:
paragraph_open, blockquote_open,
list_item_opentext, em_open,
strong_open, link_open,
imagecode_inline,
fence, html_blockКаждое правило можно изменять или расширять, создавая плагины, которые добавляют новые элементы или модифицируют существующие. Например, можно добавить рендеринг кастомного синтаксиса для «спойлеров» или интерактивных блоков.
Markdown-it оптимизирован для работы с большими текстами. Основные методы рендерера работают с массивами токенов напрямую, что позволяет избегать лишних операций и сложных обходов DOM-подобной структуры. Рекурсивная обработка применяется только для inline-элементов, тогда как блочные элементы рендерятся последовательно, что снижает затраты памяти и повышает скорость.
Рендерер может использовать объект env, который
передается через все методы рендеринга. Это позволяет: