summaryInclude=60; const fuseOptions = { shouldSort: true, includeMatches: true, threshold: 0.0, tokenize:true, location: 0, distance: 100, maxPatternLength: 32, minMatchCharLength: 2, keys: [ {name:"title",weight:0.8}, {name:"contents",weight:0.5}, {name:"tags",weight:0.3}, {name:"categories",weight:0.3} ] }; const getQueryByParam = param => decodeURIComponent( (location.search.split(param + '=')[1] || '').split('&')[0] ).replace(/\+/g, ' ') var searchQuery = getQueryByParam("s"); if(searchQuery){ $("#search-query").val(searchQuery); executeSearch(searchQuery); }else { $('#search-results').append("

Please enter a word or phrase above

"); } function executeSearch(searchQuery){ fetch("/index.json") .then(response => response.json()) .then(data => { let fuse = new Fuse(data, fuseOptions); let result = fuse.search(searchQuery); console.log({"matches":result}); if(result.length > 0){ populateResults(result); }else{ $('#search-results').append("

No matches found

"); } }); } function populateResults(result){ result.forEach(d => console.log( d) ) $.each(result,function(key,value){ var contents= value.item.contents; var snippet = ""; if(snippet.length<1){ snippet += contents.substring(0,summaryInclude*2); } //pull template from hugo templarte definition var templateDefinition = $('#search-result-template').html(); //replace values var output = render(templateDefinition,{key:key, title:value.item.title, link:value.item.permalink, tags:value.item.tags, categories:value.item.categories, snippet:snippet}); $('#search-results').append(output); let snippetHighlights=[]; snippetHighlights.push(searchQuery); snippetHighlights.forEach(value => $("#summary-"+key).mark(value)); }); } function render(templateString, data) { var conditionalMatches,conditionalPattern,copy; conditionalPattern = /\$\{\s*isset ([a-zA-Z]+) \s*\}(.+)\$\{\s*end\s*}/g; // Since loop below depends on re.lastInxdex, we use a copy to capture any // manipulations whilst inside the loop. copy = templateString; while ((conditionalMatches = conditionalPattern.exec(templateString)) !== null) { if(data[conditionalMatches[1]]){ // Valid key: Remove conditionals, leave contents. copy = copy.replace(conditionalMatches[0],conditionalMatches[2]); }else{ // Not valid: Remove entire section. copy = copy.replace(conditionalMatches[0],''); } } templateString = copy; // Now any conditionals removed we can do simple substitution. var key, find, re; for (key in data) { find = '\\$\\{\\s*' + key + '\\s*\\}'; re = new RegExp(find, 'g'); templateString = templateString.replace(re, data[key]); } return templateString; }