forked from leanprover-community/doc-gen
-
Notifications
You must be signed in to change notification settings - Fork 0
/
searchWorker.js
71 lines (60 loc) · 2.46 KB
/
searchWorker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Access indexed data structure to be used for searching through the documentation
const req = new XMLHttpRequest();
req.open('GET', 'searchable_data.bmp', false /* blocking */);
req.responseType = 'json';
req.send();
importScripts('https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/index.min.js');
// Include options as per API specs: https://lucaong.github.io/minisearch/modules/_minisearch_.html
const miniSearch = new MiniSearch({
idField: 'name',
fields: ['module', 'name', 'description'],
storeFields: ['module', 'name', 'description', 'attributes', 'kind']
});
const indexedData = req.response;
miniSearch.addAll(indexedData);
onconnect = ({ports: [port]}) =>
port.onmessage = ({ data }) => {
const { query, filters, maxCount } = data;
const filterFunc = (result) => filterItemResult(result, filters);
const sanitizedQuery = query.trim();
if (sanitizedQuery && typeof sanitizedQuery === "string" && sanitizedQuery.length > 0) {
const results = miniSearch.search(sanitizedQuery, {
boost: { module: 1, description: 2, name: 3 },
combineWith: 'AND',
filter: filterFunc,
// prefix: (term) => term.length > 3,
// fuzzy: (term) => term.length > 3 && 0.2,
});
const response = typeof maxCount === "number" && maxCount >= 0 ? results.slice(0, maxCount) : results;
console.log(response)
port.postMessage({response, total: results.length});
}
port.postMessage({response: [], total: 0});
};
const filterItemResult = (result, filters = {}) => {
const { attributes: attrFilter, kind: kindFilter } = filters;
const hasAttrFilter = attrFilter && attrFilter.length > 0;
const hasKindFilter = kindFilter && kindFilter.length > 0;
if (!hasAttrFilter && !hasKindFilter) {
return true;
}
const { attributes: attrRes, kind: kindRes } = result;
let isResultAttrIncluded = false;
let isResultKindIncluded = false;
if (hasKindFilter) {
isResultKindIncluded = kindFilter.includes(kindRes);
}
if (hasAttrFilter) {
for (let attribute of attrRes) {
if (attrFilter.includes(attribute)) {
isResultAttrIncluded = true;
break;
}
}
}
return hasKindFilter && hasAttrFilter ?
(isResultAttrIncluded && isResultKindIncluded) :
hasAttrFilter ?
isResultAttrIncluded :
isResultKindIncluded;
}