Хук preprocess в Marked позволяет вмешиваться в процесс
обработки Markdown до того, как библиотека начнет разбирать текст. Это
мощный инструмент для модификации исходного Markdown, добавления
собственных директив или выполнения любых подготовительных
трансформаций. Он принимает текстовую строку Markdown и возвращает новую
строку, которая будет передана на разбор.
Хук задается через объект опций при инициализации Marked:
import { marked } from 'marked';
marked.use({
hooks: {
preprocess(markdown) {
// возвращает модифицированный markdown
return markdown;
}
}
});
Параметры:
markdown — исходная строка Markdown.Массовое исправление текста
Часто требуется автоматически исправить или заменить определенные конструкции Markdown до его обработки. Например, замена всех фигурных скобок на квадратные для совместимости с внутренними конвенциями:
marked.use({
hooks: {
preprocess(md) {
return md.replace(/\{(.*?)\}/g, '[$1]');
}
}
});
В результате все вхождения {текст} будут заменены на
[текст] перед разбором.
Добавление кастомных директив
Можно реализовать собственные макросы или плейсхолдеры. Например, вставка текущей даты:
marked.use({
hooks: {
preprocess(md) {
return md.replace(/\{\{DATE\}\}/g, new Date().toLocaleDateString());
}
}
});
Любая встречающаяся конструкция {{DATE}} заменяется на
актуальную дату в момент парсинга.
Фильтрация или удаление контента
Для удаления определенных блоков Markdown можно использовать регулярные выражения или более сложную логику:
marked.use({
hooks: {
preprocess(md) {
// удаляем все HTML-комментарии
return md.replace(/<!--[\s\S]*?-->/g, '');
}
}
});
Это позволяет предотвратить появление нежелательных элементов в финальном HTML.
preprocess всегда вызывается перед всеми
остальными хуками, такими как tokenizer,
renderer или walkTokens. Это делает его
идеальным местом для любых изменений исходного Markdown, на которые
должны опираться последующие этапы обработки.
Важно учитывать порядок применения хуков:
preprocess — изменение исходного Markdown.tokenizer — создание токенов на основе
модифицированного Markdown.walkTokens — обход токенов для дополнительных
трансформаций.renderer — генерация итогового HTML.Поддержка кастомных синтаксисов
marked.use({
hooks: {
preprocess(md) {
// конвертируем @username в ссылку на профиль
return md.replace(/@(\w+)/g, '[@$1](https://example.com/users/$1)');
}
}
});
Все упоминания @username автоматически превращаются в
ссылки.
Динамическая локализация текста
const translations = {
hello: 'Привет',
bye: 'Пока'
};
marked.use({
hooks: {
preprocess(md) {
return md.replace(/\{\{(\w+)\}\}/g, (_, key) => translations[key] || key);
}
}
});
Конструкции {{hello}} заменяются на перевод, заданный в
объекте translations.
preprocess должен быть максимально быстрым. Все
операции выполняются синхронно перед токенизацией, поэтому тяжелые
вычисления могут замедлить разбор Markdown.walkTokens и tokenizerpreprocess работает до разборa,
поэтому полезен для модификации исходного текста.tokenizer работает на этапе создания токенов, позволяя
создавать новые типы токенов.walkTokens обход токенов после токенизации, удобен для
изменения контента без изменения исходного Markdown.preprocess — это универсальный инструмент для подготовки
Markdown к разбору: исправление текста, внедрение динамического
контента, поддержка макросов и фильтрация нежелательных элементов. Его
сила заключается в возможности изменять исходный Markdown до того, как
библиотека Marked создаст токены и сгенерирует HTML, что делает его
ключевым хуком при кастомизации обработки Markdown.