Skip to content

Commit 02f65cf

Browse files
committed
Include method names in search matches
Also lower the debounce threshold—turns out lunr is FAST.
1 parent b4500d2 commit 02f65cf

File tree

3 files changed

+39
-23
lines changed

3 files changed

+39
-23
lines changed

addon/components/docs-viewer/x-search/component.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ export default Component.extend(EKMixin, {
115115

116116
actions: {
117117
search(text) {
118-
debounce(this, 'search', text, 250);
118+
debounce(this, 'search', text, 100);
119119
},
120120

121121
selectResult(index) {

addon/components/docs-viewer/x-search/x-result/component.js

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -39,29 +39,45 @@ export default Component.extend({
3939
matches: computed(function() {
4040
let metadata = this.get('result.resultInfo.matchData.metadata');
4141

42-
return Object.keys(metadata).reduce((matches, key) => {
43-
let match = metadata[key];
44-
if (match.text) {
45-
let text = this.get('result.document.text');
46-
let spaceIndices = text.split("")
47-
.map((char, index) => (char === ' ') ? index : null)
48-
.filter(val => val > 0);
42+
return Object.keys(metadata).reduce((matches, term) => {
43+
let match = metadata[term];
44+
let query = this.get('query');
45+
let normalizedQuery = query.toLowerCase();
46+
Object.keys(match).forEach((key) => {
47+
if (key === 'text') {
48+
let text = this.get('result.document.text');
49+
let spaceIndices = text.split("")
50+
.map((char, index) => (char === ' ') ? index : null)
51+
.filter(val => val > 0);
4952

50-
match.text.position.forEach(([ wordStart, length ]) => {
51-
let spaceAfterWord = spaceIndices.find(i => i > wordStart);
52-
let indexOfSpaceAfterWord = spaceIndices.indexOf(spaceAfterWord);
53-
let indexOfSpaceBeforeWord = indexOfSpaceAfterWord - 1;
54-
let indexOfStartingSpace = (indexOfSpaceBeforeWord > 3) ? indexOfSpaceBeforeWord - 3 : 0;
55-
let indexOfEndingSpace = ((indexOfSpaceAfterWord + 3) < spaceIndices.length) ? indexOfSpaceAfterWord + 3 : spaceIndices.length;
56-
let matchingText = text.slice(spaceIndices[indexOfStartingSpace], spaceIndices[indexOfEndingSpace]);
57-
let query = this.get('query');
58-
matchingText = matchingText.replace(query, `<em class='docs-viewer-search__result-item__text--emphasis'>${query}</em>`);
53+
match.text.position.forEach(([ wordStart, length ]) => {
54+
let spaceAfterWord = spaceIndices.find(i => i > wordStart);
55+
let indexOfSpaceAfterWord = spaceIndices.indexOf(spaceAfterWord);
56+
let indexOfSpaceBeforeWord = indexOfSpaceAfterWord - 1;
57+
let indexOfStartingSpace = (indexOfSpaceBeforeWord > 3) ? indexOfSpaceBeforeWord - 3 : 0;
58+
let indexOfEndingSpace = ((indexOfSpaceAfterWord + 3) < spaceIndices.length) ? indexOfSpaceAfterWord + 3 : spaceIndices.length;
59+
let matchingText = text.slice(spaceIndices[indexOfStartingSpace], spaceIndices[indexOfEndingSpace]);
60+
matchingText = this._highlight(matchingText, matchingText.indexOf(query), query.length);
5961

60-
matches.push(matchingText);
61-
});
62-
}
62+
matches.push(matchingText);
63+
});
64+
} else {
65+
let normalizedTerm = term.toLowerCase();
66+
this.get('result.document.keywords').forEach((keyword) => {
67+
let normalizedKeyword = keyword.toLowerCase();
68+
if (keyword.toLowerCase().indexOf(normalizedTerm) !== -1) {
69+
let index = normalizedKeyword.indexOf(normalizedQuery);
70+
matches.push(this._highlight(keyword, index, normalizedQuery.length));
71+
}
72+
});
73+
}
74+
});
6375

6476
return matches;
65-
}, []).join(' &middot ');
66-
})
77+
}, []).join(' &middot; ');
78+
}),
79+
80+
_highlight(text, start, length) {
81+
return `${text.slice(0, start)}<em class='docs-viewer-search__result-item__text--emphasis'>${text.slice(start, start + length)}</em>${text.slice(start + length)}`;
82+
}
6783
});

addon/services/docs-search.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export default Service.extend({
1111
search(phrase) {
1212
return this.loadSearchIndex()
1313
.then(({ index, documents }) => {
14-
let words = phrase.split(/\s+/);
14+
let words = phrase.toLowerCase().split(/\s+/);
1515
let results = index.query((query) => {
1616
// In the future we could boost results based on the field they come from
1717
for (let word of words) {

0 commit comments

Comments
 (0)