diff --git a/static/js/search.js b/assets/js/academic-search.js similarity index 85% rename from static/js/search.js rename to assets/js/academic-search.js index 6b271726..8c52735b 100644 --- a/static/js/search.js +++ b/assets/js/academic-search.js @@ -1,6 +1,8 @@ /************************************************* - * Academic: the website framework for Hugo. + * Academic * https://github.com/gcushen/hugo-academic + * + * In-built Fuse based search algorithm. **************************************************/ /* --------------------------------------------------------------------------- @@ -149,25 +151,28 @@ function render(template, data) { * Initialize. * --------------------------------------------------------------------------- */ +// If Academic's in-built search is enabled and Fuse loaded, then initialize it. +if (typeof Fuse === 'function') { // Wait for Fuse to initialize. -$.getJSON( search_index_filename, function( search_index ) { - let fuse = new Fuse(search_index, fuseOptions); + $.getJSON(search_index_filename, function (search_index) { + let fuse = new Fuse(search_index, fuseOptions); - // On page load, check for search query in URL. - if (query = getSearchQuery('q')) { - $("#search-query").val(query); - initSearch(true, fuse); - } - - // On search box key up, process query. - $('#search-query').keyup(function (e) { - clearTimeout($.data(this, 'searchTimer')); // Ensure only one timer runs! - if (e.keyCode == 13) { + // On page load, check for search query in URL. + if (query = getSearchQuery('q')) { + $("#search-query").val(query); initSearch(true, fuse); - } else { - $(this).data('searchTimer', setTimeout(function () { - initSearch(false, fuse); - }, 250)); } + + // On search box key up, process query. + $('#search-query').keyup(function (e) { + clearTimeout($.data(this, 'searchTimer')); // Ensure only one timer runs! + if (e.keyCode == 13) { + initSearch(true, fuse); + } else { + $(this).data('searchTimer', setTimeout(function () { + initSearch(false, fuse); + }, 250)); + } + }); }); -}); +} diff --git a/static/js/hugo-academic.js b/assets/js/academic.js similarity index 99% rename from static/js/hugo-academic.js rename to assets/js/academic.js index c754d57c..050dc802 100644 --- a/static/js/hugo-academic.js +++ b/assets/js/academic.js @@ -1,6 +1,8 @@ /************************************************* - * Academic: the personal website framework for Hugo. + * Academic * https://github.com/gcushen/hugo-academic + * + * Core JS functions and initialization. **************************************************/ (function($){ diff --git a/assets/js/algolia-search.js b/assets/js/algolia-search.js new file mode 100644 index 00000000..aa1750ee --- /dev/null +++ b/assets/js/algolia-search.js @@ -0,0 +1,72 @@ +/************************************************* + * Academic + * https://github.com/gcushen/hugo-academic + * + * Algolia based search algorithm. + **************************************************/ + +if ((typeof instantsearch === 'function') && $('#search-box').length) { + function getTemplate(templateName) { + return document.querySelector(`#${templateName}-template`).innerHTML; + } + + const options = { + appId: algoliaConfig.appId, + apiKey: algoliaConfig.apiKey, + indexName: algoliaConfig.indexName, + routing: true, + searchParameters: { + hitsPerPage: 10 + }, + searchFunction: function (helper) { + let searchResults = document.querySelector('#search-hits') + if (helper.state.query === '') { + searchResults.style.display = 'none'; + return; + } + helper.search(); + searchResults.style.display = 'block'; + } + }; + + const search = instantsearch(options); + + // Initialize search box. + search.addWidget( + instantsearch.widgets.searchBox({ + container: '#search-box', + autofocus: false, + reset: true, + poweredBy: algoliaConfig.poweredBy, + placeholder: i18n.placeholder + }) + ); + + // Initialize search results. + search.addWidget( + instantsearch.widgets.infiniteHits({ + container: '#search-hits', + escapeHits: true, + templates: { + empty: '