From ff11136d20d45bdd9113fd41a81b0d2fb399d0a9 Mon Sep 17 00:00:00 2001 From: yoyurec Date: Thu, 6 Oct 2022 01:23:18 +0300 Subject: [PATCH] feat(page-icon): add sidebar links inherited icons on load/add --- README.md | 15 ++++++++---- screenshots/settings.png | Bin 15721 -> 16057 bytes src/css/awesomeLinks.css | 4 ++++ src/js/awesomeLinks.ts | 3 +++ src/js/modules/favIcons.ts | 8 ++++--- src/js/modules/internal.ts | 1 + src/js/modules/linksObserver.ts | 22 ++++++++++++------ src/js/modules/pageIcons.ts | 8 ++++--- src/js/modules/sidebarIcon.ts | 40 ++++++++++++++++++++++++++++++++ src/js/modules/titleIcon.ts | 12 ++++++---- 10 files changed, 91 insertions(+), 22 deletions(-) create mode 100644 src/js/modules/sidebarIcon.ts diff --git a/README.md b/README.md index 29bea09..7c1eacf 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,10 @@

* **Favicons** for external links! 🡖 -* **Pages icons** for internal links 🡖 +* **Pages icons** for internal links🡖 + * Common page `icon::` + * Aliased page icon + * Inherited from props page (+ place icon on page title & current tab) * Page icons`icon::`extended from Emoji to hundreds icons set via Nerd fonts support 🡖 * Custom **Journal icons** 🡖 @@ -14,7 +17,7 @@ Buy Me A Coffee ## Install -From Logseq store - `Plugins -> Marketplace`. +From Logseq store - `Plugins -> Marketplace` ![](https://github.com/yoyurec/logseq-awesome-links/raw/main/screenshots/market.png) @@ -33,18 +36,20 @@ From Logseq store - `Plugins -> Marketplace`. ### ✨ Page icons Enable feature to show Logseq page (or aliased page) icon for internal links in content. -In addition you can config icon inheriting from related page proprty, to avoid manual setting `icon::` for common pages. +In addition you can config icon inheriting from page property referenced page, to avoid manual setting `icon::` for common pages. For ex.: * create "Projects" page, set `icon::` for it * create "Some project" page, set `page-type:: [[Projects]]` * set in plugin settings "Inherit icon from..." `page-type` * ...and all pages with `page-type:: [[Projects]]` will have inherited "Projects" page icon! +Inherited icons also will be shown on current page title, current tab (if "Tabs" plugin installed) and sidebar. + ![](https://github.com/yoyurec/logseq-awesome-links/raw/main/screenshots/page-icons.png) ### ✨ Custom page icons -3600+ icons combined from popular sets (Font Awesome, Material Design, Seti-UI, etc...)! +3600+ icons combined from popular sets (Font Awesome, Material Design, SetiUI, etc...)! Native Logseq props `icon::` extended with Nerd icons font: * Search in collection ([Icons Cheat Sheet](https://www.nerdfonts.com/cheat-sheet)), * select @@ -52,6 +57,7 @@ Native Logseq props `icon::` extended with Nerd icons font: * paste to `icon::` props Banners & Tabs plugin support included 😎 +Feature can be disabled. ![](https://github.com/yoyurec/logseq-awesome-links/raw/main/screenshots/nerd-icons.png) @@ -60,6 +66,7 @@ Banners & Tabs plugin support included 😎 ### ✨ Journal icon Can be customized in settings. +Delete value to disable feature. ![](https://github.com/yoyurec/logseq-awesome-links/raw/main/screenshots/journal-icon.png) diff --git a/screenshots/settings.png b/screenshots/settings.png index e238b402020189ee116b704ff579712f648e5666..2eea167305d7b67612446387c57262e090da88d2 100644 GIT binary patch literal 16057 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 literal 15721 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 VvRLB;?oRK~(a^hwRJ;4+e*s!uDV_iT diff --git a/src/css/awesomeLinks.css b/src/css/awesomeLinks.css index 05b664b..35fd19d 100644 --- a/src/css/awesomeLinks.css +++ b/src/css/awesomeLinks.css @@ -30,6 +30,10 @@ line-height: 1.2em; width: 1.4em; } +/* sidebar */ +.awLinks-sidebar-icon + .page-icon { + display: none !important; +} /* content */ .is-awesomeLinks-int .page-icon.awLinks-page-icon { display: inline-block; diff --git a/src/js/awesomeLinks.ts b/src/js/awesomeLinks.ts index 6500af9..9f2ef50 100644 --- a/src/js/awesomeLinks.ts +++ b/src/js/awesomeLinks.ts @@ -11,6 +11,7 @@ import { pageIconsLoad, pageIconsUnload, toggleIconsFeature } from './modules/in import { nerdFontLoad, nerdFontUnload, toggleNerdFonFeature } from './modules/internal'; import { faviconsLoad, faviconsUnload, toggleFaviconsFeature } from './modules/internal'; import { journalIconsLoad, journalIconsUnload, toggleJournalIconFeature } from './modules/internal'; +import { sidebarIconsLoad, sidebarIconsUnload } from './modules/internal'; import { stopLinksObserver, runLinksObserver, initLinksObserver } from './modules/internal'; import '../css/awesomeLinks.css'; @@ -32,6 +33,7 @@ const runStuff = async () => { nerdFontLoad(); faviconsLoad(); journalIconsLoad(); + sidebarIconsLoad(); if (globalContext.pluginConfig?.featureFaviconsEnabled || globalContext.pluginConfig?.featurePageIconsEnabled) { runLinksObserver(); } @@ -43,6 +45,7 @@ const stopStuff = () => { nerdFontUnload(); faviconsUnload(); journalIconsUnload(); + sidebarIconsUnload(); stopLinksObserver(); body.classList.remove('is-awesomeLinks'); } diff --git a/src/js/modules/favIcons.ts b/src/js/modules/favIcons.ts index 7799a9b..af35a82 100644 --- a/src/js/modules/favIcons.ts +++ b/src/js/modules/favIcons.ts @@ -3,7 +3,10 @@ import { doc, body } from './DOMContainers'; import { stopLinksObserver } from './internal'; // External links favicons -export const setFavicons = async (extLinkList: NodeListOf) => { +export const setFavicons = async (extLinkList?: NodeListOf | HTMLAnchorElement[]) => { + if (!extLinkList) { + extLinkList = doc.querySelectorAll('.external-link'); + } for (let i = 0; i < extLinkList.length; i++) { const oldFav = extLinkList[i].querySelector('.page-icon.awLinks-link-icon'); if (oldFav) { @@ -36,8 +39,7 @@ const removeFavicons = () => { export const faviconsLoad = async () => { if (globalContext.pluginConfig?.featureFaviconsEnabled) { setTimeout(() => { - const extLinkList: NodeListOf = doc.querySelectorAll('.external-link'); - setFavicons(extLinkList); + setFavicons(); }, 500); } } diff --git a/src/js/modules/internal.ts b/src/js/modules/internal.ts index f297f02..1084c1f 100644 --- a/src/js/modules/internal.ts +++ b/src/js/modules/internal.ts @@ -5,3 +5,4 @@ export * from './nerdFont'; export * from './journalIcons'; export * from './favIcons'; export * from './titleIcon'; +export * from './sidebarIcon'; diff --git a/src/js/modules/linksObserver.ts b/src/js/modules/linksObserver.ts index dd7873d..d8ecf2b 100644 --- a/src/js/modules/linksObserver.ts +++ b/src/js/modules/linksObserver.ts @@ -1,5 +1,5 @@ import { appContainer } from './DOMContainers'; -import { setFavicons, setPageIcons, setTitleIcon } from './internal'; +import { setFavicons, setPageIcons, setSidebarIcons, setTitleIcon } from './internal'; let linksObserver: MutationObserver, linksObserverConfig: MutationObserverInit; @@ -20,15 +20,23 @@ const linksObserverCallback: MutationCallback = function (mutationsList) { if (titleEl) { setTitleIcon(titleEl); } + // sidebar icon + console.log(addedNode); + if (addedNode.classList.contains('favorite-item') || addedNode.classList.contains('recent-item')) { + const sidebarLink = addedNode.querySelector('a') as HTMLAnchorElement; + if (sidebarLink) { + setSidebarIcons([sidebarLink]); + } + } // favicons - const extLinkList = addedNode.querySelectorAll('.external-link') as NodeListOf; - if (extLinkList.length) { - setFavicons(extLinkList); + const extLink = addedNode.querySelector('.external-link') as HTMLAnchorElement; + if (extLink) { + setFavicons([extLink]); } // page icons - const linkList = addedNode.querySelectorAll('.ls-block .page-ref:not(.page-property-key)') as NodeListOf; - if (linkList.length) { - setPageIcons(linkList); + const pageLink = addedNode.querySelector('.ls-block .page-ref:not(.page-property-key)') as HTMLAnchorElement; + if (pageLink) { + setPageIcons([pageLink]); } } } diff --git a/src/js/modules/pageIcons.ts b/src/js/modules/pageIcons.ts index 364a63d..5a3219a 100644 --- a/src/js/modules/pageIcons.ts +++ b/src/js/modules/pageIcons.ts @@ -4,7 +4,10 @@ import { searchIcon } from './queries'; import { setTitleIcon, removeTitleIcon } from './internal'; import { stopLinksObserver } from './internal'; -export const setPageIcons = async (linkList: NodeListOf) => { +export const setPageIcons = async (linkList?: NodeListOf | HTMLAnchorElement[]) => { + if (!linkList) { + linkList = doc.querySelectorAll('.ls-block .page-ref:not(.page-property-key)'); + } for (let i = 0; i < linkList.length; i++) { const linkItem = linkList[i]; const oldPageIcon = linkItem.querySelector('.page-icon.awLinks-page-icon'); @@ -34,8 +37,7 @@ const removePageIcons = () => { } export const pageIconsLoad = async () => { - const linkList: NodeListOf = doc.querySelectorAll('.ls-block .page-ref:not(.page-property-key)'); - setPageIcons(linkList); + setPageIcons(); setTitleIcon(); } diff --git a/src/js/modules/sidebarIcon.ts b/src/js/modules/sidebarIcon.ts new file mode 100644 index 0000000..7b02141 --- /dev/null +++ b/src/js/modules/sidebarIcon.ts @@ -0,0 +1,40 @@ +import { doc } from './DOMContainers'; +import { searchIcon } from './queries'; + +export const setSidebarIcons = async (sidebarLinksList?: NodeListOf | HTMLAnchorElement[]) => { + if (!sidebarLinksList) { + sidebarLinksList = doc.querySelectorAll('.nav-contents-container :is(.favorite-item , .recent-item) .items-center'); + } + for (let i = 0; i < sidebarLinksList.length; i++) { + const sidebarLinkItem = sidebarLinksList[i]; + const defaultIcon = sidebarLinkItem.querySelector('.ui__icon'); + if (!defaultIcon) { + continue; + } + const pageTitle = sidebarLinkItem.querySelector('.page-title')?.textContent; + if (!pageTitle) { + continue; + } + const pageIcon = await searchIcon(pageTitle); + if (pageIcon) { + sidebarLinkItem.insertAdjacentHTML('afterbegin', `${pageIcon}`); + } + } +} + +const removeSidebarIcons = () => { + const pageIcons = doc.querySelectorAll('.nav-contents-container .page-icon.awLinks-sidebar-icon'); + if (pageIcons.length) { + for (let i = 0; i < pageIcons.length; i++) { + pageIcons[i].remove(); + } + } +} + +export const sidebarIconsLoad = async () => { + setSidebarIcons(); +} + +export const sidebarIconsUnload = () => { + removeSidebarIcons(); +} diff --git a/src/js/modules/titleIcon.ts b/src/js/modules/titleIcon.ts index eeb3c1f..2007fc8 100644 --- a/src/js/modules/titleIcon.ts +++ b/src/js/modules/titleIcon.ts @@ -1,14 +1,16 @@ import { doc } from './DOMContainers'; import { getInheritedPropsIcon } from './queries'; -export const setTitleIcon = async (pageNameEl?: Element) => { - const title = pageNameEl || doc.querySelector('.ls-page-title'); - if (title && !title.querySelector('.page-icon')) { - const pageName = title.textContent; +export const setTitleIcon = async (pageTitleEl?: Element | null) => { + if (!pageTitleEl) { + pageTitleEl = doc.querySelector('.ls-page-title'); + } + if (pageTitleEl && !pageTitleEl.querySelector('.page-icon')) { + const pageName = pageTitleEl.textContent; if (pageName) { const titleIcon = await getInheritedPropsIcon(pageName); if (titleIcon) { - title.insertAdjacentHTML('afterbegin', `${titleIcon}`); + pageTitleEl.insertAdjacentHTML('afterbegin', `${titleIcon}`); setTabIcon(titleIcon); } }