Jacky Zhao
2023-06-20 fd5c8d17d3b3cd0a13b0a21a2b78d85010e02e12
quartz/plugins/emitters/contentIndex.ts
@@ -1,18 +1,5 @@
import { visit } from "unist-util-visit"
import { QuartzEmitterPlugin } from "../types"
import { Element } from "hast"
import path from "path"
import { trimPathSuffix } from "../../path"
interface Options {
  indexAnchorLinks: boolean,
  indexExternalLinks: boolean,
}
const defaultOptions: Options = {
  indexAnchorLinks: false,
  indexExternalLinks: false,
}
export type ContentIndex = Map<string, ContentDetails> 
export type ContentDetails = {
@@ -22,39 +9,17 @@
  content: string,
}
export const ContentIndex: QuartzEmitterPlugin<Options> = (userOpts) => {
  const opts = { ...userOpts, ...defaultOptions }
export const ContentIndex: QuartzEmitterPlugin = () => {
  return {
    name: "ContentIndex",
    async emit(_contentDir, _cfg, content, _resources, emit) {
      const fp = path.join("static", "contentIndex")
      const linkIndex: ContentIndex = new Map()
      for (const [tree, file] of content) {
        let slug = trimPathSuffix(file.data.slug!)
        const outgoing: Set<string> = new Set()
        visit(tree, 'element', (node: Element) => {
          if (node.tagName === 'a' && node.properties && typeof node.properties.href === 'string') {
            let dest = node.properties.href
            if (dest.startsWith(".")) {
              const normalizedPath = path.normalize(path.join(slug, dest))
              dest = trimPathSuffix(normalizedPath)
              outgoing.add(dest)
            } else if (dest.startsWith("#")) {
              if (opts.indexAnchorLinks) {
                outgoing.add(dest)
              }
            } else {
              if (opts.indexExternalLinks) {
                outgoing.add(dest)
              }
            }
          }
        })
      for (const [_tree, file] of content) {
        let slug = file.data.slug!
        linkIndex.set(slug, {
          title: file.data.frontmatter?.title!,
          links: [...outgoing],
          links: file.data.links ?? [],
          tags: file.data.frontmatter?.tags,
          content: file.data.text ?? ""
        })