_search.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. //= require ../lib/_lunr
  2. //= require ../lib/_jquery
  3. //= require ../lib/_jquery.highlight
  4. ;(function () {
  5. 'use strict';
  6. var content, searchResults;
  7. var highlightOpts = { element: 'span', className: 'search-highlight' };
  8. var searchDelay = 0;
  9. var timeoutHandle = 0;
  10. var index;
  11. function populate() {
  12. index = lunr(function(){
  13. this.ref('id');
  14. this.field('title', { boost: 10 });
  15. this.field('body');
  16. this.pipeline.add(lunr.trimmer, lunr.stopWordFilter);
  17. var lunrConfig = this;
  18. $('h1, h2').each(function() {
  19. var title = $(this);
  20. var body = title.nextUntil('h1, h2');
  21. lunrConfig.add({
  22. id: title.prop('id'),
  23. title: title.text(),
  24. body: body.text()
  25. });
  26. });
  27. });
  28. determineSearchDelay();
  29. }
  30. $(populate);
  31. $(bind);
  32. function determineSearchDelay() {
  33. if (index.tokenSet.toArray().length>5000) {
  34. searchDelay = 300;
  35. }
  36. }
  37. function bind() {
  38. content = $('.content');
  39. searchResults = $('.search-results');
  40. $('#input-search').on('keyup',function(e) {
  41. var wait = function() {
  42. return function(executingFunction, waitTime){
  43. clearTimeout(timeoutHandle);
  44. timeoutHandle = setTimeout(executingFunction, waitTime);
  45. };
  46. }();
  47. wait(function(){
  48. search(e);
  49. }, searchDelay);
  50. });
  51. }
  52. function search(event) {
  53. var searchInput = $('#input-search')[0];
  54. unhighlight();
  55. searchResults.addClass('visible');
  56. // ESC clears the field
  57. if (event.keyCode === 27) searchInput.value = '';
  58. if (searchInput.value) {
  59. var results = index.search(searchInput.value).filter(function(r) {
  60. return r.score > 0.0001;
  61. });
  62. if (results.length) {
  63. searchResults.empty();
  64. $.each(results, function (index, result) {
  65. var elem = document.getElementById(result.ref);
  66. searchResults.append("<li><a href='#" + result.ref + "'>" + $(elem).text() + "</a></li>");
  67. });
  68. highlight.call(searchInput);
  69. } else {
  70. searchResults.html('<li></li>');
  71. $('.search-results li').text('No Results Found for "' + searchInput.value + '"');
  72. }
  73. } else {
  74. unhighlight();
  75. searchResults.removeClass('visible');
  76. }
  77. }
  78. function highlight() {
  79. if (this.value) content.highlight(this.value, highlightOpts);
  80. }
  81. function unhighlight() {
  82. content.unhighlight(highlightOpts);
  83. }
  84. })();