Markdown-it — это мощная библиотека для разбора Markdown в JavaScript, которая предоставляет гибкую систему правил (rules) для управления процессом парсинга и рендеринга. Каждый этап обработки текста в Markdown-it разделён на токенизацию, постпроцессинг и рендеринг, и для каждого из этих этапов можно включать или отключать отдельные правила.
Правила в Markdown-it можно условно разделить на несколько типов:
Каждое правило идентифицируется по имени, что позволяет гибко управлять его активацией.
Markdown-it предоставляет методы для управления правилами на уровне inline и block:
const MarkdownIt = require('markdown-it');
const md = new MarkdownIt();
// Отключение встроенного правила 'emphasis'
md.inline.disable('emphasis');
// Включение правила обратно
md.inline.enable('emphasis');
// Отключение правила 'table' для блочных элементов
md.block.disable('table');
md.block.enable('table');
disable() принимает одно имя правила или массив
имен правил.enable() работает аналогично.Примечание: отключение правила не удаляет токены,
которые оно уже создало, если парсинг уже выполнен. Это влияет только на
последующие вызовы метода .render().
Core Rules управляют внутренней структурой токенов и выполняются
после блоковой и инлайн обработки, но до рендеринга. Для управления Core
Rules используется массив md.core.ruler:
// Получение списка всех Core Rules
console.log(md.core.ruler.getRules(''));
// Отключение правила по имени
md.core.ruler.disable(['normalize', 'block']);
md.core.ruler.enable('block');
Core Rules выполняются строго в том порядке, в котором они добавлены, поэтому их последовательность критически важна для правильной обработки Markdown.
Markdown-it поддерживает добавление собственных правил для любых этапов:
// Пример пользовательского inline-правила
function myBoldRule(state, silent) {
const pos = state.pos;
if (state.src[pos] !== '*') return false;
if (!silent) {
const token = state.push('strong_open', 'strong', 1);
token.markup = '*';
state.push('text', '', 0).content = 'Пользовательский текст';
state.push('strong_close', 'strong', -1);
}
state.pos += 1;
return true;
}
// Добавление правила в начало inline-цепочки
md.inline.ruler.before('emphasis', 'my_bold', myBoldRule);
// Добавление правила в конец
md.inline.ruler.push('my_bold_end', myBoldRule);
ruler.push(name, fn) добавляет правило в конец
списка.ruler.before(name, reference, fn) вставляет
правило перед существующим.ruler.after(name, reference, fn) вставляет
правило после существующего.Такой подход позволяет расширять функциональность Markdown без изменения исходного кода библиотеки.
Помимо управления правилами парсинга, можно программно включать и отключать правила рендеринга HTML:
// Изменение рендерера для ссылок
md.renderer.rules.link_open = (tokens, idx) => {
return `<a href="${tokens[idx].attrGet('href')}" class="custom-link">`;
};
// Отключение рендерера для изображений
md.renderer.rules.image = () => '';
tokens — массив токенов текущего блока.idx — индекс текущего токена.before и after
позволяет точно контролировать последовательность правил,
избегая конфликтов между стандартными и пользовательскими.Markdown-it предоставляет полный контроль над процессом парсинга и рендеринга Markdown. Программное включение и отключение правил позволяет создавать как минималистичные движки для специфичных задач, так и расширенные редакторы с поддержкой нестандартных синтаксисов.