gil.ink/.eleventy.js

235 lines
6.2 KiB
JavaScript
Raw Normal View History

2025-04-30 02:44:05 -04:00
import { RenderPlugin, IdAttributePlugin } from "@11ty/eleventy";
2025-02-06 21:51:23 -05:00
import eleventyNavigationPlugin from "@11ty/eleventy-navigation";
import { feedPlugin } from "@11ty/eleventy-plugin-rss";
2025-05-19 14:23:33 -04:00
2025-02-06 21:51:23 -05:00
import markdownIt from "markdown-it";
import markdownItFootnote from "markdown-it-footnote";
2025-05-19 14:23:33 -04:00
2025-02-19 03:03:13 -05:00
import { DateTime } from "luxon";
2025-05-19 14:23:33 -04:00
import { chunk } from "lodash-es";
2025-02-06 21:51:23 -05:00
2025-02-18 15:12:10 -05:00
export default function (eleventyConfig) {
const MARKDOWN_OPTIONS = {
html: true,
breaks: true,
linkify: true,
typographer: true,
};
2025-05-18 13:17:26 -04:00
let md = markdownIt(MARKDOWN_OPTIONS).use(markdownItFootnote);
2025-02-06 21:51:23 -05:00
// Libraries
eleventyConfig.setLibrary("md", md);
// Plugins
2025-04-30 02:44:05 -04:00
eleventyConfig.addPlugin(RenderPlugin);
eleventyConfig.addPlugin(IdAttributePlugin);
2025-02-06 21:51:23 -05:00
eleventyConfig.addPlugin(eleventyNavigationPlugin);
eleventyConfig.addPlugin(feedPlugin, {
type: "atom", // or "rss", "json"
outputPath: "/feed.xml",
collection: {
name: "post", // iterate over `collections.posts`
limit: 10, // 0 means no limit
},
metadata: {
language: "en",
title: "Gil•INK",
subtitle: "Gil's personal website",
base: "https://gil.ink/",
author: {
name: "Gil Caley",
email: "hello@gil.ink",
},
},
});
2025-02-06 21:51:23 -05:00
2025-02-19 03:03:13 -05:00
// Filters
eleventyConfig.addFilter("filterByCategory", function (posts, cat) {
/*
case matters, so let's lowercase the desired category, cat
and we will lowercase our posts categories
*/
cat = cat.toLowerCase();
let result = posts.filter((p) => {
let cats = p.data.categories.map((s) => s.toLowerCase());
return cats.includes(cat);
});
return result;
});
2025-05-18 13:17:26 -04:00
eleventyConfig.addFilter("formatDate", function (date, format) {
return DateTime.fromJSDate(date).toFormat(format);
2025-05-16 21:16:21 -04:00
});
2025-05-18 13:17:26 -04:00
eleventyConfig.addFilter("formatDateRel", function (date) {
return DateTime.fromJSDate(date).toRelative();
});
eleventyConfig.addFilter("md", function (content = "") {
return md.render(content);
2025-02-19 03:03:13 -05:00
});
2025-05-18 13:17:26 -04:00
eleventyConfig.addFilter("mdInline", function (content = "") {
2025-04-28 01:49:10 -04:00
return md.renderInline(content);
});
2025-02-19 03:03:13 -05:00
2025-02-06 21:51:23 -05:00
// Passthrough copies
2025-02-18 15:12:10 -05:00
["src/assets"].forEach((path) => {
eleventyConfig.addPassthroughCopy(path);
});
2025-04-30 02:44:05 -04:00
2025-05-18 13:17:26 -04:00
// Watch targets
2025-02-06 21:51:23 -05:00
eleventyConfig.addWatchTarget("./src/assets/css");
2025-05-18 13:17:26 -04:00
// Frontmatter parsing
eleventyConfig.setFrontMatterParsingOptions({ excerpt: true });
// COLLECTIONS
2025-05-19 14:23:33 -04:00
////// Categories
2025-05-18 13:17:26 -04:00
eleventyConfig.addCollection("categories", function (collectionApi) {
let categories = new Set();
let posts = collectionApi.getFilteredByTag("post");
posts.forEach((p) => {
let cats = p.data.categories;
cats.forEach((c) => categories.add(c));
});
2025-05-18 13:17:26 -04:00
return Array.from(categories);
});
2025-05-19 14:23:33 -04:00
////// Paginated tags (by @zachleat)
// See: https://github.com/11ty/eleventy/issues/332#issuecomment-445236776
// note that this uses the lodash.chunk method, so youll have to require that
eleventyConfig.addCollection("tagPagination", function (collectionApi) {
// Get unique list of tags
let tagSet = new Set();
collectionApi.getAllSorted().map(function (item) {
if ("tags" in item.data) {
let tags = item.data.tags;
// optionally filter things out before you iterate over?
for (let tag of tags) {
tagSet.add(tag);
}
}
});
// Get each item that matches the tag
let paginationSize = 10;
let tagMap = [];
let tagArray = [...tagSet];
for (let tagName of tagArray) {
let tagItems = collectionApi.getFilteredByTag(tagName);
let pagedItems = chunk(tagItems, paginationSize);
//console.log( tagName, tagItems.length, pagedItems.length );
for (
let pageNumber = 0, max = pagedItems.length;
pageNumber < max;
pageNumber++
) {
tagMap.push({
tagName: tagName,
pageNumber: pageNumber,
pageSize: pagedItems.length,
pageData: pagedItems[pageNumber],
});
}
}
/* return data looks like:
[{
tagName: "tag1",
pageNumber: 0
pageData: [] // array of items
},{
tagName: "tag1",
pageNumber: 1
pageData: [] // array of items
},{
tagName: "tag1",
pageNumber: 2
pageData: [] // array of items
},{
tagName: "tag2",
pageNumber: 0
pageData: [] // array of items
}]
*/
//console.log( tagMap );
return tagMap;
});
////// Paginated categories (by @zachleat)
eleventyConfig.addCollection("catPagination", function (collectionApi) {
// Get unique list of tags
let catSet = new Set();
collectionApi.getAllSorted().map(function (item) {
if ("categories" in item.data) {
let cats = item.data.categories;
// optionally filter things out before you iterate over?
for (let cat of cats) {
catSet.add(cat);
}
}
});
// Get each item that matches the tag
let paginationSize = 10;
let catMap = [];
let catArray = [...catSet];
for (let catName of catArray) {
let catItems = collectionApi.getAllSorted().filter(function (item) {
if ("categories" in item.data) {
return item.data.categories.includes(catName);
} else {
return false;
}
});
let pagedItems = chunk(catItems, paginationSize);
//console.log( tagName, tagItems.length, pagedItems.length );
for (
let pageNumber = 0, max = pagedItems.length;
pageNumber < max;
pageNumber++
) {
catMap.push({
catName: catName,
pageNumber: pageNumber,
pageSize: pagedItems.length,
pageData: pagedItems[pageNumber],
});
}
}
/* return data looks like:
[{
tagName: "tag1",
pageNumber: 0
pageData: [] // array of items
},{
tagName: "tag1",
pageNumber: 1
pageData: [] // array of items
},{
tagName: "tag1",
pageNumber: 2
pageData: [] // array of items
},{
tagName: "tag2",
pageNumber: 0
pageData: [] // array of items
}]
*/
//console.log( tagMap );
return catMap;
});
2025-02-06 21:51:23 -05:00
return {
dir: {
2025-02-19 03:03:13 -05:00
input: "src",
2025-02-06 21:51:23 -05:00
},
};
}