Для начала работы с Marked необходимо установить библиотеку через npm или подключить её напрямую в браузере. В среде Node.js установка производится командой:
npm install marked
После установки подключение библиотеки в код осуществляется следующим образом:
const marked = require('marked');
Для использования в браузере можно подключить библиотеку через CDN:
После этого объект marked становится доступен в
глобальной области видимости.
Библиотека Marked позволяет легко преобразовывать текст в формате
Markdown в HTML. Основной метод — marked.parse():
const markdownText = `
# Заголовок первого уровня
Это обычный текст с **жирным выделением** и *курсивом*.
`;
const html = marked.parse(markdownText);
console.log(html);
Результатом работы будет строка с HTML-разметкой:
Заголовок первого уровня
Это обычный текст с жирным выделением и курсивом.
Особенности базового преобразования:
inline code) превращается в
, а блоки кода — в
.
Marked поддерживает множество опций, которые позволяют изменять поведение преобразования. Основные из них:
marked.setOptions({
gfm: true, // Включение GitHub Flavored Markdown
breaks: true, // Преобразование переносов строк в
headerIds: true, // Генерация id для заголовков
mangle: false, // Отключение автоматического шифрования email
smartLists: true // Улучшенные списки
});
Пример использования:
const markdownText = `
# Пример заголовка
- Первый пункт
- Второй пункт
`;
const html = marked.parse(markdownText);
console.log(html);
При включенных опциях и
формируются корректно, а заголовки получают
атрибут id, который можно использовать для навигации по
странице.
Markdown-документ может содержать произвольный HTML. По умолчанию
Marked пропускает HTML-теги, что может привести к потенциальным
XSS-уязвимостям при выводе на страницу. Для предотвращения этого
используется комбинация Marked с библиотекой для очистки HTML, например
DOMPurify:
const DOMPurify = require('dompurify');
const { JSDOM } = require('jsdom');
const window = new JSDOM('').window;
const purify = DOMPurify(window);
const unsafeMarkdown = `
# Заголовок
`;
const html = marked.parse(unsafeMarkdown);
const safeHtml = purify.sanitize(html);
console.log(safeHtml);
Это гарантирует, что скрипты и опасные теги будут удалены, а форматирование Markdown останется.
Для старых проектов или специфических форматов часто требуется контролировать вывод HTML на уровне токенов. Marked предоставляет низкоуровневый API:
const lexer = new marked.Lexer();
const tokens = lexer.lex(markdownText);
console.log(tokens);
Токены — это массив объектов, представляющих отдельные элементы Markdown: заголовки, списки, цитаты, параграфы. Каждый токен содержит свойства:
type — тип элемента (heading,
paragraph, list и т.д.)text — текстовое содержимоеdepth — уровень заголовка (для
heading)items — элементы списка (для list)Далее можно использовать marked.Parser для генерации
HTML:
const parser = new marked.Parser();
const html = parser.parse(tokens);
console.log(html);
Такой подход позволяет модифицировать токены перед генерацией HTML и реализовывать кастомные преобразования.
Marked поддерживает создание кастомного рендерера через объект
Renderer. Это позволяет изменять способ генерации HTML для
отдельных элементов Markdown:
const renderer = new marked.Renderer();
renderer.heading = function(text, level) {
return `${text} `;
};
const html = marked.parse('# Заголовок с классом', { renderer });
console.log(html);
В этом примере заголовок будет иметь класс
custom-heading. Аналогично можно переопределять рендеринг
ссылок, списков, блоков кода и других элементов.
В Node.js часто требуется преобразовать Markdown-файлы в HTML. Для
этого используется стандартный модуль fs:
const fs = require('fs');
const markdownText = fs.readFileSync('example.md', 'utf-8');
const html = marked.parse(markdownText);
fs.writeFileSync('example.html', html);
Таким образом, Marked можно интегрировать в систему генерации статических сайтов или документации, получая готовый HTML прямо из Markdown-файлов.
Опция gfm включает поддержку расширений GitHub:
- [ ] и
- [x])Пример таблицы:
const markdownText = `
| Имя | Возраст |
|------|---------|
| Алекс | 30 |
| Мария | 25 |
`;
const html = marked.parse(markdownText);
console.log(html);
В HTML результат будет содержать корректно сгенерированную таблицу
Marked позволяет получать содержимое блоков кода с указанием
языка: Блоки кода можно интегрировать с библиотеками подсветки синтаксиса,
например Результат будет содержать HTML с классами, подходящими для
CSS-подсветки. с
и
.
Обработка блоков
кода и подсветка синтаксиса
const markdownText = `
\`\`\`javascript
console.log("Hello, world!");
\`\`\`
`;
const html = marked.parse(markdownText);
console.log(html);highlight.js:marked.setOptions({
highlight: function(code, lang) {
const hljs = require('highlight.js');
return hljs.highlight(code, { language: lang }).value;
}
});