131 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
var base_path = 'function' === typeof importScripts ? '.' : '/search/';
 | 
						|
var allowSearch = false;
 | 
						|
var index;
 | 
						|
var documents = {};
 | 
						|
var lang = ['en'];
 | 
						|
var data;
 | 
						|
 | 
						|
function getScript(script, callback) {
 | 
						|
  console.log('Loading script: ' + script);
 | 
						|
  $.getScript(base_path + script).done(function () {
 | 
						|
    callback();
 | 
						|
  }).fail(function (jqxhr, settings, exception) {
 | 
						|
    console.log('Error: ' + exception);
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
function getScriptsInOrder(scripts, callback) {
 | 
						|
  if (scripts.length === 0) {
 | 
						|
    callback();
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  getScript(scripts[0], function() {
 | 
						|
    getScriptsInOrder(scripts.slice(1), callback);
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
function loadScripts(urls, callback) {
 | 
						|
  if( 'function' === typeof importScripts ) {
 | 
						|
    importScripts.apply(null, urls);
 | 
						|
    callback();
 | 
						|
  } else {
 | 
						|
    getScriptsInOrder(urls, callback);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function onJSONLoaded () {
 | 
						|
  data = JSON.parse(this.responseText);
 | 
						|
  var scriptsToLoad = ['lunr.js'];
 | 
						|
  if (data.config && data.config.lang && data.config.lang.length) {
 | 
						|
    lang = data.config.lang;
 | 
						|
  }
 | 
						|
  if (lang.length > 1 || lang[0] !== "en") {
 | 
						|
    scriptsToLoad.push('lunr.stemmer.support.js');
 | 
						|
    if (lang.length > 1) {
 | 
						|
      scriptsToLoad.push('lunr.multi.js');
 | 
						|
    }
 | 
						|
    for (var i=0; i < lang.length; i++) {
 | 
						|
      if (lang[i] != 'en') {
 | 
						|
        scriptsToLoad.push(['lunr', lang[i], 'js'].join('.'));
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  loadScripts(scriptsToLoad, onScriptsLoaded);
 | 
						|
}
 | 
						|
 | 
						|
function onScriptsLoaded () {
 | 
						|
  console.log('All search scripts loaded, building Lunr index...');
 | 
						|
  if (data.config && data.config.separator && data.config.separator.length) {
 | 
						|
    lunr.tokenizer.separator = new RegExp(data.config.separator);
 | 
						|
  }
 | 
						|
 | 
						|
  if (data.index) {
 | 
						|
    index = lunr.Index.load(data.index);
 | 
						|
    data.docs.forEach(function (doc) {
 | 
						|
      documents[doc.location] = doc;
 | 
						|
    });
 | 
						|
    console.log('Lunr pre-built index loaded, search ready');
 | 
						|
  } else {
 | 
						|
    index = lunr(function () {
 | 
						|
      if (lang.length === 1 && lang[0] !== "en" && lunr[lang[0]]) {
 | 
						|
        this.use(lunr[lang[0]]);
 | 
						|
      } else if (lang.length > 1) {
 | 
						|
        this.use(lunr.multiLanguage.apply(null, lang));  // spread operator not supported in all browsers: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator#Browser_compatibility
 | 
						|
      }
 | 
						|
      this.field('title');
 | 
						|
      this.field('text');
 | 
						|
      this.ref('location');
 | 
						|
 | 
						|
      for (var i=0; i < data.docs.length; i++) {
 | 
						|
        var doc = data.docs[i];
 | 
						|
        this.add(doc);
 | 
						|
        documents[doc.location] = doc;
 | 
						|
      }
 | 
						|
    });
 | 
						|
    console.log('Lunr index built, search ready');
 | 
						|
  }
 | 
						|
  allowSearch = true;
 | 
						|
  postMessage({config: data.config});
 | 
						|
  postMessage({allowSearch: allowSearch});
 | 
						|
}
 | 
						|
 | 
						|
function init () {
 | 
						|
  var oReq = new XMLHttpRequest();
 | 
						|
  oReq.addEventListener("load", onJSONLoaded);
 | 
						|
  var index_path = base_path + '/search_index.json';
 | 
						|
  if( 'function' === typeof importScripts ){
 | 
						|
      index_path = 'search_index.json';
 | 
						|
  }
 | 
						|
  oReq.open("GET", index_path);
 | 
						|
  oReq.send();
 | 
						|
}
 | 
						|
 | 
						|
function search (query) {
 | 
						|
  if (!allowSearch) {
 | 
						|
    console.error('Assets for search still loading');
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  var resultDocuments = [];
 | 
						|
  var results = index.search(query);
 | 
						|
  for (var i=0; i < results.length; i++){
 | 
						|
    var result = results[i];
 | 
						|
    doc = documents[result.ref];
 | 
						|
    doc.summary = doc.text.substring(0, 200);
 | 
						|
    resultDocuments.push(doc);
 | 
						|
  }
 | 
						|
  return resultDocuments;
 | 
						|
}
 | 
						|
 | 
						|
if( 'function' === typeof importScripts ) {
 | 
						|
  onmessage = function (e) {
 | 
						|
    if (e.data.init) {
 | 
						|
      init();
 | 
						|
    } else if (e.data.query) {
 | 
						|
      postMessage({ results: search(e.data.query) });
 | 
						|
    } else {
 | 
						|
      console.error("Worker - Unrecognized message: " + e);
 | 
						|
    }
 | 
						|
  };
 | 
						|
}
 |