diff --git a/.eleventy.js b/.eleventy.js index 8ec34bc..440c255 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -162,6 +162,7 @@ module.exports = function (eleventyConfig) { } let permalink = `/notes/${slugify(fileName)}`; + let noteIcon = process.env.NOTE_ICON_DEFAULT; const title = linkTitle ? linkTitle : fileName; let deadLink = false; @@ -175,13 +176,16 @@ module.exports = function (eleventyConfig) { if (frontMatter.data.permalink) { permalink = frontMatter.data.permalink; } + if (frontMatter.data.noteIcon) { + noteIcon = frontMatter.data.noteIcon; + } } catch { deadLink = true; } return `${title}`; + }" ${deadLink ? "" : 'data-note-icon="' + noteIcon + '"'} href="${permalink}${headerLinkPath}">${title}`; }) ); }); diff --git a/plugin-info.json b/plugin-info.json index 9403ce4..79a81a5 100644 --- a/plugin-info.json +++ b/plugin-info.json @@ -6,7 +6,11 @@ "filesToAdd": [ "src/site/styles/custom-style.scss", ".env", - "src/site/favicon.svg" + "src/site/favicon.svg", + "src/site/img/default-note-icon.svg", + "src/site/img/tree-1.svg", + "src/site/img/tree-2.svg", + "src/site/img/tree-3.svg" ], "filesToModify": [ ".eleventy.js", diff --git a/src/site/_data/filetree.js b/src/site/_data/filetree.js index ccb26fc..714d7cf 100644 --- a/src/site/_data/filetree.js +++ b/src/site/_data/filetree.js @@ -1,80 +1,87 @@ const fsFileTree = require("fs-file-tree"); -const matter = require('gray-matter'); -const fs = require('fs'); +const matter = require("gray-matter"); +const fs = require("fs"); module.exports = async () => { - const tree = await fsFileTree("src/site/notes"); - populateWithPermalink(tree); + const tree = await fsFileTree("src/site/notes"); + populateWithPermalink(tree); - return sortTree(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; - } + //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; - }).reduce( - (obj, key) => { - obj[key] = unsorted[key]; + } - return obj; - }, - {} - ); + if (a.toLowerCase() > b.toLowerCase()) { + return 1; + } - for (const key of Object.keys(orderedTree)) { - if (!orderedTree[key].path) { - orderedTree[key] = sortTree(orderedTree[key]) - } + 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; -} + return orderedTree; +}; -function getPermalinkAndName(path, key) { - let permalink = "/" - let name = key.replace(".md", ""); - 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 - } - } catch { - //ignore +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 }; + 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 } = getPermalinkAndName(tree[key].path, key); - tree[key].permalink = permalink - tree[key].name = name - } - } else { - tree[key].isFolder = true; - populateWithPermalink(tree[key]); - } - }); + 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]); + } + }); } diff --git a/src/site/_data/meta.js b/src/site/_data/meta.js index 217f1e7..90ae703 100644 --- a/src/site/_data/meta.js +++ b/src/site/_data/meta.js @@ -13,10 +13,37 @@ module.exports = async () => { if (themeStyle) { themeStyle = themeStyle.split("site")[1]; } + let bodyClasses = []; + let noteIconsSettings = { + filetree: false, + links: false, + title: false, + default: process.env.NOTE_ICON_DEFAULT, + }; + if (process.env.NOTE_ICON_TITLE && process.env.NOTE_ICON_TITLE == "true") { + bodyClasses.push("title-note-icon"); + noteIconsSettings.title = true; + } + if ( + process.env.NOTE_ICON_FILETREE && + process.env.NOTE_ICON_FILETREE == "true" + ) { + bodyClasses.push("filetree-note-icon"); + noteIconsSettings.filetree = true; + } + if ( + process.env.NOTE_ICON_INTERNAL_LINKS && + process.env.NOTE_ICON_INTERNAL_LINKS == "true" + ) { + bodyClasses.push("links-note-icon"); + noteIconsSettings.links = true; + } const meta = { env: process.env.ELEVENTY_ENV, theme: process.env.THEME, themeStyle, + bodyClasses: bodyClasses.join(" "), + noteIconsSettings, baseTheme: process.env.BASE_THEME || "dark", siteName: process.env.SITE_NAME_HEADER || "Digital Garden", siteBaseUrl: baseUrl, diff --git a/src/site/_includes/components/filetree.njk b/src/site/_includes/components/filetree.njk index c26d571..6c9f6d2 100644 --- a/src/site/_includes/components/filetree.njk +++ b/src/site/_includes/components/filetree.njk @@ -3,8 +3,8 @@