2023-02-13 14:41:59 +06:00

88 lines
2.0 KiB
JavaScript

const fsFileTree = require("fs-file-tree");
const matter = require("gray-matter");
const fs = require("fs");
module.exports = async () => {
const tree = await fsFileTree("src/site/notes");
populateWithPermalink(tree);
return sortTree(tree);
};
const sortTree = (unsorted) => {
//Sort by folder before file, then by name
const orderedTree = Object.keys(unsorted)
.sort((a, b) => {
if (a.indexOf(".md") > -1 && b.indexOf(".md") === -1) {
return 1;
}
if (a.indexOf(".md") === -1 && b.indexOf(".md") > -1) {
return -1;
}
if (a.toLowerCase() > b.toLowerCase()) {
return 1;
}
return -1;
})
.reduce((obj, key) => {
obj[key] = unsorted[key];
return obj;
}, {});
for (const key of Object.keys(orderedTree)) {
if (!orderedTree[key].path) {
orderedTree[key] = sortTree(orderedTree[key]);
}
}
return orderedTree;
};
function getPermalinkMeta(path, key) {
let permalink = "/";
let name = key.replace(".md", "");
let noteIcon = process.env.NOTE_ICON_DEFAULT;
try {
const file = fs.readFileSync(`${path}`, "utf8");
const frontMatter = matter(file);
if (frontMatter.data.permalink) {
permalink = frontMatter.data.permalink;
}
if (frontMatter.data.title) {
name = frontMatter.data.title;
}
if (frontMatter.data.noteIcon) {
noteIcon = frontMatter.data.noteIcon;
}
} catch {
//ignore
}
return { permalink, name, noteIcon };
}
function populateWithPermalink(tree) {
Object.keys(tree).forEach((key) => {
if (tree[key].path) {
const isNote = tree[key].path.endsWith(".md");
tree[key].isNote = isNote;
if (isNote) {
let { permalink, name, noteIcon } = getPermalinkMeta(
tree[key].path,
key
);
tree[key].permalink = permalink;
tree[key].name = name;
tree[key].noteIcon = noteIcon;
}
} else {
tree[key].isFolder = true;
populateWithPermalink(tree[key]);
}
});
}