aboutsummaryrefslogtreecommitdiff
path: root/frontend/query.ts
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/query.ts')
-rw-r--r--frontend/query.ts42
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", "+"))
+}