Marked — это современная библиотека для парсинга Markdown в JavaScript, которая отличается высокой производительностью и гибкостью по сравнению с классическим стандартом Markdown. Несмотря на то, что синтаксис Marked в большинстве случаев совместим с оригинальным Markdown, существуют ключевые особенности и расширения, которые делают его более мощным инструментом для веб-разработки и серверных приложений.
1. GitHub Flavored Markdown (GFM) Marked по умолчанию поддерживает GFM, который включает дополнительные возможности по сравнению с классическим Markdown:
Таблицы
| Столбец 1 | Столбец 2 |
|-----------|-----------|
| Данные 1 | Данные 2 |
В классическом Markdown таблицы не являются частью стандарта и требуют расширений.
Зачёркнутый текст
~~Устаревший текст~~
В обычном Markdown такой возможности нет.
Автоматические ссылки Marked автоматически преобразует URL в кликабельные ссылки:
https://example.comMarked предоставляет гибкую систему рендеринга, которая позволяет полностью контролировать, как различные элементы Markdown преобразуются в HTML. Классический Markdown имеет фиксированные правила рендеринга, что ограничивает возможности кастомизации.
Пример использования кастомного рендера:
import { marked } from 'marked';
const renderer = {
heading(text, level) {
return `<h${level} class="custom-heading">${text}</h${level}>`;
},
link(href, title, text) {
return `<a href="${href}" target="_blank">${text}</a>`;
}
};
marked.use({ renderer });
const html = marked('# Заголовок с кастомным стилем');
Преимущества кастомного рендеринга:
Marked позволяет безопасно обрабатывать Markdown, предотвращая XSS-атаки. В классическом Markdown HTML-блоки обрабатываются как обычный текст, что может создавать уязвимости при рендеринге на веб-страницах.
Настройка безопасного рендеринга:
marked.setOptions({
mangle: false, // Отключает автоматическое преобразование email
headerIds: true, // Генерация id для заголовков
sanitizer: (html) => html.replace(/<script.*?>.*?<\/script>/gi, '')
});
Marked поддерживает асинхронные парсеры, что особенно важно при работе с динамическим содержимым, загрузкой внешних ресурсов или интеграцией с базами данных. Классический Markdown обычно обрабатывается синхронно.
Пример асинхронного парсинга:
import { marked } from 'marked';
async function renderMarkdown(mdText) {
const html = await marked.parse(mdText);
return html;
}
Асинхронный подход позволяет:
Marked использует собственный лексер для разбиения Markdown на токены, что дает преимущества перед традиционным Markdown-парсером:
Пример получения токенов:
const tokens = marked.lexer('# Заголовок\n\nТекст абзаца');
console.log(tokens);
Marked легко интегрируется с внешними плагинами и библиотеками для добавления функциональности:
highlight.js или
Prism.js.Эти отличия делают Marked предпочтительным инструментом для веб-разработки и проектов, где необходим контроль над рендерингом и производительностью, сохраняя при этом совместимость с привычным синтаксисом Markdown.