Метод marked.parser

marked.parser — это метод библиотеки Marked, предназначенный для конвертации токенизированного Markdown в HTML. Он является ключевым инструментом, когда требуется управлять процессом парсинга на более детальном уровне, отличаясь от высокоуровневого marked() тем, что позволяет работать непосредственно с массивом токенов, полученных методом marked.lexer.


Токенизация Markdown

Прежде чем использовать marked.parser, необходимо получить токены. Это делается с помощью:

const marked = require('marked');

const markdownText = `
# Заголовок первого уровня

Текстовый абзац с **жирным** и *курсивным* текстом.

- Пункт списка 1
- Пункт списка 2
`;

const tokens = marked.lexer(markdownText);
console.log(tokens);

В результате tokens будет массив объектов, где каждый объект представляет отдельный элемент Markdown: заголовок, абзац, список, блок кода и так далее.

Ключевые свойства токена:

  • type — тип элемента (heading, paragraph, list, code, blockquote и др.).
  • text — текстовое содержимое элемента.
  • depth — для заголовков, указывает уровень (16).
  • tokens — вложенные токены, например, внутри списка.

Использование marked.parser

После получения токенов их можно преобразовать в HTML с помощью:

const html = marked.parser(tokens);
console.log(html);

Метод marked.parser рекурсивно проходит по массиву токенов, обрабатывая каждый в зависимости от его type, и возвращает итоговую строку HTML.


Настройка marked.parser через опции

marked.parser принимает второй аргумент — объект опций, позволяющий контролировать парсинг:

const html = marked.parser(tokens, {
  renderer: new marked.Renderer(),
  gfm: true,
  breaks: false,
  sanitize: false
});

Основные опции:

  • renderer — объект класса marked.Renderer, который переопределяет стандартные методы генерации HTML для каждого типа токена.
  • gfm — включает поддержку GitHub Flavored Markdown.
  • breaks — при true обычный перенос строки преобразуется в <br>.
  • sanitize — при true удаляет потенциально опасный HTML.

Переопределение методов Renderer

Renderer позволяет точно контролировать HTML, который генерируется для каждого токена:

const renderer = new marked.Renderer();

renderer.heading = function(text, level) {
  return `<h${level} class="custom-heading">${text}</h${level}>`;
};

renderer.listitem = function(text) {
  return `<li class="custom-item">${text}</li>`;
};

const html = marked.parser(tokens, { renderer });
console.log(html);

Такой подход особенно полезен при интеграции с системами, где требуется особая структура HTML или кастомные CSS-классы.


Работа с вложенными токенами

Метод marked.parser автоматически обрабатывает вложенные структуры. Например, списки внутри блоков цитат или параграфы внутри списков:

const markdown = `
> Цитата:
> - Пункт 1
> - Пункт 2
`;

const tokens = marked.lexer(markdown);
const html = marked.parser(tokens);
console.log(html);

В этом случае marked.parser рекурсивно обрабатывает массив токенов для цитаты, внутри которого находится список с собственными токенами. Результат будет корректным HTML с <blockquote> и <ul><li>...</li></ul>.


Преимущества использования marked.parser вместо marked()

  • Полный контроль над процессом парсинга через токены и кастомный Renderer.
  • Возможность промежуточной обработки токенов (фильтрация, модификация, логирование).
  • Легко интегрировать с системами, где Markdown требует специфической генерации HTML.
  • Возможность рекурсивной обработки сложных структур, таких как вложенные списки или блоки цитат.

Практические рекомендации

  1. Всегда используйте marked.lexer перед marked.parser, если требуется кастомизация вывода.
  2. Переопределяйте методы Renderer, только если необходимо изменить стандартный HTML.
  3. Обрабатывайте вложенные токены внимательно, чтобы сохранить структуру документа.
  4. Используйте опции gfm и breaks, чтобы обеспечить совместимость с GitHub Flavored Markdown, если это важно.

Пример комбинированного подхода

const markdown = `
# Основной заголовок

> Цитата с **выделением**:
> - Первый пункт
> - Второй пункт
`;

const tokens = marked.lexer(markdown);

const renderer = new marked.Renderer();
renderer.strong = text => `<strong class="highlight">${text}</strong>`;
renderer.blockquote = text => `<blockquote class="quote-block">${text}</blockquote>`;

const html = marked.parser(tokens, { renderer, gfm: true });
console.log(html);

В результате получаем полностью кастомизированный HTML с сохранением вложенной структуры и стилизованными элементами.


marked.parser — это мощный инструмент для детального контроля над конвертацией Markdown в HTML. Правильное использование токенов и Renderer позволяет создавать гибкие и расширяемые решения для веб-приложений, CMS и других проектов, где важна точность и структура HTML.