Computer Science Club of the University of Waterloo's website.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
www-new/lib/organized-content.ts

41 lines
1.1 KiB

import fs from "fs/promises";
import path from "path";
import matter from "gray-matter";
import { serialize } from "next-mdx-remote/serialize";
const BASE_PATH = "content";
export async function getSectionNamesForPage(page: string) {
const sectionDir = path.join(BASE_PATH, page);
return (await fs.readdir(sectionDir))
.filter((name) => name.endsWith(".md"))
.map((name) => name.slice(0, -".md".length));
}
export async function getSectionsForPage(page: string) {
const names = await getSectionNamesForPage(page);
const sections = await Promise.all(
names.map(async (name) => ({
name,
data: await getSectionForPage(page, name),
}))
);
return sections.sort((a, b) => a.data.index - b.data.index);
}
export async function getSectionForPage(page: string, section: string) {
const raw = await fs.readFile(
path.join(BASE_PATH, page, `${section}.md`),
"utf-8"
);
const { content, data } = matter(raw);
return {
content: await serialize(content),
title: data.title as string,
index: data.index as number,
};
}