Препроцессинг markdown

Библиотека Markdown-it представляет собой высокопроизводительный парсер Markdown в JavaScript, который позволяет не только преобразовывать текст в HTML, но и расширять стандартное поведение с помощью плагинов и кастомных правил. Одним из ключевых этапов работы с Markdown является препроцессинг, позволяющий модифицировать исходный текст перед его рендерингом.

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

Препроцессинг включает несколько этапов:

  1. Токенизация – разбор исходного Markdown на структурированные элементы (токены).
  2. Фильтрация и модификация токенов – изменение содержимого, добавление новых элементов, удаление ненужных блоков.
  3. Внедрение пользовательской логики – выполнение специфических правил для форматирования текста или добавления динамического контента.

Markdown-it предоставляет доступ к этим этапам через систему плагинов и правил рендеринга.

Инициализация и базовое использование

const MarkdownIt = require('markdown-it');
const md = new MarkdownIt();

// Преобразование текста Markdown в HTML
const markdownText = '# Заголовок\n\nТекст с **жирным** выделением.';
const result = md.render(markdownText);
console.log(result);

На этом базовом уровне препроцессинг минимален, но библиотека предоставляет гибкие возможности для вмешательства на стадии токенов.

Работа с токенами

Markdown-it разбивает текст на токены, каждый из которых имеет свойства: type, tag, content, attrs, children.

Пример перебора токенов:

const tokens = md.parse(markdownText, {});
tokens.forEach(token => {
    console.log(`Тип: ${token.type}, Содержимое: ${token.content}`);
});

Типы токенов делятся на:

  • Block tokens – блоки, такие как параграфы, заголовки, списки.
  • Inline tokens – внутренние элементы блоков, такие как ссылки, эмфаза, коды.

Использование токенов позволяет внедрять правила препроцессинга, например, заменять определённые слова или добавлять CSS-классы к определённым элементам.

Создание собственного правила препроцессинга

Markdown-it позволяет добавлять правила на этапе core или inline. Core-правила обрабатывают весь документ, inline – отдельные элементы текста.

Пример добавления правила для core-этапа:

function highlightImportantTokens(state) {
    state.tokens.forEach(token => {
        if (token.type === 'inline') {
            token.children.forEach(child => {
                if (child.type === 'text' && child.content.includes('важно')) {
                    child.content = child.content.replace(/важно/g, '<strong>важно</strong>');
                }
            });
        }
    });
}

md.core.ruler.push('highlight_important', highlightImportantTokens);

Здесь на этапе препроцессинга все вхождения слова “важно” заменяются на HTML-тег <strong>, что обеспечивает автоматическое выделение ключевых слов.

Плагины и расширение функциональности

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

  • Добавлять новые синтаксические конструкции.
  • Фильтровать или изменять токены перед рендерингом.
  • Внедрять динамический контент на основе внешних данных.

Пример создания простого плагина:

function customEmojiPlugin(md) {
    md.core.ruler.push('emoji_replace', state => {
        state.tokens.forEach(token => {
            if (token.type === 'inline') {
                token.children.forEach(child => {
                    if (child.type === 'text') {
                        child.content = child.content.replace(/:smile:/g, '?');
                    }
                });
            }
        });
    });
}

md.use(customEmojiPlugin);

Такой подход позволяет внедрять препроцессинг на уровне текста до его окончательного рендеринга.

Предобработка через внешние функции

Иногда проще обработать Markdown на уровне исходной строки до передачи его в парсер. Это может быть полезно для:

  • Замены специальных меток на HTML.
  • Подстановки данных из базы или конфигурации.
  • Стандартизации форматирования (например, приведение всех заголовков к верхнему регистру).
let markdownText = '# заголовок\n\nТекст с ключевым словом важно.';
markdownText = markdownText.replace(/# заголовок/, '# ЗАГОЛОВОК');

const html = md.render(markdownText);

Предобработка на этом уровне проста, но ограничена по сравнению с токенами, так как не учитывает контекст структурных элементов Markdown.

Использование цепочек препроцессинга

Для сложных проектов можно сочетать несколько уровней препроцессинга:

  1. Строковая предобработка – глобальные замены и стандартизация текста.
  2. Токенизация и модификация токенов – изменение структуры документа.
  3. Плагины для дополнительных правил – внедрение логики, специфичной для проекта.

Такой подход обеспечивает гибкость и контроль над каждым этапом преобразования Markdown в HTML.


Markdown-it предоставляет мощные средства для препроцессинга Markdown. Использование токенов, правил core/inline и плагинов позволяет реализовать сложные сценарии модификации текста до его окончательного рендеринга, сохраняя высокую производительность и расширяемость.