InvestWeb/lib/wiki/api.ts
2023-02-06 03:03:33 -08:00

70 lines
2 KiB
TypeScript

import { default as pathlib } from "path";
import fg from "fast-glob";
import fs from "fs";
import matter from "gray-matter";
const wikiDir = pathlib.join(process.cwd(), "InvestWiki/wiki");
const getAllFiles = (path: string) => {
const files = fg.sync("**/*.md", {
cwd: path,
onlyFiles: true,
absolute: false,
});
return files;
};
function getAllWikiPaths() {
const files = getAllFiles(wikiDir);
// manipulate array entries, remove the .md extension and move it to the front of the string
const paths = files.map((file: string) => {
const path = file.replace(".md", "");
// move the last part of the path to the front
const pathParts = path.split("/");
const lastPart = pathParts.pop();
if (lastPart) {
pathParts.unshift(lastPart);
}
return pathParts.join("/");
});
return paths;
}
function getWikiPath(lang: string, path: string) {
const files = getAllFiles(wikiDir);
// filter the files to only include the ones in the path
const pageFiles = files.filter(
(file) => file.split("/").slice(0, -1).join("/") === path
);
let pagePath = "";
// do https://github.com/vercel/next.js/blob/canary/examples/blog-starter/lib/api.ts
if (pageFiles.length !== 0) {
// check if there is a file with the language code
const langFile = pageFiles.find((file) => file.includes(`${lang}.md`));
if (langFile) {
pagePath = langFile;
} else {
// otherwise, use the english file if it exists, otherwise return the first file
pagePath =
pageFiles.find((file) => file.includes("en.md")) ?? pageFiles[0];
}
}
return pagePath;
}
function getWikiContent(lang: string, path: string) {
// get the path to the file
const relativePath = getWikiPath(lang, path);
if (!relativePath) {
return null;
}
const filePath = pathlib.join(wikiDir, relativePath);
// read the file
const fileContents = fs.readFileSync(filePath, "utf8");
const { data, content } = matter(fileContents);
return { data, content };
}
export { getWikiPath, getAllWikiPaths, getWikiContent };