From 4a826ff2748eafdbf63dd0547706ed7dc7ed3d76 Mon Sep 17 00:00:00 2001 From: Oscar Najera Date: Thu, 9 Nov 2023 17:49:27 +0100 Subject: Search page --- assets/js/search.js | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 assets/js/search.js (limited to 'assets') diff --git a/assets/js/search.js b/assets/js/search.js new file mode 100644 index 0000000..2dd397a --- /dev/null +++ b/assets/js/search.js @@ -0,0 +1,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 = + "

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) + }) +} -- cgit v1.2.3