bc543f81d9
* feat(plugins): add OxHugoFlavouredMarkdown ox-hugo is an org exporter backend that exports org files to hugo-compatible markdown in an opinionated way. This plugin adds some tweaks to the generated markdown to make it compatible with quartz but the list of changes applied it is not extensive. In the future however, we could leapfrog ox-hugo altogether and create a quartz site directly out of org-roam files. That way we won't have to do all the ritual dancing that this plugin has to perform. See https://github.com/k2052/org-to-markdown * fix: add toml to remarkFrontmatter configuration * docs: add docs for OxHugoFlavouredMarkdown * fixup! docs: add docs for OxHugoFlavouredMarkdown
71 lines
1.8 KiB
TypeScript
71 lines
1.8 KiB
TypeScript
import matter from "gray-matter"
|
|
import remarkFrontmatter from "remark-frontmatter"
|
|
import { QuartzTransformerPlugin } from "../types"
|
|
import yaml from "js-yaml"
|
|
import toml from "toml"
|
|
import { slugTag } from "../../util/path"
|
|
|
|
export interface Options {
|
|
delims: string | string[]
|
|
language: "yaml" | "toml"
|
|
}
|
|
|
|
const defaultOptions: Options = {
|
|
delims: "---",
|
|
language: "yaml",
|
|
}
|
|
|
|
export const FrontMatter: QuartzTransformerPlugin<Partial<Options> | undefined> = (userOpts) => {
|
|
const opts = { ...defaultOptions, ...userOpts }
|
|
return {
|
|
name: "FrontMatter",
|
|
markdownPlugins() {
|
|
return [
|
|
[remarkFrontmatter, ["yaml", "toml"]],
|
|
() => {
|
|
return (_, file) => {
|
|
const { data } = matter(file.value, {
|
|
...opts,
|
|
engines: {
|
|
yaml: (s) => yaml.load(s, { schema: yaml.JSON_SCHEMA }) as object,
|
|
toml: (s) => toml.parse(s) 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 = [...new Set(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[]
|
|
}
|
|
}
|
|
}
|