Skip to content

Commit 81e71df

Browse files
committed
processSearchQuery: Add support for category: filter
1 parent b6de53f commit 81e71df

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

app/utils/search.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
1+
const CATEGORY_PREFIX = 'category:';
12
const KEYWORD_PREFIX = 'keyword:';
23
const KEYWORDS_PREFIX = 'keywords:';
34

45
/**
56
* Process a search query string and extract filters like `keywords:`.
67
*
78
* @param {string} query
8-
* @return {{ q: string, keyword?: string, all_keywords?: string }}
9+
* @return {{ q: string, keyword?: string, all_keywords?: string, category?: string }}
910
*/
1011
export function processSearchQuery(query) {
1112
let tokens = query.trim().split(/\s+/);
1213

1314
let queries = [];
1415
let keywords = [];
16+
let category = null;
1517
for (let token of tokens) {
16-
if (token.startsWith(KEYWORD_PREFIX)) {
18+
if (token.startsWith(CATEGORY_PREFIX)) {
19+
let value = token.slice(CATEGORY_PREFIX.length).trim();
20+
if (value) {
21+
category = value;
22+
}
23+
} else if (token.startsWith(KEYWORD_PREFIX)) {
1724
let value = token.slice(KEYWORD_PREFIX.length).trim();
1825
if (value) {
1926
keywords.push(value);
@@ -30,11 +37,16 @@ export function processSearchQuery(query) {
3037
}
3138

3239
let result = { q: queries.join(' ') };
40+
3341
if (keywords.length === 1) {
3442
result.keyword = keywords[0];
3543
} else if (keywords.length !== 0) {
3644
result.all_keywords = keywords.join(' ');
3745
}
3846

47+
if (category) {
48+
result.category = category;
49+
}
50+
3951
return result;
4052
}

tests/utils/search-test.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ module('processSearchQuery()', function () {
1313
['foo keywords:bar,baz', { q: 'foo', all_keywords: 'bar baz' }],
1414
['foo keywords:bar keywords:baz', { q: 'foo', keyword: 'baz' }],
1515
['foo keyword:bar keyword:baz', { q: 'foo', all_keywords: 'bar baz' }],
16+
['foo category:', { q: 'foo' }],
17+
['foo category:no-std', { q: 'foo', category: 'no-std' }],
18+
['foo category:no-std keywords:bar,baz', { q: 'foo', all_keywords: 'bar baz', category: 'no-std' }],
1619
];
1720

1821
for (let [input, expectation] of TESTS) {

0 commit comments

Comments
 (0)