Merge branch 'uroybd-path-rewrite'

This commit is contained in:
Ole Eskild Steensen 2023-03-25 16:15:11 +01:00
commit 6d8a267fde
4 changed files with 120 additions and 96 deletions

View File

@ -0,0 +1,105 @@
const sortTree = (unsorted) => {
//Sort by folder before file, then by name
const orderedTree = Object.keys(unsorted)
.sort((a, b) => {
const a_is_note = a.indexOf(".md") > -1;
const b_is_note = b.indexOf(".md") > -1;
if (a_is_note && !b_is_note) {
return 1;
}
if (!a_is_note && b_is_note) {
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].isFolder) {
orderedTree[key] = sortTree(orderedTree[key]);
}
}
return orderedTree;
};
function toTitleCase(str) {
return str.replace(/\w\S*/g, function (txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
});
}
function getPermalinkMeta(note, key) {
let permalink = "/";
let parts = note.filePathStem.split("/");
let name = parts[parts.length - 1];
let noteIcon = process.env.NOTE_ICON_DEFAULT;
let hide = false;
let folders = null;
try {
if (note.data.permalink) {
permalink = note.data.permalink;
}
if (note.data.tags && note.data.tags.indexOf("gardenEntry") != -1) {
permalink = "/";
}
if (note.data.title) {
name = note.data.title;
}
if (note.data.noteIcon) {
noteIcon = note.data.noteIcon;
}
// Reason for adding the hide flag instead of removing completely from file tree is to
// allow users to use the filetree data elsewhere without the fear of losing any data.
if (note.data.hide) {
hide = note.data.hide;
}
if (note.data["dg-path"]) {
folders = note.data["dg-path"].split("/");
} else {
folders = note.filePathStem
.split("notes/")[1]
.split("/")
.map(toTitleCase);
}
} catch {
//ignore
}
return [{ permalink, name, noteIcon, hide }, folders];
}
function assignNested(obj, keyPath, value) {
lastKeyIndex = keyPath.length - 1;
for (var i = 0; i < lastKeyIndex; ++i) {
key = keyPath[i];
if (!(key in obj)) {
obj[key] = { isFolder: true };
}
obj = obj[key];
}
obj[keyPath[lastKeyIndex]] = value;
}
function getFileTree(data) {
const tree = {};
(data.collections.note || []).forEach((note) => {
const [meta, folders] = getPermalinkMeta(note);
assignNested(tree, folders, { isNote: true, ...meta });
});
const fileTree = sortTree(tree);
return fileTree;
}
exports.getFileTree = getFileTree;

View File

@ -35,8 +35,10 @@ function getGraph(data) {
let links = [];
let stemURLs = {};
let homeAlias = "/";
(data.collections.note||[]).forEach((v, idx) => {
let fpath = v.filePathStem.replace("/notes/", "");
(data.collections.note || []).forEach((v, idx) => {
let fpath = v.data["dg-path"]
? v.data["dg-path"].split(".md")[0]
: v.filePathStem.replace("/notes/", "");
let parts = fpath.split("/");
let group = "none";
if (parts.length >= 3) {
@ -47,14 +49,20 @@ function getGraph(data) {
title: v.data.title || v.fileSlug,
url: v.url,
group,
home: v.data["dg-home"] || (v.data.tags && v.data.tags.indexOf("gardenEntry") > -1)|| false,
home:
v.data["dg-home"] ||
(v.data.tags && v.data.tags.indexOf("gardenEntry") > -1) ||
false,
outBound: extractLinks(v.template.frontMatter.content),
neighbors: new Set(),
backLinks: new Set(),
noteIcon: v.data.noteIcon || process.env.NOTE_ICON_DEFAULT
noteIcon: v.data.noteIcon || process.env.NOTE_ICON_DEFAULT,
};
stemURLs[fpath] = v.url;
if (v.data["dg-home"] || (v.data.tags && v.data.tags.indexOf("gardenEntry") > -1)) {
if (
v.data["dg-home"] ||
(v.data.tags && v.data.tags.indexOf("gardenEntry") > -1)
) {
homeAlias = v.url;
}
});

View File

@ -1,7 +1,9 @@
const { getGraph } = require("../../helpers/linkUtils");
const { getFileTree } = require("../../helpers/filetreeUtils");
const { userComputed } = require("../../helpers/userUtils");
module.exports = {
graph: (data) => getGraph(data),
filetree: (data) => getFileTree(data),
userComputed: (data) => userComputed(data),
};

View File

@ -1,91 +0,0 @@
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;
let hide = false;
try {
const file = fs.readFileSync(`${path}`, "utf8");
const frontMatter = matter(file);
if (frontMatter.data.permalink) {
permalink = frontMatter.data.permalink;
}
if (frontMatter.data.tags && frontMatter.data.tags.indexOf("gardenEntry") != -1) {
permalink = "/";
}
if (frontMatter.data.title) {
name = frontMatter.data.title;
}
if (frontMatter.data.noteIcon) {
noteIcon = frontMatter.data.noteIcon;
}
// Reason for adding the hide flag instead of removing completely from file tree is to
// allow users to use the filetree data elsewhere without the fear of losing any data.
if (frontMatter.data.hide) {
hide = frontMatter.data.hide;
}
} catch {
//ignore
}
return { permalink, name, noteIcon, hide };
}
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 meta = getPermalinkMeta(tree[key].path, key);
Object.assign(tree[key], meta);
}
} else {
tree[key].isFolder = true;
populateWithPermalink(tree[key]);
}
});
}