joshua.seigler.net/eleventy.config.js
2025-05-15 11:48:58 -04:00

97 lines
2.5 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 utc = require("dayjs/plugin/utc");
const clean = require("eleventy-plugin-clean");
const site = require("./site/_data/site");
dayjs.extend(utc);
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).utc().format(format);
});
clean.updateFileRecord("dist");
const buildTime = new Date().toISOString().replace(/[:.-]/g, "");
config.addGlobalData("buildTime", buildTime);
return {
dir: {
input: "site",
output: "dist",
},
};
};