Marked — это высокопроизводительная библиотека для парсинга Markdown в HTML на JavaScript. Она предоставляет гибкий API для обработки текста, включая возможность кастомизации рендеринга, работу с токенами и расширение функционала через плагины. Библиотека подходит как для клиентской, так и для серверной разработки (Node.js).
Для установки в проект через npm используется команда:
npm install marked
Подключение в Node.js:
const { marked } = require('marked');
В среде браузера можно использовать CDN:
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
Основная задача Marked — преобразование текста в формате Markdown в HTML. Простейший пример:
const markdown = "# Заголовок 1\n\nЭто пример текста.";
const html = marked(markdown);
console.log(html);
Результат:
<h1>Заголовок 1</h1>
<p>Это пример текста.</p>
Marked автоматически обрабатывает заголовки, списки, ссылки, изображения, таблицы и другие стандартные элементы Markdown.
Marked предоставляет объект options, с помощью которого
можно настроить работу парсера:
marked.setOptions({
renderer: new marked.Renderer(),
gfm: true, // поддержка GitHub Flavored Markdown
breaks: true, // перевод строк как <br>
smartLists: true, // умные списки
smartypants: true // типографские символы
});
Ключевые параметры:
renderer — объект для переопределения методов
рендеринга.gfm — включает расширенный синтаксис Markdown, как в
GitHub.breaks — автоматически преобразует переводы строк в
<br>.smartLists — корректно обрабатывает вложенные
списки.smartypants — заменяет кавычки и дефисы на типографские
аналоги.Объект Renderer позволяет изменять HTML, создаваемый для
разных элементов Markdown:
const renderer = new marked.Renderer();
renderer.heading = (text, level) => {
return `<h${level} class="custom-header">${text}</h${level}>`;
};
const html = marked("# Пример", { renderer });
console.log(html);
Каждый метод рендерера соответствует конкретному элементу Markdown:
paragraph, list, listitem,
link, image, code и т.д.
Marked предоставляет возможность работы с токенами для детальной
обработки Markdown. Метод lexer разбивает текст на массив
токенов:
const tokens = marked.lexer("# Заголовок\n\nТекст параграфа");
console.log(tokens);
Пример токена заголовка:
{
"type": "heading",
"depth": 1,
"text": "Заголовок"
}
Токены можно модифицировать перед рендерингом или использовать для создания кастомных обработчиков.
Для предотвращения XSS-атак рекомендуется использовать параметр
sanitize или внешние библиотеки вроде
DOMPurify:
const dirtyHtml = marked("<script>alert('xss')</script>");
const cleanHtml = DOMPurify.sanitize(dirtyHtml);
Marked поддерживает асинхронную обработку через функцию
marked.parse с колбэком или промисом:
const markdown = "Пример с асинхронной обработкой";
marked.parse(markdown, (err, html) => {
if (err) throw err;
console.log(html);
});
Это полезно при интеграции с внешними сервисами или при загрузке больших Markdown-файлов.
Marked активно используется для динамической генерации HTML в редакторах, просмотре документации и фронтенд-приложениях. В связке со Snapshots-тестами можно контролировать корректность преобразования Markdown:
import { marked } from 'marked';
test('Markdown рендерится корректно', () => {
const markdown = "# Тестовый заголовок";
const html = marked(markdown);
expect(html).toMatchSnapshot();
});
Snapshot-тестирование позволяет фиксировать изменения в выводе HTML и отслеживать непреднамеренные изменения в рендеринге.
Marked поддерживает расширения через walkTokens и
кастомные лексеры:
marked.use({
walkTokens(token) {
if (token.type === 'text') {
token.text = token.text.replace(/важно/g, '<strong>важно</strong>');
}
}
});
Это позволяет внедрять специфические правила обработки Markdown без изменения исходного текста.
Marked сочетает в себе скорость, простоту и гибкость, что делает её одной из самых популярных библиотек для работы с Markdown в JavaScript.