Библиотека Marked предоставляет мощный механизм для парсинга Markdown и конвертации его в HTML. Одной из ключевых возможностей является расширение функционала с помощью объектов расширения (extensions). Понимание структуры этих объектов необходимо для создания пользовательских правил парсинга, обработки нестандартных синтаксических конструкций и интеграции собственных рендереров.
Объект расширения в Marked представляет собой JavaScript-объект с определёнными свойствами, которые позволяют контролировать поведение парсера. Основные свойства включают:
name – строковое имя расширения. Используется для идентификации расширения в списке подключённых. Например:
const myExtension = {
name: 'customLink'
};level – определяет уровень обработки:
block или inline.
block – расширение применяется к блочным элементам
Markdown, таким как параграфы, заголовки, списки.inline – расширение применяется к содержимому внутри
блочных элементов, например, к ссылкам, эмодзи или выделенному
тексту.level: 'inline'start – необязательная функция или массив индексов для оптимизации. Используется для повышения производительности парсинга, предоставляя парсеру информацию о том, с каких символов стоит начинать проверку для данного расширения.
start(src) {
return src.indexOf('@@');
}tokenizer – функция, которая выполняет разбор входного текста и возвращает объект токена. Токен описывает распознанный элемент Markdown. Структура токена:
{
type: 'custom', // тип токена
raw: '@@example@@', // исходный текст
text: 'example' // содержимое без маркеров
}
Пример tokenizer для нестандартного синтаксиса:
tokenizer(src) {
const match = /^@@(\w+)@@/.exec(src);
if (match) {
return {
type: 'custom',
raw: match[0],
text: match[1]
};
}
}renderer – функция, которая преобразует токен в HTML. Принимает токен, возвращает строку с HTML-разметкой:
renderer(token) {
return `<span class="highlight">${token.text}</span>`;
}childTokens – массив дочерних токенов, если элемент имеет вложенную структуру. Полезно для блочных элементов, содержащих внутренние инлайн-элементы.
const token = {
type: 'customBlock',
raw: '::alert This is important::',
text: 'This is important',
childTokens: []
};Promise, что
удобно при интеграции с внешними источниками данных.const alertExtension = {
name: 'alertBlock',
level: 'block',
start(src) {
return src.indexOf('::alert');
},
tokenizer(src) {
const rule = /^::alert\s+([\s\S]+?)::/;
const match = rule.exec(src);
if (match) {
return {
type: 'alert',
raw: match[0],
text: match[1].trim()
};
}
},
renderer(token) {
return `<div class="alert">${token.text}</div>`;
}
};
Это расширение создаёт блоки предупреждений в Markdown, которые будут
рендериться в HTML с обёрткой
<div class="alert">.
name, level и хотя бы один из методов
tokenizer или renderer.start уменьшает количество проверок текста и
ускоряет обработку больших документов.childTokens и
соответствующие правила рендеринга, чтобы сохранить структуру
документа.Объект расширения Marked — это гибкий инструмент для добавления кастомного синтаксиса и создания собственного потока преобразования Markdown в HTML, сохраняя при этом полную совместимость с базовыми правилами библиотеки.