mirror of
https://github.com/jackyzha0/quartz.git
synced 2026-02-03 22:15:42 -06:00
feat: new marker interface for highlight parsing logic and validation
This commit is contained in:
parent
250fe442eb
commit
23d2cfbfd3
@ -7,6 +7,7 @@ import {
|
|||||||
DefinitionContent,
|
DefinitionContent,
|
||||||
Paragraph,
|
Paragraph,
|
||||||
Code,
|
Code,
|
||||||
|
Parent,
|
||||||
} from "mdast"
|
} from "mdast"
|
||||||
import { Element, Literal, Root as HtmlRoot } from "hast"
|
import { Element, Literal, Root as HtmlRoot } from "hast"
|
||||||
import { ReplaceFunction, findAndReplace as mdastFindReplace } from "mdast-util-find-and-replace"
|
import { ReplaceFunction, findAndReplace as mdastFindReplace } from "mdast-util-find-and-replace"
|
||||||
@ -100,6 +101,19 @@ const arrowMapping: Record<string, string> = {
|
|||||||
"<=": "⇐",
|
"<=": "⇐",
|
||||||
"<==": "⇐",
|
"<==": "⇐",
|
||||||
}
|
}
|
||||||
|
// Marker node used for highlighting
|
||||||
|
interface HighlightMarker {
|
||||||
|
type: "highlightMarker"
|
||||||
|
}
|
||||||
|
|
||||||
|
function isHighlightMarker(node: unknown): node is HighlightMarker {
|
||||||
|
return (
|
||||||
|
typeof node === "object" &&
|
||||||
|
node !== null &&
|
||||||
|
"type" in node &&
|
||||||
|
(node as { type: unknown }).type === "highlightMarker"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
function canonicalizeCallout(calloutName: string): keyof typeof calloutMapping {
|
function canonicalizeCallout(calloutName: string): keyof typeof calloutMapping {
|
||||||
const normalizedCallout = calloutName.toLowerCase() as keyof typeof calloutMapping
|
const normalizedCallout = calloutName.toLowerCase() as keyof typeof calloutMapping
|
||||||
@ -391,11 +405,13 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin<Partial<Options>>
|
|||||||
|
|
||||||
visit(tree, (node) => {
|
visit(tree, (node) => {
|
||||||
if (!("children" in node)) return
|
if (!("children" in node)) return
|
||||||
const children = (node as any).children as any[]
|
const parent = node as Parent
|
||||||
|
const children = parent.children
|
||||||
|
if (children.length === 0) return
|
||||||
|
|
||||||
const markers: number[] = []
|
const markers: number[] = []
|
||||||
for (let i = 0; i < children.length; i++) {
|
for (let i = 0; i < children.length; i++) {
|
||||||
if (children[i].type === "highlightMarker") {
|
if (isHighlightMarker(children[i])) {
|
||||||
markers.push(i)
|
markers.push(i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -413,11 +429,11 @@ export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin<Partial<Options>>
|
|||||||
const htmlContent = content
|
const htmlContent = content
|
||||||
.map((n) => {
|
.map((n) => {
|
||||||
const hast = toHast(n, { allowDangerousHtml: true })
|
const hast = toHast(n, { allowDangerousHtml: true })
|
||||||
return toHtml(hast as any, { allowDangerousHtml: true })
|
return hast ? toHtml(hast, { allowDangerousHtml: true }) : ""
|
||||||
})
|
})
|
||||||
.join("")
|
.join("")
|
||||||
|
|
||||||
const newNode = {
|
const newNode: Html = {
|
||||||
type: "html",
|
type: "html",
|
||||||
value: `<span class="text-highlight">${htmlContent}</span>`,
|
value: `<span class="text-highlight">${htmlContent}</span>`,
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user