diff --git a/assets/js/offline-search.js b/assets/js/offline-search.js index 548a86a761..58c407f80c 100644 --- a/assets/js/offline-search.js +++ b/assets/js/offline-search.js @@ -1,200 +1,183 @@ // Adapted from code by Matt Walters https://www.mattwalters.net/posts/2018-03-28-hugo-and-lunr/ (function ($) { - 'use strict'; + 'use strict'; - $(document).ready(function () { - const $searchInput = $('.td-search input'); + $(document).ready(function () { + const $searchInput = $('.td-search input'); - // - // Register handler - // + // + // Register handler + // - $searchInput.on('change', (event) => { - render($(event.target)); + $searchInput.on('change', (event) => { + render($(event.target)); - // Hide keyboard on mobile browser - $searchInput.blur(); - }); + // Hide keyboard on mobile browser + $searchInput.blur(); + }); + + // Prevent reloading page by enter key on sidebar search. + $searchInput.closest('form').on('submit', () => { + return false; + }); - // Prevent reloading page by enter key on sidebar search. - $searchInput.closest('form').on('submit', () => { - return false; + // + // Lunr + // + + let idx = null; // Lunr index + const resultDetails = new Map(); // Will hold the data for the search results (titles and summaries) + + // Set up for an Ajax call to request the JSON data file that is created by Hugo's build process + $.ajax($searchInput.data('offline-search-index-json-src')).then((data) => { + idx = lunr(function () { + this.ref('ref'); + + // If you added more searchable fields to the search index, list them here. + // Here you can specify searchable fields to the search index - e.g. individual toxonomies for you project + // With "boost" you can add weighting for specific (default weighting without boost: 1) + this.field('title', { boost: 5 }); + this.field('categories', { boost: 3 }); + this.field('tags', { boost: 3 }); + // this.field('projects', { boost: 3 }); // example for an individual toxonomy called projects + this.field('description', { boost: 2 }); + this.field('body'); + + data.forEach((doc) => { + this.add(doc); + + resultDetails.set(doc.ref, { + title: doc.title, + excerpt: doc.excerpt, + }); }); + }); - // - // Lunr - // - - let idx = null; // Lunr index - const resultDetails = new Map(); // Will hold the data for the search results (titles and summaries) - - // Set up for an Ajax call to request the JSON data file that is created by Hugo's build process - $.ajax($searchInput.data('offline-search-index-json-src')).then( - (data) => { - idx = lunr(function () { - this.ref('ref'); - - // If you added more searchable fields to the search index, list them here. - // Here you can specify searchable fields to the search index - e.g. individual toxonomies for you project - // With "boost" you can add weighting for specific (default weighting without boost: 1) - this.field('title', { boost: 5 }); - this.field('categories', { boost: 3 }); - this.field('tags', { boost: 3 }); - // this.field('projects', { boost: 3 }); // example for an individual toxonomy called projects - this.field('description', { boost: 2 }); - this.field('body'); - - data.forEach((doc) => { - this.add(doc); - - resultDetails.set(doc.ref, { - title: doc.title, - excerpt: doc.excerpt, - }); - }); - }); - - $searchInput.trigger('change'); - } - ); + $searchInput.trigger('change'); + }); - const render = ($targetSearchInput) => { - // - // Dispose existing popover - // - - { - let popover = bootstrap.Popover.getInstance( - $targetSearchInput[0] - ); - if (popover !== null) { - popover.dispose(); - } - } - - // - // Search - // - - if (idx === null) { - return; - } - - const searchQuery = $targetSearchInput.val(); - if (searchQuery === '') { - return; - } - - const results = idx - .query((q) => { - const tokens = lunr.tokenizer(searchQuery.toLowerCase()); - tokens.forEach((token) => { - const queryString = token.toString(); - q.term(queryString, { - boost: 100, - }); - q.term(queryString, { - wildcard: - lunr.Query.wildcard.LEADING | - lunr.Query.wildcard.TRAILING, - boost: 10, - }); - q.term(queryString, { - editDistance: 2, - }); - }); - }) - .slice( - 0, - $targetSearchInput.data('offline-search-max-results') - ); - - // - // Make result html - // - - const $html = $('
').text(`No results found for query "${searchQuery}"`) - ); - } else { - results.forEach((r) => { - const doc = resultDetails.get(r.ref); - const href = - $searchInput.data('offline-search-base-href') + - r.ref.replace(/^\//, ''); - - const $entry = $('