aboutsummaryrefslogtreecommitdiff
path: root/frontend/query.ts
blob: f3c7e07bc6e127f2bd72235be47c7e6baf49aa72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import { status } from "./ui.ts"

// TODO embed this information into bangs.js
const ENGINE_PINNED: Set<string> = new Set(["ddg", "qw", "qwl", "g"])
const ENGINE_NAMES: { [key: string]: string } = {
    "ddg": "DuckDuckGo",
    "qw": "Qwant",
    "qwl": "Qwant Lite",
    "g": "Google",
}

interface Bangs { [key: string]: { url: string, name?: string, pinned?: boolean } | undefined }
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],
                    pinned: ENGINE_PINNED.has(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", "+"))
}