From dd062107c433c587f8ff2565d13e859cb4d3a737 Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Thu, 19 Sep 2024 13:43:43 +0000 Subject: [PATCH] Obsidian Parser (Checkboxes) --- quartz/plugins/parsers/custom/default.ts | 2 +- quartz/plugins/parsers/obsidian/arrows.ts | 2 +- quartz/plugins/parsers/obsidian/callouts.ts | 2 +- quartz/plugins/parsers/obsidian/checkboxes.ts | 67 +++++++++++++++++++ quartz/plugins/parsers/obsidian/highlights.ts | 2 +- quartz/plugins/parsers/obsidian/index.ts | 1 + quartz/plugins/parsers/obsidian/mermaid.ts | 2 +- quartz/plugins/parsers/obsidian/wikilinks.ts | 2 +- quartz/plugins/transformers/markdown.ts | 6 +- quartz/plugins/types.ts | 2 +- 10 files changed, 80 insertions(+), 8 deletions(-) diff --git a/quartz/plugins/parsers/custom/default.ts b/quartz/plugins/parsers/custom/default.ts index 00882bb41..ab3581480 100644 --- a/quartz/plugins/parsers/custom/default.ts +++ b/quartz/plugins/parsers/custom/default.ts @@ -29,7 +29,7 @@ export const CustomDefault: QuartzParserPlugin> = (userOpts) => } return plug }, - htmlPlugins(_ctx) { + htmlPlugins() { const plug: Pluggable = () => {} return plug }, diff --git a/quartz/plugins/parsers/obsidian/arrows.ts b/quartz/plugins/parsers/obsidian/arrows.ts index f5e42a33f..c0687571f 100644 --- a/quartz/plugins/parsers/obsidian/arrows.ts +++ b/quartz/plugins/parsers/obsidian/arrows.ts @@ -58,7 +58,7 @@ export const ObsidianArrow: QuartzParserPlugin> = (userOpts) => } return plug }, - htmlPlugins(_ctx) { + htmlPlugins() { const plug: Pluggable = () => {} return plug }, diff --git a/quartz/plugins/parsers/obsidian/callouts.ts b/quartz/plugins/parsers/obsidian/callouts.ts index 3f80973f9..f8dc7647d 100644 --- a/quartz/plugins/parsers/obsidian/callouts.ts +++ b/quartz/plugins/parsers/obsidian/callouts.ts @@ -187,7 +187,7 @@ export const ObsidianCallouts: QuartzParserPlugin> = (userOpts) } return plug }, - htmlPlugins(_ctx) { + htmlPlugins() { const plug: Pluggable = () => {} return plug }, diff --git a/quartz/plugins/parsers/obsidian/checkboxes.ts b/quartz/plugins/parsers/obsidian/checkboxes.ts index e69de29bb..2fdf07292 100644 --- a/quartz/plugins/parsers/obsidian/checkboxes.ts +++ b/quartz/plugins/parsers/obsidian/checkboxes.ts @@ -0,0 +1,67 @@ +import { QuartzParserPlugin } from "../../types" +import { ReplaceFunction, findAndReplace as mdastFindReplace } from "mdast-util-find-and-replace" +// @ts-ignore +import checkboxScript from "../../components/scripts/checkbox.inline.ts" +import { visit } from "unist-util-visit" +import { JSResource } from "../../../util/resources" +import { Element, Literal, Root as HtmlRoot } from "hast" +import { Root } from "mdast" +import { Pluggable } from "unified" + +interface Options { + enabled: Boolean +} + +const defaultOptions: Options = { + enabled: true, +} + +export const ObsidianCheckboxes: QuartzParserPlugin> = (userOpts) => { + const opts: Options = { ...defaultOptions, ...userOpts } + return { + name: "ObsidianCheckboxes", + textTransform(_ctx, src: string | Buffer) { + if (src instanceof Buffer) { + src = src.toString() + } + return src + }, + markdownPlugins(_ctx) { + const plug: Pluggable = (tree: Root, _file) => { + const replacements: [RegExp, string | ReplaceFunction][] = [] + mdastFindReplace(tree, replacements) + } + return plug + }, + htmlPlugins() { + if (opts.enabled) { + const plug: Pluggable = (tree: HtmlRoot, _file) => { + visit(tree, "element", (node) => { + if (node.tagName === "input" && node.properties.type === "checkbox") { + const isChecked = node.properties?.checked ?? false + node.properties = { + type: "checkbox", + disabled: false, + checked: isChecked, + class: "checkbox-toggle", + } + } + }) + } + return plug + } + return {} as Pluggable + }, + externalResources() { + if (opts.enabled) { + const js: JSResource = { + script: checkboxScript, + loadTime: "afterDOMReady", + contentType: "inline", + } + return js + } + return {} as JSResource + }, + } +} diff --git a/quartz/plugins/parsers/obsidian/highlights.ts b/quartz/plugins/parsers/obsidian/highlights.ts index 3befeed7b..6a1fd8a7b 100644 --- a/quartz/plugins/parsers/obsidian/highlights.ts +++ b/quartz/plugins/parsers/obsidian/highlights.ts @@ -45,7 +45,7 @@ export const ObsidianHighlights: QuartzParserPlugin> = (userOpt } return plug }, - htmlPlugins(_ctx) { + htmlPlugins() { const plug: Pluggable = () => {} return plug }, diff --git a/quartz/plugins/parsers/obsidian/index.ts b/quartz/plugins/parsers/obsidian/index.ts index 33378d42a..baf0fd627 100644 --- a/quartz/plugins/parsers/obsidian/index.ts +++ b/quartz/plugins/parsers/obsidian/index.ts @@ -1,5 +1,6 @@ export { ObsidianArrow } from "./arrows" export { ObsidianCallouts } from "./callouts" +export { ObsidianCheckboxes } from "./checkboxes" export { ObsidianComments } from "./comments" export { ObsidianHighlights } from "./highlights" export { ObsidianMermaid } from "./mermaid" diff --git a/quartz/plugins/parsers/obsidian/mermaid.ts b/quartz/plugins/parsers/obsidian/mermaid.ts index e338386ac..6eaffee94 100644 --- a/quartz/plugins/parsers/obsidian/mermaid.ts +++ b/quartz/plugins/parsers/obsidian/mermaid.ts @@ -24,7 +24,7 @@ export const ObsidianMermaid: QuartzParserPlugin> = (userOpts) } return src }, - markdownPlugins(_ctx) { + markdownPlugins() { const plug: Pluggable = (tree: Root, _file) => { if (opts.enabled) { visit(tree, "code", (node: Code) => { diff --git a/quartz/plugins/parsers/obsidian/wikilinks.ts b/quartz/plugins/parsers/obsidian/wikilinks.ts index b46f716c0..dd2ab7b48 100644 --- a/quartz/plugins/parsers/obsidian/wikilinks.ts +++ b/quartz/plugins/parsers/obsidian/wikilinks.ts @@ -156,7 +156,7 @@ export const ObsidianWikilinks: QuartzParserPlugin> = (userOpts } return plug }, - htmlPlugins(_ctx) { + htmlPlugins() { const plug: Pluggable = () => {} return plug }, diff --git a/quartz/plugins/transformers/markdown.ts b/quartz/plugins/transformers/markdown.ts index 88aba4b68..9ae24fa13 100644 --- a/quartz/plugins/transformers/markdown.ts +++ b/quartz/plugins/transformers/markdown.ts @@ -38,6 +38,7 @@ import rehypeAutolinkHeadings from "rehype-autolink-headings" import { ObsidianArrow, ObsidianCallouts, + ObsidianCheckboxes, ObsidianComments, ObsidianHighlights, ObsidianMermaid, @@ -214,13 +215,16 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin {}) + plugins.push(ObsidianCheckboxes({ enabled: opts.enableCheckbox }).htmlPlugins()) return plugins }, externalResources() { const js: JSResource[] = [] + js.push( + ObsidianCheckboxes({ enabled: opts.enableCheckbox }).externalResources() as JSResource, + ) js.push(ObsidianCallouts({ enabled: opts.callouts }).externalResources() as JSResource) js.push(ObsidianMermaid({ enabled: opts.mermaid }).externalResources() as JSResource) diff --git a/quartz/plugins/types.ts b/quartz/plugins/types.ts index f89bd1d96..c3e56c5dd 100644 --- a/quartz/plugins/types.ts +++ b/quartz/plugins/types.ts @@ -54,6 +54,6 @@ export type QuartzParserPluginInstance = { name: string textTransform: (ctx: BuildCtx, src: string | Buffer) => string | Buffer markdownPlugins: (ctx: BuildCtx) => Pluggable - htmlPlugins: (ctx: BuildCtx) => Pluggable + htmlPlugins: () => Pluggable externalResources: () => JSResource | string }