Skip to main content

max / makenotwork

1.5 KB · 57 lines History Blame Raw
1 (function () {
2 "use strict";
3
4 var index = null;
5 var input = document.querySelector(".docs-search-input");
6 var results = document.querySelector(".docs-search-results");
7 if (!input || !results) return;
8
9 fetch("/docs/search.json")
10 .then(function (r) { return r.json(); })
11 .then(function (data) { index = data; });
12
13 input.addEventListener("input", function () {
14 window.timing.debounce("docs-search", doSearch);
15 });
16
17 function doSearch() {
18 var q = input.value.trim().toLowerCase();
19 results.innerHTML = "";
20
21 if (!q || !index) {
22 results.classList.add("hidden");
23 return;
24 }
25
26 var matches = index.filter(function (entry) {
27 return (
28 entry.title.toLowerCase().indexOf(q) !== -1 ||
29 entry.body_text.toLowerCase().indexOf(q) !== -1
30 );
31 });
32
33 if (matches.length === 0) {
34 results.classList.remove("hidden");
35 results.innerHTML = '<div class="empty-state empty-state--compact">No results found.</div>';
36 return;
37 }
38
39 results.classList.remove("hidden");
40 matches.slice(0, 15).forEach(function (entry) {
41 var a = document.createElement("a");
42 a.href = "/docs/" + entry.slug;
43 a.className = "docs-search-result";
44 a.innerHTML =
45 '<span class="docs-search-result-title">' + esc(entry.title) + "</span>" +
46 '<span class="docs-search-result-section">' + esc(entry.section) + "</span>";
47 results.appendChild(a);
48 });
49 }
50
51 function esc(s) {
52 var d = document.createElement("span");
53 d.textContent = s;
54 return d.innerHTML;
55 }
56 })();
57