(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; | |
} | |
})(); |