Markdown-it — это мощная библиотека для парсинга Markdown в JavaScript, которая предоставляет гибкий API для модификации выходного HTML на разных этапах обработки. Постпроцессинг HTML в Markdown-it позволяет вмешиваться в результат преобразования Markdown после того, как он был скомпилирован в HTML, что открывает широкие возможности для кастомизации, оптимизации и интеграции с другими библиотеками.
Markdown-it выполняет несколько ключевых этапов при конвертации Markdown в HTML:
Постпроцессинг можно реализовать на уровне токенов или готового HTML. Каждый подход имеет свои преимущества.
Markdown-it позволяет работать напрямую с токенами через правила рендеринга и плагины. Токены хранят детальную информацию о структуре документа, что делает возможным точечное вмешательство.
Пример добавления класса к заголовкам:
const MarkdownIt = require('markdown-it');
const md = new MarkdownIt();
md.core.ruler.push('add_custom_class_to_headings', function (state) {
state.tokens.forEach(token => {
if (token.type === 'heading_open') {
token.attrPush(['class', 'custom-heading']);
}
});
});
const result = md.render('# Заголовок\n\nТекст абзаца');
console.log(result);
Разбор примера:
core.ruler.push добавляет правило в цепочку обработки
токенов.state.tokens содержит массив токенов всего
документа.token.attrPush позволяет добавлять HTML-атрибуты.Markdown-it предоставляет возможность переопределять стандартные рендереры для отдельных типов токенов. Это позволяет изменять HTML для определённых элементов без изменения остальных.
Пример переопределения рендерера ссылок:
const defaultRender = md.renderer.rules.link_open || function(tokens, idx, options, env, self) {
return self.renderToken(tokens, idx, options);
};
md.renderer.rules.link_open = function (tokens, idx, options, env, self) {
tokens[idx].attrPush(['target', '_blank']);
return defaultRender(tokens, idx, options, env, self);
};
Ключевые моменты:
defaultRender.target="_blank" ко всем
ссылкам.Иногда удобнее работать с уже сгенерированным HTML. В этом случае
можно использовать сторонние библиотеки (например, cheerio
или jsdom) для разбора и модификации HTML.
Пример добавления класса к тегам <p>:
const cheerio = require('cheerio');
let html = md.render('Параграф текста');
const $ = cheerio.load(html);
$('p').addClass('custom-paragraph');
html = $.html();
console.log(html);
Особенности подхода:
Markdown-it поддерживает плагины для подсветки кода (например,
highlight.js). Постпроцессинг HTML позволяет добавить
собственные стили или атрибуты к элементам <pre> и
<code> после рендеринга:
md.renderer.rules.fence = (tokens, idx, options, env, self) => {
const token = tokens[idx];
const langClass = token.info ? `language-${token.info.trim()}` : '';
return `<pre class="custom-code ${langClass}"><code>${md.utils.escapeHtml(token.content)}</code></pre>`;
};
Markdown-it позволяет расширять синтаксис Markdown с помощью плагинов, создавая новые токены для сложных структур, таких как диаграммы или таблицы с фильтрацией. Постпроцессинг HTML даёт возможность форматировать эти элементы после рендеринга, например, добавляя идентификаторы для якорей или классы для CSS:
md.core.ruler.push('add_ids_to_tables', function(state) {
state.tokens.forEach((token, i) => {
if (token.type === 'table_open') {
token.attrPush(['id', `table-${i}`]);
}
});
});
target="_blank" и
rel="noopener".Постпроцессинг HTML в Markdown-it — это мощный инструмент, который сочетает гибкость и точность. Он позволяет создавать полностью кастомизированный HTML, сохраняя при этом стандартную структуру Markdown.