67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import matter from "gray-matter"
 | 
						|
import remarkFrontmatter from "remark-frontmatter"
 | 
						|
import { QuartzTransformerPlugin } from "../types"
 | 
						|
import yaml from "js-yaml"
 | 
						|
import { slugTag } from "../../util/path"
 | 
						|
 | 
						|
export interface Options {
 | 
						|
  delims: string | string[]
 | 
						|
}
 | 
						|
 | 
						|
const defaultOptions: Options = {
 | 
						|
  delims: "---",
 | 
						|
}
 | 
						|
 | 
						|
export const FrontMatter: QuartzTransformerPlugin<Partial<Options> | undefined> = (userOpts) => {
 | 
						|
  const opts = { ...defaultOptions, ...userOpts }
 | 
						|
  return {
 | 
						|
    name: "FrontMatter",
 | 
						|
    markdownPlugins() {
 | 
						|
      return [
 | 
						|
        remarkFrontmatter,
 | 
						|
        () => {
 | 
						|
          return (_, file) => {
 | 
						|
            const { data } = matter(file.value, {
 | 
						|
              ...opts,
 | 
						|
              engines: {
 | 
						|
                yaml: (s) => yaml.load(s, { schema: yaml.JSON_SCHEMA }) as object,
 | 
						|
              },
 | 
						|
            })
 | 
						|
 | 
						|
            // tag is an alias for tags
 | 
						|
            if (data.tag) {
 | 
						|
              data.tags = data.tag
 | 
						|
            }
 | 
						|
 | 
						|
            if (data.tags && !Array.isArray(data.tags)) {
 | 
						|
              data.tags = data.tags
 | 
						|
                .toString()
 | 
						|
                .split(",")
 | 
						|
                .map((tag: string) => tag.trim())
 | 
						|
            }
 | 
						|
 | 
						|
            // slug them all!!
 | 
						|
            data.tags = data.tags?.map((tag: string) => slugTag(tag)) ?? []
 | 
						|
 | 
						|
            // fill in frontmatter
 | 
						|
            file.data.frontmatter = {
 | 
						|
              title: file.stem ?? "Untitled",
 | 
						|
              tags: [],
 | 
						|
              ...data,
 | 
						|
            }
 | 
						|
          }
 | 
						|
        },
 | 
						|
      ]
 | 
						|
    },
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
declare module "vfile" {
 | 
						|
  interface DataMap {
 | 
						|
    frontmatter: { [key: string]: any } & {
 | 
						|
      title: string
 | 
						|
      tags: string[]
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |