Библиотека Marked является мощным инструментом для парсинга Markdown в JavaScript. Она позволяет превращать Markdown-текст в HTML с высокой скоростью и гибкостью. Основная задача библиотеки — преобразование синтаксиса Markdown в корректный HTML, который можно использовать на веб-страницах или в статических генераторах сайтов.
import { marked } from 'marked';
const markdown = `# Заголовок первого уровня
Это пример текста с **жирным** и *курсивным* форматированием.`;
const html = marked(markdown);
console.log(html);
В этом примере Markdown-текст преобразуется в HTML. marked() возвращает строку HTML, готовую к вставке в DOM или сохранению в файле.
Marked поддерживает широкие возможности настройки. Основные опции включают:
true).<br> при
переносах строк (false по умолчанию).true по умолчанию).false по умолчанию).Пример использования настроек:
marked.setOptions({
gfm: true,
breaks: true,
smartLists: true,
sanitize: true
});
const html = marked('# Пример с настройками');
console.log(html);
Для полного контроля над генерацией HTML можно использовать Custom Renderer. Это позволяет переопределять поведение преобразования отдельных элементов Markdown, например, заголовков, ссылок или изображений.
const renderer = new marked.Renderer();
renderer.heading = (text, level) => {
return `<h${level} class="custom-heading">${text}</h${level}>`;
};
renderer.link = (href, title, text) => {
return `<a href="${href}" title="${title || ''}" target="_blank">${text}</a>`;
};
const markdown = '# Заголовок\n[Ссылка](https://example.com)';
const html = marked(markdown, { renderer });
console.log(html);
Особенности кастомного рендерера:
Marked предоставляет API для лексического анализа Markdown, позволяя работать с токенами перед генерацией HTML. Это важно для статической генерации, где необходим контроль над структурой документа.
const tokens = marked.lexer('# Заголовок\nТекст с **жирным**');
console.log(tokens);
Возвращаемый объект содержит массив токенов с типами
(heading, paragraph, strong) и
значениями. Это позволяет:
Для статической генерации веб-страниц Marked подходит идеально:
fs.readFileSync или асинхронных функций.marked().Пример генерации страницы:
import fs from 'fs';
import { marked } from 'marked';
const markdown = fs.readFileSync('./content/post.md', 'utf-8');
const htmlContent = marked(markdown);
const template = `
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Статическая страница</title>
</head>
<body>
${htmlContent}
</body>
</html>
`;
fs.writeFileSync('./dist/post.html', template);
Этот подход обеспечивает полностью статический HTML, который можно размещать на любом сервере без необходимости исполнения JavaScript на клиенте.
Marked поддерживает custom tokenizer и custom renderer, что открывает возможности для создания собственных расширений Markdown. Примеры расширений:
toc).@[user] в ссылки на профиль.const renderer = new marked.Renderer();
renderer.code = (code, language) => {
return `<pre class="code-block"><code class="${language}">${code}</code></pre>`;
};
Marked предоставляет асинхронный API, что позволяет обрабатывать большие Markdown-документы и интегрировать асинхронные операции, например, загрузку внешних данных или вставку контента.
import { marked } from 'marked';
async function generateHTML(markdown) {
return await marked.parse(markdown);
}
const html = await generateHTML('# Асинхронная обработка');
console.log(html);
Асинхронная обработка особенно полезна при генерации сайтов с динамическим контентом, когда Markdown собирается из разных источников.
marked.parse вместо marked()
для больших файлов, так как новый API оптимизирован под высокую
производительность.gfm: true только при необходимости, чтобы
ускорить парсинг.Marked сочетает скорость, гибкость настройки и широкие возможности расширения, что делает его одним из лучших инструментов для статической генерации контента в JavaScript.