zelda-planted/themes/zen/assets/js/search.js

76 lines
2.0 KiB
JavaScript
Raw Permalink Normal View History

2020-10-15 04:39:37 +00:00
/**
* @file
* A JavaScript file for flexsearch.
*/
(function () {
'use strict';
const flexSearch = new FlexSearch({
doc: {
id: 'id',
field: ['title','tags','content','date'],
store: ['title','summary','date','permalink']
}
});
function showResults(items) {
const template = document.querySelector('template').content;
const fragment = document.createDocumentFragment();
const results = document.querySelector('.search-results');
results.textContent = '';
for (const item of items) {
const result = template.cloneNode(true);
const a = result.querySelector('a');
const time = result.querySelector('time');
const content = result.querySelector('.content');
a.innerHTML = item.title;
a.href = item.permalink;
time.innerText = item.date;
content.innerHTML = item.summary;
fragment.appendChild(result);
}
results.appendChild(fragment);
}
function doSearch () {
const query = document.querySelector('.search-text').value.trim();
const results = flexSearch.search({
query: query,
limit: {{ .Site.Params.searchLimit | default 20 }}
});
showResults(results);
}
function enableUI () {
const searchform = document.querySelector('.search-form');
searchform.addEventListener('submit', function (e) {
e.preventDefault();
doSearch();
})
searchform.addEventListener('keyup', function () {
doSearch();
})
document.querySelector('.search-loading').classList.add('hidden');
document.querySelector('.search-input').classList.remove('hidden');
document.querySelector('.search-text').focus();
}
function buildIndex () {
document.querySelector('.search-loading').classList.remove('hidden');
fetch('/searchindex.json')
.then(function (response) {
return response.json();
})
.then(function (data) {
flexSearch.add(data);
});
}
buildIndex();
enableUI();
})();