Marked — это высокопроизводительная библиотека для парсинга Markdown в HTML на JavaScript. Она предназначена для динамической генерации документации, блогов и любых систем, где текстовое содержание хранится в формате Markdown. Основное преимущество Marked заключается в скорости работы, гибкости настройки и поддержке расширенных функций Markdown.
Для использования Marked в проекте Node.js необходимо установить пакет через npm:
npm install marked
После установки библиотеку подключают следующим образом:
const { marked } = require('marked');
В браузере можно использовать CDN:
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script>
const html = marked.parse('# Заголовок');
</script>
Базовая функция marked.parse() преобразует текст
Markdown в HTML:
const markdownText = `
# Заголовок первого уровня
Текстовый абзац с **жирным выделением** и *курсивом*.
`;
const htmlContent = marked.parse(markdownText);
console.log(htmlContent);
Результат:
<h1>Заголовок первого уровня</h1>
<p>Текстовый абзац с <strong>жирным выделением</strong> и <em>курсивом</em>.</p>
Marked позволяет создавать пользовательский рендерер через класс
Renderer. Это особенно полезно при генерации документации,
когда требуется добавить кастомные стили или атрибуты HTML.
const renderer = new marked.Renderer();
renderer.heading = (text, level) => {
return `<h${level} class="doc-heading">${text}</h${level}>`;
};
renderer.link = (href, title, text) => {
return `<a href="${href}" title="${title || text}" target="_blank">${text}</a>`;
};
const htmlCustom = marked.parse('# Заголовок', { renderer });
Marked предоставляет широкий набор опций для управления парсингом Markdown:
gfm — включает расширенный синтаксис GitHub Flavored
Markdown.breaks — преобразует перенос строки в
<br>.smartLists — умные списки, корректирующие
вложенность.headerIds — автоматическая генерация ID для
заголовков.mangle — защита email-адресов в тексте.Пример использования опций:
const options = {
gfm: true,
breaks: true,
smartLists: true,
headerIds: true,
mangle: false
};
const htmlWithOptions = marked.parse(markdownText, options);
Marked выполняет предварительный разбор Markdown на токены с помощью
функции marked.lexer():
const tokens = marked.lexer(markdownText);
console.log(tokens);
Это позволяет анализировать структуру документа и программно
обрабатывать элементы перед генерацией HTML. Каждому элементу
присваивается тип: heading, paragraph,
list, link, code и т.д.
Для работы с большими файлами документации или динамическими источниками Marked поддерживает асинхронную обработку:
const fs = require('fs').promises;
async function renderMarkdownFile(filePath) {
const content = await fs.readFile(filePath, 'utf-8');
const html = await marked.parse(content);
return html;
}
renderMarkdownFile('./docs/example.md').then(console.log);
В генераторах документации Marked часто используют для:
.md файлов в HTML-страницы.Пример с подсветкой кода:
const hljs = require('highlight.js');
marked.setOptions({
highlight: function(code, lang) {
return hljs.highlightAuto(code, [lang]).value;
}
});
const codeMarkdown = '```javascript\nconsole.log("Hello World");\n```';
const htmlCode = marked.parse(codeMarkdown);
Marked поддерживает расширяемость через хуки и кастомные обработчики токенов:
walkTokens(token) — функция для обхода всех токенов
перед рендерингом.tokenizer — позволяет создавать собственные правила для
новых типов Markdown-синтаксиса.renderer — полный контроль над генерацией HTML.Пример использования walkTokens:
marked.use({
walkTokens: token => {
if (token.type === 'text') {
token.text = token.text.replace(/TODO:/g, '<strong>TODO:</strong>');
}
}
});
const htmlTokens = marked.parse('TODO: реализовать функцию');
Marked ориентирован на скорость, но при генерации больших наборов документации полезно:
lexer() для
анализа и фильтрации.Marked сочетает высокую производительность с гибкостью и масштабируемостью, что делает его идеальным инструментом для генерации профессиональной документации и динамического контента.