From 4e830a5931bd8f9462557fe83b32eb9249c2e735 Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Thu, 19 Sep 2024 15:54:16 +0000 Subject: [PATCH] Obsidian Parser (InHtmlEmbed) --- quartz/plugins/parsers/obsidian/arrows.ts | 5 +- quartz/plugins/parsers/obsidian/callouts.ts | 8 +-- quartz/plugins/parsers/obsidian/checkboxes.ts | 5 +- quartz/plugins/parsers/obsidian/comments.ts | 5 +- quartz/plugins/parsers/obsidian/highlights.ts | 5 +- quartz/plugins/parsers/obsidian/html.ts | 0 quartz/plugins/parsers/obsidian/mermaid.ts | 2 + quartz/plugins/parsers/obsidian/tags.ts | 5 +- quartz/plugins/parsers/obsidian/wikilinks.ts | 5 +- quartz/plugins/transformers/markdown.ts | 57 +++++++++++++++++-- 10 files changed, 80 insertions(+), 17 deletions(-) delete mode 100644 quartz/plugins/parsers/obsidian/html.ts diff --git a/quartz/plugins/parsers/obsidian/arrows.ts b/quartz/plugins/parsers/obsidian/arrows.ts index 3bd12d74b..db62a0c1b 100644 --- a/quartz/plugins/parsers/obsidian/arrows.ts +++ b/quartz/plugins/parsers/obsidian/arrows.ts @@ -4,13 +4,16 @@ import { JSResource } from "../../../util/resources" import { SKIP } from "unist-util-visit" import { Root } from "mdast" import { Pluggable } from "unified" +import { mdastFindReplaceInHtml } from "../../transformers/markdown" interface Options { enabled: Boolean + inHtml: Boolean } const defaultOptions: Options = { enabled: true, + inHtml: false, } const arrowMapping: Record = { @@ -53,7 +56,7 @@ export const ObsidianArrow: QuartzParser> = (userOpts) => { } }, ]) - mdastFindReplace(tree, replacements) + mdastFindReplaceInHtml(tree, replacements, opts.inHtml) } } return plug diff --git a/quartz/plugins/parsers/obsidian/callouts.ts b/quartz/plugins/parsers/obsidian/callouts.ts index 41a45ed99..d2eb513d3 100644 --- a/quartz/plugins/parsers/obsidian/callouts.ts +++ b/quartz/plugins/parsers/obsidian/callouts.ts @@ -9,13 +9,16 @@ import { PhrasingContent } from "mdast-util-find-and-replace/lib" import { capitalize } from "../../../util/lang" import { toHast } from "mdast-util-to-hast" import { toHtml } from "hast-util-to-html" +import { mdastToHtml } from "../../transformers/markdown" interface Options { enabled: Boolean + inHtml: Boolean } const defaultOptions: Options = { enabled: true, + inHtml: false, } // from https://github.com/escwxyz/remark-obsidian-callout/blob/main/src/index.ts @@ -58,11 +61,6 @@ function canonicalizeCallout(calloutName: string): keyof typeof calloutMapping { return calloutMapping[normalizedCallout] ?? calloutName } -const mdastToHtml = (ast: PhrasingContent | Paragraph) => { - const hast = toHast(ast, { allowDangerousHtml: true })! - return toHtml(hast, { allowDangerousHtml: true }) -} - export const ObsidianCallouts: QuartzParser> = (userOpts) => { const opts: Options = { ...defaultOptions, ...userOpts } return { diff --git a/quartz/plugins/parsers/obsidian/checkboxes.ts b/quartz/plugins/parsers/obsidian/checkboxes.ts index 3dcb4d3fa..8236e3875 100644 --- a/quartz/plugins/parsers/obsidian/checkboxes.ts +++ b/quartz/plugins/parsers/obsidian/checkboxes.ts @@ -7,13 +7,16 @@ import { JSResource } from "../../../util/resources" import { Element, Literal, Root as HtmlRoot } from "hast" import { Root } from "mdast" import { Pluggable } from "unified" +import { mdastFindReplaceInHtml } from "../../transformers/markdown" interface Options { enabled: Boolean + inHtml: Boolean } const defaultOptions: Options = { enabled: true, + inHtml: false, } export const ObsidianCheckboxes: QuartzParser> = (userOpts) => { @@ -29,7 +32,7 @@ export const ObsidianCheckboxes: QuartzParser> = (userOpts) => markdownPlugins(_ctx) { const plug: Pluggable = (tree: Root, _file) => { const replacements: [RegExp, string | ReplaceFunction][] = [] - mdastFindReplace(tree, replacements) + mdastFindReplaceInHtml(tree, replacements, opts.inHtml) } return plug }, diff --git a/quartz/plugins/parsers/obsidian/comments.ts b/quartz/plugins/parsers/obsidian/comments.ts index 580eeed9e..ed9325c30 100644 --- a/quartz/plugins/parsers/obsidian/comments.ts +++ b/quartz/plugins/parsers/obsidian/comments.ts @@ -3,13 +3,16 @@ import { ReplaceFunction, findAndReplace as mdastFindReplace } from "mdast-util- import { JSResource } from "../../../util/resources" import { Root } from "mdast" import { Pluggable } from "unified" +import { mdastFindReplaceInHtml } from "../../transformers/markdown" interface Options { enabled: Boolean + inHtml: Boolean } const defaultOptions: Options = { enabled: true, + inHtml: false, } const commentRegex = new RegExp(/%%[\s\S]*?%%/g) @@ -33,7 +36,7 @@ export const ObsidianComments: QuartzParser> = (userOpts) => { const plug: Pluggable = (tree: Root, _file) => { if (opts.enabled) { const replacements: [RegExp, string | ReplaceFunction][] = [] - mdastFindReplace(tree, replacements) + mdastFindReplaceInHtml(tree, replacements, opts.inHtml) } } return plug diff --git a/quartz/plugins/parsers/obsidian/highlights.ts b/quartz/plugins/parsers/obsidian/highlights.ts index 09abe4fec..3000e9091 100644 --- a/quartz/plugins/parsers/obsidian/highlights.ts +++ b/quartz/plugins/parsers/obsidian/highlights.ts @@ -3,13 +3,16 @@ import { ReplaceFunction, findAndReplace as mdastFindReplace } from "mdast-util- import { JSResource } from "../../../util/resources" import { Root } from "mdast" import { Pluggable } from "unified" +import { mdastFindReplaceInHtml } from "../../transformers/markdown" interface Options { enabled: Boolean + inHtml: Boolean } const defaultOptions: Options = { enabled: true, + inHtml: false, } const highlightRegex = new RegExp(/==([^=]+)==/g) @@ -40,7 +43,7 @@ export const ObsidianHighlights: QuartzParser> = (userOpts) => } }, ]) - mdastFindReplace(tree, replacements) + mdastFindReplaceInHtml(tree, replacements, opts.inHtml) } } return plug diff --git a/quartz/plugins/parsers/obsidian/html.ts b/quartz/plugins/parsers/obsidian/html.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/quartz/plugins/parsers/obsidian/mermaid.ts b/quartz/plugins/parsers/obsidian/mermaid.ts index c868b8b7b..8b64686bc 100644 --- a/quartz/plugins/parsers/obsidian/mermaid.ts +++ b/quartz/plugins/parsers/obsidian/mermaid.ts @@ -6,10 +6,12 @@ import { Pluggable } from "unified" interface Options { enabled: Boolean + inHtml: Boolean } const defaultOptions: Options = { enabled: true, + inHtml: false, } export const ObsidianMermaid: QuartzParser> = (userOpts) => { diff --git a/quartz/plugins/parsers/obsidian/tags.ts b/quartz/plugins/parsers/obsidian/tags.ts index 7f30d5911..d6257a8c7 100644 --- a/quartz/plugins/parsers/obsidian/tags.ts +++ b/quartz/plugins/parsers/obsidian/tags.ts @@ -4,13 +4,16 @@ import { FilePath, pathToRoot, slugTag, slugifyFilePath } from "../../../util/pa import { JSResource } from "../../../util/resources" import { Root } from "mdast" import { Pluggable } from "unified" +import { mdastFindReplaceInHtml } from "../../transformers/markdown" interface Options { enabled: Boolean + inHtml: Boolean } const defaultOptions: Options = { enabled: true, + inHtml: false, } // (?:^| ) -> non-capturing group, tag should start be separated by a space or be the start of the line @@ -66,7 +69,7 @@ export const ObsidianTags: QuartzParser> = (userOpts) => { } }, ]) - mdastFindReplace(tree, replacements) + mdastFindReplaceInHtml(tree, replacements, opts.inHtml) } return plug }, diff --git a/quartz/plugins/parsers/obsidian/wikilinks.ts b/quartz/plugins/parsers/obsidian/wikilinks.ts index 51eb53574..702410443 100644 --- a/quartz/plugins/parsers/obsidian/wikilinks.ts +++ b/quartz/plugins/parsers/obsidian/wikilinks.ts @@ -4,13 +4,16 @@ import { FilePath, splitAnchor, slugifyFilePath } from "../../../util/path" import { JSResource } from "../../../util/resources" import { Root } from "mdast" import { Pluggable } from "unified" +import { mdastFindReplaceInHtml } from "../../transformers/markdown" interface Options { enabled: Boolean + inHtml: Boolean } const defaultOptions: Options = { enabled: true, + inHtml: false, } const externalLinkRegex = /^https?:\/\//i @@ -152,7 +155,7 @@ export const ObsidianWikilinks: QuartzParser> = (userOpts) => { } }, ]) - mdastFindReplace(tree, replacements) + mdastFindReplaceInHtml(tree, replacements, opts.inHtml) } return plug }, diff --git a/quartz/plugins/transformers/markdown.ts b/quartz/plugins/transformers/markdown.ts index 681169306..6ac0fab0c 100644 --- a/quartz/plugins/transformers/markdown.ts +++ b/quartz/plugins/transformers/markdown.ts @@ -150,6 +150,41 @@ const defaultRoamOptions: RoamOptions = { attributeComponent: true, } +export const mdastToHtml = (ast: PhrasingContent | Paragraph) => { + const hast = toHast(ast, { allowDangerousHtml: true })! + return toHtml(hast, { allowDangerousHtml: true }) +} + +export const mdastFindReplaceInHtml = ( + tree: Root, + replacements: [RegExp, string | ReplaceFunction][], + inHtml: Boolean, +) => { + if (inHtml) { + visit(tree, "html", (node: Html) => { + for (const [regex, replace] of replacements) { + if (typeof replace === "string") { + node.value = node.value.replace(regex, replace) + } else { + node.value = node.value.replace(regex, (substring: string, ...args) => { + const replaceValue = replace(substring, ...args) + if (typeof replaceValue === "string") { + return replaceValue + } else if (Array.isArray(replaceValue)) { + return replaceValue.map(mdastToHtml).join("") + } else if (typeof replaceValue === "object" && replaceValue !== null) { + return mdastToHtml(replaceValue) + } else { + return substring + } + }) + } + } + }) + } + mdastFindReplace(tree, replacements) +} + export const CommonMarkFlavoredMarkdown: QuartzTransformerPlugin> = ( userOpts, ) => { @@ -251,6 +286,8 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin { return (tree: Root, file) => { //const replacements: [RegExp, string | ReplaceFunction][] = [] @@ -265,12 +302,20 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin