Marked — это современная библиотека для парсинга Markdown в HTML на стороне JavaScript. Она отличается высокой производительностью, гибкостью и простотой интеграции. Важнейшее преимущество Marked — возможность работать как синхронно, так и асинхронно, предоставляя разработчику полный контроль над процессом преобразования текста.
Синхронный парсинг выполняется с помощью метода
marked.parse() или marked(), которые принимают
строку с Markdown и возвращают HTML. Синхронный режим идеально подходит
для обработки небольших текстов и ситуаций, когда требуется мгновенный
результат без асинхронной задержки.
const marked = require('marked');
const markdownText = '# Заголовок\n\nЭто пример текста на Markdown.';
const html = marked.parse(markdownText);
console.log(html);
В этом примере Markdown автоматически преобразуется в HTML, включая заголовки, абзацы и другие элементы разметки.
Marked позволяет настраивать поведение парсинга через options. Основные параметры включают:
gfm — включение расширенного синтаксиса GitHub Flavored
Markdown.breaks — включение разрывов строк по стандарту
Markdown.sanitize — фильтрация HTML для предотвращения XSS-атак
(устаревший, рекомендуется использовать DOMPurify).mangle — экранирование email-адресов.headerIds — автоматическая генерация идентификаторов
для заголовков.marked.setOptions({
gfm: true,
breaks: true,
headerIds: true,
});
Эти настройки позволяют точно управлять тем, как Markdown будет преобразован в HTML, обеспечивая полное соответствие требованиям проекта.
Marked предоставляет возможность полностью контролировать вывод HTML
с помощью кастомного рендерера. Класс Renderer позволяет
переопределять методы для всех типов элементов Markdown: заголовков,
ссылок, изображений, списков и т.д.
const renderer = new marked.Renderer();
renderer.heading = (text, level) => {
return `${text} `;
};
const html = marked.parse('# Тестовый заголовок', { renderer });
console.log(html);
Такой подход позволяет интегрировать Marked в сложные проекты, где стандартная генерация HTML недостаточна.
При работе с большими текстами важно понимать ограничения синхронного режима. Marked использует внутренние алгоритмы на основе токенизации и рекурсивного рендеринга, что обеспечивает высокую скорость. Однако для гигантских файлов рекомендуется:
const largeText = markdownChunks.join('\n\n');
const html = marked.parse(largeText);
Такой подход минимизирует задержки при рендеринге и сохраняет стабильность приложения.
Синхронная прокрутка в Marked удобно используется для live-preview редакторов Markdown. Основная идея — обрабатывать ввод текста мгновенно и обновлять HTML в реальном времени.
const textarea = document.getElementById('markdown');
const preview = document.getElementById('preview');
textarea.addEventListener('input', () => {
const markdown = textarea.value;
preview.innerHTML = marked.parse(markdown);
});
Используя этот подход, можно реализовать редактор, где визуальная часть синхронно отражает изменения в Markdown, без задержек.
Marked поддерживает подключение extension API, позволяя создавать новые типы токенов и парсить нестандартный Markdown. Это особенно важно для синхронной обработки, когда необходимо поддерживать расширенные форматы без нарушения производительности.
Пример расширения для выделения специфических блоков:
const myExtension = {
extensions: [{
name: 'highlight',
level: 'block',
start(src) { return src.match(/==/)?.index; },
tokenizer(src) {
const rule = /^==(.+?)==/;
const match = rule.exec(src);
if (match) {
return { type: 'highlight', raw: match[0], text: match[1].trim() };
}
},
renderer(token) {
return `${token.text}`;
}
}]
};
marked.use(myExtension);
С помощью таких расширений синхронная обработка Markdown становится гибкой и мощной.
Для повышения производительности синхронного парсинга:
Эти меры позволяют работать с десятками тысяч строк Markdown без ощутимых задержек.