Website version 6
v6.j0.lol
1import { execSync } from 'node:child_process';
2import { existsSync, mkdirSync } from "node:fs";
3import { join } from "node:path";
4import sharp from "sharp";
5
6export function setupEvents(eleventyConfig) {
7 let blogPosts = [];
8
9 eleventyConfig.addCollection("posts", (collectionApi) => {
10 const posts = collectionApi.getFilteredByTag("post");
11 blogPosts = posts;
12 return posts;
13 });
14
15 eleventyConfig.on("eleventy.after", async () => {
16 mkdirSync("_site/og", { recursive: true });
17
18 for (const post of blogPosts) {
19 const { data, page } = post;
20
21 const title = data?.title ?? "Untitled";
22 const subtitle = data?.description ?? data?.subtitle ?? "";
23 const datestring = data?.date
24 ? new Date(data.date).toLocaleDateString("en-GB", {
25 year: "numeric",
26 month: "long",
27 day: "numeric",
28 })
29 : "";
30
31 const slug = page.url.replace(/^\/|\/$/g, "").replace(/\//g, "-") || "index";
32 const outPath = join("_site/og", `${slug}.jpg`);
33
34 if (existsSync(outPath)) {
35 console.log(`[og] Skipping ${outPath} (already exists)`);
36 continue;
37 }
38
39 try {
40 const png = execSync(
41 [
42 `typst compile ./typst/og_image.typ`,
43 `--font-path ./typst/`,
44 `--input title=${JSON.stringify(title)}`,
45 `--input subtitle=${JSON.stringify(subtitle)}`,
46 `--input datestring=${JSON.stringify(datestring)}`,
47 `--format png -`,
48 ].join(" "),
49 { maxBuffer: 10 * 1024 * 1024 }
50 );
51
52 await sharp(png)
53 .jpeg({ quality: 85, mozjpeg: true })
54 .toFile(outPath);
55
56 console.log(`[og] Generated ${outPath}`);
57 } catch (err) {
58 console.error(`[og] Failed for ${page.url}:`, err.message);
59 }
60 }
61 });
62}