mirror of
https://github.com/oliverbooth/X10D
synced 2024-11-10 03:05:42 +00:00
81 lines
2.1 KiB
JavaScript
81 lines
2.1 KiB
JavaScript
|
(function () {
|
||
|
importScripts('lunr.min.js');
|
||
|
|
||
|
var lunrIndex;
|
||
|
|
||
|
var stopWords = null;
|
||
|
var searchData = {};
|
||
|
|
||
|
lunr.tokenizer.separator = /[\s\-\.\(\)]+/;
|
||
|
|
||
|
var stopWordsRequest = new XMLHttpRequest();
|
||
|
stopWordsRequest.open('GET', '../search-stopwords.json');
|
||
|
stopWordsRequest.onload = function () {
|
||
|
if (this.status != 200) {
|
||
|
return;
|
||
|
}
|
||
|
stopWords = JSON.parse(this.responseText);
|
||
|
buildIndex();
|
||
|
}
|
||
|
stopWordsRequest.send();
|
||
|
|
||
|
var searchDataRequest = new XMLHttpRequest();
|
||
|
|
||
|
searchDataRequest.open('GET', '../index.json');
|
||
|
searchDataRequest.onload = function () {
|
||
|
if (this.status != 200) {
|
||
|
return;
|
||
|
}
|
||
|
searchData = JSON.parse(this.responseText);
|
||
|
|
||
|
buildIndex();
|
||
|
|
||
|
postMessage({ e: 'index-ready' });
|
||
|
}
|
||
|
searchDataRequest.send();
|
||
|
|
||
|
onmessage = function (oEvent) {
|
||
|
var q = oEvent.data.q;
|
||
|
var hits = lunrIndex.search(q);
|
||
|
var results = [];
|
||
|
hits.forEach(function (hit) {
|
||
|
var item = searchData[hit.ref];
|
||
|
results.push({ 'href': item.href, 'title': item.title, 'keywords': item.keywords });
|
||
|
});
|
||
|
postMessage({ e: 'query-ready', q: q, d: results });
|
||
|
}
|
||
|
|
||
|
function buildIndex() {
|
||
|
if (stopWords !== null && !isEmpty(searchData)) {
|
||
|
lunrIndex = lunr(function () {
|
||
|
this.pipeline.remove(lunr.stopWordFilter);
|
||
|
this.ref('href');
|
||
|
this.field('title', { boost: 50 });
|
||
|
this.field('keywords', { boost: 20 });
|
||
|
|
||
|
for (var prop in searchData) {
|
||
|
if (searchData.hasOwnProperty(prop)) {
|
||
|
this.add(searchData[prop]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var docfxStopWordFilter = lunr.generateStopWordFilter(stopWords);
|
||
|
lunr.Pipeline.registerFunction(docfxStopWordFilter, 'docfxStopWordFilter');
|
||
|
this.pipeline.add(docfxStopWordFilter);
|
||
|
this.searchPipeline.add(docfxStopWordFilter);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function isEmpty(obj) {
|
||
|
if(!obj) return true;
|
||
|
|
||
|
for (var prop in obj) {
|
||
|
if (obj.hasOwnProperty(prop))
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
})();
|