Website version 6 v6.j0.lol
at trunk 62 lines 1.7 kB view raw
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}