Eleventy Plugin Unified
Use the unified ecosystem in Eleventy.
You can render, transform and lint:
- markdown with the remark ecosystem.
- html with the rehype ecosystem.
- text with the retext ecosystem.
Install
npm install eleventy-plugin-unified remark-slug
const EleventyUnifiedPlugin = require("eleventy-plugin-unified");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(EleventyUnifiedPlugin, [
"remark-slug",
]);
};
Full example
npm install eleventy-plugin-unified remark-slug rehype-format unist-util-visit
const EleventyUnifiedPlugin = require("eleventy-plugin-unified");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(EleventyUnifiedPlugin, {
transformsDirectory: "./plugins/",
markdownTransforms: ["aria-current-links.js", "remark-slug"],
htmlTransforms: [["rehype-format", { indent: "\t" }]],
});
};
import { join } from "node:path";
import { visit } from "unist-util-visit";
export default function ariaCurrentLinks() {
const {
pageContext: { page },
} = this.data();
return (tree) => {
visit(tree, ["link", "linkReference"], (node) => {
const url = node?.url;
if (url && join(page.filePathStem) !== join(url)) {
return;
}
node.data = {
...node.data,
hProperties: {
...node.data.hProperties,
"aria-current": "true",
},
};
});
};
}
const EleventyUnifiedPlugin = require("eleventy-plugin-unified");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(EleventyUnifiedPlugin, [
markdownTransforms: [
'remark-emoji'
]
]);
};
Configuring html transforms (rehype plugins)
const EleventyUnifiedPlugin = require("eleventy-plugin-unified");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(EleventyUnifiedPlugin, [
htmlTransforms: [
'rehype-format'
]
]);
};
Configuring text transforms (retext plugins)
npm install eleventy-plugin-unified retext-repeated-words vfile-reporter
const EleventyUnifiedPlugin = require("eleventy-plugin-unified");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(EleventyUnifiedPlugin, [
reporter: 'vfile-reporter',
textTransforms: [
'retext-repeated-words'
]
]);
};
or
const EleventyUnifiedPlugin = require("eleventy-plugin-unified");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(EleventyUnifiedPlugin, [
reporter: (file) => {
console.log(file);
},
textTransforms: [
'retext-repeated-words'
]
]);
};
Configuring text parser language
npm install eleventy-plugin-unified retext-latin retext-repeated-words vfile-reporter
const EleventyUnifiedPlugin = require("eleventy-plugin-unified");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(EleventyUnifiedPlugin, [
textParser: 'retext-latin',
reporter: 'vfile-reporter',
textTransforms: [
'retext-repeated-words'
]
]);
};
Configuring options for a plugin
const EleventyUnifiedPlugin = require("eleventy-plugin-unified");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(EleventyUnifiedPlugin, [
htmlTransforms: [
["rehype-format", { indent: "\t" }]
],
]);
};
Configuring internal plugins
const EleventyUnifiedPlugin = require("eleventy-plugin-unified");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(EleventyUnifiedPlugin, [
markdownTransforms: [
"./plugins/responsive-tables.js"
],
]);
};
or
const EleventyUnifiedPlugin = require("eleventy-plugin-unified");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(EleventyUnifiedPlugin, [
transformsDirectory: "./plugins",
markdownTransforms: [
"responsive-tables.js"
],
]);
};
Getting access to page context and eleventy config
npm install eleventy-plugin-unified unist-util-visit
const EleventyUnifiedPlugin = require("eleventy-plugin-unified");
module.exports = function (eleventyConfig) {
eleventyConfig.addPlugin(EleventyUnifiedPlugin, {
transformsDirectory: "./plugins/",
markdownTransforms: ["log-data.js"],
});
};
export default function logData() {
const { pageContext, eleventyConfig } = this.data();
console.log({ pageContext, eleventyConfig });
}
Acknowledgements
Inspired by florianeckerstorfer/eleventy-plugin-remark