// Re-export shared path utilities from @quartz-community/utils export { isFilePath, isFullSlug, isSimpleSlug, isRelativeURL, isAbsoluteURL, getFullSlug, slugifyFilePath, simplifySlug, joinSegments, endsWith, trimSuffix, stripSlashes, getFileExtension, isFolderPath, getAllSegmentPrefixes, pathToRoot, resolveRelative, splitAnchor, slugTag, transformInternalLink, transformLink, } from "@quartz-community/utils" export type { FilePath, FullSlug, SimpleSlug, RelativeURL, TransformOptions, } from "@quartz-community/utils" // --- v5-specific exports below --- import type { Element as HastElement } from "hast" import type { FullSlug } from "@quartz-community/utils" import { isRelativeURL, joinSegments, resolveRelative } from "@quartz-community/utils" import { clone } from "./clone" export const QUARTZ = "quartz" // from micromorph/src/utils.ts // https://github.com/natemoo-re/micromorph/blob/main/src/utils.ts#L5 const _rebaseHtmlElement = (el: Element, attr: string, newBase: string | URL) => { const rebased = new URL(el.getAttribute(attr)!, newBase) el.setAttribute(attr, rebased.pathname + rebased.hash) } export function normalizeRelativeURLs(el: Element | Document, destination: string | URL) { el.querySelectorAll('[href=""], [href^="./"], [href^="../"]').forEach((item) => { _rebaseHtmlElement(item, "href", destination) }) el.querySelectorAll('[src=""], [src^="./"], [src^="../"]').forEach((item) => { _rebaseHtmlElement(item, "src", destination) }) } const _rebaseHastElement = ( el: HastElement, attr: string, curBase: FullSlug, newBase: FullSlug, ) => { if (el.properties?.[attr]) { if (!isRelativeURL(String(el.properties[attr]))) { return } const rel = joinSegments(resolveRelative(curBase, newBase), "..", el.properties[attr] as string) el.properties[attr] = rel } } export function normalizeHastElement(rawEl: HastElement, curBase: FullSlug, newBase: FullSlug) { const el = clone(rawEl) // clone so we dont modify the original page _rebaseHastElement(el, "src", curBase, newBase) _rebaseHastElement(el, "href", curBase, newBase) if (el.children) { el.children = el.children.map((child) => normalizeHastElement(child as HastElement, curBase, newBase), ) } return el }