Для работы с библиотекой Marked необходимо сначала установить её через npm или подключить через CDN. В Node.js установка производится командой:
npm install marked
После установки библиотеку можно подключить в проекте следующим образом:
const { marked } = require('marked');
Для браузера можно использовать CDN:
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
В этом случае объект marked становится доступен
глобально.
Marked преобразует Markdown в HTML. Базовое использование выглядит так:
const markdownString = `
# Заголовок первого уровня
Текст с **жирным** и *курсивным* форматированием.
- Пункт 1
- Пункт 2
`;
const html = marked(markdownString);
console.log(html);
Результатом будет корректный HTML с соответствующей структурой:
<h1>Заголовок первого уровня</h1>
<p>Текст с <strong>жирным</strong> и <em>курсивным</em> форматированием.</p>
<ul>
<li>Пункт 1</li>
<li>Пункт 2</li>
</ul>
Marked поддерживает множество опций, которые позволяют гибко управлять генерацией HTML.
Основные опции:
gfm — включает поддержку GitHub Flavored Markdown (по
умолчанию true).breaks — переводит переносы строк в
<br> (по умолчанию false).sanitize — отключает выполнение HTML (устаревшая, лучше
использовать DOMPurify).headerIds — добавляет id к заголовкам (по
умолчанию true).mangle — маскирует email-адреса (по умолчанию
true).Пример использования опций:
marked.setOptions({
gfm: true,
breaks: true,
headerIds: false
});
const html = marked('# Заголовок\nТекст с переносом\nновой строки.');
Renderer позволяет полностью контролировать преобразование Markdown в HTML. Создание кастомного рендерера выглядит так:
const renderer = new marked.Renderer();
renderer.link = function(href, title, text) {
return `<a href="${href}" target="_blank" title="${title || ''}">${text}</a>`;
};
const html = marked('[Google](https://google.com)', { renderer });
В этом примере все ссылки будут открываться в новом окне, независимо от исходного Markdown.
Marked поддерживает работу на уровне лексического
анализа с использованием метода lexer. Это полезно
для сложной обработки Markdown перед рендерингом:
const tokens = marked.lexer('# Заголовок\nТекст');
console.log(tokens);
Результат представляет собой массив объектов-токенов, например:
[
{ "type": "heading", "depth": 1, "text": "Заголовок" },
{ "type": "paragraph", "text": "Текст" }
]
Эти токены можно модифицировать или фильтровать перед преобразованием в HTML.
Для защиты от XSS рекомендуется комбинировать Marked с библиотеками типа DOMPurify:
const dirtyHtml = marked('Пример с <script>alert(1)</script>');
const cleanHtml = DOMPurify.sanitize(dirtyHtml);
Это предотвращает внедрение опасного кода в браузер.
С версии 4 Marked поддерживает асинхронные парсеры, что позволяет использовать промисы для рендеринга:
(async () => {
const html = await marked.parse('# Асинхронный заголовок');
console.log(html);
})();
Асинхронность особенно полезна при работе с кастомными асинхронными рендерерами, например, для загрузки данных по ссылкам или изображений.
В контексте Markdown-редакторов горячие клавиши помогают ускорить форматирование текста:
**
вокруг выделенного фрагмента.* вокруг
выделенного текста.[текст](url).- перед каждой строкой.1., 2., …Интеграция горячих клавиш с Marked обычно осуществляется через
прослушку событий клавиатуры и динамическую вставку Markdown в текстовое
поле, после чего вызывается marked() для обновления
HTML.
Пример обработчика Ctrl + B:
textarea.addEventListener('keydown', (e) => {
if (e.ctrlKey && e.key === 'b') {
e.preventDefault();
const start = textarea.selectionStart;
const end = textarea.selectionEnd;
const selectedText = textarea.value.slice(start, end);
textarea.setRangeText(`**${selectedText}**`, start, end, 'end');
updatePreview();
}
});
Функция updatePreview() может просто вызывать
marked() и подставлять HTML в область предпросмотра.
Marked поддерживает плагины и расширения, например:
Расширения создаются через собственные функции-обработчики, которые
подключаются через опцию extensions.
Пример создания простого расширения для подсветки TODO:
const todoExtension = {
name: 'todo',
level: 'inline',
start(src) { return src.indexOf('[ ]'); },
tokenizer(src) {
const match = /^\[ \]/.exec(src);
if (match) return { type: 'todo', raw: match[0] };
},
renderer(token) {
return '<input type="checkbox">';
}
};
marked.use({ extensions: [todoExtension] });
После этого в Markdown [ ] будет преобразовываться в
HTML-чекбокс.
lexer +
parser, чтобы оптимизировать производительность.target="_blank" для
ссылок).Marked сочетает простоту преобразования Markdown в HTML с гибкой настройкой, что делает библиотеку идеальной для интеграции в современные веб-приложения и редакторы.