-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathsearch.js
More file actions
115 lines (99 loc) · 3 KB
/
search.js
File metadata and controls
115 lines (99 loc) · 3 KB
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
;(function () {
let text
let isLoadingText = false
const searchTimeout = null
function search(value) {
const results = Object.keys(text).reduce(function (
sectionResults,
sectionKey
) {
return sectionResults.concat(
Object.keys(text[sectionKey]).reduce(function (
subSectionResults,
subSectionKey
) {
const regexp = new RegExp(value, 'g')
const matches = []
let match = null
while (
(match = regexp.exec(text[sectionKey][subSectionKey].raw)) != null
) {
matches.push(match)
}
if (matches.length) {
return subSectionResults.concat({
section: sectionKey,
subSection: subSectionKey,
title: text[sectionKey][subSectionKey].title,
matches: matches.length,
})
}
return subSectionResults
}, [])
)
}, [])
results.sort(function (resultA, resultB) {
if (resultA.matches > resultB.matches) {
return -1
} else if (resultA.matches < resultB.matches) {
return 1
}
return 0
})
const searchResult = document.querySelector('#search-result')
const fiveFirst = results.splice(0, 5)
searchResult.innerHTML = ''
if (fiveFirst.length) {
fiveFirst.forEach(function (result) {
const resultEl = document.createElement('a')
resultEl.className = 'docs-search-result-item'
resultEl.innerHTML = `<span>${result.section}</span> - ${result.title}`
resultEl.href = `/docs/${result.section}/${result.subSection}.html`
searchResult.appendChild(resultEl)
})
} else {
const resultEl = document.createElement('a')
resultEl.className = 'docs-search-result-item'
resultEl.innerHTML = `<span>No result</span>`
resultEl.href = ''
searchResult.appendChild(resultEl)
}
searchResult.style.display = 'block'
}
function setSearchLoadTimeout(value) {
clearTimeout(searchTimeout)
setTimeout(function () {
if (text) {
search(value)
} else {
setSearchLoadTimeout(value)
}
}, 100)
}
document.body.addEventListener('click', function () {
document.querySelector('#search-result').style.display = 'none'
})
document
.querySelector('#search-docs')
.addEventListener('keyup', function (event) {
if (event.target.value.length < 3) {
document.querySelector('#search-result').style.display = 'none'
return
}
if (isLoadingText) {
return setSearchLoadTimeout(event.target.value)
}
if (text) {
search(event.target.value)
} else {
isLoadingText = true
const oReq = new window.XMLHttpRequest()
oReq.addEventListener('load', function () {
text = JSON.parse(this.responseText)
search(event.target.value)
})
oReq.open('GET', '/docs-text.js')
oReq.send()
}
})
})()