Remark и Rehype — это мощные экосистемы для работы с Markdown и HTML в JavaScript. Одной из ключевых возможностей является управление предупреждениями (warnings), которые могут возникать при разборе и трансформации документов. Предупреждения позволяют выявлять потенциальные проблемы в синтаксисе, структуре документа или несовместимости плагинов.
Remark формирует предупреждения при обработке Markdown, например:
Rehype генерирует предупреждения при обработке HTML или при трансформации AST (Abstract Syntax Tree):
Для сбора предупреждений используется объект VFile,
который является центральной структурой для всех плагинов Remark и
Rehype. Каждое предупреждение добавляется с помощью метода
message():
import { unified } from 'unified';
import remarkParse from 'remark-parse';
import { VFile } from 'vfile';
const file = new VFile({ path: 'example.md', value: '# Заголовок\nТекст' });
file.message('Некорректный заголовок', { line: 1, column: 1 });
console.log(file.messages);
Ключевые параметры message():
reason — текст сообщения.position — объект с указанием строки и столбца.fatal — если true, обработка должна завершиться
ошибкой.Многие плагины Remark/Rehype автоматически формируют предупреждения. Например:
import remarkLint from 'remark-lint';
import remarkPresetLintRecommended from 'remark-preset-lint-recommended';
const processor = unified()
.use(remarkParse)
.use(remarkLint)
.use(remarkPresetLintRecommended);
const file = await processor.process('# Заголовок\n\n\nТекст');
file.messages.forEach(msg => {
console.log(msg.reason, msg.position);
});
В этом примере remark-lint собирает предупреждения о
несоблюдении правил стиля и структуры документа.
VFile позволяет фильтровать предупреждения по степени важности:
const warnings = file.messages.filter(msg => !msg.fatal);
const errors = file.messages.filter(msg => msg.fatal);
Можно также реализовать кастомный логгер:
file.messages.forEach(msg => {
const { reason, position, fatal } = msg;
if (fatal) {
console.error(`Ошибка: ${reason} (${position.start.line}:${position.start.column})`);
} else {
console.warn(`Предупреждение: ${reason} (${position.start.line}:${position.start.column})`);
}
});
Для учебных целей и анализа кода часто важно отображать предупреждения в читаемом виде, например, с подсветкой строк исходного документа:
import fs from 'fs';
const text = fs.readFileSync('example.md', 'utf-8');
file.messages.forEach(msg => {
const { line, column } = msg.position.start;
const lineContent = text.split('\n')[line - 1];
console.log(`${line}:${column} ${msg.fatal ? 'Ошибка' : 'Предупреждение'}: ${msg.reason}`);
console.log(`> ${lineContent}`);
});
Такой подход позволяет быстро локализовать проблемные участки и интегрировать обработку предупреждений в CI/CD пайплайны.
VFile как центральный объект для
хранения и отображения предупреждений.fatal и source
для различения ошибок и предупреждений плагинов.Эти методы позволяют управлять предупреждениями максимально прозрачно, выявлять ошибки на раннем этапе и гарантировать корректность обработки документов в сложных проектах.