mirror of
https://github.com/jackyzha0/quartz.git
synced 2025-12-28 07:14:05 -06:00
Currently alias links do a full *double* page refresh when clicked and have no popovers, which is caused by the HTML redirect pages that are emitted by AliasRedirects. This is very bad, but the fix was easy
46 lines
1.7 KiB
TypeScript
46 lines
1.7 KiB
TypeScript
export function registerEscapeHandler(outsideContainer: HTMLElement | null, cb: () => void) {
|
|
if (!outsideContainer) return
|
|
function click(this: HTMLElement, e: HTMLElementEventMap["click"]) {
|
|
if (e.target !== this) return
|
|
e.preventDefault()
|
|
e.stopPropagation()
|
|
cb()
|
|
}
|
|
|
|
function esc(e: HTMLElementEventMap["keydown"]) {
|
|
if (!e.key.startsWith("Esc")) return
|
|
e.preventDefault()
|
|
cb()
|
|
}
|
|
|
|
outsideContainer?.addEventListener("click", click)
|
|
window.addCleanup(() => outsideContainer?.removeEventListener("click", click))
|
|
document.addEventListener("keydown", esc)
|
|
window.addCleanup(() => document.removeEventListener("keydown", esc))
|
|
}
|
|
|
|
export function removeAllChildren(node: HTMLElement) {
|
|
while (node.firstChild) {
|
|
node.removeChild(node.firstChild)
|
|
}
|
|
}
|
|
|
|
// AliasRedirect emits HTML redirects which also have the link[rel="canonical"]
|
|
// containing the URL it's redirecting to.
|
|
// Extracting it here with regex is _probably_ faster than parsing the entire HTML
|
|
// with a DOMParser effectively twice (here and later in the SPA code), even if
|
|
// way less robust - we only care about our own generated redirects after all.
|
|
const canonicalRegex = /<link rel="canonical" href="([^"]*)">/
|
|
|
|
export async function fetchCanonical(url: URL): Promise<Response> {
|
|
const res = await fetch(`${url}`)
|
|
if (!res.headers.get("content-type")?.startsWith("text/html")) {
|
|
return res
|
|
}
|
|
// reading the body can only be done once, so we need to clone the response
|
|
// to allow the caller to read it if it's was not a redirect
|
|
const text = await res.clone().text()
|
|
const [_, redirect] = text.match(canonicalRegex) ?? []
|
|
return redirect ? fetch(redirect) : res
|
|
}
|