Токенизация — это первый этап обработки Markdown в библиотеке Marked, на котором исходный текст преобразуется в набор токенов. Каждый токен представляет собой логическую единицу синтаксиса Markdown: заголовок, абзац, список, ссылку, изображение, кодовый блок и так далее. Токенизация позволяет отделить структуру документа от его содержания, что значительно упрощает последующую генерацию HTML.
При разборе Markdown Marked использует лексический анализ. Исходный текст последовательно сканируется строка за строкой. Лексический анализ основан на регулярных выражениях, каждое из которых соответствует определённому синтаксическому элементу Markdown. Например:
#, ##, ### и т.д.)
распознаются шаблоном, который ищет одну или несколько решёток в начале
строки, за которыми следует текст.*, -, + для
маркированных списков и числа для нумерованных) распознаются шаблонами,
которые учитывают отступы и символы списка.Каждое совпадение с регулярным выражением создаёт токен. Токен содержит тип элемента, содержимое, а иногда и дополнительные метаданные, например уровень заголовка или язык программирования для блоков кода.
Marked использует следующие основные виды токенов:
depth (уровень заголовка) и text.items. Каждый элемент списка также является токеном.href и
title.href и
alt.Инициализация лексера Создаётся экземпляр класса
Lexer, которому передаётся исходный текст Markdown. Лексер
хранит текущую позицию в тексте и последовательность токенов.
Построчная проверка Текст разбивается на строки.
Каждая строка проверяется по очереди на совпадение с регулярными
выражениями блоков (block-level tokens). Если совпадение
найдено, создаётся соответствующий токен, а текст строки маркируется как
обработанный.
Рекурсивный разбор вложенных структур Некоторые блоки, например списки или блоки цитат, могут содержать другие блоки. Marked создаёт токены для вложенных элементов рекурсивно. Это позволяет точно сохранить иерархию документа.
Обработка inline-токенов После построения
блоковых токенов текст внутри каждого блока дополнительно проходит
разбор на inline-токены. Например, в абзаце может
встречаться жирный текст, ссылки или встроенный код. Для этого
используется InlineLexer, который сканирует строку и
заменяет найденные элементы на соответствующие токены.
Финальная сборка массива токенов В результате получается массив токенов, описывающий всю структуру документа. Этот массив затем передаётся в рендерер, который превращает токены в HTML.
Markdown:
# Заголовок 1
Текст с **жирным** и _курсивом_.
- Пункт 1
- Пункт 2
Результирующие токены:
[
{ "type": "heading", "depth": 1, "text": "Заголовок 1" },
{ "type": "paragraph", "text": "Текст с **жирным** и _курсивом_" },
{
"type": "list",
"ordered": false,
"items": [
{ "type": "list_item", "text": "Пункт 1", "tokens": [] },
{ "type": "list_item", "text": "Пункт 2", "tokens": [] }
]
}
]
Этот пример показывает, как Marked преобразует текст Markdown в структурированный набор токенов, сохраняя типы элементов и их вложенность.
Marked применяет следующие приёмы для повышения производительности:
Тщательная токенизация позволяет Marked обеспечивать быструю и точную генерацию HTML из Markdown даже для больших документов с глубокой вложенностью элементов.