Markdown-it предоставляет гибкий механизм управления правилами
синтаксиса, что позволяет настраивать обработку Markdown на уровне
токенов и парсеров. Работа с правилами осуществляется через
парсерные цепочки (parser rules) и
рендереры (renderer rules), что позволяет
включать, отключать или переопределять отдельные элементы разметки.
Парсерные правила — это функции, которые разбирают исходный текст и создают токены. Каждое правило отвечает за конкретный синтаксический элемент: заголовки, списки, ссылки, жирный текст и т.д.
md.core.ruler для глобальных правил,
md.block.ruler для блочных элементов и
md.inline.ruler для встроенных.const MarkdownIt = require('markdown-it');
const md = new MarkdownIt();
// Отключение правила выделения жирного текста
md.inline.ruler.disable('strong');
// Включение правила обратно
md.inline.ruler.enable('strong');
Методы disable и enable принимают имя
правила или массив имён. Отключение правила полностью убирает его из
процесса токенизации, что позволяет исключить ненужные элементы разметки
без изменения исходного кода Markdown-it.
Для изменения поведения стандартного правила используется метод
md.renderer.rules[name]. Он позволяет задать собственную
функцию рендеринга для определённого типа токена:
// Переопределяем рендеринг заголовков
md.renderer.rules.heading_open = (tokens, idx, options, env, self) => {
const level = tokens[idx].tag;
return `<${level} class="custom-heading">`;
};
В этом примере стандартный HTML для заголовков заменяется на элемент с дополнительным классом. При этом токены продолжают создаваться стандартным парсером, изменяется только процесс рендеринга.
Markdown-it обрабатывает текст в несколько этапов:
core) — последовательность
правил, выполняемых над всем документом.block) — разбор
больших структур: параграфы, списки, цитаты.inline) —
обработка текста внутри блочных элементов: ссылки, выделение, коды.Понимание этой иерархии важно при включении или отключении правил, так как некоторые изменения могут влиять на работу других цепочек.
const md = new MarkdownIt();
// Отключаем ссылки и изображения
md.inline.ruler.disable(['link', 'image']);
// Переопределяем рендеринг кода
md.renderer.rules.code_inline = (tokens, idx) => {
return `<code class="inline-code">${tokens[idx].content}</code>`;
};
// Добавляем пользовательское блочное правило
md.block.ruler.before('paragraph', 'alert_block', (state, startLine, endLine, silent) => {
const line = state.getLines(startLine, startLine + 1, 0, false);
if (!line.startsWith('!!!')) return false;
if (!silent) {
const token = state.push('alert_open', 'div', 1);
token.attrs = [['class', 'alert']];
state.push('inline', '', 0).content = line.slice(3).trim();
state.push('alert_close', 'div', -1);
}
state.line = startLine + 1;
return true;
});
В этом примере:
alert_block,
создающее элемент <div class="alert">.before или after других правил).Гибкость управления правилами позволяет создавать Markdown-парсеры под специфические задачи: от упрощённого синтаксиса до расширенного с кастомными блоками и стилями рендеринга.