forked from www/www-new
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.
57 lines
1.5 KiB
57 lines
1.5 KiB
import { readFile, readdir, access } from "fs/promises";
|
|
import path from "path";
|
|
|
|
import matter from "gray-matter";
|
|
import { serialize } from "next-mdx-remote/serialize";
|
|
|
|
const EXECS_PATH = path.join("content", "team", "execs");
|
|
const fileType = ".md";
|
|
|
|
export interface Metadata {
|
|
name: string;
|
|
role: string;
|
|
image: string;
|
|
}
|
|
|
|
export async function getExecNames() {
|
|
return (await readdir(EXECS_PATH))
|
|
.filter((name) => name.endsWith(fileType))
|
|
.map((name) => name.slice(0, -1 * fileType.length));
|
|
}
|
|
|
|
export async function getExec(fileName: string, convert = true) {
|
|
const raw = await readFile(path.join(EXECS_PATH, `${fileName}${fileType}`));
|
|
const { content, data: metadata } = matter(raw);
|
|
const image =
|
|
(metadata.image as string | undefined) ??
|
|
(await getMemberImagePath(metadata.name));
|
|
|
|
return {
|
|
content: convert ? await serialize(content) : content,
|
|
metadata: { ...metadata, image } as Metadata,
|
|
};
|
|
}
|
|
|
|
async function getImage(imgPath: string) {
|
|
try {
|
|
await access(path.join("public", imgPath));
|
|
return imgPath;
|
|
} catch {
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
export async function getMemberImagePath(name: string) {
|
|
const imgPath = path.join("images", "team", name.replace(" ", ""));
|
|
const placeholder = path.join(
|
|
"images",
|
|
"team",
|
|
"team-member-placeholder.svg"
|
|
);
|
|
const img =
|
|
(await getImage(imgPath + ".jpg")) ??
|
|
(await getImage(imgPath + ".png")) ??
|
|
(await getImage(imgPath + ".gif")) ??
|
|
placeholder;
|
|
return img;
|
|
}
|
|
|