/// interface Bangs { [key: string]: string } let bangs: Bangs = {} let status_el: HTMLElement globalThis.addEventListener("hashchange", () => process_url()) globalThis.addEventListener("load", async () => { const bangs_res = await fetch("/bangs.json") if (!bangs_res.ok) document.writeln("error: could not download bangs.json") bangs = await bangs_res.json() process_url() }) function setup_page(engine?: string) { const section = document.createElement("section") if (engine) { document.head.innerHTML += `` const heading = document.createElement("h1") heading.textContent = engine const input = document.createElement("input") input.type = "input" input.addEventListener("keydown", ev => { if (ev.code == "Enter") process_query(engine, input.value ?? "") }) const submit = document.createElement("button") submit.textContent = "Search" submit.addEventListener("click", () => { process_query(engine, input.value ?? "") }) const info = document.createElement("p") info.textContent = `To install this as the default search engine, select "Add " in the context-menu of the URL-bar.` section.append(heading, input, submit, info) } else { const info = document.createElement("p") info.textContent = `todo` section.append(info) } status_el = document.createElement("p") section.append(status_el) document.body.append(section) } function status(text: string, color?: string) { status_el.textContent = text if (color) status_el.style.color = color } function process_url() { if (document.location.hash.length != 0) { const input = document.location.hash.substring(1) const [default_engine, query_encoded] = input.split("#") if (!query_encoded) return setup_page(default_engine) const query = decodeURIComponent(query_encoded) process_query(default_engine, query) } else { setup_page() } } function process_query(default_engine: string, query: string) { const bang_prefix = "!" let url = "" if (query.startsWith(bang_prefix)) { const [engine, ...query_parts] = query.substring(bang_prefix.length).split(" ") url = search_url(engine, query_parts.join(" ")) } else { url = search_url(default_engine, query) } status(`Forwarding to ${url}`, "green") setTimeout(() => document.location.href = url, 0) } function search_url(engine: string, query: string) { return bangs[engine].replace("{{{s}}}", encodeURIComponent(query).replaceAll("%20", "+")) }