{{ if $.Param "enableSearch" }} <div class="search"> <span class="icon"> {{ partial "svgs/etc/search.svg" (dict "width" 22 "height" 22) }} </span> <input id="search" class="input" type="text" placeholder="{{T "search-placeholder"}}" autocomplete="off"> <div id="search-results" class="dropdown"> <div id="search-menu" class="dropdown-menu" role="menu"> </div> </div> </div> {{ partial "sidebar/site-mark" . }} {{ $lunr := resources.Get "js/lunr.min.js" | fingerprint }} <script> {{ if .Site.IsMultiLingual }} var baseurl = "{{.Site.BaseURL}}{{.Site.LanguagePrefix}}"; {{ else }} var baseurl = "{{.Site.BaseURL}}"; {{ end }} fetchInject([ "{{ $lunr.RelPermalink }}", ]).then(() => { var lunrIndex = null; var pagesIndex = null; var searchResults = null; var searchMenu = null; function endsWith(str, suffix) { return str.indexOf(suffix, str.length - suffix.length) !== -1; } function initLunr() { if (!endsWith(baseurl, "/")) { baseurl = baseurl + '/'; }; $.getJSON(baseurl + "index.json") .done(function (index) { pagesIndex = index; lunrIndex = lunr(function () { this.ref('uri'); this.field('title'); this.field('description'); //this.field('content'); //this.field('tags'); //this.field('series'); //this.field('categories'); var that = this; index.forEach(function(page) { that.add(page); }); }); }) .fail(function (jqxhr, textStatus, error) { var err = textStatus + ", " + error; console.error("Error getting Hugo index file:", err); }); } function search(query) { return lunrIndex.search(query).map(function (result) { return pagesIndex.filter(function (page) { return page.uri === result.ref; })[0]; }); } function renderSearchResults(results) { searchResults = document.getElementById('search-results'); searchMenu = document.getElementById('search-menu'); searchResults.setAttribute('class', 'dropdown is-active'); var content = document.createElement('div'); content.setAttribute('class', 'dropdown-content search-content'); if (results.length > 0) { results.forEach(function (result) { var item = document.createElement('a'); item.setAttribute('href', result.uri); item.setAttribute('class', 'dropdown-item'); item.innerHTML = `<div class="menu-item"><div class="menu-item__title">ยป ${result.title}</div><div class="menu-item__desc">${result.description ? result.description : result.content}</div></div>`; content.appendChild(item); }); } else { var item = document.createElement('span'); item.setAttribute('class', 'dropdown-item'); item.innerText = 'No results found'; content.appendChild(item); } while (searchMenu.hasChildNodes()) { searchMenu.removeChild( searchMenu.lastChild ); } searchMenu.appendChild(content); } initLunr(); $("#search").on('input', function(e) { if (!e.target.value) { $('#search-results').attr('class', 'dropdown'); return null; } var results = search(e.target.value); renderSearchResults(results); }); $('#search').on('blur', function() { setTimeout(function() { $('#search-results').attr('class', 'dropdown'); }, 100); }); $('#search').on('click', function (e) { if (!e.target.value) { $('#search-results').attr('class', 'dropdown'); return null; } var results = search(e.target.value); renderSearchResults(results); }); $('#search').on('keydown', function(e) { var items = $('#search-menu .dropdown-item'); var activeIndex = $('#search-menu .dropdown-item.is-active').index(); items.removeClass('is-active'); if (e.key === 'ArrowDown') { items.eq(activeIndex + 1).addClass('is-active'); } else if (e.key === 'ArrowUp') { items.eq(activeIndex - 1).addClass('is-active'); } else if (e.key === 'Enter') { var currentItemLink = items.eq(activeIndex).attr('href'); if (currentItemLink) { location.href = currentItemLink; } } }); }); </script> {{ end }}