Markdown-it предоставляет мощный и гибкий механизм для рендеринга отдельных элементов Markdown. В отличие от простого парсера, он позволяет управлять процессом генерации HTML на уровне токенов, что открывает широкие возможности для кастомизации. В основе лежит концепция токенов, каждый из которых представляет отдельный элемент Markdown, такой как заголовок, параграф, список или ссылку.
Каждый токен в Markdown-it имеет набор ключевых свойств:
paragraph_open,
heading_open, inline и т.д.).p, h1, ul).[ключ, значение], применяемых к тегу.inline.1
для открывающего, -1 для закрывающего, 0 для
самозакрывающегося.Эта структура позволяет обращаться к отдельным элементам Markdown и управлять их рендерингом без изменения всей строки документа.
Markdown-it использует объект Renderer, который хранит
функции рендеринга для каждого типа токена. Основной способ изменить
вывод отдельного элемента — переопределить соответствующую функцию:
const MarkdownIt = require('markdown-it');
const md = new MarkdownIt();
md.renderer.rules.heading_open = (tokens, idx, options, env, self) => {
const token = tokens[idx];
return `<${token.tag} class="custom-heading">`;
};
md.renderer.rules.heading_close = (tokens, idx) => {
return `</h${tokens[idx].tag.slice(1)}>`;
};
const result = md.render('# Заголовок');
console.log(result);
В этом примере каждый заголовок получает собственный
класс. Функция получает текущий токен
(tokens[idx]) и должна вернуть HTML-строку.
Инлайновые токены, такие как жирный текст, ссылки,
эмфаза, обрабатываются отдельно через массив
children:
md.renderer.rules.em_open = () => '<em class="highlight">';
md.renderer.rules.em_close = () => '</em>';
const result = md.render('*выделенный текст*');
console.log(result);
Каждое открытие или закрытие тега можно полностью контролировать. Для
сложных случаев можно перебрать token.children и
модифицировать содержимое на лету.
Markdown-it позволяет добавлять собственные токены через плагины. Это полезно для внедрения специфических синтаксисов:
function customPlugin(md) {
md.core.ruler.push('highlight_keyword', state => {
state.tokens.forEach(token => {
if (token.type === 'inline') {
token.children.forEach(child => {
if (child.type === 'text') {
child.content = child.content.replace(/\bTODO\b/g, '<span class="todo">TODO</span>');
}
});
}
});
});
}
md.use(customPlugin);
const result = md.render('Это текст с TODO заметкой.');
console.log(result);
В этом примере слово TODO превращается в отдельный
HTML-элемент, не затрагивая другие части текста.
Токены хранят массив attrs, который позволяет добавлять
атрибуты к тегам. Атрибуты можно изменять как при рендеринге, так и
через плагины:
md.renderer.rules.link_open = (tokens, idx) => {
const token = tokens[idx];
token.attrPush(['target', '_blank']); // добавление атрибута
return md.renderer.renderToken(tokens, idx, {});
};
const result = md.render('[Ссылка](https://example.com)');
console.log(result);
Это позволяет динамически расширять возможности рендеринга ссылок, изображений и других элементов без изменения исходного Markdown.
Для рендеринга отдельных элементов полезно использовать фильтрацию токенов:
md.core.ruler.push('filter_paragraphs', state => {
state.tokens = state.tokens.filter(token => token.type !== 'paragraph_open');
});
Таким образом можно полностью исключить или изменить поведение конкретного типа элемента перед финальной генерацией HTML.
Функции рендеринга могут учитывать окружение или контекст:
md.renderer.rules.paragraph_open = (tokens, idx, options, env) => {
if (env.isPreview) {
return '<p class="preview">';
}
return '<p>';
};
const env = { isPreview: true };
const result = md.render('Пример параграфа', env);
console.log(result);
Это позволяет создавать динамически настраиваемый HTML в зависимости от состояния приложения или пользовательских параметров.
renderer.rules предоставляет гибкий механизм
переопределения HTML.children позволяет управлять инлайновыми
элементами и вложенной структурой.Markdown-it предоставляет низкоуровневый контроль над рендерингом, сохраняя при этом совместимость с полноценным парсингом Markdown, что делает его мощным инструментом для любых приложений, где требуется генерация HTML из Markdown с точной настройкой каждого элемента.