При переходе с Showdown на Marked важно понимать фундаментальные различия в подходах этих библиотек. Showdown изначально ориентирован на полную конвертацию Markdown в HTML с акцентом на совместимость с различными диалектами Markdown. Marked же делает ставку на скорость парсинга, расширяемость и современный API для работы с AST (Abstract Syntax Tree).
Ключевые отличия:
makeHtml и настройками через
setOption. Marked предлагает функции
marked.parse, marked.parseInline и возможность
настройки рендерера через объект marked.Renderer.marked.use, что
обеспечивает гибкую интеграцию новых синтаксических конструкций.Для работы с Marked достаточно установить библиотеку через npm:
npm install marked
Подключение и простой пример использования:
import { marked } from 'marked';
const markdownText = `
# Заголовок 1
Параграф с **жирным текстом** и [ссылкой](https://example.com).
`;
const html = marked.parse(markdownText);
console.log(html);
Метод marked.parse конвертирует полный документ Markdown
в HTML, тогда как marked.parseInline обрабатывает только
отдельные строки или фрагменты, исключая блочные элементы вроде
заголовков или списков.
Marked позволяет полностью кастомизировать HTML, который генерируется
из Markdown. Для этого используется объект Renderer:
import { marked } from 'marked';
const renderer = new marked.Renderer();
renderer.link = function(href, title, text) {
return `<a href="${href}" title="${title || ''}" target="_blank">${text}</a>`;
};
const markdown = `[OpenAI](https://openai.com)`;
const html = marked.parse(markdown, { renderer });
console.log(html);
Особенности кастомизации:
marked.use можно расширять функционал без
изменения исходного кода рендерера.Marked поддерживает обширный набор опций, схожих с настройками Showdown, но с большей точностью:
gfm — включение поддержки GitHub Flavored
Markdown.breaks — перенос строк при разрыве строки в
Markdown.sanitize — очистка HTML от потенциально опасных тегов
(устарело, рекомендуется использовать DOMPurify).headerIds — автоматическая генерация ID для
заголовков.mangle — предотвращение автоматического кодирования
email-адресов.Пример:
const html = marked.parse(markdownText, {
gfm: true,
breaks: true,
headerIds: true,
mangle: false
});
Marked поддерживает создание собственных токенов для обработки нестандартного синтаксиса. Это особенно важно при миграции с Showdown, если использовались кастомные расширения.
Пример добавления токена для заметок:
import { marked } from 'marked';
const noteTokenizer = {
name: 'note',
level: 'inline',
start(src) { return src.indexOf('!!'); },
tokenizer(src, tokens) {
const rule = /^!!(.+?)!!/;
const match = rule.exec(src);
if (match) return { type: 'note', raw: match[0], text: match[1] };
},
renderer(token) {
return `<span class="note">${token.text}</span>`;
}
};
marked.use({ extensions: [noteTokenizer] });
console.log(marked.parse('Это !!важная заметка!!'));
В отличие от Showdown, который сразу генерирует HTML, Marked предоставляет возможность работать с AST через токены. Это открывает доступ к логике обработки Markdown на уровне структуры документа.
import { marked } from 'marked';
const tokens = marked.lexer('# Заголовок\n\nПараграф');
console.log(tokens);
Преимущества работы с токенами:
sanitize, Marked рекомендует использовать внешние
библиотеки вроде DOMPurify.gfm: true.marked.use для централизованного
управления расширениями и рендерером.Если потребуется, можно добавить подробную таблицу соответствий настроек Showdown → Marked для упрощения процесса миграции и сохранения поведения документов.