Для работы с библиотекой Marked необходимо установить её через npm:
npm install marked
После установки подключение в проекте выглядит так:
import { marked } from 'marked';
или в CommonJS:
const { marked } = require('marked');
Marked — это мощная библиотека для преобразования Markdown в HTML. Она предоставляет гибкие возможности как для простого рендеринга, так и для расширенной кастомизации.
Базовый синтаксис использования сводится к вызову функции
marked() с текстом Markdown:
const markdownText = `
# Заголовок первого уровня
Это **жирный** текст и *курсив*.
`;
const html = marked(markdownText);
console.log(html);
Результатом будет HTML-структура:
<h1>Заголовок первого уровня</h1>
<p>Это <strong>жирный</strong> текст и <em>курсив</em>.</p>
Особенности:
Marked позволяет изменять поведение парсера через объект
options. Основные параметры:
marked.setOptions({
renderer: new marked.Renderer(), // кастомный рендерер
gfm: true, // поддержка GitHub Flavored Markdown
breaks: false, // перенос строк как в HTML
sanitize: false, // устаревший, использовать `DOMPurify` для безопасности
smartLists: true, // умные списки
smartypants: true // преобразование кавычек и тире
});
Пример использования кастомного рендерера:
const renderer = new marked.Renderer();
renderer.heading = function (text, level) {
return `<h${level} class="custom-heading">${text}</h${level}>`;
};
const markdown = '# Тестовый заголовок';
const html = marked(markdown, { renderer });
console.log(html);
Результат:
<h1 class="custom-heading">Тестовый заголовок</h1>
По умолчанию Marked позволяет вставлять HTML из Markdown, что может быть опасно. Для предотвращения XSS рекомендуется использовать фильтрацию через сторонние библиотеки, например DOMPurify:
import DOMPurify from 'dompurify';
const unsafeMarkdown = `
<script>alert('XSS');</script>
**Жирный текст**
`;
const safeHTML = DOMPurify.sanitize(marked(unsafeMarkdown));
console.log(safeHTML);
Таким образом, можно безопасно интегрировать Markdown-контент в веб-приложения.
Marked поддерживает асинхронное преобразование, что особенно полезно при использовании расширений, подгружающих данные или обрабатывающих файлы на лету.
const asyncMarkdown = `
# Заголовок
[Ссылка](https://example.com)
`;
marked.parse(asyncMarkdown, {}, (err, html) => {
if (err) throw err;
console.log(html);
});
Marked можно расширять через токены и лексеры:
marked.Lexer) преобразует
Markdown в токены.marked.Parser) превращает
токены в HTML.Пример создания токена для блоков предупреждений:
const lexer = new marked.Lexer();
lexer.rules.block.warning = /^!!!\s+(.*)$/m;
const tokens = lexer.lex('!!! Внимание, это предупреждение!');
console.log(tokens);
Для кода в Markdown (```javascript ... ```) можно
подключать подсветку синтаксиса через внешние библиотеки, например
highlight.js:
import hljs from 'highlight.js';
marked.setOptions({
highlight: function(code, lang) {
return hljs.highlightAuto(code, [lang]).value;
}
});
const markdownCode = `
\`\`\`javascript
console.log('Hello World');
\`\`\`
`;
const htmlCode = marked(markdownCode);
console.log(htmlCode);
Это позволяет автоматически подсвечивать языки программирования в блоках кода.
Можно обрабатывать отдельные блоки Markdown без конвертации всего текста:
const tokens = marked.lexer('# Заголовок\n\nТекст параграфа');
tokens.forEach(token => {
if (token.type === 'heading') {
console.log('Найден заголовок:', token.text, 'уровень:', token.depth);
}
});
Такой подход удобен для генерации оглавлений или анализа документа.
Опция gfm включает расширенный синтаксис:
- [ ] и - [x])Пример таблицы:
| Имя | Возраст |
|------|---------|
| Иван | 25 |
| Анна | 30 |
marked.setOptions({ gfm: true });
const htmlTable = marked(markdownTable);
console.log(htmlTable);
marked().Renderer.Эти инструменты позволяют создавать динамические, безопасные и красиво оформленные веб-приложения с Markdown-контентом.