From 18e52cb0cb0062ff052e114d85fe867dbfa384dd Mon Sep 17 00:00:00 2001 From: saberzero1 Date: Sat, 14 Mar 2026 22:01:54 +0100 Subject: [PATCH] chore: commit dist/ and remove prepare script Pre-built output is now committed to the repository so that Quartz can skip the build step during plugin installation. The prepare script is removed to prevent redundant builds when installing from npm/git. --- .gitignore | 1 - dist/PageList-DncPcZ4-.d.ts | 21 +++ dist/components/index.d.ts | 11 ++ dist/components/index.js | 271 ++++++++++++++++++++++++++++++++ dist/components/index.js.map | 1 + dist/index.d.ts | 4 + dist/index.js | 296 +++++++++++++++++++++++++++++++++++ dist/index.js.map | 1 + dist/types-BWrP_Ur0.d.ts | 10 ++ dist/types.d.ts | 3 + dist/types.js | 3 + dist/types.js.map | 1 + package-lock.json | 14 +- package.json | 1 - 14 files changed, 630 insertions(+), 8 deletions(-) create mode 100644 dist/PageList-DncPcZ4-.d.ts create mode 100644 dist/components/index.d.ts create mode 100644 dist/components/index.js create mode 100644 dist/components/index.js.map create mode 100644 dist/index.d.ts create mode 100644 dist/index.js create mode 100644 dist/index.js.map create mode 100644 dist/types-BWrP_Ur0.d.ts create mode 100644 dist/types.d.ts create mode 100644 dist/types.js create mode 100644 dist/types.js.map diff --git a/.gitignore b/.gitignore index 657842b..ef88793 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ node_modules/ .pnp.js # Build output -dist/ build/ *.tsbuildinfo diff --git a/dist/PageList-DncPcZ4-.d.ts b/dist/PageList-DncPcZ4-.d.ts new file mode 100644 index 0000000..98cb085 --- /dev/null +++ b/dist/PageList-DncPcZ4-.d.ts @@ -0,0 +1,21 @@ +import { QuartzComponent } from '@quartz-community/types'; + +interface PageData { + slug?: string; + frontmatter?: { + title?: string; + tags?: string[]; + }; + dates?: { + created: Date; + modified: Date; + published: Date; + }; + [key: string]: unknown; +} +type SortFn = (f1: PageData, f2: PageData) => number; +declare function byDateAndAlphabetical(cfg: unknown): SortFn; +declare function byDateAndAlphabeticalFolderFirst(cfg: unknown): SortFn; +declare const PageList: QuartzComponent; + +export { PageList as P, type SortFn as S, byDateAndAlphabeticalFolderFirst as a, byDateAndAlphabetical as b }; diff --git a/dist/components/index.d.ts b/dist/components/index.d.ts new file mode 100644 index 0000000..1b7d9b9 --- /dev/null +++ b/dist/components/index.d.ts @@ -0,0 +1,11 @@ +import { QuartzComponent } from '@quartz-community/types'; +import { S as SortFn } from '../PageList-DncPcZ4-.js'; +export { P as PageList, b as byDateAndAlphabetical, a as byDateAndAlphabeticalFolderFirst } from '../PageList-DncPcZ4-.js'; + +interface TagContentOptions { + sort?: SortFn; + numPages: number; +} +declare const _default: (opts?: Partial) => QuartzComponent; + +export { SortFn, _default as TagContent }; diff --git a/dist/components/index.js b/dist/components/index.js new file mode 100644 index 0000000..8071e29 --- /dev/null +++ b/dist/components/index.js @@ -0,0 +1,271 @@ +import { jsx, jsxs, Fragment } from 'preact/jsx-runtime'; +import { htmlToJsx } from '@quartz-community/utils/jsx'; + +// src/util/path.ts +function joinSegments(...args) { + if (args.length === 0) return ""; + let joined = args.filter((segment) => segment !== "" && segment !== "/").map((segment) => stripSlashes(segment)).join("/"); + const first = args[0]; + const last = args[args.length - 1]; + if (first?.startsWith("/")) joined = "/" + joined; + if (last?.endsWith("/")) joined = joined + "/"; + return joined; +} +function stripSlashes(s, onlyStripPrefix) { + if (s.startsWith("/")) s = s.substring(1); + if (!onlyStripPrefix && s.endsWith("/")) s = s.slice(0, -1); + return s; +} +function simplifySlug(fp) { + const res = stripSlashes(trimSuffix(fp, "index"), true); + return res.length === 0 ? "/" : res; +} +function trimSuffix(s, suffix) { + if (endsWith(s, suffix)) s = s.slice(0, -suffix.length); + return s; +} +function endsWith(s, suffix) { + return s === suffix || s.endsWith("/" + suffix); +} +function pathToRoot(slug) { + let rootPath = slug.split("/").filter((x) => x !== "").slice(0, -1).map((_) => "..").join("/"); + if (rootPath.length === 0) rootPath = "."; + return rootPath; +} +function resolveRelative(current, target) { + return joinSegments(pathToRoot(current), simplifySlug(target)); +} +function isFolderPath(fplike) { + return fplike.endsWith("/") || endsWith(fplike, "index") || endsWith(fplike, "index.md") || endsWith(fplike, "index.html"); +} +function getAllSegmentPrefixes(tags) { + const segments = tags.split("/"); + const results = []; + for (let i = 0; i < segments.length; i++) { + results.push(segments.slice(0, i + 1).join("/")); + } + return results; +} +function getDate(cfg, data) { + const type = cfg?.defaultDateType ?? "created"; + return data.dates?.[type]; +} +function byDateAndAlphabetical(cfg) { + return (f1, f2) => { + if (f1.dates && f2.dates) { + return (getDate(cfg, f2)?.getTime() ?? 0) - (getDate(cfg, f1)?.getTime() ?? 0); + } else if (f1.dates && !f2.dates) { + return -1; + } else if (!f1.dates && f2.dates) { + return 1; + } + const f1Title = f1.frontmatter?.title?.toLowerCase() ?? ""; + const f2Title = f2.frontmatter?.title?.toLowerCase() ?? ""; + return f1Title.localeCompare(f2Title); + }; +} +function byDateAndAlphabeticalFolderFirst(cfg) { + return (f1, f2) => { + const f1IsFolder = isFolderPath(f1.slug ?? ""); + const f2IsFolder = isFolderPath(f2.slug ?? ""); + if (f1IsFolder && !f2IsFolder) return -1; + if (!f1IsFolder && f2IsFolder) return 1; + if (f1.dates && f2.dates) { + return (getDate(cfg, f2)?.getTime() ?? 0) - (getDate(cfg, f1)?.getTime() ?? 0); + } else if (f1.dates && !f2.dates) { + return -1; + } else if (!f1.dates && f2.dates) { + return 1; + } + const f1Title = f1.frontmatter?.title?.toLowerCase() ?? ""; + const f2Title = f2.frontmatter?.title?.toLowerCase() ?? ""; + return f1Title.localeCompare(f2Title); + }; +} +function DateDisplay({ date, locale }) { + return /* @__PURE__ */ jsx("time", { dateTime: date.toISOString(), children: date.toLocaleDateString(locale, { + year: "numeric", + month: "short", + day: "2-digit" + }) }); +} +var PageList = ({ + cfg, + fileData, + allFiles, + limit, + sort +}) => { + const sorter = sort ?? byDateAndAlphabeticalFolderFirst(cfg); + let list = [...allFiles].sort(sorter); + if (limit) { + list = list.slice(0, limit); + } + const fileSlug = fileData?.slug; + return /* @__PURE__ */ jsx("ul", { class: "section-ul", children: list.map((page) => { + const title = page.frontmatter?.title; + const tags = page.frontmatter?.tags ?? []; + return /* @__PURE__ */ jsx("li", { class: "section-li", children: /* @__PURE__ */ jsxs("div", { class: "section", children: [ + /* @__PURE__ */ jsx("p", { class: "meta", children: page.dates && /* @__PURE__ */ jsx( + DateDisplay, + { + date: getDate(cfg, page), + locale: cfg?.locale ?? "en-US" + } + ) }), + /* @__PURE__ */ jsx("div", { class: "desc", children: /* @__PURE__ */ jsx("h3", { children: /* @__PURE__ */ jsx( + "a", + { + href: resolveRelative(fileSlug ?? "", page.slug), + class: "internal", + children: title + } + ) }) }), + /* @__PURE__ */ jsx("ul", { class: "tags", children: tags.map((tag) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx( + "a", + { + class: "internal tag-link", + href: resolveRelative( + fileSlug ?? "", + `tags/${tag}` + ), + children: tag + } + ) })) }) + ] }) }); + }) }); +}; +PageList.css = ` +.section h3 { + margin: 0; +} + +.section > .tags { + margin: 0; +} +`; + +// src/i18n/locales/en-US.ts +var en_US_default = { + pages: { + tagContent: { + tag: "Tag", + tagIndex: "Tag Index", + itemsUnderTag: ({ count }) => count === 1 ? "1 item with this tag." : `${count} items with this tag.`, + showingFirst: ({ count }) => `Showing first ${count} tags.`, + totalTags: ({ count }) => `Found ${count} total tags.` + } + }, + components: {} +}; + +// src/i18n/index.ts +var locales = { + "en-US": en_US_default +}; +function i18n(locale) { + return locales[locale] || en_US_default; +} + +// src/components/styles/listPage.scss +var listPage_default = "ul.section-ul {\n list-style: none;\n margin-top: 2em;\n padding-left: 0;\n}\n\nli.section-li {\n margin-bottom: 1em;\n}\nli.section-li > .section {\n display: grid;\n grid-template-columns: fit-content(8em) 3fr 1fr;\n}\n@media all and (max-width: 600px) {\n li.section-li > .section > .tags {\n display: none;\n }\n}\nli.section-li > .section > .desc > h3 > a {\n background-color: transparent;\n}\nli.section-li > .section .meta {\n margin: 0 1em 0 0;\n opacity: 0.6;\n}\n\n.popover .section {\n grid-template-columns: fit-content(8em) 1fr !important;\n}\n.popover .section > .tags {\n display: none;\n}"; +var defaultOptions = { + numPages: 10 +}; +function concatenateResources(...resources) { + const result = resources.filter((r) => r !== void 0).flat(); + return result.length === 0 ? void 0 : result; +} +var TagContent_default = ((opts) => { + const options = { ...defaultOptions, ...opts }; + const TagContent = (props) => { + const { tree, fileData, allFiles, cfg } = props; + const fd = fileData; + const slug = fd.slug; + const locale = cfg?.locale ?? "en-US"; + if (!(slug?.startsWith("tags/") || slug === "tags")) { + throw new Error(`Component "TagContent" tried to render a non-tag page: ${slug}`); + } + const tag = simplifySlug(slug.slice("tags/".length)); + const allPagesWithTag = (t) => allFiles.filter( + (file) => (file.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes).includes(t) + ); + const hastRoot = tree; + const content = hastRoot.children.length === 0 ? fd.description : htmlToJsx(hastRoot); + const cssClasses = fd.frontmatter?.cssclasses ?? []; + const classes = cssClasses.join(" "); + if (tag === "/") { + const tags = [ + ...new Set( + allFiles.flatMap((data) => data.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes) + ) + ].sort((a, b) => a.localeCompare(b)); + const tagItemMap = /* @__PURE__ */ new Map(); + for (const t of tags) { + tagItemMap.set(t, allPagesWithTag(t)); + } + return /* @__PURE__ */ jsxs("div", { class: "popover-hint", children: [ + /* @__PURE__ */ jsx("article", { class: classes, children: /* @__PURE__ */ jsx("p", { children: content }) }), + /* @__PURE__ */ jsx("p", { children: i18n(locale).pages.tagContent.totalTags({ count: tags.length }) }), + /* @__PURE__ */ jsx("div", { children: tags.map((t) => { + const pages = tagItemMap.get(t); + const listProps = { + ...props, + allFiles: pages + }; + const pageListContent = PageList({ + ...listProps, + limit: options.numPages, + sort: options?.sort + }); + const contentPage = allFiles.find( + (file) => file.slug === `tags/${t}` + ); + const root = contentPage?.htmlAst; + const tagDesc = !root || root.children.length === 0 ? contentPage?.description : htmlToJsx(root); + const tagListingPage = `/tags/${t}`; + const href = resolveRelative(slug, tagListingPage); + return /* @__PURE__ */ jsxs("div", { children: [ + /* @__PURE__ */ jsx("h2", { children: /* @__PURE__ */ jsx("a", { class: "internal tag-link", href, children: t }) }), + tagDesc && /* @__PURE__ */ jsx("p", { children: tagDesc }), + /* @__PURE__ */ jsxs("div", { class: "page-listing", children: [ + /* @__PURE__ */ jsxs("p", { children: [ + i18n(locale).pages.tagContent.itemsUnderTag({ count: pages.length }), + pages.length > options.numPages && /* @__PURE__ */ jsxs(Fragment, { children: [ + " ", + /* @__PURE__ */ jsx("span", { children: i18n(locale).pages.tagContent.showingFirst({ + count: options.numPages + }) }) + ] }) + ] }), + pageListContent + ] }) + ] }); + }) }) + ] }); + } else { + const pages = allPagesWithTag(tag); + const listProps = { + ...props, + allFiles: pages + }; + const pageListContent = PageList({ + ...listProps, + sort: options?.sort + }); + return /* @__PURE__ */ jsxs("div", { class: "popover-hint", children: [ + /* @__PURE__ */ jsx("article", { class: classes, children: content }), + /* @__PURE__ */ jsxs("div", { class: "page-listing", children: [ + /* @__PURE__ */ jsx("p", { children: i18n(locale).pages.tagContent.itemsUnderTag({ count: pages.length }) }), + /* @__PURE__ */ jsx("div", { children: pageListContent }) + ] }) + ] }); + } + }; + TagContent.css = concatenateResources(listPage_default, PageList.css); + return TagContent; +}); + +export { PageList, TagContent_default as TagContent, byDateAndAlphabetical, byDateAndAlphabeticalFolderFirst }; +//# sourceMappingURL=index.js.map +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/components/index.js.map b/dist/components/index.js.map new file mode 100644 index 0000000..166f8fc --- /dev/null +++ b/dist/components/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/util/path.ts","../../src/components/PageList.tsx","../../src/i18n/locales/en-US.ts","../../src/i18n/index.ts","../../src/components/styles/listPage.scss","../../src/components/TagContent.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export type FullSlug = string & { __brand: \"FullSlug\" };\nexport type SimpleSlug = string & { __brand: \"SimpleSlug\" };\nexport type RelativeURL = string & { __brand: \"relative\" };\n\nexport function joinSegments(...args: string[]): string {\n if (args.length === 0) return \"\";\n let joined = args\n .filter((segment) => segment !== \"\" && segment !== \"/\")\n .map((segment) => stripSlashes(segment))\n .join(\"/\");\n const first = args[0];\n const last = args[args.length - 1];\n if (first?.startsWith(\"/\")) joined = \"/\" + joined;\n if (last?.endsWith(\"/\")) joined = joined + \"/\";\n return joined;\n}\n\nexport function stripSlashes(s: string, onlyStripPrefix?: boolean): string {\n if (s.startsWith(\"/\")) s = s.substring(1);\n if (!onlyStripPrefix && s.endsWith(\"/\")) s = s.slice(0, -1);\n return s;\n}\n\nexport function simplifySlug(fp: FullSlug): SimpleSlug {\n const res = stripSlashes(trimSuffix(fp, \"index\"), true);\n return (res.length === 0 ? \"/\" : res) as SimpleSlug;\n}\n\nexport function trimSuffix(s: string, suffix: string): string {\n if (endsWith(s, suffix)) s = s.slice(0, -suffix.length);\n return s;\n}\n\nexport function endsWith(s: string, suffix: string): boolean {\n return s === suffix || s.endsWith(\"/\" + suffix);\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 if (rootPath.length === 0) rootPath = \".\";\n return rootPath as RelativeURL;\n}\n\nexport function resolveRelative(current: FullSlug, target: FullSlug | SimpleSlug): RelativeURL {\n return joinSegments(pathToRoot(current), simplifySlug(target as FullSlug)) as RelativeURL;\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(tags: string): string[] {\n const segments = tags.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","import type { QuartzComponent, QuartzComponentProps } from \"@quartz-community/types\";\nimport { resolveRelative, isFolderPath } from \"../util/path\";\nimport type { FullSlug } from \"../util/path\";\n\ninterface PageData {\n slug?: string;\n frontmatter?: { title?: string; tags?: string[] };\n dates?: {\n created: Date;\n modified: Date;\n published: Date;\n };\n [key: string]: unknown;\n}\n\nexport type SortFn = (f1: PageData, f2: PageData) => number;\n\nfunction getDate(cfg: unknown, data: PageData): Date | undefined {\n const type = (cfg as { defaultDateType?: string } | undefined)?.defaultDateType ?? \"created\";\n return data.dates?.[type as keyof typeof data.dates] as Date | undefined;\n}\n\nexport function byDateAndAlphabetical(cfg: unknown): SortFn {\n return (f1, f2) => {\n if (f1.dates && f2.dates) {\n return (getDate(cfg, f2)?.getTime() ?? 0) - (getDate(cfg, f1)?.getTime() ?? 0);\n } else if (f1.dates && !f2.dates) {\n return -1;\n } else if (!f1.dates && f2.dates) {\n return 1;\n }\n const f1Title = f1.frontmatter?.title?.toLowerCase() ?? \"\";\n const f2Title = f2.frontmatter?.title?.toLowerCase() ?? \"\";\n return f1Title.localeCompare(f2Title);\n };\n}\n\nexport function byDateAndAlphabeticalFolderFirst(cfg: unknown): SortFn {\n return (f1, f2) => {\n const f1IsFolder = isFolderPath(f1.slug ?? \"\");\n const f2IsFolder = isFolderPath(f2.slug ?? \"\");\n if (f1IsFolder && !f2IsFolder) return -1;\n if (!f1IsFolder && f2IsFolder) return 1;\n\n if (f1.dates && f2.dates) {\n return (getDate(cfg, f2)?.getTime() ?? 0) - (getDate(cfg, f1)?.getTime() ?? 0);\n } else if (f1.dates && !f2.dates) {\n return -1;\n } else if (!f1.dates && f2.dates) {\n return 1;\n }\n const f1Title = f1.frontmatter?.title?.toLowerCase() ?? \"\";\n const f2Title = f2.frontmatter?.title?.toLowerCase() ?? \"\";\n return f1Title.localeCompare(f2Title);\n };\n}\n\ntype DateComponentProps = {\n date: Date;\n locale: string;\n};\n\nfunction DateDisplay({ date, locale }: DateComponentProps) {\n return (\n \n );\n}\n\ntype PageListProps = {\n limit?: number;\n sort?: SortFn;\n} & QuartzComponentProps;\n\nexport const PageList: QuartzComponent = ({\n cfg,\n fileData,\n allFiles,\n limit,\n sort,\n}: PageListProps) => {\n const sorter = sort ?? byDateAndAlphabeticalFolderFirst(cfg);\n let list = [...(allFiles as PageData[])].sort(sorter);\n if (limit) {\n list = list.slice(0, limit);\n }\n\n const fileSlug = (fileData as { slug?: string } | undefined)?.slug as FullSlug | undefined;\n\n return (\n \n );\n};\n\nPageList.css = `\n.section h3 {\n margin: 0;\n}\n\n.section > .tags {\n margin: 0;\n}\n`;\n","export default {\n pages: {\n tagContent: {\n tag: \"Tag\",\n tagIndex: \"Tag Index\",\n itemsUnderTag: ({ count }: { count: number }) =>\n count === 1 ? \"1 item with this tag.\" : `${count} items with this tag.`,\n showingFirst: ({ count }: { count: number }) => `Showing first ${count} tags.`,\n totalTags: ({ count }: { count: number }) => `Found ${count} total tags.`,\n },\n },\n components: {},\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","ul.section-ul {\n list-style: none;\n margin-top: 2em;\n padding-left: 0;\n}\n\nli.section-li {\n margin-bottom: 1em;\n}\nli.section-li > .section {\n display: grid;\n grid-template-columns: fit-content(8em) 3fr 1fr;\n}\n@media all and (max-width: 600px) {\n li.section-li > .section > .tags {\n display: none;\n }\n}\nli.section-li > .section > .desc > h3 > a {\n background-color: transparent;\n}\nli.section-li > .section .meta {\n margin: 0 1em 0 0;\n opacity: 0.6;\n}\n\n.popover .section {\n grid-template-columns: fit-content(8em) 1fr !important;\n}\n.popover .section > .tags {\n display: none;\n}","import type {\n QuartzComponent,\n QuartzComponentConstructor,\n QuartzComponentProps,\n} from \"@quartz-community/types\";\nimport { PageList } from \"./PageList\";\nimport type { SortFn } from \"./PageList\";\nimport { htmlToJsx } from \"@quartz-community/utils/jsx\";\nimport type { ComponentChildren } from \"preact\";\nimport type { Root } from \"hast\";\nimport { i18n } from \"../i18n\";\nimport { getAllSegmentPrefixes, resolveRelative, simplifySlug } from \"../util/path\";\nimport type { FullSlug } from \"../util/path\";\nimport style from \"./styles/listPage.scss\";\n\ninterface TagContentOptions {\n sort?: SortFn;\n numPages: number;\n}\n\nconst defaultOptions: TagContentOptions = {\n numPages: 10,\n};\n\nfunction concatenateResources(\n ...resources: (string | string[] | undefined)[]\n): string | string[] | undefined {\n const result = resources.filter((r): r is string | string[] => r !== undefined).flat();\n return result.length === 0 ? undefined : result;\n}\n\ninterface PageFileData {\n slug?: string;\n filePath?: string;\n frontmatter?: { title?: string; tags?: string[]; cssclasses?: string[] };\n description?: unknown;\n htmlAst?: Root;\n [key: string]: unknown;\n}\n\nexport default ((opts?: Partial) => {\n const options: TagContentOptions = { ...defaultOptions, ...opts };\n\n const TagContent: QuartzComponent = (props: QuartzComponentProps) => {\n const { tree, fileData, allFiles, cfg } = props;\n const fd = fileData as PageFileData;\n const slug = fd.slug;\n const locale = (cfg as { locale?: string } | undefined)?.locale ?? \"en-US\";\n\n if (!(slug?.startsWith(\"tags/\") || slug === \"tags\")) {\n throw new Error(`Component \"TagContent\" tried to render a non-tag page: ${slug}`);\n }\n\n const tag = simplifySlug(slug.slice(\"tags/\".length) as FullSlug);\n const allPagesWithTag = (t: string) =>\n (allFiles as PageFileData[]).filter((file) =>\n (file.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes).includes(t),\n );\n\n const hastRoot = tree as Root;\n const content = hastRoot.children.length === 0 ? fd.description : htmlToJsx(hastRoot);\n\n const cssClasses = fd.frontmatter?.cssclasses ?? [];\n const classes = cssClasses.join(\" \");\n\n if (tag === \"/\") {\n const tags = [\n ...new Set(\n (allFiles as PageFileData[])\n .flatMap((data) => data.frontmatter?.tags ?? [])\n .flatMap(getAllSegmentPrefixes),\n ),\n ].sort((a, b) => a.localeCompare(b));\n\n const tagItemMap: Map = new Map();\n for (const t of tags) {\n tagItemMap.set(t, allPagesWithTag(t));\n }\n\n return (\n
\n
\n

{content}

\n
\n

{i18n(locale).pages.tagContent.totalTags({ count: tags.length })}

\n
\n {tags.map((t) => {\n const pages = tagItemMap.get(t)!;\n const listProps = {\n ...props,\n allFiles: pages,\n };\n const pageListContent = PageList({\n ...listProps,\n limit: options.numPages,\n sort: options?.sort,\n }) as unknown as ComponentChildren;\n\n const contentPage = (allFiles as PageFileData[]).find(\n (file) => file.slug === `tags/${t}`,\n );\n\n const root = contentPage?.htmlAst;\n const tagDesc =\n !root || root.children.length === 0 ? contentPage?.description : htmlToJsx(root);\n\n const tagListingPage = `/tags/${t}` as FullSlug;\n const href = resolveRelative(slug as FullSlug, tagListingPage);\n\n return (\n
\n

\n \n {t}\n \n

\n {tagDesc &&

{tagDesc}

}\n
\n

\n {i18n(locale).pages.tagContent.itemsUnderTag({ count: pages.length })}\n {pages.length > options.numPages && (\n <>\n {\" \"}\n \n {i18n(locale).pages.tagContent.showingFirst({\n count: options.numPages,\n })}\n \n \n )}\n

\n {pageListContent}\n
\n
\n );\n })}\n
\n
\n );\n } else {\n const pages = allPagesWithTag(tag);\n const listProps = {\n ...props,\n allFiles: pages,\n };\n const pageListContent = PageList({\n ...listProps,\n sort: options?.sort,\n }) as unknown as ComponentChildren;\n\n return (\n
\n
{content}
\n
\n

{i18n(locale).pages.tagContent.itemsUnderTag({ count: pages.length })}

\n
{pageListContent}
\n
\n
\n );\n }\n };\n\n TagContent.css = concatenateResources(style, PageList.css);\n return TagContent;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..30505df --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,4 @@ +export { T as TagPage, a as TagPageOptions } from './types-BWrP_Ur0.js'; +export { TagContent } from './components/index.js'; +export { PageGenerator, PageMatcher, QuartzComponent, QuartzComponentConstructor, QuartzComponentProps, QuartzPageTypePlugin, QuartzPageTypePluginInstance, VirtualPage } from '@quartz-community/types'; +import './PageList-DncPcZ4-.js'; diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..97c2530 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,296 @@ +import { jsxs, jsx, Fragment } from 'preact/jsx-runtime'; +import { htmlToJsx } from '@quartz-community/utils/jsx'; + +// src/util/path.ts +function joinSegments(...args) { + if (args.length === 0) return ""; + let joined = args.filter((segment) => segment !== "" && segment !== "/").map((segment) => stripSlashes(segment)).join("/"); + const first = args[0]; + const last = args[args.length - 1]; + if (first?.startsWith("/")) joined = "/" + joined; + if (last?.endsWith("/")) joined = joined + "/"; + return joined; +} +function stripSlashes(s, onlyStripPrefix) { + if (s.startsWith("/")) s = s.substring(1); + if (!onlyStripPrefix && s.endsWith("/")) s = s.slice(0, -1); + return s; +} +function simplifySlug(fp) { + const res = stripSlashes(trimSuffix(fp, "index"), true); + return res.length === 0 ? "/" : res; +} +function trimSuffix(s, suffix) { + if (endsWith(s, suffix)) s = s.slice(0, -suffix.length); + return s; +} +function endsWith(s, suffix) { + return s === suffix || s.endsWith("/" + suffix); +} +function pathToRoot(slug) { + let rootPath = slug.split("/").filter((x) => x !== "").slice(0, -1).map((_) => "..").join("/"); + if (rootPath.length === 0) rootPath = "."; + return rootPath; +} +function resolveRelative(current, target) { + return joinSegments(pathToRoot(current), simplifySlug(target)); +} +function isFolderPath(fplike) { + return fplike.endsWith("/") || endsWith(fplike, "index") || endsWith(fplike, "index.md") || endsWith(fplike, "index.html"); +} +function getAllSegmentPrefixes(tags) { + const segments = tags.split("/"); + const results = []; + for (let i = 0; i < segments.length; i++) { + results.push(segments.slice(0, i + 1).join("/")); + } + return results; +} +function getDate(cfg, data) { + const type = cfg?.defaultDateType ?? "created"; + return data.dates?.[type]; +} +function byDateAndAlphabeticalFolderFirst(cfg) { + return (f1, f2) => { + const f1IsFolder = isFolderPath(f1.slug ?? ""); + const f2IsFolder = isFolderPath(f2.slug ?? ""); + if (f1IsFolder && !f2IsFolder) return -1; + if (!f1IsFolder && f2IsFolder) return 1; + if (f1.dates && f2.dates) { + return (getDate(cfg, f2)?.getTime() ?? 0) - (getDate(cfg, f1)?.getTime() ?? 0); + } else if (f1.dates && !f2.dates) { + return -1; + } else if (!f1.dates && f2.dates) { + return 1; + } + const f1Title = f1.frontmatter?.title?.toLowerCase() ?? ""; + const f2Title = f2.frontmatter?.title?.toLowerCase() ?? ""; + return f1Title.localeCompare(f2Title); + }; +} +function DateDisplay({ date, locale }) { + return /* @__PURE__ */ jsx("time", { dateTime: date.toISOString(), children: date.toLocaleDateString(locale, { + year: "numeric", + month: "short", + day: "2-digit" + }) }); +} +var PageList = ({ + cfg, + fileData, + allFiles, + limit, + sort +}) => { + const sorter = sort ?? byDateAndAlphabeticalFolderFirst(cfg); + let list = [...allFiles].sort(sorter); + if (limit) { + list = list.slice(0, limit); + } + const fileSlug = fileData?.slug; + return /* @__PURE__ */ jsx("ul", { class: "section-ul", children: list.map((page) => { + const title = page.frontmatter?.title; + const tags = page.frontmatter?.tags ?? []; + return /* @__PURE__ */ jsx("li", { class: "section-li", children: /* @__PURE__ */ jsxs("div", { class: "section", children: [ + /* @__PURE__ */ jsx("p", { class: "meta", children: page.dates && /* @__PURE__ */ jsx( + DateDisplay, + { + date: getDate(cfg, page), + locale: cfg?.locale ?? "en-US" + } + ) }), + /* @__PURE__ */ jsx("div", { class: "desc", children: /* @__PURE__ */ jsx("h3", { children: /* @__PURE__ */ jsx( + "a", + { + href: resolveRelative(fileSlug ?? "", page.slug), + class: "internal", + children: title + } + ) }) }), + /* @__PURE__ */ jsx("ul", { class: "tags", children: tags.map((tag) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx( + "a", + { + class: "internal tag-link", + href: resolveRelative( + fileSlug ?? "", + `tags/${tag}` + ), + children: tag + } + ) })) }) + ] }) }); + }) }); +}; +PageList.css = ` +.section h3 { + margin: 0; +} + +.section > .tags { + margin: 0; +} +`; + +// src/i18n/locales/en-US.ts +var en_US_default = { + pages: { + tagContent: { + tag: "Tag", + tagIndex: "Tag Index", + itemsUnderTag: ({ count }) => count === 1 ? "1 item with this tag." : `${count} items with this tag.`, + showingFirst: ({ count }) => `Showing first ${count} tags.`, + totalTags: ({ count }) => `Found ${count} total tags.` + } + }, + components: {} +}; + +// src/i18n/index.ts +var locales = { + "en-US": en_US_default +}; +function i18n(locale) { + return locales[locale] || en_US_default; +} + +// src/components/styles/listPage.scss +var listPage_default = "ul.section-ul {\n list-style: none;\n margin-top: 2em;\n padding-left: 0;\n}\n\nli.section-li {\n margin-bottom: 1em;\n}\nli.section-li > .section {\n display: grid;\n grid-template-columns: fit-content(8em) 3fr 1fr;\n}\n@media all and (max-width: 600px) {\n li.section-li > .section > .tags {\n display: none;\n }\n}\nli.section-li > .section > .desc > h3 > a {\n background-color: transparent;\n}\nli.section-li > .section .meta {\n margin: 0 1em 0 0;\n opacity: 0.6;\n}\n\n.popover .section {\n grid-template-columns: fit-content(8em) 1fr !important;\n}\n.popover .section > .tags {\n display: none;\n}"; +var defaultOptions = { + numPages: 10 +}; +function concatenateResources(...resources) { + const result = resources.filter((r) => r !== void 0).flat(); + return result.length === 0 ? void 0 : result; +} +var TagContent_default = ((opts) => { + const options = { ...defaultOptions, ...opts }; + const TagContent = (props) => { + const { tree, fileData, allFiles, cfg } = props; + const fd = fileData; + const slug = fd.slug; + const locale = cfg?.locale ?? "en-US"; + if (!(slug?.startsWith("tags/") || slug === "tags")) { + throw new Error(`Component "TagContent" tried to render a non-tag page: ${slug}`); + } + const tag = simplifySlug(slug.slice("tags/".length)); + const allPagesWithTag = (t) => allFiles.filter( + (file) => (file.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes).includes(t) + ); + const hastRoot = tree; + const content = hastRoot.children.length === 0 ? fd.description : htmlToJsx(hastRoot); + const cssClasses = fd.frontmatter?.cssclasses ?? []; + const classes = cssClasses.join(" "); + if (tag === "/") { + const tags = [ + ...new Set( + allFiles.flatMap((data) => data.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes) + ) + ].sort((a, b) => a.localeCompare(b)); + const tagItemMap = /* @__PURE__ */ new Map(); + for (const t of tags) { + tagItemMap.set(t, allPagesWithTag(t)); + } + return /* @__PURE__ */ jsxs("div", { class: "popover-hint", children: [ + /* @__PURE__ */ jsx("article", { class: classes, children: /* @__PURE__ */ jsx("p", { children: content }) }), + /* @__PURE__ */ jsx("p", { children: i18n(locale).pages.tagContent.totalTags({ count: tags.length }) }), + /* @__PURE__ */ jsx("div", { children: tags.map((t) => { + const pages = tagItemMap.get(t); + const listProps = { + ...props, + allFiles: pages + }; + const pageListContent = PageList({ + ...listProps, + limit: options.numPages, + sort: options?.sort + }); + const contentPage = allFiles.find( + (file) => file.slug === `tags/${t}` + ); + const root = contentPage?.htmlAst; + const tagDesc = !root || root.children.length === 0 ? contentPage?.description : htmlToJsx(root); + const tagListingPage = `/tags/${t}`; + const href = resolveRelative(slug, tagListingPage); + return /* @__PURE__ */ jsxs("div", { children: [ + /* @__PURE__ */ jsx("h2", { children: /* @__PURE__ */ jsx("a", { class: "internal tag-link", href, children: t }) }), + tagDesc && /* @__PURE__ */ jsx("p", { children: tagDesc }), + /* @__PURE__ */ jsxs("div", { class: "page-listing", children: [ + /* @__PURE__ */ jsxs("p", { children: [ + i18n(locale).pages.tagContent.itemsUnderTag({ count: pages.length }), + pages.length > options.numPages && /* @__PURE__ */ jsxs(Fragment, { children: [ + " ", + /* @__PURE__ */ jsx("span", { children: i18n(locale).pages.tagContent.showingFirst({ + count: options.numPages + }) }) + ] }) + ] }), + pageListContent + ] }) + ] }); + }) }) + ] }); + } else { + const pages = allPagesWithTag(tag); + const listProps = { + ...props, + allFiles: pages + }; + const pageListContent = PageList({ + ...listProps, + sort: options?.sort + }); + return /* @__PURE__ */ jsxs("div", { class: "popover-hint", children: [ + /* @__PURE__ */ jsx("article", { class: classes, children: content }), + /* @__PURE__ */ jsxs("div", { class: "page-listing", children: [ + /* @__PURE__ */ jsx("p", { children: i18n(locale).pages.tagContent.itemsUnderTag({ count: pages.length }) }), + /* @__PURE__ */ jsx("div", { children: pageListContent }) + ] }) + ] }); + } + }; + TagContent.css = concatenateResources(listPage_default, PageList.css); + return TagContent; +}); + +// src/pageType.ts +var tagMatcher = ({ slug }) => { + return slug.startsWith("tags/") || slug === "tags"; +}; +var TagPage = () => ({ + name: "TagPage", + priority: 10, + match: tagMatcher, + generate({ content, cfg }) { + const allFiles = content.map((c) => c[1].data); + const locale = cfg?.locale ?? "en-US"; + const tags = new Set( + allFiles.flatMap((data) => data.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes) + ); + tags.add("index"); + const existingTagSlugs = /* @__PURE__ */ new Set(); + for (const [, file] of content) { + const slug = file.data?.slug; + if (slug && slug.startsWith("tags/")) { + existingTagSlugs.add(slug); + } + } + const virtualPages = []; + for (const tag of tags) { + const slug = joinSegments("tags", tag); + if (existingTagSlugs.has(slug)) continue; + const title = tag === "index" ? i18n(locale).pages.tagContent.tagIndex : `${i18n(locale).pages.tagContent.tag}: ${tag}`; + virtualPages.push({ + slug, + title, + data: {} + }); + } + return virtualPages; + }, + layout: "tag", + body: TagContent_default +}); + +export { TagContent_default as TagContent, TagPage }; +//# 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 new file mode 100644 index 0000000..9c3ca5c --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/util/path.ts","../src/components/PageList.tsx","../src/i18n/locales/en-US.ts","../src/i18n/index.ts","../src/components/styles/listPage.scss","../src/components/TagContent.tsx","../src/pageType.ts"],"names":["jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["export type FullSlug = string & { __brand: \"FullSlug\" };\nexport type SimpleSlug = string & { __brand: \"SimpleSlug\" };\nexport type RelativeURL = string & { __brand: \"relative\" };\n\nexport function joinSegments(...args: string[]): string {\n if (args.length === 0) return \"\";\n let joined = args\n .filter((segment) => segment !== \"\" && segment !== \"/\")\n .map((segment) => stripSlashes(segment))\n .join(\"/\");\n const first = args[0];\n const last = args[args.length - 1];\n if (first?.startsWith(\"/\")) joined = \"/\" + joined;\n if (last?.endsWith(\"/\")) joined = joined + \"/\";\n return joined;\n}\n\nexport function stripSlashes(s: string, onlyStripPrefix?: boolean): string {\n if (s.startsWith(\"/\")) s = s.substring(1);\n if (!onlyStripPrefix && s.endsWith(\"/\")) s = s.slice(0, -1);\n return s;\n}\n\nexport function simplifySlug(fp: FullSlug): SimpleSlug {\n const res = stripSlashes(trimSuffix(fp, \"index\"), true);\n return (res.length === 0 ? \"/\" : res) as SimpleSlug;\n}\n\nexport function trimSuffix(s: string, suffix: string): string {\n if (endsWith(s, suffix)) s = s.slice(0, -suffix.length);\n return s;\n}\n\nexport function endsWith(s: string, suffix: string): boolean {\n return s === suffix || s.endsWith(\"/\" + suffix);\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 if (rootPath.length === 0) rootPath = \".\";\n return rootPath as RelativeURL;\n}\n\nexport function resolveRelative(current: FullSlug, target: FullSlug | SimpleSlug): RelativeURL {\n return joinSegments(pathToRoot(current), simplifySlug(target as FullSlug)) as RelativeURL;\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(tags: string): string[] {\n const segments = tags.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","import type { QuartzComponent, QuartzComponentProps } from \"@quartz-community/types\";\nimport { resolveRelative, isFolderPath } from \"../util/path\";\nimport type { FullSlug } from \"../util/path\";\n\ninterface PageData {\n slug?: string;\n frontmatter?: { title?: string; tags?: string[] };\n dates?: {\n created: Date;\n modified: Date;\n published: Date;\n };\n [key: string]: unknown;\n}\n\nexport type SortFn = (f1: PageData, f2: PageData) => number;\n\nfunction getDate(cfg: unknown, data: PageData): Date | undefined {\n const type = (cfg as { defaultDateType?: string } | undefined)?.defaultDateType ?? \"created\";\n return data.dates?.[type as keyof typeof data.dates] as Date | undefined;\n}\n\nexport function byDateAndAlphabetical(cfg: unknown): SortFn {\n return (f1, f2) => {\n if (f1.dates && f2.dates) {\n return (getDate(cfg, f2)?.getTime() ?? 0) - (getDate(cfg, f1)?.getTime() ?? 0);\n } else if (f1.dates && !f2.dates) {\n return -1;\n } else if (!f1.dates && f2.dates) {\n return 1;\n }\n const f1Title = f1.frontmatter?.title?.toLowerCase() ?? \"\";\n const f2Title = f2.frontmatter?.title?.toLowerCase() ?? \"\";\n return f1Title.localeCompare(f2Title);\n };\n}\n\nexport function byDateAndAlphabeticalFolderFirst(cfg: unknown): SortFn {\n return (f1, f2) => {\n const f1IsFolder = isFolderPath(f1.slug ?? \"\");\n const f2IsFolder = isFolderPath(f2.slug ?? \"\");\n if (f1IsFolder && !f2IsFolder) return -1;\n if (!f1IsFolder && f2IsFolder) return 1;\n\n if (f1.dates && f2.dates) {\n return (getDate(cfg, f2)?.getTime() ?? 0) - (getDate(cfg, f1)?.getTime() ?? 0);\n } else if (f1.dates && !f2.dates) {\n return -1;\n } else if (!f1.dates && f2.dates) {\n return 1;\n }\n const f1Title = f1.frontmatter?.title?.toLowerCase() ?? \"\";\n const f2Title = f2.frontmatter?.title?.toLowerCase() ?? \"\";\n return f1Title.localeCompare(f2Title);\n };\n}\n\ntype DateComponentProps = {\n date: Date;\n locale: string;\n};\n\nfunction DateDisplay({ date, locale }: DateComponentProps) {\n return (\n \n );\n}\n\ntype PageListProps = {\n limit?: number;\n sort?: SortFn;\n} & QuartzComponentProps;\n\nexport const PageList: QuartzComponent = ({\n cfg,\n fileData,\n allFiles,\n limit,\n sort,\n}: PageListProps) => {\n const sorter = sort ?? byDateAndAlphabeticalFolderFirst(cfg);\n let list = [...(allFiles as PageData[])].sort(sorter);\n if (limit) {\n list = list.slice(0, limit);\n }\n\n const fileSlug = (fileData as { slug?: string } | undefined)?.slug as FullSlug | undefined;\n\n return (\n
    \n {list.map((page) => {\n const title = page.frontmatter?.title;\n const tags = page.frontmatter?.tags ?? [];\n\n return (\n
  • \n
    \n

    \n {page.dates && (\n \n )}\n

    \n
    \n

    \n \n {title}\n \n

    \n
    \n
      \n {tags.map((tag) => (\n
    • \n \n {tag}\n \n
    • \n ))}\n
    \n
    \n
  • \n );\n })}\n
\n );\n};\n\nPageList.css = `\n.section h3 {\n margin: 0;\n}\n\n.section > .tags {\n margin: 0;\n}\n`;\n","export default {\n pages: {\n tagContent: {\n tag: \"Tag\",\n tagIndex: \"Tag Index\",\n itemsUnderTag: ({ count }: { count: number }) =>\n count === 1 ? \"1 item with this tag.\" : `${count} items with this tag.`,\n showingFirst: ({ count }: { count: number }) => `Showing first ${count} tags.`,\n totalTags: ({ count }: { count: number }) => `Found ${count} total tags.`,\n },\n },\n components: {},\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","ul.section-ul {\n list-style: none;\n margin-top: 2em;\n padding-left: 0;\n}\n\nli.section-li {\n margin-bottom: 1em;\n}\nli.section-li > .section {\n display: grid;\n grid-template-columns: fit-content(8em) 3fr 1fr;\n}\n@media all and (max-width: 600px) {\n li.section-li > .section > .tags {\n display: none;\n }\n}\nli.section-li > .section > .desc > h3 > a {\n background-color: transparent;\n}\nli.section-li > .section .meta {\n margin: 0 1em 0 0;\n opacity: 0.6;\n}\n\n.popover .section {\n grid-template-columns: fit-content(8em) 1fr !important;\n}\n.popover .section > .tags {\n display: none;\n}","import type {\n QuartzComponent,\n QuartzComponentConstructor,\n QuartzComponentProps,\n} from \"@quartz-community/types\";\nimport { PageList } from \"./PageList\";\nimport type { SortFn } from \"./PageList\";\nimport { htmlToJsx } from \"@quartz-community/utils/jsx\";\nimport type { ComponentChildren } from \"preact\";\nimport type { Root } from \"hast\";\nimport { i18n } from \"../i18n\";\nimport { getAllSegmentPrefixes, resolveRelative, simplifySlug } from \"../util/path\";\nimport type { FullSlug } from \"../util/path\";\nimport style from \"./styles/listPage.scss\";\n\ninterface TagContentOptions {\n sort?: SortFn;\n numPages: number;\n}\n\nconst defaultOptions: TagContentOptions = {\n numPages: 10,\n};\n\nfunction concatenateResources(\n ...resources: (string | string[] | undefined)[]\n): string | string[] | undefined {\n const result = resources.filter((r): r is string | string[] => r !== undefined).flat();\n return result.length === 0 ? undefined : result;\n}\n\ninterface PageFileData {\n slug?: string;\n filePath?: string;\n frontmatter?: { title?: string; tags?: string[]; cssclasses?: string[] };\n description?: unknown;\n htmlAst?: Root;\n [key: string]: unknown;\n}\n\nexport default ((opts?: Partial) => {\n const options: TagContentOptions = { ...defaultOptions, ...opts };\n\n const TagContent: QuartzComponent = (props: QuartzComponentProps) => {\n const { tree, fileData, allFiles, cfg } = props;\n const fd = fileData as PageFileData;\n const slug = fd.slug;\n const locale = (cfg as { locale?: string } | undefined)?.locale ?? \"en-US\";\n\n if (!(slug?.startsWith(\"tags/\") || slug === \"tags\")) {\n throw new Error(`Component \"TagContent\" tried to render a non-tag page: ${slug}`);\n }\n\n const tag = simplifySlug(slug.slice(\"tags/\".length) as FullSlug);\n const allPagesWithTag = (t: string) =>\n (allFiles as PageFileData[]).filter((file) =>\n (file.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes).includes(t),\n );\n\n const hastRoot = tree as Root;\n const content = hastRoot.children.length === 0 ? fd.description : htmlToJsx(hastRoot);\n\n const cssClasses = fd.frontmatter?.cssclasses ?? [];\n const classes = cssClasses.join(\" \");\n\n if (tag === \"/\") {\n const tags = [\n ...new Set(\n (allFiles as PageFileData[])\n .flatMap((data) => data.frontmatter?.tags ?? [])\n .flatMap(getAllSegmentPrefixes),\n ),\n ].sort((a, b) => a.localeCompare(b));\n\n const tagItemMap: Map = new Map();\n for (const t of tags) {\n tagItemMap.set(t, allPagesWithTag(t));\n }\n\n return (\n
\n
\n

{content}

\n
\n

{i18n(locale).pages.tagContent.totalTags({ count: tags.length })}

\n
\n {tags.map((t) => {\n const pages = tagItemMap.get(t)!;\n const listProps = {\n ...props,\n allFiles: pages,\n };\n const pageListContent = PageList({\n ...listProps,\n limit: options.numPages,\n sort: options?.sort,\n }) as unknown as ComponentChildren;\n\n const contentPage = (allFiles as PageFileData[]).find(\n (file) => file.slug === `tags/${t}`,\n );\n\n const root = contentPage?.htmlAst;\n const tagDesc =\n !root || root.children.length === 0 ? contentPage?.description : htmlToJsx(root);\n\n const tagListingPage = `/tags/${t}` as FullSlug;\n const href = resolveRelative(slug as FullSlug, tagListingPage);\n\n return (\n
\n

\n \n {t}\n \n

\n {tagDesc &&

{tagDesc}

}\n
\n

\n {i18n(locale).pages.tagContent.itemsUnderTag({ count: pages.length })}\n {pages.length > options.numPages && (\n <>\n {\" \"}\n \n {i18n(locale).pages.tagContent.showingFirst({\n count: options.numPages,\n })}\n \n \n )}\n

\n {pageListContent}\n
\n
\n );\n })}\n
\n
\n );\n } else {\n const pages = allPagesWithTag(tag);\n const listProps = {\n ...props,\n allFiles: pages,\n };\n const pageListContent = PageList({\n ...listProps,\n sort: options?.sort,\n }) as unknown as ComponentChildren;\n\n return (\n
\n
{content}
\n
\n

{i18n(locale).pages.tagContent.itemsUnderTag({ count: pages.length })}

\n
{pageListContent}
\n
\n
\n );\n }\n };\n\n TagContent.css = concatenateResources(style, PageList.css);\n return TagContent;\n}) satisfies QuartzComponentConstructor;\n","import type {\n QuartzPageTypePlugin,\n PageMatcher,\n FullSlug,\n VirtualPage,\n} from \"@quartz-community/types\";\nimport TagContentComponent from \"./components/TagContent\";\nimport { i18n } from \"./i18n\";\nimport { getAllSegmentPrefixes, joinSegments } from \"./util/path\";\nimport type { SortFn } from \"./components/PageList\";\n\nexport interface TagPageOptions {\n sort?: SortFn;\n numPages?: number;\n}\n\nconst tagMatcher: PageMatcher = ({ slug }) => {\n return slug.startsWith(\"tags/\") || slug === \"tags\";\n};\n\nexport const TagPage: QuartzPageTypePlugin = () => ({\n name: \"TagPage\",\n priority: 10,\n match: tagMatcher,\n generate({ content, cfg }) {\n const allFiles = content.map((c) => c[1].data);\n const locale = (cfg as { locale?: string } | undefined)?.locale ?? \"en-US\";\n\n const tags: Set = new Set(\n (allFiles as { frontmatter?: { tags?: string[] } }[])\n .flatMap((data) => data.frontmatter?.tags ?? [])\n .flatMap(getAllSegmentPrefixes),\n );\n\n tags.add(\"index\");\n\n const existingTagSlugs = new Set();\n for (const [, file] of content) {\n const slug = (file.data as { slug?: string } | undefined)?.slug;\n if (slug && slug.startsWith(\"tags/\")) {\n existingTagSlugs.add(slug);\n }\n }\n\n const virtualPages: VirtualPage[] = [];\n for (const tag of tags) {\n const slug = joinSegments(\"tags\", tag) as unknown as FullSlug;\n if (existingTagSlugs.has(slug as string)) continue;\n\n const title =\n tag === \"index\"\n ? i18n(locale).pages.tagContent.tagIndex\n : `${i18n(locale).pages.tagContent.tag}: ${tag}`;\n\n virtualPages.push({\n slug,\n title,\n data: {},\n });\n }\n\n return virtualPages;\n },\n layout: \"tag\",\n body: TagContentComponent,\n});\n"]} \ No newline at end of file diff --git a/dist/types-BWrP_Ur0.d.ts b/dist/types-BWrP_Ur0.d.ts new file mode 100644 index 0000000..28a7486 --- /dev/null +++ b/dist/types-BWrP_Ur0.d.ts @@ -0,0 +1,10 @@ +import { QuartzPageTypePlugin } from '@quartz-community/types'; +import { S as SortFn } from './PageList-DncPcZ4-.js'; + +interface TagPageOptions { + sort?: SortFn; + numPages?: number; +} +declare const TagPage: QuartzPageTypePlugin; + +export { TagPage as T, type TagPageOptions as a }; diff --git a/dist/types.d.ts b/dist/types.d.ts new file mode 100644 index 0000000..46346c9 --- /dev/null +++ b/dist/types.d.ts @@ -0,0 +1,3 @@ +export { BuildCtx, PageGenerator, PageMatcher, ProcessedContent, QuartzPageTypePlugin, QuartzPageTypePluginInstance, QuartzPluginData, StaticResources, VirtualPage } from '@quartz-community/types'; +export { a as TagPageOptions } from './types-BWrP_Ur0.js'; +export { S as SortFn } from './PageList-DncPcZ4-.js'; diff --git a/dist/types.js b/dist/types.js new file mode 100644 index 0000000..6bd95cc --- /dev/null +++ b/dist/types.js @@ -0,0 +1,3 @@ + +//# sourceMappingURL=types.js.map +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/dist/types.js.map b/dist/types.js.map new file mode 100644 index 0000000..efc9e48 --- /dev/null +++ b/dist/types.js.map @@ -0,0 +1 @@ +{"version":3,"sources":[],"names":[],"mappings":"","file":"types.js"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index dcdaa73..e8046d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,7 @@ "license": "MIT", "dependencies": { "@quartz-community/types": "github:quartz-community/types", - "@quartz-community/utils": "github:quartz-community/utils", - "tsup": "^8.5.0", - "typescript": "^5.9.3", - "vfile": "^6.0.3" + "@quartz-community/utils": "github:quartz-community/utils" }, "devDependencies": { "@types/hast": "^3.0.4", @@ -26,6 +23,8 @@ "preact": "^10.28.2", "prettier": "^3.6.2", "sass": "^1.97.3", + "tsup": "^8.5.0", + "typescript": "^5.9.3", "vitest": "^2.1.9" }, "engines": { @@ -34,7 +33,8 @@ }, "peerDependencies": { "@jackyzha0/quartz": "^4.5.2", - "preact": "^10.0.0" + "preact": "^10.0.0", + "vfile": "^6.0.3" }, "peerDependenciesMeta": { "@jackyzha0/quartz": { @@ -42,6 +42,9 @@ }, "preact": { "optional": false + }, + "vfile": { + "optional": true } } }, @@ -4046,7 +4049,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", diff --git a/package.json b/package.json index bed62a5..45682a0 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,6 @@ "sideEffects": false, "scripts": { "build": "tsup", - "prepare": "npm run build", "dev": "tsup --watch", "lint": "eslint . --max-warnings=0", "format": "prettier . --check",