Jacky Zhao
2023-07-26 cee2883c0889a65e2786d70eb81932f5ed017e59
quartz/plugins/emitters/tagPage.tsx
@@ -5,7 +5,13 @@
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) {
@@ -26,15 +32,23 @@
      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) {
@@ -48,7 +62,7 @@
      }
      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 = {