From f35043b395adf9ffa06b71000dfba6f560d44cb7 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Wed, 26 Jul 2023 16:27:16 +0200 Subject: add a bunch of ui for the search page and style --- frontend/query.ts | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 frontend/query.ts (limited to 'frontend/query.ts') 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; +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", "+")) +} -- cgit v1.2.3-70-g09d2