From 21ac736a1f02e9f41c5b69565f53952d51320381 Mon Sep 17 00:00:00 2001 From: multipleof4 Date: Mon, 31 Aug 2026 09:37:27 -0700 Subject: [PATCH] Feat: Copy article assets during page generation Co-authored-by: kimi-k3 --- scripts/generate-pages.mjs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/scripts/generate-pages.mjs b/scripts/generate-pages.mjs index 3d08ede..d618b86 100644 --- a/scripts/generate-pages.mjs +++ b/scripts/generate-pages.mjs @@ -1,4 +1,5 @@ import fs from "node:fs/promises"; +import path from "node:path"; import fg from "fast-glob"; import matter from "gray-matter"; import { marked } from "marked"; @@ -18,6 +19,21 @@ const getUnlistedSlugs = async () => { } }; +const copyArticleAssets = async (file, slug) => { + const dir = path.dirname(file); + const entries = await fs.readdir(dir, { withFileTypes: true }); + await Promise.all( + entries + .filter((entry) => entry.name !== "index.md") + .map((entry) => + fs.cp(path.join(dir, entry.name), path.join(SRC, slug, entry.name), { + recursive: true, + force: true + }) + ) + ); +}; + const run = async () => { const [files, unlisted] = await Promise.all([ fg(ARTICLES_GLOB, { cwd: ROOT, absolute: true }), @@ -33,6 +49,7 @@ const run = async () => { articles.push({ ...data, + sourceFile: file, isUnlisted: unlisted.has(data.slug), html: fixInternalLinks(marked.parse(content)) }); @@ -53,6 +70,7 @@ const run = async () => { for (const article of articles) { await writePage([SRC, article.slug, "index.html"], renderArticle(article)); + await copyArticleAssets(article.sourceFile, article.slug); } await writeDiscoveryFiles(listedArticles, AUTHOR_PAGES);