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
|
// Options for fuse.js
let fuseOptions = {
includeMatches: true,
includeScore: true,
ignoreLocation: true,
minMatchCharLength: 3,
keys: [
{ name: "title", weight: 0.8 },
{ name: "contents", weight: 0.4 },
{ name: "tags", weight: 0.5 },
{ name: "categories", weight: 0.5 },
],
}
function getUrlParameter(name) {
const urlParams = new URLSearchParams(location.search)
return urlParams.get(name)
}
let searchQuery = getUrlParameter("q")
if (searchQuery) {
document.getElementById("search-query").value = searchQuery
executeSearch(searchQuery)
} else {
document.getElementById("search-results").innerHTML = ""
}
function executeSearch(searchQuery) {
// Look for "index.json" in the same directory where this script is called.
fetch("index.json")
.then((response) => response.json())
.then(function (data) {
let fuse = new Fuse(data, fuseOptions)
let result = fuse.search(searchQuery)
// console.log("Results: ", result)
if (result.length > 0) {
populateResults(result)
} else {
document.getElementById("search-results").innerHTML =
"<p class=\"bg-washed-red pa3 dark-red f4 fw6 tc br2 b--light-red ba\">No matches found</p>"
}
})
}
function populateResults(result) {
result.forEach(function (value, key) {
// Lifted from https://stackoverflow.com/posts/3700369/revisions
var elem = document.createElement("textarea")
elem.innerHTML = value.item.contents
var decoded = elem.value
// Pull template from hugo template definition
let frag = document
.getElementById("search-result-template")
.content.cloneNode(true)
// Replace values
frag.querySelector(".search_summary").setAttribute("id", "summary-" + key)
frag.querySelector(".search_link")
.setAttribute("href", value.item.permalink)
frag.querySelector(".search_title").textContent = value.item.title
frag.querySelector(".search_snippet").textContent = decoded
frag.querySelector(".search_time").textContent = value.item.date
document.getElementById("search-results").appendChild(frag)
})
}
|