Расширения в библиотеке Marked позволяют модифицировать или дополнять стандартный процесс разметки Markdown. Они могут добавлять новые синтаксические конструкции, изменять поведение существующих элементов или полностью перехватывать обработку определённых блоков и инлайн-элементов. Для обеспечения стабильности и корректной работы расширений необходимо системное тестирование.
Расширения бывают двух типов:
Каждое расширение задается объектом с обязательными полями:
name – уникальное имя расширения;level – block или
inline;start – функция или массив индексов начала возможного
применения правила (оптимизация поиска);tokenizer – функция, определяющая токен, который будет
распознан;renderer – функция, определяющая, как токен
преобразуется в HTML.Токенизация является ключевым этапом работы расширения. Она отвечает за корректное определение границ синтаксических конструкций и формирование токенов для дальнейшей обработки.
Проверка корректности распознавания токенов Необходимо тестировать каждый тип токена на корректность распознавания:
const tokens = marked.lexer("**текст**", { extensions: [myExtension] });
console.assert(tokens[0].type === 'strong', "Токен не распознан как жирный текст");Проверка границ токена Важно удостовериться, что токен не захватывает лишние символы:
const tokens = marked.lexer("**текст** остальное", { extensions: [myExtension] });
console.assert(tokens[0].raw === '**текст**', "Токен захватил лишние символы");Обработка ошибок и некорректного Markdown Расширение должно корректно обрабатывать неполные конструкции:
const tokens = marked.lexer("**текст", { extensions: [myExtension] });
console.assert(tokens[0].type === 'text', "Некорректный Markdown должен оставаться текстом");После токенизации важным этапом является рендеринг HTML из токенов. Тесты должны проверять соответствие ожидаемого HTML и фактического:
const html = marked.parse("**текст**", { extensions: [myExtension] });
console.assert(html === "<strong>текст</strong>", "Рендеринг не совпадает с ожиданием");
Особенности тестирования рендеринга:
**_текст_**);> блок > **жирный**);Для комплексного тестирования расширений рекомендуется применять моки — искусственные данные, имитирующие сложные структуры Markdown.
Пример создания фиктивного документа для теста:
const mockMarkdown = `
# Заголовок 1
> Цитата с **жирным** и _курсивом_
- Список 1
- Список 2
`;
const html = marked.parse(mockMarkdown, { extensions: [myExtension] });
Такой подход позволяет проверять одновременно несколько правил расширения и выявлять конфликтные ситуации между ними.
Для автоматизации тестов удобно использовать Jest или Mocha. Основная структура теста включает:
marked.parse или
marked.lexer;Пример автоматического теста:
test("Тест жирного текста", () => {
const md = "**тест**";
const html = marked.parse(md, { extensions: [myExtension] });
expect(html).toBe("<strong>тест</strong>");
});
Любое расширение может взаимодействовать с другими правилами или стандартными токенами. Регрессионные тесты фиксируют ранее правильное поведение:
Некоторые расширения могут значительно замедлять обработку больших документов. Рекомендуется:
start, чтобы
ускорить поиск токенов.Расширения должны оставаться совместимыми с новыми версиями Marked:
tokenizer и renderer при
изменениях внутренних структур;Тщательное тестирование расширений обеспечивает надежность, предсказуемость и стабильность Markdown-приложений, минимизируя вероятность ошибок при обработке сложных документов.