aboutsummaryrefslogtreecommitdiffstats
path: root/assets/js
diff options
context:
space:
mode:
Diffstat (limited to 'assets/js')
-rw-r--r--assets/js/loads.js14
-rw-r--r--assets/js/search.js77
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)
+ }
+}
+)