From cce389c81d262d1d2a2bd8140c879efd68e3c6dd Mon Sep 17 00:00:00 2001
From: Jacky Zhao <j.zhao2k19@gmail.com>
Date: Wed, 13 Sep 2023 18:28:53 +0000
Subject: [PATCH] feat: note transclusion (#475)
---
quartz/plugins/transformers/ofm.ts | 52 +++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 43 insertions(+), 9 deletions(-)
diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts
index 811d659..8306f40 100644
--- a/quartz/plugins/transformers/ofm.ts
+++ b/quartz/plugins/transformers/ofm.ts
@@ -135,6 +135,7 @@
const hast = toHast(ast, { allowDangerousHtml: true })!
return toHtml(hast, { allowDangerousHtml: true })
}
+
const findAndReplace = opts.enableInHtmlEmbed
? (tree: Root, regex: RegExp, replace?: Replace | null | undefined) => {
if (replace) {
@@ -238,8 +239,16 @@
value: `<iframe src="${url}"></iframe>`,
}
} else if (ext === "") {
- // TODO: note embed
+ const block = anchor.slice(1)
+ return {
+ type: "html",
+ data: { hProperties: { transclude: true } },
+ value: `<blockquote class="transclude" data-url="${url}" data-block="${block}"><a href="${
+ url + anchor
+ }" class="transclude-inner">Transclude of block ${block}</a></blockquote>`,
+ }
}
+
// otherwise, fall through to regular link
}
@@ -422,22 +431,47 @@
if (opts.parseBlockReferences) {
plugins.push(() => {
+ const inlineTagTypes = new Set(["p", "li"])
+ const blockTagTypes = new Set(["blockquote"])
return (tree, file) => {
file.data.blocks = {}
- const validTagTypes = new Set(["blockquote", "p", "li"])
- visit(tree, "element", (node, _index, _parent) => {
- if (validTagTypes.has(node.tagName)) {
+
+ visit(tree, "element", (node, index, parent) => {
+ if (blockTagTypes.has(node.tagName)) {
+ const nextChild = parent?.children.at(index! + 2) as Element
+ if (nextChild && nextChild.tagName === "p") {
+ const text = nextChild.children.at(0) as Literal
+ if (text && text.value && text.type === "text") {
+ const matches = text.value.match(blockReferenceRegex)
+ if (matches && matches.length >= 1) {
+ parent!.children.splice(index! + 2, 1)
+ const block = matches[0].slice(1)
+
+ if (!Object.keys(file.data.blocks!).includes(block)) {
+ node.properties = {
+ ...node.properties,
+ id: block,
+ }
+ file.data.blocks![block] = node
+ }
+ }
+ }
+ }
+ } else if (inlineTagTypes.has(node.tagName)) {
const last = node.children.at(-1) as Literal
- if (last.value && typeof last.value === "string") {
+ if (last && last.value && typeof last.value === "string") {
const matches = last.value.match(blockReferenceRegex)
if (matches && matches.length >= 1) {
last.value = last.value.slice(0, -matches[0].length)
const block = matches[0].slice(1)
- node.properties = {
- ...node.properties,
- id: block,
+
+ if (!Object.keys(file.data.blocks!).includes(block)) {
+ node.properties = {
+ ...node.properties,
+ id: block,
+ }
+ file.data.blocks![block] = node
}
- file.data.blocks![block] = node
}
}
}
--
Gitblit v1.10.0