import { status } from "./ui.ts" // TODO embed this information into bangs.js const ENGINE_NAMES: {[key:string]:string} = { "ddg": "DuckDuckGo", "qw": "Qwant", "qwl": "Qwant Lite", "g": "Google", } interface Bangs { [key: string]: { url: string, name: string } } export let bangs: Promise; export function load_bangs() { status("info", "Loading bangs...") bangs = new Promise(r => { (async () => { const bangs_res = await fetch("/bangs.json") if (!bangs_res.ok) return status("error", "could not download bangs.json") const k: {[key:string]:string} = await bangs_res.json() status("info", "Bangs loaded.") r(Object.fromEntries(Object.entries(k).map(([key,url]) => [key, { url, name: ENGINE_NAMES[key] ?? key }]))) })() }) } export async 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 = await search_url(engine, query_parts.join(" ")) } else { url = await search_url(default_engine, query) } status("success", `Forwarding to ${url}`) setTimeout(() => document.location.href = url, 0) } async function search_url(engine: string, query: string) { return (await bangs)[engine].url.replace("{{{s}}}", encodeURIComponent(query).replaceAll("%20", "+")) }