diff options
Diffstat (limited to 'assets/js')
-rw-r--r-- | assets/js/loads.js | 14 | ||||
-rw-r--r-- | assets/js/search.js | 77 |
2 files changed, 91 insertions, 0 deletions
diff --git a/assets/js/loads.js b/assets/js/loads.js new file mode 100644 index 0000000..c50037c --- /dev/null +++ b/assets/js/loads.js @@ -0,0 +1,14 @@ +function load_css(url) { + let link = document.createElement("link"); + link.rel = "stylesheet"; + link.type = "text/css"; + link.href = url; + let head = document.getElementsByTagName("head")[0]; + head.appendChild(link); +} + +addEventListener("load", function () { + if (document.querySelector(".highlight .chroma")) { + load_css("/css/syntax.css"); + } +}); diff --git a/assets/js/search.js b/assets/js/search.js new file mode 100644 index 0000000..ab2256b --- /dev/null +++ b/assets/js/search.js @@ -0,0 +1,77 @@ +// 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(url, name) { + const urlParams = new URLSearchParams(url) + return urlParams.get(name) +} + +function search(query, data){ + let fuse = new Fuse(data, fuseOptions) + return fuse.search(query) +} + +function unescapeText(input) { + // Lifted from https://stackoverflow.com/posts/3700369/revisions + var elem = document.createElement("textarea") + elem.innerHTML = input + return elem.value +} + +function resultEntry(data, key) { + // Pull template from hugo template definition + let frag = document + .getElementById("search-result-template") + .content.cloneNode(true) + + // Replace values + let { title, permalink, contents, date } = data + frag.querySelector(".search_summary").setAttribute("id", "summary-" + key) + frag.querySelector(".search_link").setAttribute("href", permalink) + frag.querySelector(".search_title").textContent = title + frag.querySelector(".search_snippet").textContent = unescapeText(contents) + frag.querySelector(".search_time").textContent = date + return frag +} + + +function executeSearch(searchQuery) { + // Look for "index.json" in the same directory where this script is called. + return fetch("index.json") + .then((response) => response.json()) + .then((data) => search(searchQuery, data)) +} + +function renderResults(results) { + let resultBox = document.getElementById("search-results") + resultBox.innerHTML = "" + + // console.log("Results: ", results) + if (results.length > 0) { + results.forEach((value, key) => { + resultBox.appendChild(resultEntry(value.item, key)) + }) + } else { + resultBox.innerHTML = document.getElementById("no-match").innerHTML + } +} + +addEventListener("load", function () { + let searchQuery = getUrlParameter(location.search, "q") + if (searchQuery) { + document.getElementById("search-query").value = searchQuery + executeSearch(searchQuery).then(renderResults) + } +} +) |