aboutsummaryrefslogtreecommitdiff
path: root/static/tinysearch.js
diff options
context:
space:
mode:
authorJieiku2022-08-14 12:41:15 -0700
committerJieiku2022-08-14 12:41:15 -0700
commit830cabab1f638052a8c4ac39eb86370da5a676eb (patch)
treef59bc6914105256ea684066277a49ab2dce53300 /static/tinysearch.js
parentcf95ee520261a0a523d5a3dfbc01a3847d67de51 (diff)
downloadabridge-830cabab1f638052a8c4ac39eb86370da5a676eb.tar.gz
abridge-830cabab1f638052a8c4ac39eb86370da5a676eb.tar.bz2
abridge-830cabab1f638052a8c4ac39eb86370da5a676eb.zip
Alternate Search Libraries Tinysearch and Stork1.2.0
Diffstat (limited to 'static/tinysearch.js')
-rw-r--r--static/tinysearch.js242
1 files changed, 242 insertions, 0 deletions
diff --git a/static/tinysearch.js b/static/tinysearch.js
new file mode 100644
index 0000000..80e8984
--- /dev/null
+++ b/static/tinysearch.js
@@ -0,0 +1,242 @@
+var baseUrl = document.querySelector("meta[name='base']").getAttribute("content");
+if (baseUrl.slice(-1) == "/") {
+ baseUrl = baseUrl.slice(0, -1);
+}
+// in page results when press enter or click search icon from search box
+function closeSearchNow() {
+ const main = document.querySelector("main");
+ main.innerHTML = window.main
+}
+function goSearchNow() {
+ const main = document.querySelector("main");
+ if (!window.main) {
+ window.main = main.innerHTML
+ };
+ var results = document.getElementById("suggestions");// suggestions div generated by search box
+
+ var ResultsClone = results.cloneNode(true);// make a clone of the results, so that we can alter it
+ ResultsClone.id = "results";// alter the id of our clone, so that we can apply different css style
+
+ var headerDiv = document.createElement("div");// create a div element
+
+ var headerContent = '<form name="closeSearch"><h2><button type="submit" title="Close Search"><i class="svgs x"></i></button> Results For: '.concat(document.getElementById("searchinput").value, "</h2></form>");// header to use at top of results page
+
+ headerDiv.innerHTML = headerContent;// document element div (headerDiv), set the inner contents to our header html (headerContent)
+
+ ResultsClone.insertBefore(headerDiv, ResultsClone.firstChild);//insert our header div at the top of the page
+
+ main.innerHTML = ResultsClone.outerHTML;//display ResultsClone.outerHTML as the page
+ results.innerHTML = "";// clear the suggestions div popup
+ document.getElementById("searchinput").value = "";// clear the search input box
+ document.body.contains(document.closeSearch) && (document.closeSearch.onsubmit = function() { closeSearchNow() })
+ return false
+}
+window.onload = function() {
+ document.body.contains(document.goSearch) && (document.goSearch.onsubmit = function() { return goSearchNow() })
+};
+
+async function lazyLoad() {
+ await init(baseUrl + "/tinysearch_engine_bg.wasm")
+}
+
+var loaded = false;
+if (!loaded) {
+ lazyLoad();
+ loaded = true;
+ document.body.contains(document.goSearch) && (document.goSearch.onsubmit = function() { return goSearchNow() })
+}
+
+/* Close search suggestion popup list */
+function closeAllLists(elmnt) {
+ var suggestions = document.getElementById("suggestions");
+ while (suggestions.firstChild) {
+ suggestions.removeChild(suggestions.firstChild);
+ }
+}
+
+function markTerm(input, term) {
+ return input.replace(new RegExp('(^|)(' + term + ')(|$)','ig'), '$1<mark><b>$2</b></mark>$3');
+}
+
+function autocomplete(inp) {
+
+ inp.addEventListener("input", function (e) {
+ var suggestions, entry, i, val = this.value;
+
+ /*close any already open lists of autocompleted values*/
+ closeAllLists();
+ if (!val) {
+ return false;
+ }
+
+ suggestions = document.getElementById("suggestions");// suggestions div, generated by search box
+
+ let arr = search(val, 99);//limit results
+
+ for (i = 0; i < arr.length; i++) {
+ let elem = arr[i];
+
+ entry = document.createElement("DIV");
+ entry.innerHTML = '<a href><span></span><span></span></a>';
+ var a, t, d;
+ a = entry.querySelector('a'),
+ t = entry.querySelector('span:first-child'),
+ d = entry.querySelector('span:nth-child(2)');
+ a.href = `${elem[1]}?q=${encodeURIComponent(val)}`;//a link
+ t.innerHTML = markTerm(elem[0], val);//title
+ d.innerHTML = markTerm(elem[2], val);//description
+
+ suggestions.appendChild(entry);
+ }
+ })
+}
+var searchinput = document.getElementById("searchinput");
+function suggestionFocus(e) {
+ if (e.keyCode === 191//forward slash
+ && document.activeElement.tagName !== "INPUT"
+ && document.activeElement.tagName !== "TEXTAREA") {
+ e.preventDefault();
+ searchinput.focus();
+ suggestions.classList.remove('d-none');
+ }
+
+ if (e.keyCode === 27 ) {//escape
+ searchinput.blur();
+ suggestions.classList.add('d-none');
+ closeAllLists();
+ }
+
+ const focusableSuggestions= suggestions.querySelectorAll('a');
+ if (suggestions.classList.contains('d-none')
+ || focusableSuggestions.length === 0) {
+ return;
+ }
+ const focusable= [...focusableSuggestions];
+ const index = focusable.indexOf(document.activeElement);
+
+ let nextIndex = 0;
+
+ if (e.keyCode === 38) {//up arrow
+ e.preventDefault();
+ nextIndex= index > 0 ? index-1 : 0;
+ focusableSuggestions[nextIndex].focus();
+ }
+ else if (e.keyCode === 40) {//down arrow
+ e.preventDefault();
+ nextIndex= index+1 < focusable.length ? index+1 : index;
+ focusableSuggestions[nextIndex].focus();
+ }
+
+}
+document.addEventListener("keydown", suggestionFocus);
+
+let wasm, cachedTextDecoder = (autocomplete(document.getElementById("searchinput")), new TextDecoder("utf-8", {
+ ignoreBOM: !0,
+ fatal: !0
+ })),
+ cachegetUint8Memory0 = (cachedTextDecoder.decode(), null);
+
+function getUint8Memory0() {
+ return cachegetUint8Memory0 = null !== cachegetUint8Memory0 && cachegetUint8Memory0.buffer === wasm.memory.buffer ? cachegetUint8Memory0 : new Uint8Array(wasm.memory.buffer)
+}
+
+function getStringFromWasm0(e, t) {
+ return cachedTextDecoder.decode(getUint8Memory0().subarray(e, e + t))
+}
+const heap = new Array(32).fill(void 0);
+heap.push(void 0, null, !0, !1);
+let heap_next = heap.length;
+
+function addHeapObject(e) {
+ heap_next === heap.length && heap.push(heap.length + 1);
+ var t = heap_next;
+ return heap_next = heap[t], heap[t] = e, t
+}
+let WASM_VECTOR_LEN = 0,
+ cachedTextEncoder = new TextEncoder("utf-8");
+const encodeString = "function" == typeof cachedTextEncoder.encodeInto ? function(e, t) {
+ return cachedTextEncoder.encodeInto(e, t)
+} : function(e, t) {
+ var n = cachedTextEncoder.encode(e);
+ return t.set(n), {
+ read: e.length,
+ written: n.length
+ }
+};
+
+function passStringToWasm0(e, t, n) {
+ if (void 0 === n) {
+ const n = cachedTextEncoder.encode(e),
+ a = t(n.length);
+ return getUint8Memory0().subarray(a, a + n.length).set(n), WASM_VECTOR_LEN = n.length, a
+ }
+ let a = e.length,
+ o = t(a);
+ const i = getUint8Memory0();
+ let r = 0;
+ for (; r < a; r++) {
+ const t = e.charCodeAt(r);
+ if (127 < t) break;
+ i[o + r] = t
+ }
+ if (r !== a) {
+ 0 !== r && (e = e.slice(r)), o = n(o, a, a = r + 3 * e.length);
+ const t = getUint8Memory0().subarray(o + r, o + a);
+ r += encodeString(e, t).written
+ }
+ return WASM_VECTOR_LEN = r, o
+}
+
+function getObject(e) {
+ return heap[e]
+}
+
+function dropObject(e) {
+ e < 36 || (heap[e] = heap_next, heap_next = e)
+}
+
+function takeObject(e) {
+ var t = getObject(e);
+ return dropObject(e), t
+}
+
+function search(e, t) {
+ var e = passStringToWasm0(e, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc),
+ n = WASM_VECTOR_LEN;
+ return takeObject(wasm.search(e, n, t))
+}
+async function load(e, t) {
+ if ("function" == typeof Response && e instanceof Response) {
+ if ("function" == typeof WebAssembly.instantiateStreaming) try {
+ return await WebAssembly.instantiateStreaming(e, t)
+ } catch (t) {
+ if ("application/wasm" == e.headers.get("Content-Type")) throw t;
+ console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", t)
+ }
+ var n = await e.arrayBuffer();
+ return WebAssembly.instantiate(n, t)
+ }
+ n = await WebAssembly.instantiate(e, t);
+ return n instanceof WebAssembly.Instance ? {
+ instance: n,
+ module: e
+ } : n
+}
+async function init(e) {
+ void 0 === e && (e = new URL(baseUrl + "/tinysearch_engine_bg.wasm", import.meta.url));
+ const t = {
+ wbg: {}
+ };
+ t.wbg.__wbindgen_json_parse = function(e, t) {
+ return addHeapObject(JSON.parse(getStringFromWasm0(e, t)))
+ };
+ var {
+ instance: e,
+ module: n
+ } = await load(await (e = "string" == typeof e || "function" == typeof Request && e instanceof Request || "function" == typeof URL && e instanceof URL ? fetch(e) : e), t);
+ return wasm = e.exports, init.__wbindgen_wasm_module = n, wasm
+}
+export default init;
+export {
+ search
+};