Инспектирование токенов

Marked — это библиотека для парсинга Markdown в JavaScript, которая предоставляет мощные возможности для работы с исходным текстом на уровне токенов. Инспектирование токенов позволяет понять, как библиотека разбивает Markdown на логические элементы, и управлять процессом генерации HTML более гибко.

Генерация токенов

Основной метод для работы с токенами — это lexer. Он принимает строку Markdown и возвращает массив объектов, каждый из которых представляет отдельный токен.

const marked = require('marked');

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

- Элемент списка 1
- Элемент списка 2
`;

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

Результат будет массивом объектов, где каждый объект имеет ключи type, text и дополнительные свойства, зависящие от типа токена. Например, заголовок (heading) будет содержать depth, список (list) — ordered и items.

Структура токена

Каждый токен имеет базовую структуру:

  • type — определяет тип токена (heading, paragraph, list, list_item, code, blockquote и др.).

  • text — текстовое содержимое токена.

  • raw — исходный Markdown фрагмент, соответствующий токену.

  • Дополнительные свойства зависят от типа токена, например:

    • depth для заголовков.
    • lang для блоков кода.
    • ordered для списков.

Пример токена заголовка:

{
  "type": "heading",
  "depth": 1,
  "text": "Заголовок первого уровня",
  "raw": "# Заголовок первого уровня"
}

Разбор вложенных структур

Токены могут быть вложенными. Например, список (list) содержит массив items, каждый элемент которого является токеном list_item. Внутри list_item может находиться paragraph, code или даже вложенный список.

tokens.forEach(token => {
  if (token.type === 'list') {
    token.items.forEach(item => {
      console.log(item.text); // текст каждого элемента списка
    });
  }
});

Пользовательская обработка токенов

Инспектирование токенов открывает возможности для кастомной генерации HTML или анализа Markdown без полного рендеринга. Пример — подсветка определенных слов:

tokens.forEach(token => {
  if (token.type === 'paragraph') {
    token.text = token.text.replace(/\bImportant\b/g, '<strong>Important</strong>');
  }
});

После модификации токены можно преобразовать обратно в HTML с помощью marked.parser:

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

Типы токенов

Некоторые из ключевых типов токенов:

  • heading — заголовки (#, ## и т.д.)
  • paragraph — обычный текстовый блок
  • text — отдельные текстовые фрагменты
  • list — список (упорядоченный или нет)
  • list_item — элемент списка
  • blockquote — блок цитаты
  • code — блок кода
  • hr — горизонтальная линия
  • table — таблица
  • html — HTML-фрагмент внутри Markdown

Каждый тип токена имеет уникальные свойства, обеспечивающие полное описание Markdown-содержимого.

Преимущества работы с токенами

  • Возможность анализа Markdown перед генерацией HTML.
  • Легкая модификация контента на уровне отдельных элементов.
  • Создание кастомных рендереров.
  • Оптимизация обработки больших объемов текста без многократного парсинга.

Рекомендации по использованию

  • Использовать lexer для получения массива токенов вместо прямого рендеринга через marked(markdown).
  • Проверять вложенные структуры, чтобы не потерять элементы списков и блоков.
  • Хранить исходный raw для отладки и контроля преобразований.
  • Для сложных проектов создавать обертку, которая анализирует токены и применяет пользовательские правила до вызова parser.

Инспектирование токенов в Marked — это инструмент тонкой настройки и контроля над Markdown-контентом, позволяющий точно понимать, как библиотека интерпретирует текст, и создавать гибкие решения для рендеринга, анализа или модификации документа.