Marked — это современная библиотека для разбора Markdown в JavaScript, обеспечивающая высокую производительность и гибкость в работе с текстом. Для перехода с CommonMark на Marked важно понимать ключевые различия в синтаксисе и поведении, а также возможности кастомизации парсера.
Marked предоставляет функцию marked.parse() для
преобразования текста Markdown в HTML. Отличие от CommonMark заключается
в следующем:
marked.parseAsync(), что
позволяет обрабатывать текст без блокировки основного потока
выполнения.walkTokens перед
рендерингом в HTML.Пример базового использования:
import { marked } from 'marked';
const markdown = `
# Заголовок
- Элемент списка
`;
const html = marked.parse(markdown);
console.log(html);
Marked позволяет полностью контролировать вывод HTML через кастомный
рендерер. Создание собственного рендерера выполняется через класс
marked.Renderer:
const renderer = new marked.Renderer();
renderer.heading = (text, level) => {
return `${text} `;
};
const html = marked.parse('# Пример', { renderer });
Ключевые возможности кастомного рендерера:
При миграции важно правильно настроить параметры marked.
Основные опции:
gfm — включает поддержку GitHub Flavored Markdown
(таблицы, списки задач).breaks — конвертирует одиночные переводы строки в
.sanitize — устаревшая опция, заменяется внешними
библиотеками для XSS-защиты.smartLists и smartypants — управление
типографикой и списками.Пример настройки:
marked.setOptions({
gfm: true,
breaks: true,
smartLists: true,
smartypants: true
});
Marked позволяет работать с токенами Markdown напрямую через
lexer. Это удобно для анализа контента перед
рендерингом:
const tokens = marked.lexer(markdown);
tokens.forEach(token => {
if (token.type === 'heading') {
token.text = token.text.toUpperCase();
}
});
const html = marked.parser(tokens);
Преимущества работы с токенами:
Marked поддерживает расширения через:
Пример расширения для подчеркивания текста:
marked.use({
extensions: [{
name: 'underline',
level: 'inline',
start(src) { return src.indexOf('__'); },
tokenizer(src) {
const rule = /^__([\s\S]+?)__/;
const match = rule.exec(src);
if (match) return { type: 'underline', raw: match[0], text: match[1] };
},
renderer(token) {
return `${token.text}`;
}
}]
});
При переносе проектов с CommonMark на Marked необходимо учесть:
gfm: true для полной совместимости.marked.parseAsync() обеспечивает
корректную обработку промисов.Marked легко интегрируется с React, Vue и Node.js:
dangerouslySetInnerHTML с результатом
marked.parse().v-html или создание
компонента Markdown.