| | |
| | | RelativeURL, |
| | | SimpleSlug, |
| | | TransformOptions, |
| | | _stripSlashes, |
| | | stripSlashes, |
| | | simplifySlug, |
| | | splitAnchor, |
| | | transformLink, |
| | |
| | | externalLinkIcon: true, |
| | | } |
| | | |
| | | export const CrawlLinks: QuartzTransformerPlugin<Partial<Options> | undefined> = (userOpts) => { |
| | | export const CrawlLinks: QuartzTransformerPlugin<Partial<Options>> = (userOpts) => { |
| | | const opts = { ...defaultOptions, ...userOpts } |
| | | return { |
| | | name: "LinkProcessing", |
| | |
| | | type: "element", |
| | | tagName: "svg", |
| | | properties: { |
| | | "aria-hidden": "true", |
| | | class: "external-icon", |
| | | viewBox: "0 0 512 512", |
| | | }, |
| | |
| | | } |
| | | node.properties.className = classes |
| | | |
| | | if (opts.openLinksInNewTab) { |
| | | if (isExternal && opts.openLinksInNewTab) { |
| | | node.properties.target = "_blank" |
| | | } |
| | | |
| | |
| | | |
| | | // url.resolve is considered legacy |
| | | // WHATWG equivalent https://nodejs.dev/en/api/v18/url/#urlresolvefrom-to |
| | | const url = new URL(dest, `https://base.com/${curSlug}`) |
| | | const url = new URL(dest, "https://base.com/" + stripSlashes(curSlug, true)) |
| | | const canonicalDest = url.pathname |
| | | let [destCanonical, _destAnchor] = splitAnchor(canonicalDest) |
| | | if (destCanonical.endsWith("/")) { |
| | |
| | | } |
| | | |
| | | // need to decodeURIComponent here as WHATWG URL percent-encodes everything |
| | | const full = decodeURIComponent(_stripSlashes(destCanonical, true)) as FullSlug |
| | | const full = decodeURIComponent(stripSlashes(destCanonical, true)) as FullSlug |
| | | const simple = simplifySlug(full) |
| | | outgoing.add(simple) |
| | | node.properties["data-slug"] = full |