From dbcda79720c2675c23e560e5f668f3eb88cd80a7 Mon Sep 17 00:00:00 2001 From: saberzero1 Date: Sat, 11 Apr 2026 13:49:59 +0200 Subject: [PATCH] feat: exclude unlisted pages from backlink sources Respect the file.data.unlisted convention. Pages marked unlisted are no longer shown as backlink sources on other pages. The backlinks list on an unlisted page itself is still rendered normally -- users who reached the page by direct URL should still see its incoming references. Extracts the filter predicate into a named selectBacklinkSources() helper and exports it alongside a BacklinkCandidate type so consumers and tests can exercise the filter logic directly. Adds 3 unit tests covering unlisted exclusion, explicit unlisted: false passthrough, and basic source selection. --- CHANGELOG.md | 4 + dist/components/index.js | 347 ++++++++++++++++++++++++++++++++--- dist/components/index.js.map | 2 +- dist/index.js | 347 ++++++++++++++++++++++++++++++++--- dist/index.js.map | 2 +- src/components/Backlinks.tsx | 18 +- test/backlinks.test.ts | 36 ++++ 7 files changed, 709 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9111bd8..d8c145c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,4 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Respect the `file.data.unlisted` convention. Pages marked `unlisted` are never shown as backlink sources on other pages. The backlinks list on an unlisted page itself is still rendered normally so users who reached the page by direct URL can see its incoming references. +- Exported `selectBacklinkSources` helper and `BacklinkCandidate` type for testing and reuse. +- Unit tests for `selectBacklinkSources` covering the unlisted-filter behavior. + - Initial Quartz community plugin template. diff --git a/dist/components/index.js b/dist/components/index.js index ce3eb62..87f4b87 100644 --- a/dist/components/index.js +++ b/dist/components/index.js @@ -1,10 +1,8 @@ -import { simplifySlug as simplifySlug$1, joinSegments } from '@quartz-community/utils'; +import { classNames } from '@quartz-community/utils/lang'; +import { simplifySlug, resolveRelative } from '@quartz-community/utils/path'; import { jsxs, jsx } from 'preact/jsx-runtime'; // src/util/lang.ts -function classNames(...classes) { - return classes.filter(Boolean).join(" "); -} // src/i18n/locales/en-US.ts var en_US_default = { @@ -16,9 +14,328 @@ var en_US_default = { } }; +// src/i18n/locales/ar-SA.ts +var ar_SA_default = { + components: { + backlinks: { + title: "\u0648\u0635\u0644\u0627\u062A \u0627\u0644\u0639\u0648\u062F\u0629", + noBacklinksFound: "\u0644\u0627 \u064A\u0648\u062C\u062F \u0648\u0635\u0644\u0627\u062A \u0639\u0648\u062F\u0629" + } + } +}; + +// src/i18n/locales/ca-ES.ts +var ca_ES_default = { + components: { + backlinks: { + title: "Retroenlla\xE7", + noBacklinksFound: "No s'han trobat retroenlla\xE7os" + } + } +}; + +// src/i18n/locales/cs-CZ.ts +var cs_CZ_default = { + components: { + backlinks: { + title: "P\u0159\xEDchoz\xED odkazy", + noBacklinksFound: "Nenalezeny \u017E\xE1dn\xE9 p\u0159\xEDchoz\xED odkazy" + } + } +}; + +// src/i18n/locales/de-DE.ts +var de_DE_default = { + components: { + backlinks: { + title: "Backlinks", + noBacklinksFound: "Keine Backlinks gefunden" + } + } +}; + +// src/i18n/locales/en-GB.ts +var en_GB_default = { + components: { + backlinks: { + title: "Backlinks", + noBacklinksFound: "No backlinks found" + } + } +}; + +// src/i18n/locales/es-ES.ts +var es_ES_default = { + components: { + backlinks: { + title: "Retroenlaces", + noBacklinksFound: "No se han encontrado retroenlaces" + } + } +}; + +// src/i18n/locales/fa-IR.ts +var fa_IR_default = { + components: { + backlinks: { + title: "\u0628\u06A9\u200C\u0644\u06CC\u0646\u06A9\u200C\u0647\u0627", + noBacklinksFound: "\u0628\u062F\u0648\u0646 \u0628\u06A9\u200C\u0644\u06CC\u0646\u06A9" + } + } +}; + +// src/i18n/locales/fi-FI.ts +var fi_FI_default = { + components: { + backlinks: { + title: "Takalinkit", + noBacklinksFound: "Takalinkkej\xE4 ei l\xF6ytynyt" + } + } +}; + +// src/i18n/locales/fr-FR.ts +var fr_FR_default = { + components: { + backlinks: { + title: "Liens retour", + noBacklinksFound: "Aucun lien retour trouv\xE9" + } + } +}; + +// src/i18n/locales/he-IL.ts +var he_IL_default = { + components: { + backlinks: { + title: "\u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05D7\u05D5\u05D6\u05E8\u05D9\u05DD", + noBacklinksFound: "\u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0\u05D5 \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05D7\u05D5\u05D6\u05E8\u05D9\u05DD" + } + } +}; + +// src/i18n/locales/hu-HU.ts +var hu_HU_default = { + components: { + backlinks: { + title: "Visszautal\xE1sok", + noBacklinksFound: "Nincs visszautal\xE1s" + } + } +}; + +// src/i18n/locales/id-ID.ts +var id_ID_default = { + components: { + backlinks: { + title: "Tautan Balik", + noBacklinksFound: "Tidak ada tautan balik ditemukan" + } + } +}; + +// src/i18n/locales/it-IT.ts +var it_IT_default = { + components: { + backlinks: { + title: "Link entranti", + noBacklinksFound: "Nessun link entrante" + } + } +}; + +// src/i18n/locales/ja-JP.ts +var ja_JP_default = { + components: { + backlinks: { + title: "\u30D0\u30C3\u30AF\u30EA\u30F3\u30AF", + noBacklinksFound: "\u30D0\u30C3\u30AF\u30EA\u30F3\u30AF\u306F\u3042\u308A\u307E\u305B\u3093" + } + } +}; + +// src/i18n/locales/kk-KZ.ts +var kk_KZ_default = { + components: { + backlinks: { + title: "\u0410\u0440\u0442\u049B\u0430 \u0441\u0456\u043B\u0442\u0435\u043C\u0435\u043B\u0435\u0440", + noBacklinksFound: "\u0410\u0440\u0442\u049B\u0430 \u0441\u0456\u043B\u0442\u0435\u043C\u0435\u043B\u0435\u0440 \u0442\u0430\u0431\u044B\u043B\u043C\u0430\u0434\u044B" + } + } +}; + +// src/i18n/locales/ko-KR.ts +var ko_KR_default = { + components: { + backlinks: { + title: "\uBC31\uB9C1\uD06C", + noBacklinksFound: "\uBC31\uB9C1\uD06C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4." + } + } +}; + +// src/i18n/locales/lt-LT.ts +var lt_LT_default = { + components: { + backlinks: { + title: "Atgalin\u0117s Nuorodos", + noBacklinksFound: "Atgalini\u0173 Nuorod\u0173 Nerasta" + } + } +}; + +// src/i18n/locales/nb-NO.ts +var nb_NO_default = { + components: { + backlinks: { + title: "Tilbakekoblinger", + noBacklinksFound: "Ingen tilbakekoblinger funnet" + } + } +}; + +// src/i18n/locales/nl-NL.ts +var nl_NL_default = { + components: { + backlinks: { + title: "Backlinks", + noBacklinksFound: "Geen backlinks gevonden" + } + } +}; + +// src/i18n/locales/pl-PL.ts +var pl_PL_default = { + components: { + backlinks: { + title: "Odno\u015Bniki zwrotne", + noBacklinksFound: "Brak po\u0142\u0105cze\u0144 zwrotnych" + } + } +}; + +// src/i18n/locales/pt-BR.ts +var pt_BR_default = { + components: { + backlinks: { + title: "Backlinks", + noBacklinksFound: "Sem backlinks encontrados" + } + } +}; + +// src/i18n/locales/ro-RO.ts +var ro_RO_default = { + components: { + backlinks: { + title: "Leg\u0103turi \xEEnapoi", + noBacklinksFound: "Nu s-au g\u0103sit leg\u0103turi \xEEnapoi" + } + } +}; + +// src/i18n/locales/ru-RU.ts +var ru_RU_default = { + components: { + backlinks: { + title: "\u041E\u0431\u0440\u0430\u0442\u043D\u044B\u0435 \u0441\u0441\u044B\u043B\u043A\u0438", + noBacklinksFound: "\u041E\u0431\u0440\u0430\u0442\u043D\u044B\u0435 \u0441\u0441\u044B\u043B\u043A\u0438 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442" + } + } +}; + +// src/i18n/locales/th-TH.ts +var th_TH_default = { + components: { + backlinks: { + title: "\u0E2B\u0E19\u0E49\u0E32\u0E17\u0E35\u0E48\u0E01\u0E25\u0E48\u0E32\u0E27\u0E16\u0E36\u0E07", + noBacklinksFound: "\u0E44\u0E21\u0E48\u0E21\u0E35\u0E2B\u0E19\u0E49\u0E32\u0E17\u0E35\u0E48\u0E42\u0E22\u0E07\u0E21\u0E32\u0E2B\u0E19\u0E49\u0E32\u0E19\u0E35\u0E49" + } + } +}; + +// src/i18n/locales/tr-TR.ts +var tr_TR_default = { + components: { + backlinks: { + title: "Backlinkler", + noBacklinksFound: "Backlink bulunamad\u0131" + } + } +}; + +// src/i18n/locales/uk-UA.ts +var uk_UA_default = { + components: { + backlinks: { + title: "\u0417\u0432\u043E\u0440\u043E\u0442\u043D\u0456 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F", + noBacklinksFound: "\u0417\u0432\u043E\u0440\u043E\u0442\u043D\u0438\u0445 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E" + } + } +}; + +// src/i18n/locales/vi-VN.ts +var vi_VN_default = { + components: { + backlinks: { + title: "Li\xEAn k\u1EBFt ng\u01B0\u1EE3c", + noBacklinksFound: "Kh\xF4ng c\xF3 li\xEAn k\u1EBFt ng\u01B0\u1EE3c n\xE0o" + } + } +}; + +// src/i18n/locales/zh-CN.ts +var zh_CN_default = { + components: { + backlinks: { + title: "\u53CD\u5411\u94FE\u63A5", + noBacklinksFound: "\u65E0\u6CD5\u627E\u5230\u53CD\u5411\u94FE\u63A5" + } + } +}; + +// src/i18n/locales/zh-TW.ts +var zh_TW_default = { + components: { + backlinks: { + title: "\u53CD\u5411\u9023\u7D50", + noBacklinksFound: "\u7121\u6CD5\u627E\u5230\u53CD\u5411\u9023\u7D50" + } + } +}; + // src/i18n/index.ts var locales = { - "en-US": en_US_default + "en-US": en_US_default, + "ar-SA": ar_SA_default, + "ca-ES": ca_ES_default, + "cs-CZ": cs_CZ_default, + "de-DE": de_DE_default, + "en-GB": en_GB_default, + "es-ES": es_ES_default, + "fa-IR": fa_IR_default, + "fi-FI": fi_FI_default, + "fr-FR": fr_FR_default, + "he-IL": he_IL_default, + "hu-HU": hu_HU_default, + "id-ID": id_ID_default, + "it-IT": it_IT_default, + "ja-JP": ja_JP_default, + "kk-KZ": kk_KZ_default, + "ko-KR": ko_KR_default, + "lt-LT": lt_LT_default, + "nb-NO": nb_NO_default, + "nl-NL": nl_NL_default, + "pl-PL": pl_PL_default, + "pt-BR": pt_BR_default, + "ro-RO": ro_RO_default, + "ru-RU": ru_RU_default, + "th-TH": th_TH_default, + "tr-TR": tr_TR_default, + "uk-UA": uk_UA_default, + "vi-VN": vi_VN_default, + "zh-CN": zh_CN_default, + "zh-TW": zh_TW_default }; function i18n(locale) { return locales[locale] || en_US_default; @@ -26,21 +343,6 @@ function i18n(locale) { // src/components/styles/backlinks.scss var backlinks_default = ".backlinks {\n flex-direction: column;\n}\n.backlinks > h3 {\n font-size: 1rem;\n margin: 0;\n}\n.backlinks > ul.overflow {\n list-style: none;\n padding: 0;\n margin: 0.5rem 0;\n max-height: calc(100% - 2rem);\n overscroll-behavior: contain;\n}\n.backlinks > ul.overflow > li > a {\n background-color: transparent;\n}"; -function simplifySlug(fp) { - return simplifySlug$1(fp); -} -function resolveRelative(current, target) { - const simplified = simplifySlug(target); - const rootPath = pathToRoot(current); - return joinSegments(rootPath, simplified); -} -function pathToRoot(slug) { - let rootPath = slug.split("/").filter((x) => x !== "").slice(0, -1).map((_) => "..").join("/"); - if (rootPath.length === 0) { - rootPath = "."; - } - return rootPath; -} var OverflowList = ({ children, ...props @@ -83,6 +385,9 @@ document.addEventListener("nav", (e) => { var defaultOptions = { hideWhenEmpty: true }; +function selectBacklinkSources(allFiles, currentSlug) { + return allFiles.filter((file) => file.unlisted !== true && file.links?.includes(currentSlug)); +} var Backlinks_default = ((opts) => { const options = { ...defaultOptions, ...opts }; const { OverflowList: OverflowList2, overflowListAfterDOMLoaded } = OverflowList_default(); @@ -94,7 +399,7 @@ var Backlinks_default = ((opts) => { }) => { const slug = simplifySlug(fileData.slug); const locale = cfg.locale ?? "en-US"; - const backlinkFiles = allFiles.filter((file) => file.links?.includes(slug)); + const backlinkFiles = selectBacklinkSources(allFiles, slug); if (options.hideWhenEmpty && backlinkFiles.length === 0) { return null; } diff --git a/dist/components/index.js.map b/dist/components/index.js.map index 732deee..ae8c81d 100644 --- a/dist/components/index.js.map +++ b/dist/components/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/util/lang.ts","../../src/i18n/locales/en-US.ts","../../src/i18n/index.ts","../../src/components/styles/backlinks.scss","../../src/util/path.ts","../../src/components/OverflowList.tsx","../../src/components/Backlinks.tsx"],"names":["utilSimplifySlug","OverflowList","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"No backlinks found\",\n },\n },\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n",".backlinks {\n flex-direction: column;\n}\n.backlinks > h3 {\n font-size: 1rem;\n margin: 0;\n}\n.backlinks > ul.overflow {\n list-style: none;\n padding: 0;\n margin: 0.5rem 0;\n max-height: calc(100% - 2rem);\n overscroll-behavior: contain;\n}\n.backlinks > ul.overflow > li > a {\n background-color: transparent;\n}","import { simplifySlug as utilSimplifySlug, joinSegments } from \"@quartz-community/utils\";\n\n/**\n * Simplifies a full slug by removing the '/index' suffix.\n * Uses the utility from @quartz-community/utils.\n */\nexport function simplifySlug(fp: string): string {\n return utilSimplifySlug(fp);\n}\n\n/**\n * Resolves a relative path from current slug to target slug.\n * @param current - The current page's slug\n * @param target - The target page's slug\n * @returns A relative path like \"../..\" or \"./page\"\n */\nexport function resolveRelative(current: string, target: string): string {\n const simplified = simplifySlug(target);\n const rootPath = pathToRoot(current);\n return joinSegments(rootPath, simplified);\n}\n\n/**\n * Gets the path to root from a given slug.\n * For example, \"a/b/c\" becomes \"../../..\"\n */\nfunction pathToRoot(slug: string): string {\n let rootPath = slug\n .split(\"/\")\n .filter((x) => x !== \"\")\n .slice(0, -1)\n .map((_) => \"..\")\n .join(\"/\");\n\n if (rootPath.length === 0) {\n rootPath = \".\";\n }\n\n return rootPath;\n}\n","import type { JSX } from \"preact\";\n\nconst OverflowList = ({\n children,\n ...props\n}: JSX.HTMLAttributes & { id: string }) => {\n return (\n
    \n {children}\n
  • \n
\n );\n};\n\nlet numLists = 0;\nexport default () => {\n const id = `list-${numLists++}`;\n\n return {\n OverflowList: (props: JSX.HTMLAttributes) => (\n \n ),\n overflowListAfterDOMLoaded: `\ndocument.addEventListener(\"nav\", (e) => {\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const parentUl = entry.target.parentElement\n if (!parentUl) return\n if (entry.isIntersecting) {\n parentUl.classList.remove(\"gradient-active\")\n } else {\n parentUl.classList.add(\"gradient-active\")\n }\n }\n })\n\n const ul = document.getElementById(\"${id}\")\n if (!ul) return\n\n const end = ul.querySelector(\".overflow-end\")\n if (!end) return\n\n observer.observe(end)\n})\n`,\n };\n};\n","import type { QuartzComponent, QuartzComponentProps } from \"@quartz-community/types\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport style from \"./styles/backlinks.scss\";\nimport { resolveRelative, simplifySlug } from \"../util/path\";\nimport OverflowListFactory from \"./OverflowList\";\n\nexport interface BacklinksOptions {\n hideWhenEmpty: boolean;\n}\n\ntype QuartzComponentConstructor = (\n opts: Options,\n) => QuartzComponent;\n\nconst defaultOptions: BacklinksOptions = {\n hideWhenEmpty: true,\n};\n\nexport default ((opts?: Partial) => {\n const options: BacklinksOptions = { ...defaultOptions, ...opts };\n const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory();\n\n const Backlinks: QuartzComponent = ({\n fileData,\n allFiles,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const slug = simplifySlug(fileData.slug as string);\n const locale = cfg.locale ?? \"en-US\";\n const backlinkFiles = (\n allFiles as Array<{ links?: string[]; slug?: string; frontmatter?: { title?: string } }>\n ).filter((file) => file.links?.includes(slug));\n if (options.hideWhenEmpty && backlinkFiles.length === 0) {\n return null;\n }\n return (\n
\n

{i18n(locale).components.backlinks.title}

\n \n {backlinkFiles.length > 0 ? (\n backlinkFiles.map((f) => (\n
  • \n \n {f.frontmatter?.title}\n \n
  • \n ))\n ) : (\n
  • {i18n(locale).components.backlinks.noBacklinksFound}
  • \n )}\n
    \n
    \n );\n };\n\n Backlinks.css = style;\n Backlinks.afterDOMLoaded = overflowListAfterDOMLoaded;\n\n return Backlinks;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/i18n/locales/en-US.ts","../../src/i18n/locales/ar-SA.ts","../../src/i18n/locales/ca-ES.ts","../../src/i18n/locales/cs-CZ.ts","../../src/i18n/locales/de-DE.ts","../../src/i18n/locales/en-GB.ts","../../src/i18n/locales/es-ES.ts","../../src/i18n/locales/fa-IR.ts","../../src/i18n/locales/fi-FI.ts","../../src/i18n/locales/fr-FR.ts","../../src/i18n/locales/he-IL.ts","../../src/i18n/locales/hu-HU.ts","../../src/i18n/locales/id-ID.ts","../../src/i18n/locales/it-IT.ts","../../src/i18n/locales/ja-JP.ts","../../src/i18n/locales/kk-KZ.ts","../../src/i18n/locales/ko-KR.ts","../../src/i18n/locales/lt-LT.ts","../../src/i18n/locales/nb-NO.ts","../../src/i18n/locales/nl-NL.ts","../../src/i18n/locales/pl-PL.ts","../../src/i18n/locales/pt-BR.ts","../../src/i18n/locales/ro-RO.ts","../../src/i18n/locales/ru-RU.ts","../../src/i18n/locales/th-TH.ts","../../src/i18n/locales/tr-TR.ts","../../src/i18n/locales/uk-UA.ts","../../src/i18n/locales/vi-VN.ts","../../src/i18n/locales/zh-CN.ts","../../src/i18n/locales/zh-TW.ts","../../src/i18n/index.ts","../../src/components/styles/backlinks.scss","../../src/components/OverflowList.tsx","../../src/components/Backlinks.tsx"],"names":["OverflowList","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"No backlinks found\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"وصلات العودة\",\n noBacklinksFound: \"لا يوجد وصلات عودة\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Retroenllaç\",\n noBacklinksFound: \"No s'han trobat retroenllaços\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Příchozí odkazy\",\n noBacklinksFound: \"Nenalezeny žádné příchozí odkazy\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"Keine Backlinks gefunden\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"No backlinks found\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Retroenlaces\",\n noBacklinksFound: \"No se han encontrado retroenlaces\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"بک‌لینک‌ها\",\n noBacklinksFound: \"بدون بک‌لینک\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Takalinkit\",\n noBacklinksFound: \"Takalinkkejä ei löytynyt\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Liens retour\",\n noBacklinksFound: \"Aucun lien retour trouvé\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"קישורים חוזרים\",\n noBacklinksFound: \"לא נמצאו קישורים חוזרים\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Visszautalások\",\n noBacklinksFound: \"Nincs visszautalás\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Tautan Balik\",\n noBacklinksFound: \"Tidak ada tautan balik ditemukan\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Link entranti\",\n noBacklinksFound: \"Nessun link entrante\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"バックリンク\",\n noBacklinksFound: \"バックリンクはありません\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Артқа сілтемелер\",\n noBacklinksFound: \"Артқа сілтемелер табылмады\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"백링크\",\n noBacklinksFound: \"백링크가 없습니다.\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Atgalinės Nuorodos\",\n noBacklinksFound: \"Atgalinių Nuorodų Nerasta\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Tilbakekoblinger\",\n noBacklinksFound: \"Ingen tilbakekoblinger funnet\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"Geen backlinks gevonden\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Odnośniki zwrotne\",\n noBacklinksFound: \"Brak połączeń zwrotnych\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"Sem backlinks encontrados\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Legături înapoi\",\n noBacklinksFound: \"Nu s-au găsit legături înapoi\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Обратные ссылки\",\n noBacklinksFound: \"Обратные ссылки отсутствуют\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"หน้าที่กล่าวถึง\",\n noBacklinksFound: \"ไม่มีหน้าที่โยงมาหน้านี้\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Backlinkler\",\n noBacklinksFound: \"Backlink bulunamadı\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Зворотні посилання\",\n noBacklinksFound: \"Зворотних посилань не знайдено\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Liên kết ngược\",\n noBacklinksFound: \"Không có liên kết ngược nào\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"反向链接\",\n noBacklinksFound: \"无法找到反向链接\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"反向連結\",\n noBacklinksFound: \"無法找到反向連結\",\n },\n },\n};\n","import enUS from \"./locales/en-US\";\nimport arSA from \"./locales/ar-SA\";\nimport caES from \"./locales/ca-ES\";\nimport csCZ from \"./locales/cs-CZ\";\nimport deDE from \"./locales/de-DE\";\nimport enGB from \"./locales/en-GB\";\nimport esES from \"./locales/es-ES\";\nimport faIR from \"./locales/fa-IR\";\nimport fiFI from \"./locales/fi-FI\";\nimport frFR from \"./locales/fr-FR\";\nimport heIL from \"./locales/he-IL\";\nimport huHU from \"./locales/hu-HU\";\nimport idID from \"./locales/id-ID\";\nimport itIT from \"./locales/it-IT\";\nimport jaJP from \"./locales/ja-JP\";\nimport kkKZ from \"./locales/kk-KZ\";\nimport koKR from \"./locales/ko-KR\";\nimport ltLT from \"./locales/lt-LT\";\nimport nbNO from \"./locales/nb-NO\";\nimport nlNL from \"./locales/nl-NL\";\nimport plPL from \"./locales/pl-PL\";\nimport ptBR from \"./locales/pt-BR\";\nimport roRO from \"./locales/ro-RO\";\nimport ruRU from \"./locales/ru-RU\";\nimport thTH from \"./locales/th-TH\";\nimport trTR from \"./locales/tr-TR\";\nimport ukUA from \"./locales/uk-UA\";\nimport viVN from \"./locales/vi-VN\";\nimport zhCN from \"./locales/zh-CN\";\nimport zhTW from \"./locales/zh-TW\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n \"ar-SA\": arSA,\n \"ca-ES\": caES,\n \"cs-CZ\": csCZ,\n \"de-DE\": deDE,\n \"en-GB\": enGB,\n \"es-ES\": esES,\n \"fa-IR\": faIR,\n \"fi-FI\": fiFI,\n \"fr-FR\": frFR,\n \"he-IL\": heIL,\n \"hu-HU\": huHU,\n \"id-ID\": idID,\n \"it-IT\": itIT,\n \"ja-JP\": jaJP,\n \"kk-KZ\": kkKZ,\n \"ko-KR\": koKR,\n \"lt-LT\": ltLT,\n \"nb-NO\": nbNO,\n \"nl-NL\": nlNL,\n \"pl-PL\": plPL,\n \"pt-BR\": ptBR,\n \"ro-RO\": roRO,\n \"ru-RU\": ruRU,\n \"th-TH\": thTH,\n \"tr-TR\": trTR,\n \"uk-UA\": ukUA,\n \"vi-VN\": viVN,\n \"zh-CN\": zhCN,\n \"zh-TW\": zhTW,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n",".backlinks {\n flex-direction: column;\n}\n.backlinks > h3 {\n font-size: 1rem;\n margin: 0;\n}\n.backlinks > ul.overflow {\n list-style: none;\n padding: 0;\n margin: 0.5rem 0;\n max-height: calc(100% - 2rem);\n overscroll-behavior: contain;\n}\n.backlinks > ul.overflow > li > a {\n background-color: transparent;\n}","import type { JSX } from \"preact\";\n\nconst OverflowList = ({\n children,\n ...props\n}: JSX.HTMLAttributes & { id: string }) => {\n return (\n
      \n {children}\n
    • \n
    \n );\n};\n\nlet numLists = 0;\nexport default () => {\n const id = `list-${numLists++}`;\n\n return {\n OverflowList: (props: JSX.HTMLAttributes) => (\n \n ),\n overflowListAfterDOMLoaded: `\ndocument.addEventListener(\"nav\", (e) => {\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const parentUl = entry.target.parentElement\n if (!parentUl) return\n if (entry.isIntersecting) {\n parentUl.classList.remove(\"gradient-active\")\n } else {\n parentUl.classList.add(\"gradient-active\")\n }\n }\n })\n\n const ul = document.getElementById(\"${id}\")\n if (!ul) return\n\n const end = ul.querySelector(\".overflow-end\")\n if (!end) return\n\n observer.observe(end)\n})\n`,\n };\n};\n","import type { QuartzComponent, QuartzComponentProps } from \"@quartz-community/types\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport style from \"./styles/backlinks.scss\";\nimport { resolveRelative, simplifySlug } from \"../util/path\";\nimport OverflowListFactory from \"./OverflowList\";\n\nexport interface BacklinksOptions {\n hideWhenEmpty: boolean;\n}\n\ntype QuartzComponentConstructor = (\n opts: Options,\n) => QuartzComponent;\n\nconst defaultOptions: BacklinksOptions = {\n hideWhenEmpty: true,\n};\n\nexport interface BacklinkCandidate {\n unlisted?: boolean;\n links?: string[];\n slug?: string;\n frontmatter?: { title?: string };\n}\n\nexport function selectBacklinkSources(\n allFiles: T[],\n currentSlug: string,\n): T[] {\n return allFiles.filter((file) => file.unlisted !== true && file.links?.includes(currentSlug));\n}\n\nexport default ((opts?: Partial) => {\n const options: BacklinksOptions = { ...defaultOptions, ...opts };\n const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory();\n\n const Backlinks: QuartzComponent = ({\n fileData,\n allFiles,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const slug = simplifySlug(fileData.slug as string);\n const locale = cfg.locale ?? \"en-US\";\n const backlinkFiles = selectBacklinkSources(allFiles as BacklinkCandidate[], slug);\n if (options.hideWhenEmpty && backlinkFiles.length === 0) {\n return null;\n }\n return (\n
    \n

    {i18n(locale).components.backlinks.title}

    \n \n {backlinkFiles.length > 0 ? (\n backlinkFiles.map((f) => (\n
  • \n \n {f.frontmatter?.title}\n \n
  • \n ))\n ) : (\n
  • {i18n(locale).components.backlinks.noBacklinksFound}
  • \n )}\n
    \n
    \n );\n };\n\n Backlinks.css = style;\n Backlinks.afterDOMLoaded = overflowListAfterDOMLoaded;\n\n return Backlinks;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index ce3eb62..87f4b87 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,10 +1,8 @@ -import { simplifySlug as simplifySlug$1, joinSegments } from '@quartz-community/utils'; +import { classNames } from '@quartz-community/utils/lang'; +import { simplifySlug, resolveRelative } from '@quartz-community/utils/path'; import { jsxs, jsx } from 'preact/jsx-runtime'; // src/util/lang.ts -function classNames(...classes) { - return classes.filter(Boolean).join(" "); -} // src/i18n/locales/en-US.ts var en_US_default = { @@ -16,9 +14,328 @@ var en_US_default = { } }; +// src/i18n/locales/ar-SA.ts +var ar_SA_default = { + components: { + backlinks: { + title: "\u0648\u0635\u0644\u0627\u062A \u0627\u0644\u0639\u0648\u062F\u0629", + noBacklinksFound: "\u0644\u0627 \u064A\u0648\u062C\u062F \u0648\u0635\u0644\u0627\u062A \u0639\u0648\u062F\u0629" + } + } +}; + +// src/i18n/locales/ca-ES.ts +var ca_ES_default = { + components: { + backlinks: { + title: "Retroenlla\xE7", + noBacklinksFound: "No s'han trobat retroenlla\xE7os" + } + } +}; + +// src/i18n/locales/cs-CZ.ts +var cs_CZ_default = { + components: { + backlinks: { + title: "P\u0159\xEDchoz\xED odkazy", + noBacklinksFound: "Nenalezeny \u017E\xE1dn\xE9 p\u0159\xEDchoz\xED odkazy" + } + } +}; + +// src/i18n/locales/de-DE.ts +var de_DE_default = { + components: { + backlinks: { + title: "Backlinks", + noBacklinksFound: "Keine Backlinks gefunden" + } + } +}; + +// src/i18n/locales/en-GB.ts +var en_GB_default = { + components: { + backlinks: { + title: "Backlinks", + noBacklinksFound: "No backlinks found" + } + } +}; + +// src/i18n/locales/es-ES.ts +var es_ES_default = { + components: { + backlinks: { + title: "Retroenlaces", + noBacklinksFound: "No se han encontrado retroenlaces" + } + } +}; + +// src/i18n/locales/fa-IR.ts +var fa_IR_default = { + components: { + backlinks: { + title: "\u0628\u06A9\u200C\u0644\u06CC\u0646\u06A9\u200C\u0647\u0627", + noBacklinksFound: "\u0628\u062F\u0648\u0646 \u0628\u06A9\u200C\u0644\u06CC\u0646\u06A9" + } + } +}; + +// src/i18n/locales/fi-FI.ts +var fi_FI_default = { + components: { + backlinks: { + title: "Takalinkit", + noBacklinksFound: "Takalinkkej\xE4 ei l\xF6ytynyt" + } + } +}; + +// src/i18n/locales/fr-FR.ts +var fr_FR_default = { + components: { + backlinks: { + title: "Liens retour", + noBacklinksFound: "Aucun lien retour trouv\xE9" + } + } +}; + +// src/i18n/locales/he-IL.ts +var he_IL_default = { + components: { + backlinks: { + title: "\u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05D7\u05D5\u05D6\u05E8\u05D9\u05DD", + noBacklinksFound: "\u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0\u05D5 \u05E7\u05D9\u05E9\u05D5\u05E8\u05D9\u05DD \u05D7\u05D5\u05D6\u05E8\u05D9\u05DD" + } + } +}; + +// src/i18n/locales/hu-HU.ts +var hu_HU_default = { + components: { + backlinks: { + title: "Visszautal\xE1sok", + noBacklinksFound: "Nincs visszautal\xE1s" + } + } +}; + +// src/i18n/locales/id-ID.ts +var id_ID_default = { + components: { + backlinks: { + title: "Tautan Balik", + noBacklinksFound: "Tidak ada tautan balik ditemukan" + } + } +}; + +// src/i18n/locales/it-IT.ts +var it_IT_default = { + components: { + backlinks: { + title: "Link entranti", + noBacklinksFound: "Nessun link entrante" + } + } +}; + +// src/i18n/locales/ja-JP.ts +var ja_JP_default = { + components: { + backlinks: { + title: "\u30D0\u30C3\u30AF\u30EA\u30F3\u30AF", + noBacklinksFound: "\u30D0\u30C3\u30AF\u30EA\u30F3\u30AF\u306F\u3042\u308A\u307E\u305B\u3093" + } + } +}; + +// src/i18n/locales/kk-KZ.ts +var kk_KZ_default = { + components: { + backlinks: { + title: "\u0410\u0440\u0442\u049B\u0430 \u0441\u0456\u043B\u0442\u0435\u043C\u0435\u043B\u0435\u0440", + noBacklinksFound: "\u0410\u0440\u0442\u049B\u0430 \u0441\u0456\u043B\u0442\u0435\u043C\u0435\u043B\u0435\u0440 \u0442\u0430\u0431\u044B\u043B\u043C\u0430\u0434\u044B" + } + } +}; + +// src/i18n/locales/ko-KR.ts +var ko_KR_default = { + components: { + backlinks: { + title: "\uBC31\uB9C1\uD06C", + noBacklinksFound: "\uBC31\uB9C1\uD06C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4." + } + } +}; + +// src/i18n/locales/lt-LT.ts +var lt_LT_default = { + components: { + backlinks: { + title: "Atgalin\u0117s Nuorodos", + noBacklinksFound: "Atgalini\u0173 Nuorod\u0173 Nerasta" + } + } +}; + +// src/i18n/locales/nb-NO.ts +var nb_NO_default = { + components: { + backlinks: { + title: "Tilbakekoblinger", + noBacklinksFound: "Ingen tilbakekoblinger funnet" + } + } +}; + +// src/i18n/locales/nl-NL.ts +var nl_NL_default = { + components: { + backlinks: { + title: "Backlinks", + noBacklinksFound: "Geen backlinks gevonden" + } + } +}; + +// src/i18n/locales/pl-PL.ts +var pl_PL_default = { + components: { + backlinks: { + title: "Odno\u015Bniki zwrotne", + noBacklinksFound: "Brak po\u0142\u0105cze\u0144 zwrotnych" + } + } +}; + +// src/i18n/locales/pt-BR.ts +var pt_BR_default = { + components: { + backlinks: { + title: "Backlinks", + noBacklinksFound: "Sem backlinks encontrados" + } + } +}; + +// src/i18n/locales/ro-RO.ts +var ro_RO_default = { + components: { + backlinks: { + title: "Leg\u0103turi \xEEnapoi", + noBacklinksFound: "Nu s-au g\u0103sit leg\u0103turi \xEEnapoi" + } + } +}; + +// src/i18n/locales/ru-RU.ts +var ru_RU_default = { + components: { + backlinks: { + title: "\u041E\u0431\u0440\u0430\u0442\u043D\u044B\u0435 \u0441\u0441\u044B\u043B\u043A\u0438", + noBacklinksFound: "\u041E\u0431\u0440\u0430\u0442\u043D\u044B\u0435 \u0441\u0441\u044B\u043B\u043A\u0438 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442" + } + } +}; + +// src/i18n/locales/th-TH.ts +var th_TH_default = { + components: { + backlinks: { + title: "\u0E2B\u0E19\u0E49\u0E32\u0E17\u0E35\u0E48\u0E01\u0E25\u0E48\u0E32\u0E27\u0E16\u0E36\u0E07", + noBacklinksFound: "\u0E44\u0E21\u0E48\u0E21\u0E35\u0E2B\u0E19\u0E49\u0E32\u0E17\u0E35\u0E48\u0E42\u0E22\u0E07\u0E21\u0E32\u0E2B\u0E19\u0E49\u0E32\u0E19\u0E35\u0E49" + } + } +}; + +// src/i18n/locales/tr-TR.ts +var tr_TR_default = { + components: { + backlinks: { + title: "Backlinkler", + noBacklinksFound: "Backlink bulunamad\u0131" + } + } +}; + +// src/i18n/locales/uk-UA.ts +var uk_UA_default = { + components: { + backlinks: { + title: "\u0417\u0432\u043E\u0440\u043E\u0442\u043D\u0456 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F", + noBacklinksFound: "\u0417\u0432\u043E\u0440\u043E\u0442\u043D\u0438\u0445 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E" + } + } +}; + +// src/i18n/locales/vi-VN.ts +var vi_VN_default = { + components: { + backlinks: { + title: "Li\xEAn k\u1EBFt ng\u01B0\u1EE3c", + noBacklinksFound: "Kh\xF4ng c\xF3 li\xEAn k\u1EBFt ng\u01B0\u1EE3c n\xE0o" + } + } +}; + +// src/i18n/locales/zh-CN.ts +var zh_CN_default = { + components: { + backlinks: { + title: "\u53CD\u5411\u94FE\u63A5", + noBacklinksFound: "\u65E0\u6CD5\u627E\u5230\u53CD\u5411\u94FE\u63A5" + } + } +}; + +// src/i18n/locales/zh-TW.ts +var zh_TW_default = { + components: { + backlinks: { + title: "\u53CD\u5411\u9023\u7D50", + noBacklinksFound: "\u7121\u6CD5\u627E\u5230\u53CD\u5411\u9023\u7D50" + } + } +}; + // src/i18n/index.ts var locales = { - "en-US": en_US_default + "en-US": en_US_default, + "ar-SA": ar_SA_default, + "ca-ES": ca_ES_default, + "cs-CZ": cs_CZ_default, + "de-DE": de_DE_default, + "en-GB": en_GB_default, + "es-ES": es_ES_default, + "fa-IR": fa_IR_default, + "fi-FI": fi_FI_default, + "fr-FR": fr_FR_default, + "he-IL": he_IL_default, + "hu-HU": hu_HU_default, + "id-ID": id_ID_default, + "it-IT": it_IT_default, + "ja-JP": ja_JP_default, + "kk-KZ": kk_KZ_default, + "ko-KR": ko_KR_default, + "lt-LT": lt_LT_default, + "nb-NO": nb_NO_default, + "nl-NL": nl_NL_default, + "pl-PL": pl_PL_default, + "pt-BR": pt_BR_default, + "ro-RO": ro_RO_default, + "ru-RU": ru_RU_default, + "th-TH": th_TH_default, + "tr-TR": tr_TR_default, + "uk-UA": uk_UA_default, + "vi-VN": vi_VN_default, + "zh-CN": zh_CN_default, + "zh-TW": zh_TW_default }; function i18n(locale) { return locales[locale] || en_US_default; @@ -26,21 +343,6 @@ function i18n(locale) { // src/components/styles/backlinks.scss var backlinks_default = ".backlinks {\n flex-direction: column;\n}\n.backlinks > h3 {\n font-size: 1rem;\n margin: 0;\n}\n.backlinks > ul.overflow {\n list-style: none;\n padding: 0;\n margin: 0.5rem 0;\n max-height: calc(100% - 2rem);\n overscroll-behavior: contain;\n}\n.backlinks > ul.overflow > li > a {\n background-color: transparent;\n}"; -function simplifySlug(fp) { - return simplifySlug$1(fp); -} -function resolveRelative(current, target) { - const simplified = simplifySlug(target); - const rootPath = pathToRoot(current); - return joinSegments(rootPath, simplified); -} -function pathToRoot(slug) { - let rootPath = slug.split("/").filter((x) => x !== "").slice(0, -1).map((_) => "..").join("/"); - if (rootPath.length === 0) { - rootPath = "."; - } - return rootPath; -} var OverflowList = ({ children, ...props @@ -83,6 +385,9 @@ document.addEventListener("nav", (e) => { var defaultOptions = { hideWhenEmpty: true }; +function selectBacklinkSources(allFiles, currentSlug) { + return allFiles.filter((file) => file.unlisted !== true && file.links?.includes(currentSlug)); +} var Backlinks_default = ((opts) => { const options = { ...defaultOptions, ...opts }; const { OverflowList: OverflowList2, overflowListAfterDOMLoaded } = OverflowList_default(); @@ -94,7 +399,7 @@ var Backlinks_default = ((opts) => { }) => { const slug = simplifySlug(fileData.slug); const locale = cfg.locale ?? "en-US"; - const backlinkFiles = allFiles.filter((file) => file.links?.includes(slug)); + const backlinkFiles = selectBacklinkSources(allFiles, slug); if (options.hideWhenEmpty && backlinkFiles.length === 0) { return null; } diff --git a/dist/index.js.map b/dist/index.js.map index 60a5b75..1adb6ec 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/util/lang.ts","../src/i18n/locales/en-US.ts","../src/i18n/index.ts","../src/components/styles/backlinks.scss","../src/util/path.ts","../src/components/OverflowList.tsx","../src/components/Backlinks.tsx"],"names":["utilSimplifySlug","OverflowList","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"No backlinks found\",\n },\n },\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n",".backlinks {\n flex-direction: column;\n}\n.backlinks > h3 {\n font-size: 1rem;\n margin: 0;\n}\n.backlinks > ul.overflow {\n list-style: none;\n padding: 0;\n margin: 0.5rem 0;\n max-height: calc(100% - 2rem);\n overscroll-behavior: contain;\n}\n.backlinks > ul.overflow > li > a {\n background-color: transparent;\n}","import { simplifySlug as utilSimplifySlug, joinSegments } from \"@quartz-community/utils\";\n\n/**\n * Simplifies a full slug by removing the '/index' suffix.\n * Uses the utility from @quartz-community/utils.\n */\nexport function simplifySlug(fp: string): string {\n return utilSimplifySlug(fp);\n}\n\n/**\n * Resolves a relative path from current slug to target slug.\n * @param current - The current page's slug\n * @param target - The target page's slug\n * @returns A relative path like \"../..\" or \"./page\"\n */\nexport function resolveRelative(current: string, target: string): string {\n const simplified = simplifySlug(target);\n const rootPath = pathToRoot(current);\n return joinSegments(rootPath, simplified);\n}\n\n/**\n * Gets the path to root from a given slug.\n * For example, \"a/b/c\" becomes \"../../..\"\n */\nfunction pathToRoot(slug: string): string {\n let rootPath = slug\n .split(\"/\")\n .filter((x) => x !== \"\")\n .slice(0, -1)\n .map((_) => \"..\")\n .join(\"/\");\n\n if (rootPath.length === 0) {\n rootPath = \".\";\n }\n\n return rootPath;\n}\n","import type { JSX } from \"preact\";\n\nconst OverflowList = ({\n children,\n ...props\n}: JSX.HTMLAttributes & { id: string }) => {\n return (\n
      \n {children}\n
    • \n
    \n );\n};\n\nlet numLists = 0;\nexport default () => {\n const id = `list-${numLists++}`;\n\n return {\n OverflowList: (props: JSX.HTMLAttributes) => (\n \n ),\n overflowListAfterDOMLoaded: `\ndocument.addEventListener(\"nav\", (e) => {\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const parentUl = entry.target.parentElement\n if (!parentUl) return\n if (entry.isIntersecting) {\n parentUl.classList.remove(\"gradient-active\")\n } else {\n parentUl.classList.add(\"gradient-active\")\n }\n }\n })\n\n const ul = document.getElementById(\"${id}\")\n if (!ul) return\n\n const end = ul.querySelector(\".overflow-end\")\n if (!end) return\n\n observer.observe(end)\n})\n`,\n };\n};\n","import type { QuartzComponent, QuartzComponentProps } from \"@quartz-community/types\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport style from \"./styles/backlinks.scss\";\nimport { resolveRelative, simplifySlug } from \"../util/path\";\nimport OverflowListFactory from \"./OverflowList\";\n\nexport interface BacklinksOptions {\n hideWhenEmpty: boolean;\n}\n\ntype QuartzComponentConstructor = (\n opts: Options,\n) => QuartzComponent;\n\nconst defaultOptions: BacklinksOptions = {\n hideWhenEmpty: true,\n};\n\nexport default ((opts?: Partial) => {\n const options: BacklinksOptions = { ...defaultOptions, ...opts };\n const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory();\n\n const Backlinks: QuartzComponent = ({\n fileData,\n allFiles,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const slug = simplifySlug(fileData.slug as string);\n const locale = cfg.locale ?? \"en-US\";\n const backlinkFiles = (\n allFiles as Array<{ links?: string[]; slug?: string; frontmatter?: { title?: string } }>\n ).filter((file) => file.links?.includes(slug));\n if (options.hideWhenEmpty && backlinkFiles.length === 0) {\n return null;\n }\n return (\n
    \n

    {i18n(locale).components.backlinks.title}

    \n \n {backlinkFiles.length > 0 ? (\n backlinkFiles.map((f) => (\n
  • \n \n {f.frontmatter?.title}\n \n
  • \n ))\n ) : (\n
  • {i18n(locale).components.backlinks.noBacklinksFound}
  • \n )}\n
    \n
    \n );\n };\n\n Backlinks.css = style;\n Backlinks.afterDOMLoaded = overflowListAfterDOMLoaded;\n\n return Backlinks;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file +{"version":3,"sources":["../src/i18n/locales/en-US.ts","../src/i18n/locales/ar-SA.ts","../src/i18n/locales/ca-ES.ts","../src/i18n/locales/cs-CZ.ts","../src/i18n/locales/de-DE.ts","../src/i18n/locales/en-GB.ts","../src/i18n/locales/es-ES.ts","../src/i18n/locales/fa-IR.ts","../src/i18n/locales/fi-FI.ts","../src/i18n/locales/fr-FR.ts","../src/i18n/locales/he-IL.ts","../src/i18n/locales/hu-HU.ts","../src/i18n/locales/id-ID.ts","../src/i18n/locales/it-IT.ts","../src/i18n/locales/ja-JP.ts","../src/i18n/locales/kk-KZ.ts","../src/i18n/locales/ko-KR.ts","../src/i18n/locales/lt-LT.ts","../src/i18n/locales/nb-NO.ts","../src/i18n/locales/nl-NL.ts","../src/i18n/locales/pl-PL.ts","../src/i18n/locales/pt-BR.ts","../src/i18n/locales/ro-RO.ts","../src/i18n/locales/ru-RU.ts","../src/i18n/locales/th-TH.ts","../src/i18n/locales/tr-TR.ts","../src/i18n/locales/uk-UA.ts","../src/i18n/locales/vi-VN.ts","../src/i18n/locales/zh-CN.ts","../src/i18n/locales/zh-TW.ts","../src/i18n/index.ts","../src/components/styles/backlinks.scss","../src/components/OverflowList.tsx","../src/components/Backlinks.tsx"],"names":["OverflowList","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"No backlinks found\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"وصلات العودة\",\n noBacklinksFound: \"لا يوجد وصلات عودة\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Retroenllaç\",\n noBacklinksFound: \"No s'han trobat retroenllaços\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Příchozí odkazy\",\n noBacklinksFound: \"Nenalezeny žádné příchozí odkazy\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"Keine Backlinks gefunden\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"No backlinks found\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Retroenlaces\",\n noBacklinksFound: \"No se han encontrado retroenlaces\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"بک‌لینک‌ها\",\n noBacklinksFound: \"بدون بک‌لینک\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Takalinkit\",\n noBacklinksFound: \"Takalinkkejä ei löytynyt\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Liens retour\",\n noBacklinksFound: \"Aucun lien retour trouvé\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"קישורים חוזרים\",\n noBacklinksFound: \"לא נמצאו קישורים חוזרים\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Visszautalások\",\n noBacklinksFound: \"Nincs visszautalás\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Tautan Balik\",\n noBacklinksFound: \"Tidak ada tautan balik ditemukan\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Link entranti\",\n noBacklinksFound: \"Nessun link entrante\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"バックリンク\",\n noBacklinksFound: \"バックリンクはありません\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Артқа сілтемелер\",\n noBacklinksFound: \"Артқа сілтемелер табылмады\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"백링크\",\n noBacklinksFound: \"백링크가 없습니다.\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Atgalinės Nuorodos\",\n noBacklinksFound: \"Atgalinių Nuorodų Nerasta\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Tilbakekoblinger\",\n noBacklinksFound: \"Ingen tilbakekoblinger funnet\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"Geen backlinks gevonden\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Odnośniki zwrotne\",\n noBacklinksFound: \"Brak połączeń zwrotnych\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Backlinks\",\n noBacklinksFound: \"Sem backlinks encontrados\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Legături înapoi\",\n noBacklinksFound: \"Nu s-au găsit legături înapoi\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Обратные ссылки\",\n noBacklinksFound: \"Обратные ссылки отсутствуют\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"หน้าที่กล่าวถึง\",\n noBacklinksFound: \"ไม่มีหน้าที่โยงมาหน้านี้\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Backlinkler\",\n noBacklinksFound: \"Backlink bulunamadı\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Зворотні посилання\",\n noBacklinksFound: \"Зворотних посилань не знайдено\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"Liên kết ngược\",\n noBacklinksFound: \"Không có liên kết ngược nào\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"反向链接\",\n noBacklinksFound: \"无法找到反向链接\",\n },\n },\n};\n","export default {\n components: {\n backlinks: {\n title: \"反向連結\",\n noBacklinksFound: \"無法找到反向連結\",\n },\n },\n};\n","import enUS from \"./locales/en-US\";\nimport arSA from \"./locales/ar-SA\";\nimport caES from \"./locales/ca-ES\";\nimport csCZ from \"./locales/cs-CZ\";\nimport deDE from \"./locales/de-DE\";\nimport enGB from \"./locales/en-GB\";\nimport esES from \"./locales/es-ES\";\nimport faIR from \"./locales/fa-IR\";\nimport fiFI from \"./locales/fi-FI\";\nimport frFR from \"./locales/fr-FR\";\nimport heIL from \"./locales/he-IL\";\nimport huHU from \"./locales/hu-HU\";\nimport idID from \"./locales/id-ID\";\nimport itIT from \"./locales/it-IT\";\nimport jaJP from \"./locales/ja-JP\";\nimport kkKZ from \"./locales/kk-KZ\";\nimport koKR from \"./locales/ko-KR\";\nimport ltLT from \"./locales/lt-LT\";\nimport nbNO from \"./locales/nb-NO\";\nimport nlNL from \"./locales/nl-NL\";\nimport plPL from \"./locales/pl-PL\";\nimport ptBR from \"./locales/pt-BR\";\nimport roRO from \"./locales/ro-RO\";\nimport ruRU from \"./locales/ru-RU\";\nimport thTH from \"./locales/th-TH\";\nimport trTR from \"./locales/tr-TR\";\nimport ukUA from \"./locales/uk-UA\";\nimport viVN from \"./locales/vi-VN\";\nimport zhCN from \"./locales/zh-CN\";\nimport zhTW from \"./locales/zh-TW\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n \"ar-SA\": arSA,\n \"ca-ES\": caES,\n \"cs-CZ\": csCZ,\n \"de-DE\": deDE,\n \"en-GB\": enGB,\n \"es-ES\": esES,\n \"fa-IR\": faIR,\n \"fi-FI\": fiFI,\n \"fr-FR\": frFR,\n \"he-IL\": heIL,\n \"hu-HU\": huHU,\n \"id-ID\": idID,\n \"it-IT\": itIT,\n \"ja-JP\": jaJP,\n \"kk-KZ\": kkKZ,\n \"ko-KR\": koKR,\n \"lt-LT\": ltLT,\n \"nb-NO\": nbNO,\n \"nl-NL\": nlNL,\n \"pl-PL\": plPL,\n \"pt-BR\": ptBR,\n \"ro-RO\": roRO,\n \"ru-RU\": ruRU,\n \"th-TH\": thTH,\n \"tr-TR\": trTR,\n \"uk-UA\": ukUA,\n \"vi-VN\": viVN,\n \"zh-CN\": zhCN,\n \"zh-TW\": zhTW,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n",".backlinks {\n flex-direction: column;\n}\n.backlinks > h3 {\n font-size: 1rem;\n margin: 0;\n}\n.backlinks > ul.overflow {\n list-style: none;\n padding: 0;\n margin: 0.5rem 0;\n max-height: calc(100% - 2rem);\n overscroll-behavior: contain;\n}\n.backlinks > ul.overflow > li > a {\n background-color: transparent;\n}","import type { JSX } from \"preact\";\n\nconst OverflowList = ({\n children,\n ...props\n}: JSX.HTMLAttributes & { id: string }) => {\n return (\n
      \n {children}\n
    • \n
    \n );\n};\n\nlet numLists = 0;\nexport default () => {\n const id = `list-${numLists++}`;\n\n return {\n OverflowList: (props: JSX.HTMLAttributes) => (\n \n ),\n overflowListAfterDOMLoaded: `\ndocument.addEventListener(\"nav\", (e) => {\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const parentUl = entry.target.parentElement\n if (!parentUl) return\n if (entry.isIntersecting) {\n parentUl.classList.remove(\"gradient-active\")\n } else {\n parentUl.classList.add(\"gradient-active\")\n }\n }\n })\n\n const ul = document.getElementById(\"${id}\")\n if (!ul) return\n\n const end = ul.querySelector(\".overflow-end\")\n if (!end) return\n\n observer.observe(end)\n})\n`,\n };\n};\n","import type { QuartzComponent, QuartzComponentProps } from \"@quartz-community/types\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport style from \"./styles/backlinks.scss\";\nimport { resolveRelative, simplifySlug } from \"../util/path\";\nimport OverflowListFactory from \"./OverflowList\";\n\nexport interface BacklinksOptions {\n hideWhenEmpty: boolean;\n}\n\ntype QuartzComponentConstructor = (\n opts: Options,\n) => QuartzComponent;\n\nconst defaultOptions: BacklinksOptions = {\n hideWhenEmpty: true,\n};\n\nexport interface BacklinkCandidate {\n unlisted?: boolean;\n links?: string[];\n slug?: string;\n frontmatter?: { title?: string };\n}\n\nexport function selectBacklinkSources(\n allFiles: T[],\n currentSlug: string,\n): T[] {\n return allFiles.filter((file) => file.unlisted !== true && file.links?.includes(currentSlug));\n}\n\nexport default ((opts?: Partial) => {\n const options: BacklinksOptions = { ...defaultOptions, ...opts };\n const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory();\n\n const Backlinks: QuartzComponent = ({\n fileData,\n allFiles,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const slug = simplifySlug(fileData.slug as string);\n const locale = cfg.locale ?? \"en-US\";\n const backlinkFiles = selectBacklinkSources(allFiles as BacklinkCandidate[], slug);\n if (options.hideWhenEmpty && backlinkFiles.length === 0) {\n return null;\n }\n return (\n
    \n

    {i18n(locale).components.backlinks.title}

    \n \n {backlinkFiles.length > 0 ? (\n backlinkFiles.map((f) => (\n
  • \n \n {f.frontmatter?.title}\n \n
  • \n ))\n ) : (\n
  • {i18n(locale).components.backlinks.noBacklinksFound}
  • \n )}\n
    \n
    \n );\n };\n\n Backlinks.css = style;\n Backlinks.afterDOMLoaded = overflowListAfterDOMLoaded;\n\n return Backlinks;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file diff --git a/src/components/Backlinks.tsx b/src/components/Backlinks.tsx index 1093b58..b76a456 100644 --- a/src/components/Backlinks.tsx +++ b/src/components/Backlinks.tsx @@ -17,6 +17,20 @@ const defaultOptions: BacklinksOptions = { hideWhenEmpty: true, }; +export interface BacklinkCandidate { + unlisted?: boolean; + links?: string[]; + slug?: string; + frontmatter?: { title?: string }; +} + +export function selectBacklinkSources( + allFiles: T[], + currentSlug: string, +): T[] { + return allFiles.filter((file) => file.unlisted !== true && file.links?.includes(currentSlug)); +} + export default ((opts?: Partial) => { const options: BacklinksOptions = { ...defaultOptions, ...opts }; const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory(); @@ -29,9 +43,7 @@ export default ((opts?: Partial) => { }: QuartzComponentProps & { displayClass?: string }) => { const slug = simplifySlug(fileData.slug as string); const locale = cfg.locale ?? "en-US"; - const backlinkFiles = ( - allFiles as Array<{ links?: string[]; slug?: string; frontmatter?: { title?: string } }> - ).filter((file) => file.links?.includes(slug)); + const backlinkFiles = selectBacklinkSources(allFiles as BacklinkCandidate[], slug); if (options.hideWhenEmpty && backlinkFiles.length === 0) { return null; } diff --git a/test/backlinks.test.ts b/test/backlinks.test.ts index 5246957..53d7ef8 100644 --- a/test/backlinks.test.ts +++ b/test/backlinks.test.ts @@ -1,5 +1,7 @@ import { describe, it, expect } from "vitest"; import { simplifySlug, resolveRelative } from "../src/util/path"; +import { selectBacklinkSources } from "../src/components/Backlinks"; +import type { BacklinkCandidate } from "../src/components/Backlinks"; describe("path utilities", () => { it("simplifySlug removes index suffix", () => { @@ -17,3 +19,37 @@ describe("path utilities", () => { expect(result).toContain(".."); }); }); + +describe("selectBacklinkSources", () => { + const pages: BacklinkCandidate[] = [ + { slug: "a", links: ["target"], frontmatter: { title: "A" } }, + { slug: "b", links: ["other"], frontmatter: { title: "B" } }, + { slug: "c", links: ["target"], frontmatter: { title: "C" }, unlisted: true }, + { slug: "d", links: ["target"], frontmatter: { title: "D" } }, + { slug: "e", frontmatter: { title: "E no links" } }, + ]; + + it("returns only pages whose links include the current slug", () => { + const result = selectBacklinkSources(pages, "target"); + const slugs = result.map((f) => f.slug); + expect(slugs).toContain("a"); + expect(slugs).toContain("d"); + expect(slugs).not.toContain("b"); + expect(slugs).not.toContain("e"); + }); + + it("excludes unlisted pages from backlink sources", () => { + const result = selectBacklinkSources(pages, "target"); + const slugs = result.map((f) => f.slug); + expect(slugs).not.toContain("c"); + }); + + it("treats explicit unlisted: false the same as undefined", () => { + const inputs: BacklinkCandidate[] = [ + { slug: "listed", links: ["target"], unlisted: false }, + { slug: "unlisted", links: ["target"], unlisted: true }, + ]; + const result = selectBacklinkSources(inputs, "target"); + expect(result.map((f) => f.slug)).toEqual(["listed"]); + }); +});