diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2020-01-02 13:38:15 +0300 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2020-01-02 19:11:08 +0300 |
commit | 54be3ea1162306f86f1e2916e5e6babd58ea7382 (patch) | |
tree | f11b7c7bbafd7c15d7f64bd961788d73f89ed807 /assets | |
parent | 3c0ca916a78a6b207176e947563581c9e5f1ac44 (diff) |
Update to lunr.js v2.3.8
Diffstat (limited to 'assets')
-rw-r--r-- | assets/js/slate/app/_search.js | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/assets/js/slate/app/_search.js b/assets/js/slate/app/_search.js new file mode 100644 index 0000000..da51dbb --- /dev/null +++ b/assets/js/slate/app/_search.js @@ -0,0 +1,103 @@ +//= require ../lib/_lunr +//= require ../lib/_jquery +//= require ../lib/_jquery.highlight +; (function () { + 'use strict'; + + var content, searchResults; + var highlightOpts = { element: 'span', className: 'search-highlight' }; + var searchDelay = 0; + var timeoutHandle = 0; + var index; + + $(populate); + $(bind); + + function populate() { + index = lunr(function () { + this.ref('id'); + this.field('title', { boost: 10 }); + this.field('body') + this.pipeline.add(lunr.trimmer, lunr.stopWordFilter); + var that = this; + + $('h1, h2').each(function () { + var title = $(this); + var body = title.nextUntil('h1, h2'); + that.add({ + id: title.prop('id'), + title: title.text(), + body: body.text() + }); + }); + + determineSearchDelay(this); + + }) + } + + + function determineSearchDelay(index) { + if (index._documents.length > 5000) { + searchDelay = 300; + } + } + + function bind() { + content = $('.content'); + searchResults = $('.search-results'); + + $('#input-search').on('keyup', function (e) { + var wait = function () { + return function (executingFunction, waitTime) { + clearTimeout(timeoutHandle); + timeoutHandle = setTimeout(executingFunction, waitTime); + }; + }(); + wait(function () { + search(e); + }, searchDelay); + }); + } + + function search(event) { + + var searchInput = $('#input-search')[0]; + + unhighlight(); + searchResults.addClass('visible'); + + // ESC clears the field + if (event.keyCode === 27) searchInput.value = ''; + + if (searchInput.value) { + var results = index.search(searchInput.value).filter(function (r) { + return r.score > 0.0001; + }); + + if (results.length) { + searchResults.empty(); + $.each(results, function (index, result) { + var elem = document.getElementById(result.ref); + searchResults.append("<li><a href='#" + result.ref + "'>" + $(elem).text() + "</a></li>"); + }); + highlight.call(searchInput); + } else { + searchResults.html('<li></li>'); + $('.search-results li').text('No Results Found for "' + searchInput.value + '"'); + } + } else { + unhighlight(); + searchResults.removeClass('visible'); + } + } + + function highlight() { + if (this.value) content.highlight(this.value, highlightOpts); + } + + function unhighlight() { + content.unhighlight(highlightOpts); + } +})(); + |