Библиотека Markdown-it представляет собой высокопроизводительный парсер Markdown в JavaScript, который позволяет не только преобразовывать текст в HTML, но и расширять стандартное поведение с помощью плагинов и кастомных правил. Одним из ключевых этапов работы с Markdown является препроцессинг, позволяющий модифицировать исходный текст перед его рендерингом.
Препроцессинг включает несколько этапов:
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}`);
});
Типы токенов делятся на:
Использование токенов позволяет внедрять правила препроцессинга, например, заменять определённые слова или добавлять 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 на уровне исходной строки до передачи его в парсер. Это может быть полезно для:
let markdownText = '# заголовок\n\nТекст с ключевым словом важно.';
markdownText = markdownText.replace(/# заголовок/, '# ЗАГОЛОВОК');
const html = md.render(markdownText);
Предобработка на этом уровне проста, но ограничена по сравнению с токенами, так как не учитывает контекст структурных элементов Markdown.
Для сложных проектов можно сочетать несколько уровней препроцессинга:
Такой подход обеспечивает гибкость и контроль над каждым этапом преобразования Markdown в HTML.
Markdown-it предоставляет мощные средства для препроцессинга Markdown. Использование токенов, правил core/inline и плагинов позволяет реализовать сложные сценарии модификации текста до его окончательного рендеринга, сохраняя высокую производительность и расширяемость.