Computer Science Club of the University of Waterloo's website.
https://csclub.uwaterloo.ca
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.
40 lines
1.1 KiB
40 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,
|
|
};
|
|
}
|
|
|