From db6aded02308992d9820ecdeb022e56e1538551c Mon Sep 17 00:00:00 2001 From: Utsob Roy Date: Tue, 21 Mar 2023 15:05:20 +0600 Subject: [PATCH 1/7] allow hiding in graph --- src/helpers/linkUtils.js | 15 +++++++++++---- src/site/_includes/components/graphScript.njk | 4 +++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/helpers/linkUtils.js b/src/helpers/linkUtils.js index f2e4ccf..189de0c 100644 --- a/src/helpers/linkUtils.js +++ b/src/helpers/linkUtils.js @@ -35,7 +35,7 @@ function getGraph(data) { let links = []; let stemURLs = {}; let homeAlias = "/"; - (data.collections.note||[]).forEach((v, idx) => { + (data.collections.note || []).forEach((v, idx) => { let fpath = v.filePathStem.replace("/notes/", ""); let parts = fpath.split("/"); let group = "none"; @@ -47,14 +47,21 @@ 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, + hide: v.data.hideInGraph || false, }; 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; } }); diff --git a/src/site/_includes/components/graphScript.njk b/src/site/_includes/components/graphScript.njk index 7e2d41b..29718e3 100644 --- a/src/site/_includes/components/graphScript.njk +++ b/src/site/_includes/components/graphScript.njk @@ -12,7 +12,9 @@ const keys = Object.values(existing).map((n) => n.neighbors).flat(); const n_remaining = Object.keys(remaining).reduce((acc, key) => { if (keys.indexOf(key) != -1) { - existing[key] = remaining[key]; + if (!remaining[key].hide) { + existing[key] = remaining[key]; + } } else { acc[key] = remaining[key]; } From 7a9b3585e11593d7b7710a97148bb62e9e5dce1b Mon Sep 17 00:00:00 2001 From: Utsob Roy Date: Tue, 21 Mar 2023 15:11:59 +0600 Subject: [PATCH 2/7] global graph fix --- src/site/_includes/components/graphScript.njk | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/site/_includes/components/graphScript.njk b/src/site/_includes/components/graphScript.njk index 29718e3..e97f805 100644 --- a/src/site/_includes/components/graphScript.njk +++ b/src/site/_includes/components/graphScript.njk @@ -166,9 +166,10 @@ window.fullGraph = null; function renderFullGraph() { if (!window.fullGraph) { + const hiddens = Object.values(window.graphData.nodes).filter((n) => n.hide).map((n) => n.id); const graphData = { - links: JSON.parse(JSON.stringify(window.graphData.links)), - nodes: [...Object.values(window.graphData.nodes)] + links: JSON.parse(JSON.stringify(window.graphData.links)).filter((l) => hiddens.indexOf(l.source) == -1 && hiddens.indexOf(l.target) == -1), + nodes: [...Object.values(window.graphData.nodes).filter((n) => !n.hide)] } let g = document.createElement('div'); From e258be16d4449771ae6aba0ea6865cf1c3512df8 Mon Sep 17 00:00:00 2001 From: Utsob Roy Date: Wed, 22 Mar 2023 23:58:22 +0600 Subject: [PATCH 3/7] 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]); - } - }); -} From 8fcf7255d5dfc398494db72d76dc6006cd477f6c Mon Sep 17 00:00:00 2001 From: Utsob Roy Date: Thu, 23 Mar 2023 07:48:49 +0600 Subject: [PATCH 4/7] fixed typo --- src/helpers/filetreeUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/filetreeUtils.js b/src/helpers/filetreeUtils.js index b97626a..a799f34 100644 --- a/src/helpers/filetreeUtils.js +++ b/src/helpers/filetreeUtils.js @@ -68,7 +68,7 @@ function getPermalinkMeta(note, key) { if (note.data["dg-path"]) { folders = note.data["dg-path"].split("/"); } else { - folders = note.filePathStem.split + folders = note.filePathStem .split("notes/")[1] .split("/") .map(toTitleCase); From dcdb496dd3859c0bc3dd321b0e5b0f1d2f3dc48d Mon Sep 17 00:00:00 2001 From: Utsob Roy Date: Thu, 23 Mar 2023 20:02:00 +0600 Subject: [PATCH 5/7] graph fix --- src/helpers/linkUtils.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/helpers/linkUtils.js b/src/helpers/linkUtils.js index 189de0c..aabcc17 100644 --- a/src/helpers/linkUtils.js +++ b/src/helpers/linkUtils.js @@ -36,7 +36,9 @@ function getGraph(data) { let stemURLs = {}; let homeAlias = "/"; (data.collections.note || []).forEach((v, idx) => { - let fpath = v.filePathStem.replace("/notes/", ""); + 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) { From 2ee91a928eab992e34fb63fe2b5277e163e89d18 Mon Sep 17 00:00:00 2001 From: Utsob Roy Date: Wed, 22 Mar 2023 23:58:22 +0600 Subject: [PATCH 6/7] path-rewrite support --- plugin-info.json | 5 +++-- src/helpers/filetreeUtils.js | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/plugin-info.json b/plugin-info.json index b9ff92f..7b32260 100644 --- a/plugin-info.json +++ b/plugin-info.json @@ -2,7 +2,8 @@ "filesToDelete": [ "src/site/styles/style.css", "src/site/index.njk", - "src/site/index.11tydata.js" + "src/site/index.11tydata.js", + "src/site/_data/filetree.js" ], "filesToAdd": [ "src/site/styles/custom-style.scss", @@ -53,11 +54,11 @@ "src/site/lunr.njk", "src/site/_data/versionednotes.js", "src/site/_data/meta.js", - "src/site/_data/filetree.js", "src/site/_data/dynamics.js", "src/site/img/outgoing.svg", "src/helpers/constants.js", "src/helpers/utils.js", + "src/helpers/filetreeUtils.js", "src/helpers/linkUtils.js", "netlify/functions/search/search.js", "src/site/get-theme.js", diff --git a/src/helpers/filetreeUtils.js b/src/helpers/filetreeUtils.js index a799f34..20d4729 100644 --- a/src/helpers/filetreeUtils.js +++ b/src/helpers/filetreeUtils.js @@ -2,6 +2,17 @@ const sortTree = (unsorted) => { //Sort by folder before file, then by name const orderedTree = Object.keys(unsorted) .sort((a, b) => { + + let a_pinned = unsorted[a].pinned || false; + let b_pinned = unsorted[b].pinned || false; + if (a_pinned != b_pinned) { + if (a_pinned) { + return -1; + } else { + return 1; + } + } + const a_is_note = a.indexOf(".md") > -1; const b_is_note = b.indexOf(".md") > -1; @@ -46,6 +57,7 @@ function getPermalinkMeta(note, key) { let name = parts[parts.length - 1]; let noteIcon = process.env.NOTE_ICON_DEFAULT; let hide = false; + let pinned = false; let folders = null; try { if (note.data.permalink) { @@ -65,10 +77,13 @@ function getPermalinkMeta(note, key) { if (note.data.hide) { hide = note.data.hide; } + if (frontMatter.data.pinned) { + pinned = frontMatter.data.pinned; + } if (note.data["dg-path"]) { folders = note.data["dg-path"].split("/"); } else { - folders = note.filePathStem + folders = note.filePathStem.split .split("notes/")[1] .split("/") .map(toTitleCase); @@ -77,7 +92,7 @@ function getPermalinkMeta(note, key) { //ignore } - return [{ permalink, name, noteIcon, hide }, folders]; + return [{ permalink, name, noteIcon, hide, pinned }, folders]; } function assignNested(obj, keyPath, value) { From 1a3e1fae665b971bfd9e306e1b3e39d936f4d3d9 Mon Sep 17 00:00:00 2001 From: Utsob Roy Date: Thu, 23 Mar 2023 07:48:49 +0600 Subject: [PATCH 7/7] fixed typo --- src/helpers/filetreeUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/filetreeUtils.js b/src/helpers/filetreeUtils.js index 20d4729..abe3306 100644 --- a/src/helpers/filetreeUtils.js +++ b/src/helpers/filetreeUtils.js @@ -83,7 +83,7 @@ function getPermalinkMeta(note, key) { if (note.data["dg-path"]) { folders = note.data["dg-path"].split("/"); } else { - folders = note.filePathStem.split + folders = note.filePathStem .split("notes/")[1] .split("/") .map(toTitleCase);