From 23e71e95f487fc55e7470b4b7032ae22ccd54de4 Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Thu, 19 Sep 2024 09:42:56 +0000 Subject: [PATCH] Obsidian Parsers (Arrow) --- quartz/plugins/parsers/obsidian/arrows.ts | 42 +++++++++++++++++++++++ quartz/plugins/parsers/obsidian/index.ts | 1 + quartz/plugins/transformers/markdown.ts | 35 +++++++++++++++++++ 3 files changed, 78 insertions(+) diff --git a/quartz/plugins/parsers/obsidian/arrows.ts b/quartz/plugins/parsers/obsidian/arrows.ts index e69de29bb..0916b9a59 100644 --- a/quartz/plugins/parsers/obsidian/arrows.ts +++ b/quartz/plugins/parsers/obsidian/arrows.ts @@ -0,0 +1,42 @@ +import { QuartzTransformerPlugin } from "../../types" +import { ReplaceFunction, findAndReplace as mdastFindReplace } from "mdast-util-find-and-replace" +import { SKIP } from "unist-util-visit" +import { Root } from "mdast" + +const arrowMapping: Record = { + "->": "→", + "-->": "⇒", + "=>": "⇒", + "==>": "⇒", + "<-": "←", + "<--": "⇐", + "<=": "⇐", + "<==": "⇐", +} + +const arrowRegex = new RegExp(/(-{1,2}>|={1,2}>|<-{1,2}|<={1,2})/g) + +export const ObsidianMarkdownArrow: QuartzTransformerPlugin = () => { + return { + name: "ObsidianMarkdownArrow", + markdownPlugins() { + return [ + (tree: Root) => { + const replacements: [RegExp, string | ReplaceFunction][] = [] + replacements.push([ + arrowRegex, + (value: string, ..._capture: string[]) => { + const maybeArrow = arrowMapping[value] + if (maybeArrow === undefined) return SKIP + return { + type: "html", + value: `${maybeArrow}`, + } + }, + ]) + mdastFindReplace(tree, replacements) + }, + ] + }, + } +} diff --git a/quartz/plugins/parsers/obsidian/index.ts b/quartz/plugins/parsers/obsidian/index.ts index e69de29bb..100d6069b 100644 --- a/quartz/plugins/parsers/obsidian/index.ts +++ b/quartz/plugins/parsers/obsidian/index.ts @@ -0,0 +1 @@ +export { ObsidianMarkdownArrow } from "./arrows" diff --git a/quartz/plugins/transformers/markdown.ts b/quartz/plugins/transformers/markdown.ts index 18c5444f8..4d901f52b 100644 --- a/quartz/plugins/transformers/markdown.ts +++ b/quartz/plugins/transformers/markdown.ts @@ -35,6 +35,8 @@ import smartypants from "remark-smartypants" import rehypeSlug from "rehype-slug" import rehypeAutolinkHeadings from "rehype-autolink-headings" +import { ObsidianMarkdownArrow } from "../parsers/obsidian" + export interface CommonMarkOptions { option1: Boolean } @@ -170,6 +172,39 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin { + return (tree: Root, file) => { + //const replacements: [RegExp, string | ReplaceFunction][] = [] + //const base = pathToRoot(file.data.slug!) + + if (opts.parseArrows) { + ObsidianMarkdownArrow() + } + + //mdastFindReplace(tree, replacements) + } + }) + + return plugins + }, + htmlPlugins() { + const plugins: PluggableList = [rehypeRaw] + + plugins.push(() => {}) + + return plugins + }, + externalResources() { + const js: JSResource[] = [] + + return { js } + }, } }