From e258be16d4449771ae6aba0ea6865cf1c3512df8 Mon Sep 17 00:00:00 2001 From: Utsob Roy Date: Wed, 22 Mar 2023 23:58:22 +0600 Subject: [PATCH] path-rewrite support --- src/helpers/filetreeUtils.js | 105 +++++++++++++++++++++++++++++ src/site/_data/eleventyComputed.js | 2 + src/site/_data/filetree.js | 91 ------------------------- 3 files changed, 107 insertions(+), 91 deletions(-) create mode 100644 src/helpers/filetreeUtils.js delete mode 100644 src/site/_data/filetree.js diff --git a/src/helpers/filetreeUtils.js b/src/helpers/filetreeUtils.js new file mode 100644 index 0000000..b97626a --- /dev/null +++ b/src/helpers/filetreeUtils.js @@ -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; diff --git a/src/site/_data/eleventyComputed.js b/src/site/_data/eleventyComputed.js index f6f6d02..6e6919f 100644 --- a/src/site/_data/eleventyComputed.js +++ b/src/site/_data/eleventyComputed.js @@ -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), }; diff --git a/src/site/_data/filetree.js b/src/site/_data/filetree.js deleted file mode 100644 index 1dc6b1d..0000000 --- a/src/site/_data/filetree.js +++ /dev/null @@ -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]); - } - }); -}