80 lines
2.3 KiB
JavaScript
80 lines
2.3 KiB
JavaScript
module.exports = function (eleventyConfig) {
|
|
// Passthrough copy for static assets
|
|
eleventyConfig.addPassthroughCopy("src/assets");
|
|
eleventyConfig.addPassthroughCopy("src/js");
|
|
|
|
// Watch targets
|
|
eleventyConfig.addWatchTarget("src/css");
|
|
|
|
// Add year shortcode
|
|
eleventyConfig.addShortcode("year", () => `${new Date().getFullYear()}`);
|
|
|
|
// Add date filter for formatting
|
|
eleventyConfig.addFilter("dateFormat", (date, format = "full") => {
|
|
const d = new Date(date);
|
|
const options = {
|
|
full: { year: 'numeric', month: 'long', day: 'numeric' },
|
|
short: { year: 'numeric', month: 'short', day: 'numeric' },
|
|
iso: null,
|
|
};
|
|
|
|
if (format === "iso") {
|
|
return d.toISOString().split('T')[0];
|
|
}
|
|
|
|
return d.toLocaleDateString('en-US', options[format] || options.full);
|
|
});
|
|
|
|
// Add reading time filter
|
|
eleventyConfig.addFilter("readingTime", (content) => {
|
|
if (!content) return "1 min read";
|
|
const words = content.split(/\s+/).length;
|
|
const minutes = Math.ceil(words / 200);
|
|
return `${minutes} min read`;
|
|
});
|
|
|
|
// Add excerpt filter
|
|
eleventyConfig.addFilter("excerpt", (content, length = 150) => {
|
|
if (!content) return "";
|
|
const text = content.replace(/<[^>]+>/g, '').replace(/\n/g, ' ').trim();
|
|
return text.length > length ? text.slice(0, length) + '...' : text;
|
|
});
|
|
|
|
// Add head filter (get first n items from array)
|
|
eleventyConfig.addFilter("head", (array, n) => {
|
|
if (!Array.isArray(array)) return [];
|
|
if (n < 0) {
|
|
return array.slice(n);
|
|
}
|
|
return array.slice(0, n);
|
|
});
|
|
|
|
// Collections
|
|
// Blog posts / Proposals collection
|
|
eleventyConfig.addCollection("posts", function (collectionApi) {
|
|
return collectionApi.getFilteredByGlob("src/blog/**/*.md").sort((a, b) => {
|
|
return new Date(b.date) - new Date(a.date);
|
|
});
|
|
});
|
|
|
|
// CLQMS collection sorted by order
|
|
eleventyConfig.addCollection("clqms", function (collectionApi) {
|
|
return collectionApi.getFilteredByTag("clqms").sort((a, b) => {
|
|
return (Number(a.data.order) || 99) - (Number(b.data.order) || 99);
|
|
});
|
|
});
|
|
|
|
return {
|
|
dir: {
|
|
input: "src",
|
|
output: "_site",
|
|
includes: "_includes",
|
|
layouts: "_layouts",
|
|
data: "_data"
|
|
},
|
|
markdownTemplateEngine: "njk",
|
|
htmlTemplateEngine: "njk",
|
|
templateFormats: ["html", "njk", "md"]
|
|
};
|
|
};
|