const idx = [ {{- range .Site.Pages }} { "link": "{{ .Permalink }}", "title": "{{ .Title }}", "body": "{{ .PlainWords }}".toLowerCase(), }, {{- end }} ]; const searchKeys = ['title', 'link', 'body', 'id']; const searchPageElement = elem('#searchpage'); const searchOptions = { ignoreLocation: true, findAllMatches: true, includeScore: true, shouldSort: true, keys: searchKeys, threshold: 0.0 }; const index = new Fuse(idx, searchOptions); function searchResults(results=[], query="") { let resultsFragment = new DocumentFragment(); let showResults = elem('.search_results'); if(searchPageElement) { showResults = searchPageElement; } emptyEl(showResults); if(results.length) { let resultsTitle = createEl('h3'); resultsTitle.className = 'search_title'; resultsTitle.innerText = 'Quick Links'; if(searchPageElement) { resultsTitle.innerText = 'Search Results'; } resultsFragment.appendChild(resultsTitle); results.slice(0,4).forEach(function(result){ let item = createEl('a'); item.href = `${result.link}?query=${query}`; item.className = 'search_result'; item.style.order = result.score; if(searchPageElement) { pushClass(item, 'passive'); let itemTitle = createEl('h3'); itemTitle.textContent = result.title; item.appendChild(itemTitle); let itemDescription = createEl('p'); // position of first search term instance let queryInstance = result.body.indexOf(query); itemDescription.textContent = `... ${result.body.substring(queryInstance, queryInstance + 200)} ...`; item.appendChild(itemDescription); } else { item.textContent = result.title; } resultsFragment.appendChild(item); }); } else { showResults.innerHTML = (query.length >= 3) ? `No Results` : ""; } showResults.appendChild(resultsFragment); } function search(searchTerm) { // check if searchTerm can be cast as float const isFloat = parseFloat(searchTerm); const minimumSearchTermLength = isFloat ? 2 : 3; if(searchTerm.length >= minimumSearchTermLength) { let rawResults = index.search(searchTerm); rawResults = rawResults.map(function(result){ const score = result.score; const resultItem = result.item; resultItem.score = (parseFloat(score) * 50).toFixed(0); return resultItem; }); searchResults(rawResults, searchTerm); } else { searchResults(); } } function liveSearch() { const searchField = elem('.search_field'); if (searchField) { searchField.addEventListener('input', function() { const searchTerm = searchField.value.trim().toLowerCase(); search(searchTerm); }); searchField.addEventListener('search', function(){ const searchTerm = searchField.value.trim().toLowerCase(); window.location.href = `${parentURL}/search/?query=${searchTerm}`; }); } } function findQuery(query = 'query') { const urlParams = new URLSearchParams(window.location.search); if(urlParams.has(query)){ let c = urlParams.get(query); // window.find(c); cc = `${c.charAt(0).toUpperCase()}${c.substring(1,c.length)}`; // window.find(cc); return [c, cc]; } return ["",""]; } function passiveSearch() { if(searchPageElement) { const searchTerm = findQuery()[0]; search(searchTerm); } } let main = elem('main'); if(!main) { main = elem('.main'); } window.addEventListener('load', function() { searchPageElement ? false : liveSearch(); passiveSearch(); const searchQuery = findQuery(); wrapText(searchQuery[0],main); wrapText(searchQuery[1],main); });