aboutsummaryrefslogtreecommitdiffstats
path: root/assets/js/search.js
blob: 2dd397a96fe8b7ec7e2a59f04e432661ac6050b8 (plain)
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)
    })
}