Включение и отключение правил программно

Markdown-it — это мощная библиотека для разбора Markdown в JavaScript, которая предоставляет гибкую систему правил (rules) для управления процессом парсинга и рендеринга. Каждый этап обработки текста в Markdown-it разделён на токенизацию, постпроцессинг и рендеринг, и для каждого из этих этапов можно включать или отключать отдельные правила.


Основные категории правил

Правила в Markdown-it можно условно разделить на несколько типов:

  1. Block Rules — правила обработки блочных элементов (параграфы, заголовки, списки, цитаты).
  2. Inline Rules — правила обработки встроенных элементов (жирный, курсив, ссылки, изображения).
  3. Core Rules — внутренние правила, которые управляют структурой документа и преобразованием токенов.
  4. Renderer Rules — правила, определяющие, как каждый токен преобразуется в HTML.

Каждое правило идентифицируется по имени, что позволяет гибко управлять его активацией.


Включение и отключение встроенных правил

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() работает аналогично.
  • Изменения применяются только к конкретному экземпляру Markdown-it.

Примечание: отключение правила не удаляет токены, которые оно уже создало, если парсинг уже выполнен. Это влияет только на последующие вызовы метода .render().


Работа с Core Rules

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 — индекс текущего токена.
  • Можно полностью переопределить рендеринг любого токена, что позволяет создавать кастомный HTML.

Практические советы

  1. Отключение ненужных правил повышает производительность — особенно если рендеринг производится в больших документах.
  2. Использование before и after позволяет точно контролировать последовательность правил, избегая конфликтов между стандартными и пользовательскими.
  3. Рендереры можно временно отключать для отладки и генерации промежуточного HTML.
  4. Модификация Core Rules требует внимательности, так как неправильный порядок или удаление правил может нарушить структуру документа.

Markdown-it предоставляет полный контроль над процессом парсинга и рендеринга Markdown. Программное включение и отключение правил позволяет создавать как минималистичные движки для специфичных задач, так и расширенные редакторы с поддержкой нестандартных синтаксисов.