From 3a2d198d153efc8a69e7640f7dcde88207268ff3 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Fri, 22 Sep 2023 08:40:59 +0200 Subject: Replace zola with DOM-based static site generation code --- src/posts.ts | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/posts.ts (limited to 'src/posts.ts') diff --git a/src/posts.ts b/src/posts.ts new file mode 100644 index 0000000..c727e12 --- /dev/null +++ b/src/posts.ts @@ -0,0 +1,63 @@ +import path from "node:path"; +import fs from "node:fs/promises"; + +import { matter } from "toml-matter"; +import * as marked from "marked"; + +type MatterFile = ReturnType; + +export type Post = { + input: string; + output: string; + basename: string; + url: string; + title: string; + date: Date; + description: string | undefined; + taxonomies: Record; +}; + +export async function getPost(filename: string): Promise { + return matter(await Bun.file(filename).text()); +} + +export async function readPosts( + root: string, + inputDir: string, + outputDir: string, +): Promise<{ posts: Array; tags: Set }> { + let tags = new Set(); + let posts = new Array(); + const subdir = path.join(root, inputDir); + for (let pathname of await fs.readdir(subdir)) { + const pathFromDir = path.join(inputDir, pathname); + const pathFromRoot = path.join(subdir, pathname); + const stat = await fs.stat(pathFromRoot); + if (stat.isFile() && path.extname(pathname) === ".md") { + if (pathname !== "_index.md") { + const input = pathFromRoot; + const output = pathFromRoot + .replace(root, outputDir) + .replace(".md", "/index.html"); + const url = pathFromRoot.replace(root, "").replace(".md", "/"); + + const file = await getPost(input); + + file.data.taxonomies?.tags?.map((t: string) => + tags.add(t.toLowerCase()), + ); + posts.push({ + input, + output, + basename: path.basename(pathname, ".md"), + url, + ...file.data, + } as Post); + } + } + } + return { + posts: posts.sort((a, b) => b.date.getTime() - a.date.getTime()), + tags, + }; +} -- cgit 1.4.1