feat(links.ts): custom identifiers for custom icons

This commit is contained in:
bfahrenfort 2024-12-16 00:47:24 -06:00
parent 8141cb1587
commit f581fd5894

View File

@ -12,7 +12,9 @@ import {
import path from "path"
import { visit } from "unist-util-visit"
import isAbsoluteUrl from "is-absolute-url"
import { Root } from "hast"
import { ElementContent, Root } from "hast"
type Sub = [RegExp, string | ElementContent]
interface Options {
/** How to resolve Markdown paths */
@ -22,6 +24,7 @@ interface Options {
openLinksInNewTab: boolean
lazyLoad: boolean
externalLinkIcon: boolean
substitutions?: Sub[]
}
const defaultOptions: Options = {
@ -55,13 +58,34 @@ export const CrawlLinks: QuartzTransformerPlugin<Partial<Options>> = (userOpts)
node.properties &&
typeof node.properties.href === "string"
) {
let dest = node.properties.href as RelativeURL
let href = node.properties.href
var dest = href as RelativeURL
var refIcon: string | ElementContent | null = null
var matched = false
opts.substitutions?.every(([regex, sub]) => {
let parts = href.match(regex)
if (parts != null) {
dest = parts.slice(1).join("") as RelativeURL
if (typeof sub == "object") {
refIcon = sub
} else {
refIcon = { type: "text", value: sub }
}
matched = true
return false // break equivalent
}
return true
})
node.properties.href = dest
const classes = (node.properties.className ?? []) as string[]
const isExternal = isAbsoluteUrl(dest)
classes.push(isExternal ? "external" : "internal")
if (isExternal && opts.externalLinkIcon) {
node.children.push({
if ((isExternal && opts.externalLinkIcon) || matched) {
node.children.push(
refIcon != null
? refIcon
: {
type: "element",
tagName: "svg",
properties: {
@ -80,7 +104,8 @@ export const CrawlLinks: QuartzTransformerPlugin<Partial<Options>> = (userOpts)
children: [],
},
],
})
},
)
}
// Check if the link has alias text