Remark и Rehype построены вокруг концепции плагинов и конфигураций, что позволяет создавать гибкие цепочки обработки Markdown и HTML. Часто возникает необходимость использовать одинаковые настройки в нескольких проектах или на разных этапах одного проекта. Для этого применяются техники переиспользования конфигураций.
Конфигурация Remark или Rehype обычно представляет собой объект с
ключами plugins и settings:
const remarkConfig = {
plugins: [
[require('remark-gfm')],
[require('remark-slug')]
],
settings: {
commonmark: true,
footnotes: true
}
};
Для переиспользования конфигурации удобно выделять её в отдельный модуль. Это позволяет подключать один и тот же набор плагинов и настроек в разных скриптах или проектах.
// commonRemarkConfig.js
const remarkGfm = require('remark-gfm');
const remarkSlug = require('remark-slug');
module.exports = {
plugins: [
[remarkGfm],
[remarkSlug]
],
settings: {
commonmark: true,
footnotes: true
}
};
Подключение в проекте:
const { unified } = require('unified');
const remarkParse = require('remark-parse');
const remarkStringify = require('remark-stringify');
const commonRemarkConfig = require('./commonRemarkConfig');
unified()
.use(remarkParse, commonRemarkConfig.settings)
.use(...commonRemarkConfig.plugins)
.use(remarkStringify)
.processSync('# Заголовок');
В больших проектах часто требуется объединять базовую конфигурацию с дополнительными плагинами для специфичных задач. Для этого удобно использовать функцию-обертку, которая принимает базовую конфигурацию и добавляет новые элементы:
function extendConfig(baseConfig, additionalPlugins = [], additionalSettings = {}) {
return {
plugins: [...baseConfig.plugins, ...additionalPlugins],
settings: { ...baseConfig.settings, ...additionalSettings }
};
}
const extendedConfig = extendConfig(commonRemarkConfig, [
[require('remark-autolink-headings')]
], { listItemIndent: 'one' });
Таким образом, можно создавать конфигурации под разные окружения без дублирования кода.
Rehype работает аналогично, но для HTML. Базовая конфигурация может включать плагины для обработки ссылок, изображений, атрибутов и форматирования:
const rehypeConfig = {
plugins: [
require('rehype-highlight'),
[require('rehype-autolink-headings'), { beh * avior: 'wrap' }]
]
};
Переиспользование и расширение:
const extendedRehypeConfig = {
plugins: [
...rehypeConfig.plugins,
require('rehype-format')
]
};
function createRemarkConfig({ enableGfm = true } = {}) {
const plugins = [];
if (enableGfm) plugins.push(require('remark-gfm'));
plugins.push(require('remark-slug'));
return { plugins };
}
Переиспользование конфигураций повышает поддерживаемость кода, уменьшает вероятность ошибок при настройке цепочек плагинов и ускоряет внедрение новых плагинов или изменений в существующие.