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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
import { bangs, process_query } from "./query.ts";
export function add_page_content(engine?: string) {
//@ts-ignore HTMLCollectionOf is an iterator
for (const e of [...document.getElementsByTagName("section")]) e.remove()
if (engine) {
document.body.append(section_search(engine), section_info_search())
} else {
document.body.append(section_info_start(), section_engine_select())
}
}
function section_search(engine: string) {
engine = engine.toLowerCase();
const section = document.createElement("section")
section.classList.add("search")
if (document.getElementById("search-link")) {
// <link /> is already present, we need reload because browser wont notice otherwise
window.location.reload()
}
const link = document.createElement("link")
link.rel = "search"
link.id = "search-link"
link.type = "application/opensearchdescription+xml"
link.href = `/search.xml?default=${encodeURIComponent(engine)}`
link.title = `Fastbangs (default engine: ${engine})`
document.head.append(link)
const heading = document.createElement("h1")
heading.textContent = engine
bangs.then(bangs => heading.textContent = bangs[engine]?.name ?? engine)
const input = document.createElement("input")
input.type = "input"
input.addEventListener("keydown", ev => {
if (ev.code == "Enter") process_query(engine, input.value ?? "")
})
const submit = document.createElement("button")
submit.textContent = "Search"
submit.addEventListener("click", () => {
process_query(engine, input.value ?? "")
})
const search = document.createElement("div")
search.classList.add("bar")
search.append(input, submit)
section.append(heading, search)
return section
}
function section_engine_select() {
const section = document.createElement("section")
section.classList.add("engine-select")
const select = async (e: string) => {
const engine = e.toLowerCase();
if (!(await bangs)[engine]) return status("error", `Engine ${JSON.stringify(e)} does not exist.`)
window.location.hash = `#${e}`
}
const heading = document.createElement("h2")
heading.textContent = "Select a search engine"
const listing = document.createElement("ul")
bangs.then(bangs => {
for (const key in bangs) if (bangs[key]!.pinned) {
const li = document.createElement("li")
li.classList.add("pinned")
li.textContent = bangs[key]!.name ?? key
li.onclick = () => select(key)
listing.prepend(li)
}
})
const other = document.createElement("li")
const label = document.createElement("label")
label.textContent = "Select other engine by bang:"
const input = document.createElement("input")
input.type = "input"
input.addEventListener("keydown", ev => {
if (ev.code == "Enter") select(input.value)
})
const submit = document.createElement("button")
submit.textContent = "Select"
submit.addEventListener("click", () => select(input.value))
other.append(label, input, submit)
listing.append(other)
section.append(heading, listing)
return section
}
function section_info_search() {
const section = document.createElement("section")
section.classList.add("info")
const heading = document.createElement("h2")
heading.textContent = "Setup"
const info = document.createElement("p")
info.textContent = `To install this as the default search engine, select "Add Fastbangs" in the context-menu of the URL-bar.`
section.append(heading, info)
return section
}
function section_info_start() {
const section = document.createElement("section")
section.classList.add("info")
const heading = document.createElement("h1")
heading.textContent = "Fastbangs"
const info = document.createElement("p")
info.textContent = `
This application provides a way to (mostly) locally handle search bangs.
First select a default engine to use, then register this page as a search in your browser
`
section.append(heading, info)
return section
}
let status_el: HTMLElement
export function status(level: "error" | "info" | "success", text: string) {
if (!status_el) {
status_el = document.createElement("p")
document.body.append(status_el)
}
status_el.textContent = text
status_el.classList.value = ""
status_el.classList.add("status", `level-${level}`)
}
|