feat: remove markdown build helpers

This commit is contained in:
2025-12-31 18:23:28 -05:00
parent d351d3d8b6
commit 5c1d7f4b67
8 changed files with 137 additions and 183 deletions

View File

@@ -1,52 +1,36 @@
import type { Plugin } from "vite";
import { readSync } from "to-vfile";
import { matter } from "vfile-matter";
import { resolve, join } from "node:path";
import { readdirSync, statSync, writeFileSync } from "node:fs";
import { exec } from "node:child_process";
import { readdirSync, readFileSync, writeFileSync } from "node:fs";
import matter from "gray-matter";
/*
* Code from andii.dev
*/
const processFiles = () => {
const outputFile = resolve("src/data/posts.json");
const blogDir = resolve("src/routes/blog");
const files = readdirSync(blogDir);
const blogPosts = files
.filter(
(file) => statSync(join(blogDir, file)).isFile() && file.endsWith(".mdx"),
)
const BLOG_DIR = resolve("src/routes/blog");
const OUTPUT_FILE = resolve("src/data/posts.json");
function generatePostsJson() {
const posts = readdirSync(BLOG_DIR)
.filter((file) => file.endsWith(".mdx"))
.map((file) => {
const f = readSync(resolve("src/routes/blog", file));
matter(f);
return {
...(f.data.matter as object),
slug: file.replace(".mdx", ""),
} as { date: string; slug: string };
const content = readFileSync(join(BLOG_DIR, file), "utf-8");
const { data } = matter(content);
return { ...data, slug: file.replace(".mdx", "") };
})
.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
.sort(
(a, b) =>
new Date(b.date as string).getTime() -
new Date(a.date as string).getTime(),
);
writeFileSync(outputFile, JSON.stringify(blogPosts, null, 2), "utf-8");
writeFileSync(OUTPUT_FILE, JSON.stringify(posts, null, 2));
}
exec("bunx @biomejs/biome format --write ./src/data/posts.json");
};
export const blogPostsPlugin = (): Plugin => {
return {
name: "blog-posts-gen",
buildEnd() {
processFiles();
},
configureServer(server) {
server.watcher.on("change", (filePath) => {
if (
!filePath.includes("/src/routes/blog") &&
!filePath.includes("blogPostsPlugin.ts")
)
return;
processFiles();
});
},
};
};
export const blogPostsPlugin = (): Plugin => ({
name: "blog-posts-gen",
buildStart: generatePostsJson,
configureServer(server) {
server.watcher.on("change", (path) => {
if (path.includes("src/routes/blog") && path.endsWith(".mdx")) {
generatePostsJson();
}
});
},
});

View File

@@ -1,41 +0,0 @@
import { visit } from "unist-util-visit";
import { toString as nodeToString } from "hast-util-to-string";
import { refractor } from "refractor";
import tsx from "refractor/lang/tsx.js";
/*
* Code from andii.dev
*/
refractor.register(tsx);
export const mdxPrism = () => {
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
return (tree: any) => {
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
visit(tree, "element" as any, visitor);
};
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
function visitor(node: any, index: number | undefined, parent: any) {
if (parent.type !== "mdxJsxFlowElement") {
return;
}
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
const attrs = parent.attributes.reduce((a: any, c: any) => {
if (c.type === "mdxJsxAttribute") {
a[c.name] = c.value;
}
return a;
}, {});
const lang = attrs.lang;
if (!lang) {
return;
}
const result = refractor.highlight(nodeToString(node), lang);
node.children = result.children;
}
};