// 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 = "

No matches found

" } }) } 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) }) }