From 2e9753c9960e41d248c2c56cd0f92ee48e0c8569 Mon Sep 17 00:00:00 2001 From: saberzero1 Date: Sat, 11 Apr 2026 13:50:16 +0200 Subject: [PATCH] feat: exclude unlisted pages from recent notes Respect the file.data.unlisted convention. Pages marked unlisted are filtered out of the recent notes list before any user-supplied opts.filter runs, so they cannot be accidentally surfaced by a permissive custom filter. Extracts the filter into a named filterListedPages() helper and exports it for reuse and testing. Adds 3 unit tests covering unlisted exclusion, passthrough when nothing is unlisted, and empty-input handling. --- CHANGELOG.md | 4 ++++ dist/components/index.js | 5 ++++- dist/components/index.js.map | 2 +- dist/index.d.ts | 3 ++- dist/index.js | 7 +++++-- dist/index.js.map | 2 +- src/components/RecentNotes.tsx | 8 +++++++- src/index.ts | 2 +- test/component.test.ts | 24 +++++++++++++++++++++++- 9 files changed, 48 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9111bd8..846edec 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 in the recent notes list. The unlisted filter runs before any user-supplied `opts.filter`. +- Exported `filterListedPages` helper for reuse and testing. +- Unit tests for `filterListedPages`. + - Initial Quartz community plugin template. diff --git a/dist/components/index.js b/dist/components/index.js index c98b323..ed32150 100644 --- a/dist/components/index.js +++ b/dist/components/index.js @@ -446,6 +446,9 @@ var withDefaultDateType = (data, defaultDateType) => ({ ...data, defaultDateType }); +function filterListedPages(pages) { + return pages.filter((p) => p.unlisted !== true); +} var byDateAndAlphabeticalWithConfig = (cfg) => { const sortFn = byDateAndAlphabetical(); return (f1, f2) => sortFn( @@ -469,7 +472,7 @@ var RecentNotes_default = ((userOpts) => { }) => { const globalCfg = cfg; const opts = { ...defaultOptions(globalCfg), ...userOpts }; - const pages = allFiles.filter(opts.filter).sort(opts.sort); + const pages = filterListedPages(allFiles).filter(opts.filter).sort(opts.sort); const remaining = Math.max(0, pages.length - opts.limit); const slug2 = fileData.slug; const locale = cfg.locale ?? "en-US"; diff --git a/dist/components/index.js.map b/dist/components/index.js.map index 2863335..e96800b 100644 --- a/dist/components/index.js.map +++ b/dist/components/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../node_modules/@quartz-community/utils/src/date.ts","../../node_modules/@quartz-community/utils/src/sort.ts","../../node_modules/@quartz-community/utils/src/lang.ts","../../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","../../node_modules/@quartz-community/utils/src/path.ts","../../src/util/path.ts","../../src/components/styles/recentNotes.scss","../../src/components/RecentNotes.tsx"],"names":["simplifySlug","slug","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export function formatDate(d: Date, locale: string = \"en-US\"): string {\n return d.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"2-digit\",\n });\n}\n","import type { QuartzPluginData, ValidDateType, SortFn } from \"@quartz-community/types\";\n\nexport function getDate(data: QuartzPluginData): Date | undefined {\n const defaultDateType = data.defaultDateType as ValidDateType | undefined;\n if (!defaultDateType) {\n return undefined;\n }\n const dates = data.dates as Record | undefined;\n return dates?.[defaultDateType];\n}\n\nexport function byDateAndAlphabetical(): SortFn {\n return (f1, f2) => {\n const f1Date = getDate(f1);\n const f2Date = getDate(f2);\n if (f1Date && f2Date) {\n return f2Date.getTime() - f1Date.getTime();\n } else if (f1Date && !f2Date) {\n return -1;\n } else if (!f1Date && f2Date) {\n return 1;\n }\n\n const f1Title = (\n ((f1.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n const f2Title = (\n ((f2.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n return f1Title.localeCompare(f2Title);\n };\n}\n","export function capitalize(s: string): string {\n return s.substring(0, 1).toUpperCase() + s.substring(1);\n}\n\nexport function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"آخر الملاحظات\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `تصفح ${remaining} أكثر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Recents\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vegi ${remaining} més →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nejnovější poznámky\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zobraz ${remaining} dalších →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Zuletzt bearbeitete Seiten\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} weitere ansehen →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas Recientes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vea ${remaining} más →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"یادداشت‌های اخیر\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} یادداشت دیگر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Viimeisimmät muistiinpanot\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Näytä ${remaining} lisää →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Récentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Voir ${remaining} de plus →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"הערות אחרונות\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `עיין ב ${remaining} נוספים →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Legutóbbi jegyzetek\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `${remaining} további megtekintése →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Catatan Terbaru\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Lihat ${remaining} lagi →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Note recenti\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n remaining === 1 ? \"Vedi 1 altra →\" : `Vedi altre ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近の記事\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `さらに${remaining}件 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Соңғы жазбалар\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Тағы ${remaining} жазбаны қарау →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"최근 게시글\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining}건 더보기 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Naujausi Užrašai\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Peržiūrėti dar ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nylige notater\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Se ${remaining} til →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recente notities\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zie ${remaining} meer →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Najnowsze notatki\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Zobacz ${remaining} nastepnych →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas recentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Veja mais ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notițe recente\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vezi încă ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Недавние заметки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Посмотреть оставш${getForm(remaining, \"уюся\", \"иеся\", \"иеся\")} ${remaining} →`,\n },\n },\n};\n\nfunction getForm(number: number, form1: string, form2: string, form5: string): string {\n const remainder100 = number % 100;\n const remainder10 = remainder100 % 10;\n\n if (remainder100 >= 10 && remainder100 <= 20) return form5;\n if (remainder10 > 1 && remainder10 < 5) return form2;\n if (remainder10 == 1) return form1;\n return form5;\n}\n","export default {\n components: {\n recentNotes: {\n title: \"บันทึกล่าสุด\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `ดูเพิ่มอีก ${remaining} รายการ →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Son Notlar\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} tane daha gör →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Останні нотатки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Переглянути ще ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Ghi chú gần đây\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Xem thêm ${remaining} ghi chú →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的笔记\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多${remaining}篇笔记 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的筆記\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多 ${remaining} 篇筆記 →`,\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","import { slug as slugAnchor } from \"github-slugger\";\nimport type { FilePath, FullSlug } from \"@quartz-community/types\";\n\nexport type { FilePath, FullSlug };\n\n/** No '/index' ending, no file extension, can have trailing slash for folders. */\nexport type SimpleSlug = string & { _brand: \"SimpleSlug\" };\n\n/** Starts with './' or '../', used for navigation. */\nexport type RelativeURL = string & { _brand: \"RelativeURL\" };\n\nexport interface TransformOptions {\n strategy: \"absolute\" | \"relative\" | \"shortest\";\n allSlugs: FullSlug[];\n}\n\nexport function isFilePath(s: string): s is FilePath {\n const validStart = !s.startsWith(\".\");\n return validStart && _hasFileExtension(s);\n}\n\nexport function isFullSlug(s: string): s is FullSlug {\n const validStart = !(s.startsWith(\".\") || s.startsWith(\"/\"));\n const validEnding = !s.endsWith(\"/\");\n return validStart && validEnding && !_containsForbiddenCharacters(s);\n}\n\nexport function isSimpleSlug(s: string): s is SimpleSlug {\n const validStart = !(s.startsWith(\".\") || (s.length > 1 && s.startsWith(\"/\")));\n const validEnding = !endsWith(s, \"index\");\n return validStart && !_containsForbiddenCharacters(s) && validEnding && !_hasFileExtension(s);\n}\n\nexport function isRelativeURL(s: string): s is RelativeURL {\n const validStart = /^\\.{1,2}/.test(s);\n const validEnding = !endsWith(s, \"index\");\n return validStart && validEnding && ![\".md\", \".html\"].includes(getFileExtension(s) ?? \"\");\n}\n\nexport function isAbsoluteURL(s: string): boolean {\n try {\n new URL(s);\n } catch {\n return false;\n }\n return true;\n}\n\nexport function simplifySlug(fp: FullSlug | string): SimpleSlug {\n const res = stripSlashes(trimSuffix(fp, \"index\"), true);\n return (res.length === 0 ? \"/\" : res) as SimpleSlug;\n}\n\nexport function getFullSlug(window: Window): FullSlug {\n const res = window.document.body.dataset.slug! as FullSlug;\n return res;\n}\n\nexport function getFullSlugFromUrl(): FullSlug {\n let rawSlug = window.location.pathname;\n if (rawSlug.endsWith(\"/\")) rawSlug = rawSlug.slice(0, -1);\n if (rawSlug.startsWith(\"/\")) rawSlug = rawSlug.slice(1);\n return rawSlug as FullSlug;\n}\n\nexport function slugifyFilePath(fp: FilePath, excludeExt?: boolean): FullSlug {\n fp = stripSlashes(fp) as FilePath;\n const ext = getFileExtension(fp);\n const withoutFileExt = fp.replace(new RegExp(ext + \"$\"), \"\");\n const finalExt = excludeExt || [\".md\", \".html\", undefined].includes(ext) ? \"\" : ext;\n\n let slug = _sluggify(withoutFileExt);\n\n if (endsWith(slug, \"_index\")) {\n slug = slug.replace(/_index$/, \"index\");\n }\n\n return (slug + (finalExt ?? \"\")) as FullSlug;\n}\n\nexport function joinSegments(...args: string[]): string {\n if (args.length === 0) {\n return \"\";\n }\n\n let joined = args\n .filter((segment) => segment !== \"\" && segment !== \"/\")\n .map((segment) => stripSlashes(segment))\n .join(\"/\");\n\n const first = args[0];\n const last = args[args.length - 1];\n\n if (first?.startsWith(\"/\")) {\n joined = \"/\" + joined;\n }\n\n if (last?.endsWith(\"/\")) {\n joined = joined + \"/\";\n }\n\n return joined;\n}\n\nexport function resolvePath(to: string): string {\n if (to.startsWith(\"/\")) return to;\n return \"/\" + to;\n}\n\n/** Read the base path injected at build time via `data-basepath` on ``.\n * Returns `\"\"` for root deployments, e.g. `\"/repository\"` for subdirectory. */\nexport function getBasePath(): string {\n if (typeof document === \"undefined\") return \"\";\n return document.body?.dataset?.basepath ?? \"\";\n}\n\n/** Resolve a slug to an absolute URL path, prepending the site's base path.\n * e.g. `resolveBasePath(\"features/Callouts\")` → `\"/repository/features/Callouts\"` */\nexport function resolveBasePath(to: string, basePath?: string): string {\n const base = basePath ?? getBasePath();\n const slug = to.startsWith(\"/\") ? to : \"/\" + to;\n return base + slug;\n}\n\nexport function endsWith(s: string, suffix: string): boolean {\n return s === suffix || s.endsWith(\"/\" + suffix);\n}\n\nexport function trimSuffix(s: string, suffix: string): string {\n if (endsWith(s, suffix)) {\n s = s.slice(0, -suffix.length);\n }\n return s;\n}\n\nexport function stripSlashes(s: string, onlyStripPrefix?: boolean): string {\n if (s.startsWith(\"/\")) {\n s = s.substring(1);\n }\n\n if (!onlyStripPrefix && s.endsWith(\"/\")) {\n s = s.slice(0, -1);\n }\n\n return s;\n}\n\nexport function getFileExtension(s: string): string | undefined {\n return s.match(/\\.[A-Za-z0-9]+$/)?.[0];\n}\n\nexport function isFolderPath(fplike: string): boolean {\n return (\n fplike.endsWith(\"/\") ||\n endsWith(fplike, \"index\") ||\n endsWith(fplike, \"index.md\") ||\n endsWith(fplike, \"index.html\")\n );\n}\n\nexport function getAllSegmentPrefixes(path: string): string[] {\n const segments = path.split(\"/\");\n const results: string[] = [];\n for (let i = 0; i < segments.length; i++) {\n results.push(segments.slice(0, i + 1).join(\"/\"));\n }\n return results;\n}\n\nexport function pathToRoot(slug: FullSlug): RelativeURL {\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 as RelativeURL;\n}\n\nexport function resolveRelative(current: FullSlug, target: FullSlug | SimpleSlug): RelativeURL {\n const res = joinSegments(pathToRoot(current), simplifySlug(target as FullSlug)) as RelativeURL;\n return res;\n}\n\nexport function splitAnchor(link: string): [string, string] {\n const [fp, anchor] = link.split(\"#\", 2);\n if (fp!.endsWith(\".pdf\")) {\n return [fp!, anchor === undefined ? \"\" : `#${anchor}`];\n }\n const slugged = anchor === undefined ? \"\" : \"#\" + slugAnchor(anchor);\n return [fp!, slugged];\n}\n\nexport function slugTag(tag: string): string {\n return tag\n .split(\"/\")\n .map((tagSegment) => _sluggify(tagSegment))\n .join(\"/\");\n}\n\nexport function transformInternalLink(link: string): RelativeURL {\n const [fplike, anchor] = splitAnchor(decodeURI(link));\n\n const folderPath = isFolderPath(fplike);\n const segments = fplike.split(\"/\").filter((x) => x.length > 0);\n const prefix = segments.filter(_isRelativeSegment).join(\"/\");\n const fp = segments.filter((seg) => !_isRelativeSegment(seg) && seg !== \"\").join(\"/\");\n\n const simpleSlug = simplifySlug(slugifyFilePath(fp as FilePath));\n const joined = joinSegments(stripSlashes(prefix), stripSlashes(simpleSlug));\n const trail = folderPath ? \"/\" : \"\";\n const res = (_addRelativeToStart(joined) + trail + anchor) as RelativeURL;\n return res;\n}\n\nexport function transformLink(src: FullSlug, target: string, opts: TransformOptions): RelativeURL {\n const targetSlug = transformInternalLink(target);\n\n if (opts.strategy === \"relative\") {\n return targetSlug as RelativeURL;\n } else {\n // When src is a folder page (e.g. \"Compendium/Spells\" backed by index.md),\n // the browser serves it at \"/Compendium/Spells/\" with a trailing slash.\n // pathToRoot needs the \"/index\" suffix to compute the correct depth.\n const effectiveSrc =\n !endsWith(src, \"index\") && opts.allSlugs.includes(`${src}/index` as FullSlug)\n ? (`${src}/index` as FullSlug)\n : src;\n\n const folderTail = isFolderPath(targetSlug) ? \"/\" : \"\";\n const canonicalSlug = stripSlashes(targetSlug.slice(\".\".length));\n const [targetCanonical, targetAnchor] = splitAnchor(canonicalSlug);\n\n if (opts.strategy === \"shortest\") {\n const isMultiSegment = targetCanonical.includes(\"/\");\n const isFolderTarget = isFolderPath(targetSlug);\n const matchingFileNames = opts.allSlugs.filter((slug) => {\n if (isMultiSegment) {\n // Multi-segment partial path: match by suffix\n if (slug === targetCanonical || slug.endsWith(\"/\" + targetCanonical)) {\n return true;\n }\n // Folder targets have \"/index\" stripped — also match the \"/index\" variant\n if (isFolderTarget) {\n const withIndex = targetCanonical + \"/index\";\n return slug === withIndex || slug.endsWith(\"/\" + withIndex);\n }\n return false;\n }\n const parts = slug.split(\"/\");\n const fileName = parts.at(-1);\n return targetCanonical === fileName;\n });\n\n if (matchingFileNames.length === 1) {\n const matchedSlug = matchingFileNames[0]!;\n return (resolveRelative(effectiveSrc, matchedSlug) + targetAnchor) as RelativeURL;\n }\n }\n\n return (joinSegments(pathToRoot(effectiveSrc), canonicalSlug) + folderTail) as RelativeURL;\n }\n}\n\n/**\n * Slugify a file path for use as an href.\n * Replaces whitespace→hyphens, &→-and-, %→-percent, removes ? and #.\n * Operates per segment so directory separators are preserved.\n */\nexport function slugifyPath(s: string): string {\n return s\n .split(\"/\")\n .map((segment) =>\n segment\n .replace(/\\s/g, \"-\")\n .replace(/&/g, \"-and-\")\n .replace(/%/g, \"-percent\")\n .replace(/\\?/g, \"\")\n .replace(/#/g, \"\"),\n )\n .join(\"/\")\n .replace(/\\/$/, \"\");\n}\n\n/** @internal */\nfunction _sluggify(s: string): string {\n return slugifyPath(s);\n}\n\nfunction _containsForbiddenCharacters(s: string): boolean {\n return s.includes(\" \") || s.includes(\"#\") || s.includes(\"?\") || s.includes(\"&\");\n}\n\nfunction _hasFileExtension(s: string): boolean {\n return getFileExtension(s) !== undefined;\n}\n\nfunction _isRelativeSegment(s: string): boolean {\n return /^\\.{0,2}$/.test(s);\n}\n\nfunction _addRelativeToStart(s: string): string {\n if (s === \"\") {\n s = \".\";\n }\n\n if (!s.startsWith(\".\")) {\n s = joinSegments(\".\", s);\n }\n\n return s;\n}\n","import { simplifySlug as utilSimplifySlug, joinSegments } from \"@quartz-community/utils\";\n\nexport function simplifySlug(fp: string): string {\n return utilSimplifySlug(fp);\n}\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\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",".recent-notes > h3 {\n margin: 0.5rem 0 0 0;\n font-size: 1rem;\n}\n.recent-notes > ul.recent-ul {\n list-style: none;\n margin-top: 1rem;\n padding-left: 0;\n}\n.recent-notes > ul.recent-ul > li {\n margin: 1rem 0;\n}\n.recent-notes > ul.recent-ul > li .section > .desc > h3 > a {\n background-color: transparent;\n}\n.recent-notes > ul.recent-ul > li .section > .meta {\n margin: 0 0 0.5rem 0;\n opacity: 0.6;\n}","import type {\n QuartzComponent,\n QuartzComponentProps,\n QuartzPluginData,\n SortFn,\n ValidDateType,\n} from \"@quartz-community/types\";\nimport { formatDate } from \"@quartz-community/utils/date\";\nimport { byDateAndAlphabetical, getDate } from \"@quartz-community/utils/sort\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { resolveRelative } from \"../util/path\";\nimport style from \"./styles/recentNotes.scss\";\n\ntype QuartzComponentConstructor = (\n opts: Options,\n) => QuartzComponent;\n\ntype RecentNotesPluginData = QuartzPluginData & {\n slug?: string;\n filePath?: string;\n dates?: Record;\n frontmatter?: {\n title?: string;\n tags?: string[];\n [key: string]: unknown;\n };\n [key: string]: unknown;\n};\n\ninterface GlobalConfiguration {\n locale: string;\n defaultDateType: ValidDateType;\n [key: string]: unknown;\n}\n\nexport interface RecentNotesOptions {\n title?: string;\n limit: number;\n linkToMore: string | false;\n showTags: boolean;\n filter: (f: RecentNotesPluginData) => boolean;\n sort: SortFn;\n}\n\nconst withDefaultDateType = (\n data: RecentNotesPluginData,\n defaultDateType: ValidDateType,\n): QuartzPluginData => ({\n ...data,\n defaultDateType,\n});\n\nconst byDateAndAlphabeticalWithConfig = (cfg: GlobalConfiguration): SortFn => {\n const sortFn = byDateAndAlphabetical();\n return (f1, f2) =>\n sortFn(\n withDefaultDateType(f1 as RecentNotesPluginData, cfg.defaultDateType),\n withDefaultDateType(f2 as RecentNotesPluginData, cfg.defaultDateType),\n );\n};\n\nconst defaultOptions = (cfg: GlobalConfiguration): RecentNotesOptions => ({\n limit: 3,\n linkToMore: false,\n showTags: true,\n filter: () => true,\n sort: byDateAndAlphabeticalWithConfig(cfg),\n});\n\nexport default ((userOpts?: Partial) => {\n const RecentNotes: QuartzComponent = ({\n allFiles,\n fileData,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const globalCfg = cfg as unknown as GlobalConfiguration;\n const opts = { ...defaultOptions(globalCfg), ...userOpts };\n const pages = (allFiles as RecentNotesPluginData[]).filter(opts.filter).sort(opts.sort);\n const remaining = Math.max(0, pages.length - opts.limit);\n const slug = fileData.slug as string | undefined;\n const locale = cfg.locale ?? \"en-US\";\n return (\n
\n

{opts.title ?? i18n(locale).components.recentNotes.title}

\n
    \n {pages.slice(0, opts.limit).map((page) => {\n const title = page.frontmatter?.title ?? \"Untitled\";\n const tags = page.frontmatter?.tags ?? [];\n\n return (\n
  • \n
    \n
    \n

    \n \n {title}\n \n

    \n
    \n {page.dates && getDate(withDefaultDateType(page, globalCfg.defaultDateType)) && (\n

    \n \n {formatDate(\n getDate(withDefaultDateType(page, globalCfg.defaultDateType))!,\n locale,\n )}\n \n

    \n )}\n {opts.showTags && (\n \n )}\n
    \n
  • \n );\n })}\n
\n {opts.linkToMore && remaining > 0 && (\n

\n \n {i18n(locale).components.recentNotes.seeRemainingMore({ remaining })}\n \n

\n )}\n
\n );\n };\n\n RecentNotes.css = style;\n return RecentNotes;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file +{"version":3,"sources":["../../node_modules/@quartz-community/utils/src/date.ts","../../node_modules/@quartz-community/utils/src/sort.ts","../../node_modules/@quartz-community/utils/src/lang.ts","../../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","../../node_modules/@quartz-community/utils/src/path.ts","../../src/util/path.ts","../../src/components/styles/recentNotes.scss","../../src/components/RecentNotes.tsx"],"names":["simplifySlug","slug","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export function formatDate(d: Date, locale: string = \"en-US\"): string {\n return d.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"2-digit\",\n });\n}\n","import type { QuartzPluginData, ValidDateType, SortFn } from \"@quartz-community/types\";\n\nexport function getDate(data: QuartzPluginData): Date | undefined {\n const defaultDateType = data.defaultDateType as ValidDateType | undefined;\n if (!defaultDateType) {\n return undefined;\n }\n const dates = data.dates as Record | undefined;\n return dates?.[defaultDateType];\n}\n\nexport function byDateAndAlphabetical(): SortFn {\n return (f1, f2) => {\n const f1Date = getDate(f1);\n const f2Date = getDate(f2);\n if (f1Date && f2Date) {\n return f2Date.getTime() - f1Date.getTime();\n } else if (f1Date && !f2Date) {\n return -1;\n } else if (!f1Date && f2Date) {\n return 1;\n }\n\n const f1Title = (\n ((f1.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n const f2Title = (\n ((f2.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n return f1Title.localeCompare(f2Title);\n };\n}\n","export function capitalize(s: string): string {\n return s.substring(0, 1).toUpperCase() + s.substring(1);\n}\n\nexport function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"آخر الملاحظات\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `تصفح ${remaining} أكثر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Recents\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vegi ${remaining} més →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nejnovější poznámky\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zobraz ${remaining} dalších →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Zuletzt bearbeitete Seiten\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} weitere ansehen →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas Recientes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vea ${remaining} más →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"یادداشت‌های اخیر\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} یادداشت دیگر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Viimeisimmät muistiinpanot\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Näytä ${remaining} lisää →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Récentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Voir ${remaining} de plus →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"הערות אחרונות\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `עיין ב ${remaining} נוספים →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Legutóbbi jegyzetek\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `${remaining} további megtekintése →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Catatan Terbaru\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Lihat ${remaining} lagi →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Note recenti\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n remaining === 1 ? \"Vedi 1 altra →\" : `Vedi altre ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近の記事\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `さらに${remaining}件 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Соңғы жазбалар\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Тағы ${remaining} жазбаны қарау →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"최근 게시글\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining}건 더보기 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Naujausi Užrašai\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Peržiūrėti dar ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nylige notater\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Se ${remaining} til →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recente notities\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zie ${remaining} meer →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Najnowsze notatki\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Zobacz ${remaining} nastepnych →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas recentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Veja mais ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notițe recente\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vezi încă ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Недавние заметки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Посмотреть оставш${getForm(remaining, \"уюся\", \"иеся\", \"иеся\")} ${remaining} →`,\n },\n },\n};\n\nfunction getForm(number: number, form1: string, form2: string, form5: string): string {\n const remainder100 = number % 100;\n const remainder10 = remainder100 % 10;\n\n if (remainder100 >= 10 && remainder100 <= 20) return form5;\n if (remainder10 > 1 && remainder10 < 5) return form2;\n if (remainder10 == 1) return form1;\n return form5;\n}\n","export default {\n components: {\n recentNotes: {\n title: \"บันทึกล่าสุด\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `ดูเพิ่มอีก ${remaining} รายการ →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Son Notlar\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} tane daha gör →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Останні нотатки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Переглянути ще ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Ghi chú gần đây\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Xem thêm ${remaining} ghi chú →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的笔记\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多${remaining}篇笔记 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的筆記\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多 ${remaining} 篇筆記 →`,\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","import { slug as slugAnchor } from \"github-slugger\";\nimport type { FilePath, FullSlug } from \"@quartz-community/types\";\n\nexport type { FilePath, FullSlug };\n\n/** No '/index' ending, no file extension, can have trailing slash for folders. */\nexport type SimpleSlug = string & { _brand: \"SimpleSlug\" };\n\n/** Starts with './' or '../', used for navigation. */\nexport type RelativeURL = string & { _brand: \"RelativeURL\" };\n\nexport interface TransformOptions {\n strategy: \"absolute\" | \"relative\" | \"shortest\";\n allSlugs: FullSlug[];\n}\n\nexport function isFilePath(s: string): s is FilePath {\n const validStart = !s.startsWith(\".\");\n return validStart && _hasFileExtension(s);\n}\n\nexport function isFullSlug(s: string): s is FullSlug {\n const validStart = !(s.startsWith(\".\") || s.startsWith(\"/\"));\n const validEnding = !s.endsWith(\"/\");\n return validStart && validEnding && !_containsForbiddenCharacters(s);\n}\n\nexport function isSimpleSlug(s: string): s is SimpleSlug {\n const validStart = !(s.startsWith(\".\") || (s.length > 1 && s.startsWith(\"/\")));\n const validEnding = !endsWith(s, \"index\");\n return validStart && !_containsForbiddenCharacters(s) && validEnding && !_hasFileExtension(s);\n}\n\nexport function isRelativeURL(s: string): s is RelativeURL {\n const validStart = /^\\.{1,2}/.test(s);\n const validEnding = !endsWith(s, \"index\");\n return validStart && validEnding && ![\".md\", \".html\"].includes(getFileExtension(s) ?? \"\");\n}\n\nexport function isAbsoluteURL(s: string): boolean {\n try {\n new URL(s);\n } catch {\n return false;\n }\n return true;\n}\n\nexport function simplifySlug(fp: FullSlug | string): SimpleSlug {\n const res = stripSlashes(trimSuffix(fp, \"index\"), true);\n return (res.length === 0 ? \"/\" : res) as SimpleSlug;\n}\n\nexport function getFullSlug(window: Window): FullSlug {\n const res = window.document.body.dataset.slug! as FullSlug;\n return res;\n}\n\nexport function getFullSlugFromUrl(): FullSlug {\n let rawSlug = window.location.pathname;\n if (rawSlug.endsWith(\"/\")) rawSlug = rawSlug.slice(0, -1);\n if (rawSlug.startsWith(\"/\")) rawSlug = rawSlug.slice(1);\n return rawSlug as FullSlug;\n}\n\nexport function slugifyFilePath(fp: FilePath, excludeExt?: boolean): FullSlug {\n fp = stripSlashes(fp) as FilePath;\n const ext = getFileExtension(fp);\n const withoutFileExt = fp.replace(new RegExp(ext + \"$\"), \"\");\n const finalExt = excludeExt || [\".md\", \".html\", undefined].includes(ext) ? \"\" : ext;\n\n let slug = _sluggify(withoutFileExt);\n\n if (endsWith(slug, \"_index\")) {\n slug = slug.replace(/_index$/, \"index\");\n }\n\n return (slug + (finalExt ?? \"\")) as FullSlug;\n}\n\nexport function joinSegments(...args: string[]): string {\n if (args.length === 0) {\n return \"\";\n }\n\n let joined = args\n .filter((segment) => segment !== \"\" && segment !== \"/\")\n .map((segment) => stripSlashes(segment))\n .join(\"/\");\n\n const first = args[0];\n const last = args[args.length - 1];\n\n if (first?.startsWith(\"/\")) {\n joined = \"/\" + joined;\n }\n\n if (last?.endsWith(\"/\")) {\n joined = joined + \"/\";\n }\n\n return joined;\n}\n\nexport function resolvePath(to: string): string {\n if (to.startsWith(\"/\")) return to;\n return \"/\" + to;\n}\n\n/** Read the base path injected at build time via `data-basepath` on ``.\n * Returns `\"\"` for root deployments, e.g. `\"/repository\"` for subdirectory. */\nexport function getBasePath(): string {\n if (typeof document === \"undefined\") return \"\";\n return document.body?.dataset?.basepath ?? \"\";\n}\n\n/** Resolve a slug to an absolute URL path, prepending the site's base path.\n * e.g. `resolveBasePath(\"features/Callouts\")` → `\"/repository/features/Callouts\"` */\nexport function resolveBasePath(to: string, basePath?: string): string {\n const base = basePath ?? getBasePath();\n const slug = to.startsWith(\"/\") ? to : \"/\" + to;\n return base + slug;\n}\n\nexport function endsWith(s: string, suffix: string): boolean {\n return s === suffix || s.endsWith(\"/\" + suffix);\n}\n\nexport function trimSuffix(s: string, suffix: string): string {\n if (endsWith(s, suffix)) {\n s = s.slice(0, -suffix.length);\n }\n return s;\n}\n\nexport function stripSlashes(s: string, onlyStripPrefix?: boolean): string {\n if (s.startsWith(\"/\")) {\n s = s.substring(1);\n }\n\n if (!onlyStripPrefix && s.endsWith(\"/\")) {\n s = s.slice(0, -1);\n }\n\n return s;\n}\n\nexport function getFileExtension(s: string): string | undefined {\n return s.match(/\\.[A-Za-z0-9]+$/)?.[0];\n}\n\nexport function isFolderPath(fplike: string): boolean {\n return (\n fplike.endsWith(\"/\") ||\n endsWith(fplike, \"index\") ||\n endsWith(fplike, \"index.md\") ||\n endsWith(fplike, \"index.html\")\n );\n}\n\nexport function getAllSegmentPrefixes(path: string): string[] {\n const segments = path.split(\"/\");\n const results: string[] = [];\n for (let i = 0; i < segments.length; i++) {\n results.push(segments.slice(0, i + 1).join(\"/\"));\n }\n return results;\n}\n\nexport function pathToRoot(slug: FullSlug): RelativeURL {\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 as RelativeURL;\n}\n\nexport function resolveRelative(current: FullSlug, target: FullSlug | SimpleSlug): RelativeURL {\n const res = joinSegments(pathToRoot(current), simplifySlug(target as FullSlug)) as RelativeURL;\n return res;\n}\n\nexport function splitAnchor(link: string): [string, string] {\n const [fp, anchor] = link.split(\"#\", 2);\n if (fp!.endsWith(\".pdf\")) {\n return [fp!, anchor === undefined ? \"\" : `#${anchor}`];\n }\n const slugged = anchor === undefined ? \"\" : \"#\" + slugAnchor(anchor);\n return [fp!, slugged];\n}\n\nexport function slugTag(tag: string): string {\n return tag\n .split(\"/\")\n .map((tagSegment) => _sluggify(tagSegment))\n .join(\"/\");\n}\n\nexport function transformInternalLink(link: string): RelativeURL {\n const [fplike, anchor] = splitAnchor(decodeURI(link));\n\n const folderPath = isFolderPath(fplike);\n const segments = fplike.split(\"/\").filter((x) => x.length > 0);\n const prefix = segments.filter(_isRelativeSegment).join(\"/\");\n const fp = segments.filter((seg) => !_isRelativeSegment(seg) && seg !== \"\").join(\"/\");\n\n const simpleSlug = simplifySlug(slugifyFilePath(fp as FilePath));\n const joined = joinSegments(stripSlashes(prefix), stripSlashes(simpleSlug));\n const trail = folderPath ? \"/\" : \"\";\n const res = (_addRelativeToStart(joined) + trail + anchor) as RelativeURL;\n return res;\n}\n\nexport function transformLink(src: FullSlug, target: string, opts: TransformOptions): RelativeURL {\n const targetSlug = transformInternalLink(target);\n\n if (opts.strategy === \"relative\") {\n return targetSlug as RelativeURL;\n } else {\n // When src is a folder page (e.g. \"Compendium/Spells\" backed by index.md),\n // the browser serves it at \"/Compendium/Spells/\" with a trailing slash.\n // pathToRoot needs the \"/index\" suffix to compute the correct depth.\n const effectiveSrc =\n !endsWith(src, \"index\") && opts.allSlugs.includes(`${src}/index` as FullSlug)\n ? (`${src}/index` as FullSlug)\n : src;\n\n const folderTail = isFolderPath(targetSlug) ? \"/\" : \"\";\n const canonicalSlug = stripSlashes(targetSlug.slice(\".\".length));\n const [targetCanonical, targetAnchor] = splitAnchor(canonicalSlug);\n\n if (opts.strategy === \"shortest\") {\n const isMultiSegment = targetCanonical.includes(\"/\");\n const isFolderTarget = isFolderPath(targetSlug);\n const matchingFileNames = opts.allSlugs.filter((slug) => {\n if (isMultiSegment) {\n // Multi-segment partial path: match by suffix\n if (slug === targetCanonical || slug.endsWith(\"/\" + targetCanonical)) {\n return true;\n }\n // Folder targets have \"/index\" stripped — also match the \"/index\" variant\n if (isFolderTarget) {\n const withIndex = targetCanonical + \"/index\";\n return slug === withIndex || slug.endsWith(\"/\" + withIndex);\n }\n return false;\n }\n const parts = slug.split(\"/\");\n const fileName = parts.at(-1);\n return targetCanonical === fileName;\n });\n\n if (matchingFileNames.length === 1) {\n const matchedSlug = matchingFileNames[0]!;\n return (resolveRelative(effectiveSrc, matchedSlug) + targetAnchor) as RelativeURL;\n }\n }\n\n return (joinSegments(pathToRoot(effectiveSrc), canonicalSlug) + folderTail) as RelativeURL;\n }\n}\n\n/**\n * Slugify a file path for use as an href.\n * Replaces whitespace→hyphens, &→-and-, %→-percent, removes ? and #.\n * Operates per segment so directory separators are preserved.\n */\nexport function slugifyPath(s: string): string {\n return s\n .split(\"/\")\n .map((segment) =>\n segment\n .replace(/\\s/g, \"-\")\n .replace(/&/g, \"-and-\")\n .replace(/%/g, \"-percent\")\n .replace(/\\?/g, \"\")\n .replace(/#/g, \"\"),\n )\n .join(\"/\")\n .replace(/\\/$/, \"\");\n}\n\n/** @internal */\nfunction _sluggify(s: string): string {\n return slugifyPath(s);\n}\n\nfunction _containsForbiddenCharacters(s: string): boolean {\n return s.includes(\" \") || s.includes(\"#\") || s.includes(\"?\") || s.includes(\"&\");\n}\n\nfunction _hasFileExtension(s: string): boolean {\n return getFileExtension(s) !== undefined;\n}\n\nfunction _isRelativeSegment(s: string): boolean {\n return /^\\.{0,2}$/.test(s);\n}\n\nfunction _addRelativeToStart(s: string): string {\n if (s === \"\") {\n s = \".\";\n }\n\n if (!s.startsWith(\".\")) {\n s = joinSegments(\".\", s);\n }\n\n return s;\n}\n","import { simplifySlug as utilSimplifySlug, joinSegments } from \"@quartz-community/utils\";\n\nexport function simplifySlug(fp: string): string {\n return utilSimplifySlug(fp);\n}\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\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",".recent-notes > h3 {\n margin: 0.5rem 0 0 0;\n font-size: 1rem;\n}\n.recent-notes > ul.recent-ul {\n list-style: none;\n margin-top: 1rem;\n padding-left: 0;\n}\n.recent-notes > ul.recent-ul > li {\n margin: 1rem 0;\n}\n.recent-notes > ul.recent-ul > li .section > .desc > h3 > a {\n background-color: transparent;\n}\n.recent-notes > ul.recent-ul > li .section > .meta {\n margin: 0 0 0.5rem 0;\n opacity: 0.6;\n}","import type {\n QuartzComponent,\n QuartzComponentProps,\n QuartzPluginData,\n SortFn,\n ValidDateType,\n} from \"@quartz-community/types\";\nimport { formatDate } from \"@quartz-community/utils/date\";\nimport { byDateAndAlphabetical, getDate } from \"@quartz-community/utils/sort\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { resolveRelative } from \"../util/path\";\nimport style from \"./styles/recentNotes.scss\";\n\ntype QuartzComponentConstructor = (\n opts: Options,\n) => QuartzComponent;\n\ntype RecentNotesPluginData = QuartzPluginData & {\n slug?: string;\n filePath?: string;\n dates?: Record;\n frontmatter?: {\n title?: string;\n tags?: string[];\n [key: string]: unknown;\n };\n [key: string]: unknown;\n};\n\ninterface GlobalConfiguration {\n locale: string;\n defaultDateType: ValidDateType;\n [key: string]: unknown;\n}\n\nexport interface RecentNotesOptions {\n title?: string;\n limit: number;\n linkToMore: string | false;\n showTags: boolean;\n filter: (f: RecentNotesPluginData) => boolean;\n sort: SortFn;\n}\n\nconst withDefaultDateType = (\n data: RecentNotesPluginData,\n defaultDateType: ValidDateType,\n): QuartzPluginData => ({\n ...data,\n defaultDateType,\n});\n\nexport function filterListedPages(pages: T[]): T[] {\n return pages.filter((p) => (p as { unlisted?: unknown }).unlisted !== true);\n}\n\nconst byDateAndAlphabeticalWithConfig = (cfg: GlobalConfiguration): SortFn => {\n const sortFn = byDateAndAlphabetical();\n return (f1, f2) =>\n sortFn(\n withDefaultDateType(f1 as RecentNotesPluginData, cfg.defaultDateType),\n withDefaultDateType(f2 as RecentNotesPluginData, cfg.defaultDateType),\n );\n};\n\nconst defaultOptions = (cfg: GlobalConfiguration): RecentNotesOptions => ({\n limit: 3,\n linkToMore: false,\n showTags: true,\n filter: () => true,\n sort: byDateAndAlphabeticalWithConfig(cfg),\n});\n\nexport default ((userOpts?: Partial) => {\n const RecentNotes: QuartzComponent = ({\n allFiles,\n fileData,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const globalCfg = cfg as unknown as GlobalConfiguration;\n const opts = { ...defaultOptions(globalCfg), ...userOpts };\n const pages = filterListedPages(allFiles as RecentNotesPluginData[])\n .filter(opts.filter)\n .sort(opts.sort);\n const remaining = Math.max(0, pages.length - opts.limit);\n const slug = fileData.slug as string | undefined;\n const locale = cfg.locale ?? \"en-US\";\n return (\n
\n

{opts.title ?? i18n(locale).components.recentNotes.title}

\n
    \n {pages.slice(0, opts.limit).map((page) => {\n const title = page.frontmatter?.title ?? \"Untitled\";\n const tags = page.frontmatter?.tags ?? [];\n\n return (\n
  • \n
    \n
    \n

    \n \n {title}\n \n

    \n
    \n {page.dates && getDate(withDefaultDateType(page, globalCfg.defaultDateType)) && (\n

    \n \n {formatDate(\n getDate(withDefaultDateType(page, globalCfg.defaultDateType))!,\n locale,\n )}\n \n

    \n )}\n {opts.showTags && (\n \n )}\n
    \n
  • \n );\n })}\n
\n {opts.linkToMore && remaining > 0 && (\n

\n \n {i18n(locale).components.recentNotes.seeRemainingMore({ remaining })}\n \n

\n )}\n
\n );\n };\n\n RecentNotes.css = style;\n return RecentNotes;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index 09747ad..b5aefe7 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -20,6 +20,7 @@ interface RecentNotesOptions { filter: (f: RecentNotesPluginData) => boolean; sort: SortFn; } +declare function filterListedPages(pages: T[]): T[]; declare const _default: (userOpts?: Partial) => QuartzComponent; -export { _default as RecentNotes, type RecentNotesOptions }; +export { _default as RecentNotes, type RecentNotesOptions, filterListedPages }; diff --git a/dist/index.js b/dist/index.js index c98b323..a1796d5 100644 --- a/dist/index.js +++ b/dist/index.js @@ -446,6 +446,9 @@ var withDefaultDateType = (data, defaultDateType) => ({ ...data, defaultDateType }); +function filterListedPages(pages) { + return pages.filter((p) => p.unlisted !== true); +} var byDateAndAlphabeticalWithConfig = (cfg) => { const sortFn = byDateAndAlphabetical(); return (f1, f2) => sortFn( @@ -469,7 +472,7 @@ var RecentNotes_default = ((userOpts) => { }) => { const globalCfg = cfg; const opts = { ...defaultOptions(globalCfg), ...userOpts }; - const pages = allFiles.filter(opts.filter).sort(opts.sort); + const pages = filterListedPages(allFiles).filter(opts.filter).sort(opts.sort); const remaining = Math.max(0, pages.length - opts.limit); const slug2 = fileData.slug; const locale = cfg.locale ?? "en-US"; @@ -502,6 +505,6 @@ var RecentNotes_default = ((userOpts) => { return RecentNotes; }); -export { RecentNotes_default as RecentNotes }; +export { RecentNotes_default as RecentNotes, filterListedPages }; //# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index 88da9d2..e7d6e7f 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../node_modules/@quartz-community/utils/src/date.ts","../node_modules/@quartz-community/utils/src/sort.ts","../node_modules/@quartz-community/utils/src/lang.ts","../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","../node_modules/@quartz-community/utils/src/path.ts","../src/util/path.ts","../src/components/styles/recentNotes.scss","../src/components/RecentNotes.tsx"],"names":["simplifySlug","slug","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export function formatDate(d: Date, locale: string = \"en-US\"): string {\n return d.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"2-digit\",\n });\n}\n","import type { QuartzPluginData, ValidDateType, SortFn } from \"@quartz-community/types\";\n\nexport function getDate(data: QuartzPluginData): Date | undefined {\n const defaultDateType = data.defaultDateType as ValidDateType | undefined;\n if (!defaultDateType) {\n return undefined;\n }\n const dates = data.dates as Record | undefined;\n return dates?.[defaultDateType];\n}\n\nexport function byDateAndAlphabetical(): SortFn {\n return (f1, f2) => {\n const f1Date = getDate(f1);\n const f2Date = getDate(f2);\n if (f1Date && f2Date) {\n return f2Date.getTime() - f1Date.getTime();\n } else if (f1Date && !f2Date) {\n return -1;\n } else if (!f1Date && f2Date) {\n return 1;\n }\n\n const f1Title = (\n ((f1.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n const f2Title = (\n ((f2.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n return f1Title.localeCompare(f2Title);\n };\n}\n","export function capitalize(s: string): string {\n return s.substring(0, 1).toUpperCase() + s.substring(1);\n}\n\nexport function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"آخر الملاحظات\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `تصفح ${remaining} أكثر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Recents\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vegi ${remaining} més →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nejnovější poznámky\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zobraz ${remaining} dalších →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Zuletzt bearbeitete Seiten\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} weitere ansehen →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas Recientes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vea ${remaining} más →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"یادداشت‌های اخیر\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} یادداشت دیگر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Viimeisimmät muistiinpanot\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Näytä ${remaining} lisää →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Récentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Voir ${remaining} de plus →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"הערות אחרונות\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `עיין ב ${remaining} נוספים →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Legutóbbi jegyzetek\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `${remaining} további megtekintése →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Catatan Terbaru\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Lihat ${remaining} lagi →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Note recenti\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n remaining === 1 ? \"Vedi 1 altra →\" : `Vedi altre ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近の記事\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `さらに${remaining}件 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Соңғы жазбалар\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Тағы ${remaining} жазбаны қарау →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"최근 게시글\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining}건 더보기 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Naujausi Užrašai\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Peržiūrėti dar ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nylige notater\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Se ${remaining} til →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recente notities\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zie ${remaining} meer →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Najnowsze notatki\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Zobacz ${remaining} nastepnych →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas recentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Veja mais ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notițe recente\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vezi încă ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Недавние заметки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Посмотреть оставш${getForm(remaining, \"уюся\", \"иеся\", \"иеся\")} ${remaining} →`,\n },\n },\n};\n\nfunction getForm(number: number, form1: string, form2: string, form5: string): string {\n const remainder100 = number % 100;\n const remainder10 = remainder100 % 10;\n\n if (remainder100 >= 10 && remainder100 <= 20) return form5;\n if (remainder10 > 1 && remainder10 < 5) return form2;\n if (remainder10 == 1) return form1;\n return form5;\n}\n","export default {\n components: {\n recentNotes: {\n title: \"บันทึกล่าสุด\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `ดูเพิ่มอีก ${remaining} รายการ →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Son Notlar\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} tane daha gör →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Останні нотатки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Переглянути ще ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Ghi chú gần đây\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Xem thêm ${remaining} ghi chú →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的笔记\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多${remaining}篇笔记 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的筆記\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多 ${remaining} 篇筆記 →`,\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","import { slug as slugAnchor } from \"github-slugger\";\nimport type { FilePath, FullSlug } from \"@quartz-community/types\";\n\nexport type { FilePath, FullSlug };\n\n/** No '/index' ending, no file extension, can have trailing slash for folders. */\nexport type SimpleSlug = string & { _brand: \"SimpleSlug\" };\n\n/** Starts with './' or '../', used for navigation. */\nexport type RelativeURL = string & { _brand: \"RelativeURL\" };\n\nexport interface TransformOptions {\n strategy: \"absolute\" | \"relative\" | \"shortest\";\n allSlugs: FullSlug[];\n}\n\nexport function isFilePath(s: string): s is FilePath {\n const validStart = !s.startsWith(\".\");\n return validStart && _hasFileExtension(s);\n}\n\nexport function isFullSlug(s: string): s is FullSlug {\n const validStart = !(s.startsWith(\".\") || s.startsWith(\"/\"));\n const validEnding = !s.endsWith(\"/\");\n return validStart && validEnding && !_containsForbiddenCharacters(s);\n}\n\nexport function isSimpleSlug(s: string): s is SimpleSlug {\n const validStart = !(s.startsWith(\".\") || (s.length > 1 && s.startsWith(\"/\")));\n const validEnding = !endsWith(s, \"index\");\n return validStart && !_containsForbiddenCharacters(s) && validEnding && !_hasFileExtension(s);\n}\n\nexport function isRelativeURL(s: string): s is RelativeURL {\n const validStart = /^\\.{1,2}/.test(s);\n const validEnding = !endsWith(s, \"index\");\n return validStart && validEnding && ![\".md\", \".html\"].includes(getFileExtension(s) ?? \"\");\n}\n\nexport function isAbsoluteURL(s: string): boolean {\n try {\n new URL(s);\n } catch {\n return false;\n }\n return true;\n}\n\nexport function simplifySlug(fp: FullSlug | string): SimpleSlug {\n const res = stripSlashes(trimSuffix(fp, \"index\"), true);\n return (res.length === 0 ? \"/\" : res) as SimpleSlug;\n}\n\nexport function getFullSlug(window: Window): FullSlug {\n const res = window.document.body.dataset.slug! as FullSlug;\n return res;\n}\n\nexport function getFullSlugFromUrl(): FullSlug {\n let rawSlug = window.location.pathname;\n if (rawSlug.endsWith(\"/\")) rawSlug = rawSlug.slice(0, -1);\n if (rawSlug.startsWith(\"/\")) rawSlug = rawSlug.slice(1);\n return rawSlug as FullSlug;\n}\n\nexport function slugifyFilePath(fp: FilePath, excludeExt?: boolean): FullSlug {\n fp = stripSlashes(fp) as FilePath;\n const ext = getFileExtension(fp);\n const withoutFileExt = fp.replace(new RegExp(ext + \"$\"), \"\");\n const finalExt = excludeExt || [\".md\", \".html\", undefined].includes(ext) ? \"\" : ext;\n\n let slug = _sluggify(withoutFileExt);\n\n if (endsWith(slug, \"_index\")) {\n slug = slug.replace(/_index$/, \"index\");\n }\n\n return (slug + (finalExt ?? \"\")) as FullSlug;\n}\n\nexport function joinSegments(...args: string[]): string {\n if (args.length === 0) {\n return \"\";\n }\n\n let joined = args\n .filter((segment) => segment !== \"\" && segment !== \"/\")\n .map((segment) => stripSlashes(segment))\n .join(\"/\");\n\n const first = args[0];\n const last = args[args.length - 1];\n\n if (first?.startsWith(\"/\")) {\n joined = \"/\" + joined;\n }\n\n if (last?.endsWith(\"/\")) {\n joined = joined + \"/\";\n }\n\n return joined;\n}\n\nexport function resolvePath(to: string): string {\n if (to.startsWith(\"/\")) return to;\n return \"/\" + to;\n}\n\n/** Read the base path injected at build time via `data-basepath` on ``.\n * Returns `\"\"` for root deployments, e.g. `\"/repository\"` for subdirectory. */\nexport function getBasePath(): string {\n if (typeof document === \"undefined\") return \"\";\n return document.body?.dataset?.basepath ?? \"\";\n}\n\n/** Resolve a slug to an absolute URL path, prepending the site's base path.\n * e.g. `resolveBasePath(\"features/Callouts\")` → `\"/repository/features/Callouts\"` */\nexport function resolveBasePath(to: string, basePath?: string): string {\n const base = basePath ?? getBasePath();\n const slug = to.startsWith(\"/\") ? to : \"/\" + to;\n return base + slug;\n}\n\nexport function endsWith(s: string, suffix: string): boolean {\n return s === suffix || s.endsWith(\"/\" + suffix);\n}\n\nexport function trimSuffix(s: string, suffix: string): string {\n if (endsWith(s, suffix)) {\n s = s.slice(0, -suffix.length);\n }\n return s;\n}\n\nexport function stripSlashes(s: string, onlyStripPrefix?: boolean): string {\n if (s.startsWith(\"/\")) {\n s = s.substring(1);\n }\n\n if (!onlyStripPrefix && s.endsWith(\"/\")) {\n s = s.slice(0, -1);\n }\n\n return s;\n}\n\nexport function getFileExtension(s: string): string | undefined {\n return s.match(/\\.[A-Za-z0-9]+$/)?.[0];\n}\n\nexport function isFolderPath(fplike: string): boolean {\n return (\n fplike.endsWith(\"/\") ||\n endsWith(fplike, \"index\") ||\n endsWith(fplike, \"index.md\") ||\n endsWith(fplike, \"index.html\")\n );\n}\n\nexport function getAllSegmentPrefixes(path: string): string[] {\n const segments = path.split(\"/\");\n const results: string[] = [];\n for (let i = 0; i < segments.length; i++) {\n results.push(segments.slice(0, i + 1).join(\"/\"));\n }\n return results;\n}\n\nexport function pathToRoot(slug: FullSlug): RelativeURL {\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 as RelativeURL;\n}\n\nexport function resolveRelative(current: FullSlug, target: FullSlug | SimpleSlug): RelativeURL {\n const res = joinSegments(pathToRoot(current), simplifySlug(target as FullSlug)) as RelativeURL;\n return res;\n}\n\nexport function splitAnchor(link: string): [string, string] {\n const [fp, anchor] = link.split(\"#\", 2);\n if (fp!.endsWith(\".pdf\")) {\n return [fp!, anchor === undefined ? \"\" : `#${anchor}`];\n }\n const slugged = anchor === undefined ? \"\" : \"#\" + slugAnchor(anchor);\n return [fp!, slugged];\n}\n\nexport function slugTag(tag: string): string {\n return tag\n .split(\"/\")\n .map((tagSegment) => _sluggify(tagSegment))\n .join(\"/\");\n}\n\nexport function transformInternalLink(link: string): RelativeURL {\n const [fplike, anchor] = splitAnchor(decodeURI(link));\n\n const folderPath = isFolderPath(fplike);\n const segments = fplike.split(\"/\").filter((x) => x.length > 0);\n const prefix = segments.filter(_isRelativeSegment).join(\"/\");\n const fp = segments.filter((seg) => !_isRelativeSegment(seg) && seg !== \"\").join(\"/\");\n\n const simpleSlug = simplifySlug(slugifyFilePath(fp as FilePath));\n const joined = joinSegments(stripSlashes(prefix), stripSlashes(simpleSlug));\n const trail = folderPath ? \"/\" : \"\";\n const res = (_addRelativeToStart(joined) + trail + anchor) as RelativeURL;\n return res;\n}\n\nexport function transformLink(src: FullSlug, target: string, opts: TransformOptions): RelativeURL {\n const targetSlug = transformInternalLink(target);\n\n if (opts.strategy === \"relative\") {\n return targetSlug as RelativeURL;\n } else {\n // When src is a folder page (e.g. \"Compendium/Spells\" backed by index.md),\n // the browser serves it at \"/Compendium/Spells/\" with a trailing slash.\n // pathToRoot needs the \"/index\" suffix to compute the correct depth.\n const effectiveSrc =\n !endsWith(src, \"index\") && opts.allSlugs.includes(`${src}/index` as FullSlug)\n ? (`${src}/index` as FullSlug)\n : src;\n\n const folderTail = isFolderPath(targetSlug) ? \"/\" : \"\";\n const canonicalSlug = stripSlashes(targetSlug.slice(\".\".length));\n const [targetCanonical, targetAnchor] = splitAnchor(canonicalSlug);\n\n if (opts.strategy === \"shortest\") {\n const isMultiSegment = targetCanonical.includes(\"/\");\n const isFolderTarget = isFolderPath(targetSlug);\n const matchingFileNames = opts.allSlugs.filter((slug) => {\n if (isMultiSegment) {\n // Multi-segment partial path: match by suffix\n if (slug === targetCanonical || slug.endsWith(\"/\" + targetCanonical)) {\n return true;\n }\n // Folder targets have \"/index\" stripped — also match the \"/index\" variant\n if (isFolderTarget) {\n const withIndex = targetCanonical + \"/index\";\n return slug === withIndex || slug.endsWith(\"/\" + withIndex);\n }\n return false;\n }\n const parts = slug.split(\"/\");\n const fileName = parts.at(-1);\n return targetCanonical === fileName;\n });\n\n if (matchingFileNames.length === 1) {\n const matchedSlug = matchingFileNames[0]!;\n return (resolveRelative(effectiveSrc, matchedSlug) + targetAnchor) as RelativeURL;\n }\n }\n\n return (joinSegments(pathToRoot(effectiveSrc), canonicalSlug) + folderTail) as RelativeURL;\n }\n}\n\n/**\n * Slugify a file path for use as an href.\n * Replaces whitespace→hyphens, &→-and-, %→-percent, removes ? and #.\n * Operates per segment so directory separators are preserved.\n */\nexport function slugifyPath(s: string): string {\n return s\n .split(\"/\")\n .map((segment) =>\n segment\n .replace(/\\s/g, \"-\")\n .replace(/&/g, \"-and-\")\n .replace(/%/g, \"-percent\")\n .replace(/\\?/g, \"\")\n .replace(/#/g, \"\"),\n )\n .join(\"/\")\n .replace(/\\/$/, \"\");\n}\n\n/** @internal */\nfunction _sluggify(s: string): string {\n return slugifyPath(s);\n}\n\nfunction _containsForbiddenCharacters(s: string): boolean {\n return s.includes(\" \") || s.includes(\"#\") || s.includes(\"?\") || s.includes(\"&\");\n}\n\nfunction _hasFileExtension(s: string): boolean {\n return getFileExtension(s) !== undefined;\n}\n\nfunction _isRelativeSegment(s: string): boolean {\n return /^\\.{0,2}$/.test(s);\n}\n\nfunction _addRelativeToStart(s: string): string {\n if (s === \"\") {\n s = \".\";\n }\n\n if (!s.startsWith(\".\")) {\n s = joinSegments(\".\", s);\n }\n\n return s;\n}\n","import { simplifySlug as utilSimplifySlug, joinSegments } from \"@quartz-community/utils\";\n\nexport function simplifySlug(fp: string): string {\n return utilSimplifySlug(fp);\n}\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\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",".recent-notes > h3 {\n margin: 0.5rem 0 0 0;\n font-size: 1rem;\n}\n.recent-notes > ul.recent-ul {\n list-style: none;\n margin-top: 1rem;\n padding-left: 0;\n}\n.recent-notes > ul.recent-ul > li {\n margin: 1rem 0;\n}\n.recent-notes > ul.recent-ul > li .section > .desc > h3 > a {\n background-color: transparent;\n}\n.recent-notes > ul.recent-ul > li .section > .meta {\n margin: 0 0 0.5rem 0;\n opacity: 0.6;\n}","import type {\n QuartzComponent,\n QuartzComponentProps,\n QuartzPluginData,\n SortFn,\n ValidDateType,\n} from \"@quartz-community/types\";\nimport { formatDate } from \"@quartz-community/utils/date\";\nimport { byDateAndAlphabetical, getDate } from \"@quartz-community/utils/sort\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { resolveRelative } from \"../util/path\";\nimport style from \"./styles/recentNotes.scss\";\n\ntype QuartzComponentConstructor = (\n opts: Options,\n) => QuartzComponent;\n\ntype RecentNotesPluginData = QuartzPluginData & {\n slug?: string;\n filePath?: string;\n dates?: Record;\n frontmatter?: {\n title?: string;\n tags?: string[];\n [key: string]: unknown;\n };\n [key: string]: unknown;\n};\n\ninterface GlobalConfiguration {\n locale: string;\n defaultDateType: ValidDateType;\n [key: string]: unknown;\n}\n\nexport interface RecentNotesOptions {\n title?: string;\n limit: number;\n linkToMore: string | false;\n showTags: boolean;\n filter: (f: RecentNotesPluginData) => boolean;\n sort: SortFn;\n}\n\nconst withDefaultDateType = (\n data: RecentNotesPluginData,\n defaultDateType: ValidDateType,\n): QuartzPluginData => ({\n ...data,\n defaultDateType,\n});\n\nconst byDateAndAlphabeticalWithConfig = (cfg: GlobalConfiguration): SortFn => {\n const sortFn = byDateAndAlphabetical();\n return (f1, f2) =>\n sortFn(\n withDefaultDateType(f1 as RecentNotesPluginData, cfg.defaultDateType),\n withDefaultDateType(f2 as RecentNotesPluginData, cfg.defaultDateType),\n );\n};\n\nconst defaultOptions = (cfg: GlobalConfiguration): RecentNotesOptions => ({\n limit: 3,\n linkToMore: false,\n showTags: true,\n filter: () => true,\n sort: byDateAndAlphabeticalWithConfig(cfg),\n});\n\nexport default ((userOpts?: Partial) => {\n const RecentNotes: QuartzComponent = ({\n allFiles,\n fileData,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const globalCfg = cfg as unknown as GlobalConfiguration;\n const opts = { ...defaultOptions(globalCfg), ...userOpts };\n const pages = (allFiles as RecentNotesPluginData[]).filter(opts.filter).sort(opts.sort);\n const remaining = Math.max(0, pages.length - opts.limit);\n const slug = fileData.slug as string | undefined;\n const locale = cfg.locale ?? \"en-US\";\n return (\n
\n

{opts.title ?? i18n(locale).components.recentNotes.title}

\n
    \n {pages.slice(0, opts.limit).map((page) => {\n const title = page.frontmatter?.title ?? \"Untitled\";\n const tags = page.frontmatter?.tags ?? [];\n\n return (\n
  • \n
    \n
    \n

    \n \n {title}\n \n

    \n
    \n {page.dates && getDate(withDefaultDateType(page, globalCfg.defaultDateType)) && (\n

    \n \n {formatDate(\n getDate(withDefaultDateType(page, globalCfg.defaultDateType))!,\n locale,\n )}\n \n

    \n )}\n {opts.showTags && (\n \n )}\n
    \n
  • \n );\n })}\n
\n {opts.linkToMore && remaining > 0 && (\n

\n \n {i18n(locale).components.recentNotes.seeRemainingMore({ remaining })}\n \n

\n )}\n
\n );\n };\n\n RecentNotes.css = style;\n return RecentNotes;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file +{"version":3,"sources":["../node_modules/@quartz-community/utils/src/date.ts","../node_modules/@quartz-community/utils/src/sort.ts","../node_modules/@quartz-community/utils/src/lang.ts","../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","../node_modules/@quartz-community/utils/src/path.ts","../src/util/path.ts","../src/components/styles/recentNotes.scss","../src/components/RecentNotes.tsx"],"names":["simplifySlug","slug","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export function formatDate(d: Date, locale: string = \"en-US\"): string {\n return d.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"2-digit\",\n });\n}\n","import type { QuartzPluginData, ValidDateType, SortFn } from \"@quartz-community/types\";\n\nexport function getDate(data: QuartzPluginData): Date | undefined {\n const defaultDateType = data.defaultDateType as ValidDateType | undefined;\n if (!defaultDateType) {\n return undefined;\n }\n const dates = data.dates as Record | undefined;\n return dates?.[defaultDateType];\n}\n\nexport function byDateAndAlphabetical(): SortFn {\n return (f1, f2) => {\n const f1Date = getDate(f1);\n const f2Date = getDate(f2);\n if (f1Date && f2Date) {\n return f2Date.getTime() - f1Date.getTime();\n } else if (f1Date && !f2Date) {\n return -1;\n } else if (!f1Date && f2Date) {\n return 1;\n }\n\n const f1Title = (\n ((f1.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n const f2Title = (\n ((f2.frontmatter as Record)?.title as string) ?? \"\"\n ).toLowerCase();\n return f1Title.localeCompare(f2Title);\n };\n}\n","export function capitalize(s: string): string {\n return s.substring(0, 1).toUpperCase() + s.substring(1);\n}\n\nexport function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"آخر الملاحظات\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `تصفح ${remaining} أكثر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Recents\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vegi ${remaining} més →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nejnovější poznámky\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zobraz ${remaining} dalších →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Zuletzt bearbeitete Seiten\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} weitere ansehen →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recent Notes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `See ${remaining} more →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas Recientes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vea ${remaining} más →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"یادداشت‌های اخیر\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} یادداشت دیگر →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Viimeisimmät muistiinpanot\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Näytä ${remaining} lisää →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notes Récentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Voir ${remaining} de plus →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"הערות אחרונות\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `עיין ב ${remaining} נוספים →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Legutóbbi jegyzetek\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `${remaining} további megtekintése →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Catatan Terbaru\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Lihat ${remaining} lagi →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Note recenti\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n remaining === 1 ? \"Vedi 1 altra →\" : `Vedi altre ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近の記事\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `さらに${remaining}件 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Соңғы жазбалар\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Тағы ${remaining} жазбаны қарау →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"최근 게시글\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining}건 더보기 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Naujausi Užrašai\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Peržiūrėti dar ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Nylige notater\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Se ${remaining} til →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Recente notities\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Zie ${remaining} meer →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Najnowsze notatki\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Zobacz ${remaining} nastepnych →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notas recentes\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Veja mais ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Notițe recente\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Vezi încă ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Недавние заметки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `Посмотреть оставш${getForm(remaining, \"уюся\", \"иеся\", \"иеся\")} ${remaining} →`,\n },\n },\n};\n\nfunction getForm(number: number, form1: string, form2: string, form5: string): string {\n const remainder100 = number % 100;\n const remainder10 = remainder100 % 10;\n\n if (remainder100 >= 10 && remainder100 <= 20) return form5;\n if (remainder10 > 1 && remainder10 < 5) return form2;\n if (remainder10 == 1) return form1;\n return form5;\n}\n","export default {\n components: {\n recentNotes: {\n title: \"บันทึกล่าสุด\",\n seeRemainingMore: ({ remaining }: { remaining: number }) =>\n `ดูเพิ่มอีก ${remaining} รายการ →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Son Notlar\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `${remaining} tane daha gör →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Останні нотатки\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Переглянути ще ${remaining} →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"Ghi chú gần đây\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `Xem thêm ${remaining} ghi chú →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的笔记\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多${remaining}篇笔记 →`,\n },\n },\n};\n","export default {\n components: {\n recentNotes: {\n title: \"最近的筆記\",\n seeRemainingMore: ({ remaining }: { remaining: number }) => `查看更多 ${remaining} 篇筆記 →`,\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","import { slug as slugAnchor } from \"github-slugger\";\nimport type { FilePath, FullSlug } from \"@quartz-community/types\";\n\nexport type { FilePath, FullSlug };\n\n/** No '/index' ending, no file extension, can have trailing slash for folders. */\nexport type SimpleSlug = string & { _brand: \"SimpleSlug\" };\n\n/** Starts with './' or '../', used for navigation. */\nexport type RelativeURL = string & { _brand: \"RelativeURL\" };\n\nexport interface TransformOptions {\n strategy: \"absolute\" | \"relative\" | \"shortest\";\n allSlugs: FullSlug[];\n}\n\nexport function isFilePath(s: string): s is FilePath {\n const validStart = !s.startsWith(\".\");\n return validStart && _hasFileExtension(s);\n}\n\nexport function isFullSlug(s: string): s is FullSlug {\n const validStart = !(s.startsWith(\".\") || s.startsWith(\"/\"));\n const validEnding = !s.endsWith(\"/\");\n return validStart && validEnding && !_containsForbiddenCharacters(s);\n}\n\nexport function isSimpleSlug(s: string): s is SimpleSlug {\n const validStart = !(s.startsWith(\".\") || (s.length > 1 && s.startsWith(\"/\")));\n const validEnding = !endsWith(s, \"index\");\n return validStart && !_containsForbiddenCharacters(s) && validEnding && !_hasFileExtension(s);\n}\n\nexport function isRelativeURL(s: string): s is RelativeURL {\n const validStart = /^\\.{1,2}/.test(s);\n const validEnding = !endsWith(s, \"index\");\n return validStart && validEnding && ![\".md\", \".html\"].includes(getFileExtension(s) ?? \"\");\n}\n\nexport function isAbsoluteURL(s: string): boolean {\n try {\n new URL(s);\n } catch {\n return false;\n }\n return true;\n}\n\nexport function simplifySlug(fp: FullSlug | string): SimpleSlug {\n const res = stripSlashes(trimSuffix(fp, \"index\"), true);\n return (res.length === 0 ? \"/\" : res) as SimpleSlug;\n}\n\nexport function getFullSlug(window: Window): FullSlug {\n const res = window.document.body.dataset.slug! as FullSlug;\n return res;\n}\n\nexport function getFullSlugFromUrl(): FullSlug {\n let rawSlug = window.location.pathname;\n if (rawSlug.endsWith(\"/\")) rawSlug = rawSlug.slice(0, -1);\n if (rawSlug.startsWith(\"/\")) rawSlug = rawSlug.slice(1);\n return rawSlug as FullSlug;\n}\n\nexport function slugifyFilePath(fp: FilePath, excludeExt?: boolean): FullSlug {\n fp = stripSlashes(fp) as FilePath;\n const ext = getFileExtension(fp);\n const withoutFileExt = fp.replace(new RegExp(ext + \"$\"), \"\");\n const finalExt = excludeExt || [\".md\", \".html\", undefined].includes(ext) ? \"\" : ext;\n\n let slug = _sluggify(withoutFileExt);\n\n if (endsWith(slug, \"_index\")) {\n slug = slug.replace(/_index$/, \"index\");\n }\n\n return (slug + (finalExt ?? \"\")) as FullSlug;\n}\n\nexport function joinSegments(...args: string[]): string {\n if (args.length === 0) {\n return \"\";\n }\n\n let joined = args\n .filter((segment) => segment !== \"\" && segment !== \"/\")\n .map((segment) => stripSlashes(segment))\n .join(\"/\");\n\n const first = args[0];\n const last = args[args.length - 1];\n\n if (first?.startsWith(\"/\")) {\n joined = \"/\" + joined;\n }\n\n if (last?.endsWith(\"/\")) {\n joined = joined + \"/\";\n }\n\n return joined;\n}\n\nexport function resolvePath(to: string): string {\n if (to.startsWith(\"/\")) return to;\n return \"/\" + to;\n}\n\n/** Read the base path injected at build time via `data-basepath` on ``.\n * Returns `\"\"` for root deployments, e.g. `\"/repository\"` for subdirectory. */\nexport function getBasePath(): string {\n if (typeof document === \"undefined\") return \"\";\n return document.body?.dataset?.basepath ?? \"\";\n}\n\n/** Resolve a slug to an absolute URL path, prepending the site's base path.\n * e.g. `resolveBasePath(\"features/Callouts\")` → `\"/repository/features/Callouts\"` */\nexport function resolveBasePath(to: string, basePath?: string): string {\n const base = basePath ?? getBasePath();\n const slug = to.startsWith(\"/\") ? to : \"/\" + to;\n return base + slug;\n}\n\nexport function endsWith(s: string, suffix: string): boolean {\n return s === suffix || s.endsWith(\"/\" + suffix);\n}\n\nexport function trimSuffix(s: string, suffix: string): string {\n if (endsWith(s, suffix)) {\n s = s.slice(0, -suffix.length);\n }\n return s;\n}\n\nexport function stripSlashes(s: string, onlyStripPrefix?: boolean): string {\n if (s.startsWith(\"/\")) {\n s = s.substring(1);\n }\n\n if (!onlyStripPrefix && s.endsWith(\"/\")) {\n s = s.slice(0, -1);\n }\n\n return s;\n}\n\nexport function getFileExtension(s: string): string | undefined {\n return s.match(/\\.[A-Za-z0-9]+$/)?.[0];\n}\n\nexport function isFolderPath(fplike: string): boolean {\n return (\n fplike.endsWith(\"/\") ||\n endsWith(fplike, \"index\") ||\n endsWith(fplike, \"index.md\") ||\n endsWith(fplike, \"index.html\")\n );\n}\n\nexport function getAllSegmentPrefixes(path: string): string[] {\n const segments = path.split(\"/\");\n const results: string[] = [];\n for (let i = 0; i < segments.length; i++) {\n results.push(segments.slice(0, i + 1).join(\"/\"));\n }\n return results;\n}\n\nexport function pathToRoot(slug: FullSlug): RelativeURL {\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 as RelativeURL;\n}\n\nexport function resolveRelative(current: FullSlug, target: FullSlug | SimpleSlug): RelativeURL {\n const res = joinSegments(pathToRoot(current), simplifySlug(target as FullSlug)) as RelativeURL;\n return res;\n}\n\nexport function splitAnchor(link: string): [string, string] {\n const [fp, anchor] = link.split(\"#\", 2);\n if (fp!.endsWith(\".pdf\")) {\n return [fp!, anchor === undefined ? \"\" : `#${anchor}`];\n }\n const slugged = anchor === undefined ? \"\" : \"#\" + slugAnchor(anchor);\n return [fp!, slugged];\n}\n\nexport function slugTag(tag: string): string {\n return tag\n .split(\"/\")\n .map((tagSegment) => _sluggify(tagSegment))\n .join(\"/\");\n}\n\nexport function transformInternalLink(link: string): RelativeURL {\n const [fplike, anchor] = splitAnchor(decodeURI(link));\n\n const folderPath = isFolderPath(fplike);\n const segments = fplike.split(\"/\").filter((x) => x.length > 0);\n const prefix = segments.filter(_isRelativeSegment).join(\"/\");\n const fp = segments.filter((seg) => !_isRelativeSegment(seg) && seg !== \"\").join(\"/\");\n\n const simpleSlug = simplifySlug(slugifyFilePath(fp as FilePath));\n const joined = joinSegments(stripSlashes(prefix), stripSlashes(simpleSlug));\n const trail = folderPath ? \"/\" : \"\";\n const res = (_addRelativeToStart(joined) + trail + anchor) as RelativeURL;\n return res;\n}\n\nexport function transformLink(src: FullSlug, target: string, opts: TransformOptions): RelativeURL {\n const targetSlug = transformInternalLink(target);\n\n if (opts.strategy === \"relative\") {\n return targetSlug as RelativeURL;\n } else {\n // When src is a folder page (e.g. \"Compendium/Spells\" backed by index.md),\n // the browser serves it at \"/Compendium/Spells/\" with a trailing slash.\n // pathToRoot needs the \"/index\" suffix to compute the correct depth.\n const effectiveSrc =\n !endsWith(src, \"index\") && opts.allSlugs.includes(`${src}/index` as FullSlug)\n ? (`${src}/index` as FullSlug)\n : src;\n\n const folderTail = isFolderPath(targetSlug) ? \"/\" : \"\";\n const canonicalSlug = stripSlashes(targetSlug.slice(\".\".length));\n const [targetCanonical, targetAnchor] = splitAnchor(canonicalSlug);\n\n if (opts.strategy === \"shortest\") {\n const isMultiSegment = targetCanonical.includes(\"/\");\n const isFolderTarget = isFolderPath(targetSlug);\n const matchingFileNames = opts.allSlugs.filter((slug) => {\n if (isMultiSegment) {\n // Multi-segment partial path: match by suffix\n if (slug === targetCanonical || slug.endsWith(\"/\" + targetCanonical)) {\n return true;\n }\n // Folder targets have \"/index\" stripped — also match the \"/index\" variant\n if (isFolderTarget) {\n const withIndex = targetCanonical + \"/index\";\n return slug === withIndex || slug.endsWith(\"/\" + withIndex);\n }\n return false;\n }\n const parts = slug.split(\"/\");\n const fileName = parts.at(-1);\n return targetCanonical === fileName;\n });\n\n if (matchingFileNames.length === 1) {\n const matchedSlug = matchingFileNames[0]!;\n return (resolveRelative(effectiveSrc, matchedSlug) + targetAnchor) as RelativeURL;\n }\n }\n\n return (joinSegments(pathToRoot(effectiveSrc), canonicalSlug) + folderTail) as RelativeURL;\n }\n}\n\n/**\n * Slugify a file path for use as an href.\n * Replaces whitespace→hyphens, &→-and-, %→-percent, removes ? and #.\n * Operates per segment so directory separators are preserved.\n */\nexport function slugifyPath(s: string): string {\n return s\n .split(\"/\")\n .map((segment) =>\n segment\n .replace(/\\s/g, \"-\")\n .replace(/&/g, \"-and-\")\n .replace(/%/g, \"-percent\")\n .replace(/\\?/g, \"\")\n .replace(/#/g, \"\"),\n )\n .join(\"/\")\n .replace(/\\/$/, \"\");\n}\n\n/** @internal */\nfunction _sluggify(s: string): string {\n return slugifyPath(s);\n}\n\nfunction _containsForbiddenCharacters(s: string): boolean {\n return s.includes(\" \") || s.includes(\"#\") || s.includes(\"?\") || s.includes(\"&\");\n}\n\nfunction _hasFileExtension(s: string): boolean {\n return getFileExtension(s) !== undefined;\n}\n\nfunction _isRelativeSegment(s: string): boolean {\n return /^\\.{0,2}$/.test(s);\n}\n\nfunction _addRelativeToStart(s: string): string {\n if (s === \"\") {\n s = \".\";\n }\n\n if (!s.startsWith(\".\")) {\n s = joinSegments(\".\", s);\n }\n\n return s;\n}\n","import { simplifySlug as utilSimplifySlug, joinSegments } from \"@quartz-community/utils\";\n\nexport function simplifySlug(fp: string): string {\n return utilSimplifySlug(fp);\n}\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\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",".recent-notes > h3 {\n margin: 0.5rem 0 0 0;\n font-size: 1rem;\n}\n.recent-notes > ul.recent-ul {\n list-style: none;\n margin-top: 1rem;\n padding-left: 0;\n}\n.recent-notes > ul.recent-ul > li {\n margin: 1rem 0;\n}\n.recent-notes > ul.recent-ul > li .section > .desc > h3 > a {\n background-color: transparent;\n}\n.recent-notes > ul.recent-ul > li .section > .meta {\n margin: 0 0 0.5rem 0;\n opacity: 0.6;\n}","import type {\n QuartzComponent,\n QuartzComponentProps,\n QuartzPluginData,\n SortFn,\n ValidDateType,\n} from \"@quartz-community/types\";\nimport { formatDate } from \"@quartz-community/utils/date\";\nimport { byDateAndAlphabetical, getDate } from \"@quartz-community/utils/sort\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport { resolveRelative } from \"../util/path\";\nimport style from \"./styles/recentNotes.scss\";\n\ntype QuartzComponentConstructor = (\n opts: Options,\n) => QuartzComponent;\n\ntype RecentNotesPluginData = QuartzPluginData & {\n slug?: string;\n filePath?: string;\n dates?: Record;\n frontmatter?: {\n title?: string;\n tags?: string[];\n [key: string]: unknown;\n };\n [key: string]: unknown;\n};\n\ninterface GlobalConfiguration {\n locale: string;\n defaultDateType: ValidDateType;\n [key: string]: unknown;\n}\n\nexport interface RecentNotesOptions {\n title?: string;\n limit: number;\n linkToMore: string | false;\n showTags: boolean;\n filter: (f: RecentNotesPluginData) => boolean;\n sort: SortFn;\n}\n\nconst withDefaultDateType = (\n data: RecentNotesPluginData,\n defaultDateType: ValidDateType,\n): QuartzPluginData => ({\n ...data,\n defaultDateType,\n});\n\nexport function filterListedPages(pages: T[]): T[] {\n return pages.filter((p) => (p as { unlisted?: unknown }).unlisted !== true);\n}\n\nconst byDateAndAlphabeticalWithConfig = (cfg: GlobalConfiguration): SortFn => {\n const sortFn = byDateAndAlphabetical();\n return (f1, f2) =>\n sortFn(\n withDefaultDateType(f1 as RecentNotesPluginData, cfg.defaultDateType),\n withDefaultDateType(f2 as RecentNotesPluginData, cfg.defaultDateType),\n );\n};\n\nconst defaultOptions = (cfg: GlobalConfiguration): RecentNotesOptions => ({\n limit: 3,\n linkToMore: false,\n showTags: true,\n filter: () => true,\n sort: byDateAndAlphabeticalWithConfig(cfg),\n});\n\nexport default ((userOpts?: Partial) => {\n const RecentNotes: QuartzComponent = ({\n allFiles,\n fileData,\n displayClass,\n cfg,\n }: QuartzComponentProps & { displayClass?: string }) => {\n const globalCfg = cfg as unknown as GlobalConfiguration;\n const opts = { ...defaultOptions(globalCfg), ...userOpts };\n const pages = filterListedPages(allFiles as RecentNotesPluginData[])\n .filter(opts.filter)\n .sort(opts.sort);\n const remaining = Math.max(0, pages.length - opts.limit);\n const slug = fileData.slug as string | undefined;\n const locale = cfg.locale ?? \"en-US\";\n return (\n
\n

{opts.title ?? i18n(locale).components.recentNotes.title}

\n
    \n {pages.slice(0, opts.limit).map((page) => {\n const title = page.frontmatter?.title ?? \"Untitled\";\n const tags = page.frontmatter?.tags ?? [];\n\n return (\n
  • \n
    \n
    \n

    \n \n {title}\n \n

    \n
    \n {page.dates && getDate(withDefaultDateType(page, globalCfg.defaultDateType)) && (\n

    \n \n {formatDate(\n getDate(withDefaultDateType(page, globalCfg.defaultDateType))!,\n locale,\n )}\n \n

    \n )}\n {opts.showTags && (\n \n )}\n
    \n
  • \n );\n })}\n
\n {opts.linkToMore && remaining > 0 && (\n

\n \n {i18n(locale).components.recentNotes.seeRemainingMore({ remaining })}\n \n

\n )}\n
\n );\n };\n\n RecentNotes.css = style;\n return RecentNotes;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file diff --git a/src/components/RecentNotes.tsx b/src/components/RecentNotes.tsx index bfa2d23..89add9a 100644 --- a/src/components/RecentNotes.tsx +++ b/src/components/RecentNotes.tsx @@ -51,6 +51,10 @@ const withDefaultDateType = ( defaultDateType, }); +export function filterListedPages(pages: T[]): T[] { + return pages.filter((p) => (p as { unlisted?: unknown }).unlisted !== true); +} + const byDateAndAlphabeticalWithConfig = (cfg: GlobalConfiguration): SortFn => { const sortFn = byDateAndAlphabetical(); return (f1, f2) => @@ -77,7 +81,9 @@ export default ((userOpts?: Partial) => { }: QuartzComponentProps & { displayClass?: string }) => { const globalCfg = cfg as unknown as GlobalConfiguration; const opts = { ...defaultOptions(globalCfg), ...userOpts }; - const pages = (allFiles as RecentNotesPluginData[]).filter(opts.filter).sort(opts.sort); + const pages = filterListedPages(allFiles as RecentNotesPluginData[]) + .filter(opts.filter) + .sort(opts.sort); const remaining = Math.max(0, pages.length - opts.limit); const slug = fileData.slug as string | undefined; const locale = cfg.locale ?? "en-US"; diff --git a/src/index.ts b/src/index.ts index 36641ba..d8edcc9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -export { default as RecentNotes } from "./components/RecentNotes"; +export { default as RecentNotes, filterListedPages } from "./components/RecentNotes"; export type { RecentNotesOptions } from "./components/RecentNotes"; // Re-export shared types from @quartz-community/types diff --git a/test/component.test.ts b/test/component.test.ts index 96ebdae..c739083 100644 --- a/test/component.test.ts +++ b/test/component.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { RecentNotes } from "../src/index"; +import { RecentNotes, filterListedPages } from "../src/index"; describe("RecentNotes", () => { it("is exported as a function", () => { @@ -12,3 +12,25 @@ describe("RecentNotes", () => { expect(typeof component.css).toBe("string"); }); }); + +describe("filterListedPages", () => { + it("excludes pages marked unlisted: true", () => { + const pages = [ + { slug: "a" }, + { slug: "b", unlisted: true }, + { slug: "c" }, + { slug: "d", unlisted: false }, + ]; + const result = filterListedPages(pages); + expect(result.map((p) => p.slug)).toEqual(["a", "c", "d"]); + }); + + it("returns pages unchanged when none are unlisted", () => { + const pages = [{ slug: "a" }, { slug: "b" }]; + expect(filterListedPages(pages)).toEqual(pages); + }); + + it("handles empty input", () => { + expect(filterListedPages([])).toEqual([]); + }); +});