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";
|
2025-05-18 19:49:08 -04:00
|
|
|
|
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);
|
2025-05-18 19:49:08 -04:00
|
|
|
|
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
|
2025-05-18 19:49:08 -04:00
|
|
|
|
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 19:49:08 -04:00
|
|
|
|
|
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 you’ll 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
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
}
|