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":";;;;AAIO,SAAS,gBAAgB,IAAA,EAAwB;AACtD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC9B,EAAA,IAAI,SAAS,IAAA,CACV,MAAA,CAAO,CAAC,OAAA,KAAY,OAAA,KAAY,MAAM,OAAA,KAAY,GAAG,CAAA,CACrD,GAAA,CAAI,CAAC,OAAA,KAAY,YAAA,CAAa,OAAO,CAAC,CAAA,CACtC,KAAK,GAAG,CAAA;AACX,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACjC,EAAA,IAAI,KAAA,EAAO,UAAA,CAAW,GAAG,CAAA,WAAY,GAAA,GAAM,MAAA;AAC3C,EAAA,IAAI,IAAA,EAAM,QAAA,CAAS,GAAG,CAAA,WAAY,MAAA,GAAS,GAAA;AAC3C,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,YAAA,CAAa,GAAW,eAAA,EAAmC;AACzE,EAAA,IAAI,EAAE,UAAA,CAAW,GAAG,GAAG,CAAA,GAAI,CAAA,CAAE,UAAU,CAAC,CAAA;AACxC,EAAA,IAAI,CAAC,eAAA,IAAmB,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC1D,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,aAAa,EAAA,EAA0B;AACrD,EAAA,MAAM,MAAM,YAAA,CAAa,UAAA,CAAW,EAAA,EAAI,OAAO,GAAG,IAAI,CAAA;AACtD,EAAA,OAAQ,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,GAAA;AACnC;AAEO,SAAS,UAAA,CAAW,GAAW,MAAA,EAAwB;AAC5D,EAAA,IAAI,QAAA,CAAS,CAAA,EAAG,MAAM,CAAA,EAAG,CAAA,GAAI,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,MAAA,CAAO,MAAM,CAAA;AACtD,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,QAAA,CAAS,GAAW,MAAA,EAAyB;AAC3D,EAAA,OAAO,CAAA,KAAM,MAAA,IAAU,CAAA,CAAE,QAAA,CAAS,MAAM,MAAM,CAAA;AAChD;AAEO,SAAS,WAAW,IAAA,EAA6B;AACtD,EAAA,IAAI,QAAA,GAAW,KACZ,KAAA,CAAM,GAAG,EACT,MAAA,CAAO,CAAC,MAAM,CAAA,KAAM,EAAE,EACtB,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,GAAA,CAAI,CAAC,CAAA,KAAM,IAAI,CAAA,CACf,IAAA,CAAK,GAAG,CAAA;AACX,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,QAAA,GAAW,GAAA;AACtC,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,eAAA,CAAgB,SAAmB,MAAA,EAA4C;AAC7F,EAAA,OAAO,aAAa,UAAA,CAAW,OAAO,CAAA,EAAG,YAAA,CAAa,MAAkB,CAAC,CAAA;AAC3E;AAEO,SAAS,aAAa,MAAA,EAAyB;AACpD,EAAA,OACE,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,IACnB,SAAS,MAAA,EAAQ,OAAO,CAAA,IACxB,QAAA,CAAS,MAAA,EAAQ,UAAU,CAAA,IAC3B,QAAA,CAAS,QAAQ,YAAY,CAAA;AAEjC;AAEO,SAAS,sBAAsB,IAAA,EAAwB;AAC5D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC/B,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,OAAA;AACT;ACnDA,SAAS,OAAA,CAAQ,KAAc,IAAA,EAAkC;AAC/D,EAAA,MAAM,IAAA,GAAQ,KAAkD,eAAA,IAAmB,SAAA;AACnF,EAAA,OAAO,IAAA,CAAK,QAAQ,IAA+B,CAAA;AACrD;AAEO,SAAS,sBAAsB,GAAA,EAAsB;AAC1D,EAAA,OAAO,CAAC,IAAI,EAAA,KAAO;AACjB,IAAA,IAAI,EAAA,CAAG,KAAA,IAAS,EAAA,CAAG,KAAA,EAAO;AACxB,MAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA,EAAG,OAAA,EAAQ,IAAK,CAAA,KAAM,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA,EAAG,OAAA,EAAQ,IAAK,CAAA,CAAA;AAAA,IAC9E,CAAA,MAAA,IAAW,EAAA,CAAG,KAAA,IAAS,CAAC,GAAG,KAAA,EAAO;AAChC,MAAA,OAAO,EAAA;AAAA,IACT,CAAA,MAAA,IAAW,CAAC,EAAA,CAAG,KAAA,IAAS,GAAG,KAAA,EAAO;AAChC,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,WAAA,EAAa,KAAA,EAAO,aAAY,IAAK,EAAA;AACxD,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,WAAA,EAAa,KAAA,EAAO,aAAY,IAAK,EAAA;AACxD,IAAA,OAAO,OAAA,CAAQ,cAAc,OAAO,CAAA;AAAA,EACtC,CAAA;AACF;AAEO,SAAS,iCAAiC,GAAA,EAAsB;AACrE,EAAA,OAAO,CAAC,IAAI,EAAA,KAAO;AACjB,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,EAAA,CAAG,IAAA,IAAQ,EAAE,CAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,EAAA,CAAG,IAAA,IAAQ,EAAE,CAAA;AAC7C,IAAA,IAAI,UAAA,IAAc,CAAC,UAAA,EAAY,OAAO,EAAA;AACtC,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,EAAY,OAAO,CAAA;AAEtC,IAAA,IAAI,EAAA,CAAG,KAAA,IAAS,EAAA,CAAG,KAAA,EAAO;AACxB,MAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA,EAAG,OAAA,EAAQ,IAAK,CAAA,KAAM,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA,EAAG,OAAA,EAAQ,IAAK,CAAA,CAAA;AAAA,IAC9E,CAAA,MAAA,IAAW,EAAA,CAAG,KAAA,IAAS,CAAC,GAAG,KAAA,EAAO;AAChC,MAAA,OAAO,EAAA;AAAA,IACT,CAAA,MAAA,IAAW,CAAC,EAAA,CAAG,KAAA,IAAS,GAAG,KAAA,EAAO;AAChC,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,WAAA,EAAa,KAAA,EAAO,aAAY,IAAK,EAAA;AACxD,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,WAAA,EAAa,KAAA,EAAO,aAAY,IAAK,EAAA;AACxD,IAAA,OAAO,OAAA,CAAQ,cAAc,OAAO,CAAA;AAAA,EACtC,CAAA;AACF;AAOA,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,MAAA,EAAO,EAAuB;AACzD,EAAA,uBACE,GAAA,CAAC,UAAK,QAAA,EAAU,IAAA,CAAK,aAAY,EAC9B,QAAA,EAAA,IAAA,CAAK,mBAAmB,MAAA,EAAQ;AAAA,IAC/B,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACN,CAAA,EACH,CAAA;AAEJ;AAOO,IAAM,WAA4B,CAAC;AAAA,EACxC,GAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,KAAqB;AACnB,EAAA,MAAM,MAAA,GAAS,IAAA,IAAQ,gCAAA,CAAiC,GAAG,CAAA;AAC3D,EAAA,IAAI,OAAO,CAAC,GAAI,QAAuB,CAAA,CAAE,KAAK,MAAM,CAAA;AACpD,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,WAAY,QAAA,EAA4C,IAAA;AAE9D,EAAA,2BACG,IAAA,EAAA,EAAG,KAAA,EAAM,cACP,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS;AAClB,IAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAa,KAAA;AAChC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,EAAa,IAAA,IAAQ,EAAC;AAExC,IAAA,2BACG,IAAA,EAAA,EAAG,KAAA,EAAM,cACR,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,OAAM,SAAA,EACT,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAM,MAAA,EACN,QAAA,EAAA,IAAA,CAAK,KAAA,oBACJ,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAAA,UACvB,MAAA,EAAS,KAAyC,MAAA,IAAU;AAAA;AAAA,OAC9D,EAEJ,CAAA;AAAA,sBACA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAA,EACT,8BAAC,IAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,eAAA,CAAgB,QAAA,IAAa,EAAA,EAAiB,KAAK,IAAgB,CAAA;AAAA,UACzE,KAAA,EAAM,UAAA;AAAA,UAEL,QAAA,EAAA;AAAA;AAAA,SAEL,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,QAAG,KAAA,EAAM,MAAA,EACP,eAAK,GAAA,CAAI,CAAC,GAAA,qBACT,GAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,mBAAA;AAAA,UACN,IAAA,EAAM,eAAA;AAAA,YACJ,QAAA,IAAa,EAAA;AAAA,YACb,QAAQ,GAAG,CAAA;AAAA,WACb;AAAA,UAEC,QAAA,EAAA;AAAA;AAAA,OACH,EACF,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AAEA,QAAA,CAAS,GAAA,GAAM;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;;;AChJf,IAAO,aAAA,GAAQ;AAAA,EACb,KAAA,EAAO;AAAA,IACL,UAAA,EAAY;AAAA,MACV,GAAA,EAAK,KAAA;AAAA,MACL,QAAA,EAAU,WAAA;AAAA,MACV,aAAA,EAAe,CAAC,EAAE,KAAA,OAChB,KAAA,KAAU,CAAA,GAAI,uBAAA,GAA0B,CAAA,EAAG,KAAK,CAAA,qBAAA,CAAA;AAAA,MAClD,cAAc,CAAC,EAAE,KAAA,EAAM,KAAyB,iBAAiB,KAAK,CAAA,MAAA,CAAA;AAAA,MACtE,WAAW,CAAC,EAAE,KAAA,EAAM,KAAyB,SAAS,KAAK,CAAA,YAAA;AAAA;AAC7D,GACF;AAAA,EACA,YAAY;AACd,CAAA;;;ACVA,IAAM,OAAA,GAAuC;AAAA,EAC3C,OAAA,EAAS;AACX,CAAA;AAEO,SAAS,KAAK,MAAA,EAAgB;AACnC,EAAA,OAAO,OAAA,CAAQ,MAAM,CAAA,IAAK,aAAA;AAC5B;;;ACRA,IAAA,gBAAA,GAAA,+mBAAA;ACoBA,IAAM,cAAA,GAAoC;AAAA,EACxC,QAAA,EAAU;AACZ,CAAA;AAEA,SAAS,wBACJ,SAAA,EAC4B;AAC/B,EAAA,MAAM,MAAA,GAAS,UAAU,MAAA,CAAO,CAAC,MAA8B,CAAA,KAAM,MAAS,EAAE,IAAA,EAAK;AACrF,EAAA,OAAO,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,MAAA,GAAY,MAAA;AAC3C;AAWA,IAAO,kBAAA,IAAS,CAAC,IAAA,KAAsC;AACrD,EAAA,MAAM,OAAA,GAA6B,EAAE,GAAG,cAAA,EAAgB,GAAG,IAAA,EAAK;AAEhE,EAAA,MAAM,UAAA,GAA8B,CAAC,KAAA,KAAgC;AACnE,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,KAAI,GAAI,KAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,QAAA;AACX,IAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,IAAA,MAAM,MAAA,GAAU,KAAyC,MAAA,IAAU,OAAA;AAEnE,IAAA,IAAI,EAAE,IAAA,EAAM,UAAA,CAAW,OAAO,CAAA,IAAK,SAAS,MAAA,CAAA,EAAS;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uDAAA,EAA0D,IAAI,CAAA,CAAE,CAAA;AAAA,IAClF;AAEA,IAAA,MAAM,MAAM,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAa,CAAA;AAC/D,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KACtB,QAAA,CAA4B,MAAA;AAAA,MAAO,CAAC,IAAA,KAAA,CAClC,IAAA,CAAK,WAAA,EAAa,IAAA,IAAQ,EAAC,EAAG,OAAA,CAAQ,qBAAqB,CAAA,CAAE,QAAA,CAAS,CAAC;AAAA,KAC1E;AAEF,IAAA,MAAM,QAAA,GAAW,IAAA;AACjB,IAAA,MAAM,OAAA,GAAU,SAAS,QAAA,CAAS,MAAA,KAAW,IAAI,EAAA,CAAG,WAAA,GAAc,UAAU,QAAQ,CAAA;AAEpF,IAAA,MAAM,UAAA,GAAa,EAAA,CAAG,WAAA,EAAa,UAAA,IAAc,EAAC;AAClD,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAEnC,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,GAAG,IAAI,GAAA;AAAA,UACJ,QAAA,CACE,OAAA,CAAQ,CAAC,IAAA,KAAS,IAAA,CAAK,WAAA,EAAa,IAAA,IAAQ,EAAE,CAAA,CAC9C,OAAA,CAAQ,qBAAqB;AAAA;AAClC,OACF,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAEnC,MAAA,MAAM,UAAA,uBAA8C,GAAA,EAAI;AACxD,MAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,QAAA,UAAA,CAAW,GAAA,CAAI,CAAA,EAAG,eAAA,CAAgB,CAAC,CAAC,CAAA;AAAA,MACtC;AAEA,MAAA,uBACEA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,cAAA,EACT,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,aAAQ,KAAA,EAAO,OAAA,EACd,0BAAAA,GAAAA,CAAC,GAAA,EAAA,EAAG,mBAAQ,CAAA,EACd,CAAA;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,SAAA,CAAU,EAAE,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAE,CAAA;AAAA,wBACpEA,GAAAA,CAAC,KAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AACf,UAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA;AAC9B,UAAA,MAAM,SAAA,GAAY;AAAA,YAChB,GAAG,KAAA;AAAA,YACH,QAAA,EAAU;AAAA,WACZ;AACA,UAAA,MAAM,kBAAkB,QAAA,CAAS;AAAA,YAC/B,GAAG,SAAA;AAAA,YACH,OAAO,OAAA,CAAQ,QAAA;AAAA,YACf,MAAM,OAAA,EAAS;AAAA,WAChB,CAAA;AAED,UAAA,MAAM,cAAe,QAAA,CAA4B,IAAA;AAAA,YAC/C,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,QAAQ,CAAC,CAAA;AAAA,WACnC;AAEA,UAAA,MAAM,OAAO,WAAA,EAAa,OAAA;AAC1B,UAAA,MAAM,OAAA,GACJ,CAAC,IAAA,IAAQ,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,GAAI,WAAA,EAAa,WAAA,GAAc,SAAA,CAAU,IAAI,CAAA;AAEjF,UAAA,MAAM,cAAA,GAAiB,SAAS,CAAC,CAAA,CAAA;AACjC,UAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,EAAkB,cAAc,CAAA;AAE7D,UAAA,uBACED,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,QACC,QAAA,kBAAAA,GAAAA,CAAC,OAAE,KAAA,EAAM,mBAAA,EAAoB,IAAA,EAC1B,QAAA,EAAA,CAAA,EACH,CAAA,EACF,CAAA;AAAA,YACC,OAAA,oBAAWA,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,4BACxBD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,cAAA,EACT,QAAA,EAAA;AAAA,8BAAAA,KAAC,GAAA,EAAA,EACE,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,MAAM,EAAE,KAAA,CAAM,UAAA,CAAW,cAAc,EAAE,KAAA,EAAO,KAAA,CAAM,MAAA,EAAQ,CAAA;AAAA,gBACnE,MAAM,MAAA,GAAS,OAAA,CAAQ,QAAA,oBACtBA,KAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kCACDC,IAAC,MAAA,EAAA,EACE,QAAA,EAAA,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,CAAM,WAAW,YAAA,CAAa;AAAA,oBAC1C,OAAO,OAAA,CAAQ;AAAA,mBAChB,CAAA,EACH;AAAA,iBAAA,EACF;AAAA,eAAA,EAEJ,CAAA;AAAA,cACC;AAAA,aAAA,EACH;AAAA,WAAA,EACF,CAAA;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA,OAAA,EACF,CAAA;AAAA,IAEJ,CAAA,MAAO;AACL,MAAA,MAAM,KAAA,GAAQ,gBAAgB,GAAG,CAAA;AACjC,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,GAAG,KAAA;AAAA,QACH,QAAA,EAAU;AAAA,OACZ;AACA,MAAA,MAAM,kBAAkB,QAAA,CAAS;AAAA,QAC/B,GAAG,SAAA;AAAA,QACH,MAAM,OAAA,EAAS;AAAA,OAChB,CAAA;AAED,MAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,cAAA,EACT,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,SAAA,EAAA,EAAQ,KAAA,EAAO,OAAA,EAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,wBAClCD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,cAAA,EACT,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,IAAA,CAAK,MAAM,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,aAAA,CAAc,EAAE,KAAA,EAAO,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAE,CAAA;AAAA,0BACzEA,GAAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAA,eAAA,EAAgB;AAAA,SAAA,EACxB;AAAA,OAAA,EACF,CAAA;AAAA,IAEJ;AAAA,EACF,CAAA;AAEA,EAAA,UAAA,CAAW,GAAA,GAAM,oBAAA,CAAqB,gBAAA,EAAO,QAAA,CAAS,GAAG,CAAA;AACzD,EAAA,OAAO,UAAA;AACT,CAAA","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",