112 lines
3.4 KiB
JavaScript
112 lines
3.4 KiB
JavaScript
import syntaxHighlight from "@11ty/eleventy-plugin-syntaxhighlight";
|
|
import markdownIt from "markdown-it";
|
|
import markdownItAnchor from "markdown-it-anchor";
|
|
import { filters } from "./src/_filters/index.js";
|
|
import {
|
|
postComparator,
|
|
isPostPublic,
|
|
isPostArchived,
|
|
isPostDraft,
|
|
isPostHidden
|
|
} from "./src/_utils/sort-posts.js";
|
|
import { validateLinkedArticles } from "./src/_utils/linked-articles.js";
|
|
|
|
export default function (eleventyConfig) {
|
|
let buildTimestamp = new Date().toISOString();
|
|
eleventyConfig.on("eleventy.before", () => {
|
|
buildTimestamp = new Date().toISOString();
|
|
});
|
|
eleventyConfig.addGlobalData("buildTimestamp", () => buildTimestamp);
|
|
|
|
// Build ignored local post fixtures without making them Git-tracked.
|
|
eleventyConfig.setUseGitIgnore(false);
|
|
|
|
// 1. Static Asset Passthrough Copy
|
|
eleventyConfig.addPassthroughCopy({ "src/assets": "assets" });
|
|
|
|
// 2. Syntax Highlighting Plugin
|
|
eleventyConfig.addPlugin(syntaxHighlight);
|
|
|
|
// 3. Markdown-It Library Customization
|
|
const markdownOptions = {
|
|
html: true,
|
|
breaks: false,
|
|
linkify: true
|
|
};
|
|
|
|
const markdownLib = markdownIt(markdownOptions).use(markdownItAnchor, {
|
|
permalink: markdownItAnchor.permalink.headerLink({
|
|
safariReaderFix: true
|
|
}),
|
|
slugify: (s) =>
|
|
s
|
|
.trim()
|
|
.toLowerCase()
|
|
.replace(/[^a-z0-9 -]/g, "")
|
|
.replace(/\s+/g, "-")
|
|
.replace(/-+/g, "-")
|
|
});
|
|
|
|
eleventyConfig.setLibrary("md", markdownLib);
|
|
|
|
// 4. Custom Filters (imported from modular src/_filters/index.js)
|
|
for (const [name, fn] of Object.entries(filters)) {
|
|
eleventyConfig.addFilter(name, fn);
|
|
}
|
|
|
|
// 5. Custom Collections
|
|
// Pinned / featured prioritized, chronological blog posts collection (excludes drafts, hidden, and archived posts)
|
|
eleventyConfig.addCollection("posts", (collectionApi) => {
|
|
const allPosts = collectionApi.getFilteredByGlob("src/posts/*.md");
|
|
validateLinkedArticles(allPosts);
|
|
|
|
return allPosts
|
|
.filter((post) => isPostPublic(post))
|
|
.sort(postComparator);
|
|
});
|
|
|
|
// Chronological archived blog posts collection (excludes drafts and hidden posts)
|
|
eleventyConfig.addCollection("archivedPosts", (collectionApi) => {
|
|
return collectionApi
|
|
.getFilteredByGlob("src/posts/*.md")
|
|
.filter((post) => !isPostDraft(post) && !isPostHidden(post) && isPostArchived(post))
|
|
.sort(postComparator);
|
|
});
|
|
|
|
// Dynamic Tag List Collection across all public posts (excludes drafts and hidden posts)
|
|
eleventyConfig.addCollection("tagList", (collectionApi) => {
|
|
const tagSet = new Set();
|
|
collectionApi
|
|
.getFilteredByGlob("src/posts/*.md")
|
|
.filter((post) => isPostPublic(post))
|
|
.forEach((item) => {
|
|
if ("tags" in item.data) {
|
|
let tags = item.data.tags;
|
|
if (typeof tags === "string") tags = [tags];
|
|
for (const tag of tags) {
|
|
const cleanTag = tag.replace(/^#/, "");
|
|
tagSet.add(cleanTag);
|
|
}
|
|
}
|
|
});
|
|
return [...tagSet].sort();
|
|
});
|
|
|
|
// 6. Dev Server Options (dynamic port binding)
|
|
eleventyConfig.setServerOptions({
|
|
port: parseInt(process.env.PORT || "8080", 10)
|
|
});
|
|
|
|
return {
|
|
dir: {
|
|
input: "src",
|
|
includes: "_includes",
|
|
data: "_data",
|
|
output: "_site"
|
|
},
|
|
templateFormats: ["njk", "md", "html"],
|
|
htmlTemplateEngine: "njk",
|
|
markdownTemplateEngine: "njk"
|
|
};
|
|
}
|