mirror of
https://github.com/tcsenpai/obsidiangarden_netlify.git
synced 2025-06-04 12:00:02 +00:00
path-rewrite support
This commit is contained in:
parent
7a9b3585e1
commit
e258be16d4
105
src/helpers/filetreeUtils.js
Normal file
105
src/helpers/filetreeUtils.js
Normal 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
|
||||
.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;
|
@ -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),
|
||||
};
|
||||
|
@ -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]);
|
||||
}
|
||||
});
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user