github.com/shyftnetwork/go-empyrean@v1.8.3-0.20191127201940-fbfca9338f04/shyft_documentation/source/javascripts/app/_search.js (about)

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