diff options
Diffstat (limited to 'frontend/query.ts')
-rw-r--r-- | frontend/query.ts | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/frontend/query.ts b/frontend/query.ts new file mode 100644 index 0000000..c0cc9ea --- /dev/null +++ b/frontend/query.ts @@ -0,0 +1,42 @@ +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<Bangs>; +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", "+")) +} |