joshua.seigler.net/eleventy.config.js
2024-06-07 15:39:27 -04:00

90 lines
2.3 KiB
JavaScript

const fs = require("fs");
const path = require("path");
const md = require("markdown-it");
const mdAnchor = require("markdown-it-anchor");
const mdFootnote = require("markdown-it-footnote");
const prettier = require("prettier");
const dayjs = require("dayjs")
const clean = require("eleventy-plugin-clean");
const site = require("./site/_data/site");
module.exports = (config) => {
const slugify = config.getFilter("slugify");
const url = config.getFilter("url");
const mdLib = md({
html: true,
breaks: true,
linkify: true,
typographer: true,
})
.use(mdAnchor, {
permalink: mdAnchor.permalink.ariaHidden({
placement: "before",
symbol: "",
}),
})
.use(mdFootnote);
config.setLibrary("md", mdLib);
config.addPassthroughCopy({
assets: "/",
});
// collection from music folder
config.addPassthroughCopy("site/music", {
rename: (filename) => {
const ext = path.extname(filename);
const base = path.basename(filename, ext);
return `${slugify(base)}${ext}`;
},
});
config.addCollection("music", () => {
const musicFiles = fs.readdirSync("./site/music/").map((filename) => {
const ext = path.extname(filename);
const base = path.basename(filename, ext);
const absUrl = `/music/${slugify(base)}${ext}`;
return {
data: {
title: base,
tags: ["music"],
},
url: url(absUrl),
};
});
return musicFiles;
});
config.addTransform("prettier", (content, outputPath) => {
if (typeof outputPath !== "string") {
return content;
}
const extname = path.extname(outputPath);
switch (extname) {
case ".html":
case ".css":
case ".json":
// Strip leading period from extension and use as the Prettier parser.
const parser = extname.replace(/^./, "");
return prettier.format(content, { parser });
default:
return content;
}
});
config.addFilter("absoluteURL", (url) => {
return new URL(url, site.baseUrl).href;
});
config.addFilter("toISOString", (dateString) => {
return new Date(dateString).toISOString()
});
config.addFilter("formatDate", (date, format) => {
return dayjs(date).format(format);
});
clean.updateFileRecord("dist");
return {
dir: {
input: "site",
output: "dist",
},
};
};