| | |
| | | import { pageResources, renderPage } from "../../components/renderPage" |
| | | import { ProcessedContent, defaultProcessedContent } from "../vfile" |
| | | import { FullPageLayout } from "../../cfg" |
| | | import { CanonicalSlug, FilePath, ServerSlug, joinSegments } from "../../path" |
| | | import { |
| | | CanonicalSlug, |
| | | FilePath, |
| | | ServerSlug, |
| | | getAllSegmentPrefixes, |
| | | joinSegments, |
| | | } from "../../path" |
| | | |
| | | export const TagPage: QuartzEmitterPlugin<FullPageLayout> = (opts) => { |
| | | if (!opts) { |
| | |
| | | const allFiles = content.map((c) => c[1].data) |
| | | const cfg = ctx.cfg.configuration |
| | | |
| | | const tags: Set<string> = new Set(allFiles.flatMap((data) => data.frontmatter?.tags ?? [])) |
| | | const tags: Set<string> = new Set( |
| | | allFiles.flatMap((data) => data.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes), |
| | | ) |
| | | // add base tag |
| | | tags.add("") |
| | | |
| | | const tagDescriptions: Record<string, ProcessedContent> = Object.fromEntries( |
| | | [...tags].map((tag) => [ |
| | | tag, |
| | | defaultProcessedContent({ |
| | | slug: `tags/${tag}/index` as ServerSlug, |
| | | frontmatter: { title: `Tag: ${tag}`, tags: [] }, |
| | | }), |
| | | ]), |
| | | [...tags].map((tag) => { |
| | | const title = tag === "" ? "Tag Index" : `Tag: #${tag}` |
| | | return [ |
| | | tag, |
| | | defaultProcessedContent({ |
| | | slug: joinSegments("tags", tag, "index") as ServerSlug, |
| | | frontmatter: { title, tags: [] }, |
| | | }), |
| | | ] |
| | | }), |
| | | ) |
| | | |
| | | for (const [tree, file] of content) { |
| | |
| | | } |
| | | |
| | | for (const tag of tags) { |
| | | const slug = `tags/${tag}/index` as CanonicalSlug |
| | | const slug = joinSegments("tags", tag) as CanonicalSlug |
| | | const externalResources = pageResources(slug, resources) |
| | | const [tree, file] = tagDescriptions[tag] |
| | | const componentData: QuartzComponentProps = { |