diff --git a/browser/lib/search.js b/browser/lib/search.js index dadc9a29..b42fd389 100644 --- a/browser/lib/search.js +++ b/browser/lib/search.js @@ -4,39 +4,28 @@ export default function searchFromNotes (notes, search) { if (search.trim().length === 0) return [] const searchBlocks = search.split(' ').filter(block => { return block !== '' }) - let foundNotes = findByWord(notes, searchBlocks[0]) + let foundNotes = notes searchBlocks.forEach((block) => { - foundNotes = findByWord(foundNotes, block) - if (block.match(/^#.+/)) { - foundNotes = foundNotes.concat(findByTag(notes, block)) - } + foundNotes = findByWordOrTag(foundNotes, block) }) return foundNotes } -function findByTag (notes, block) { - const tag = block.match(/#(.+)/)[1] - const regExp = new RegExp(_.escapeRegExp(tag), 'i') +function findByWordOrTag (notes, block) { + let tag = block + if (tag.match(/^#.+/)) { + tag = tag.match(/#(.+)/)[1] + } + const tagRegExp = new RegExp(_.escapeRegExp(tag), 'i') + const wordRegExp = new RegExp(_.escapeRegExp(block), 'i') return notes.filter((note) => { - if (!_.isArray(note.tags)) return false - return note.tags.some((_tag) => { - return _tag.match(regExp) - }) - }) -} - -function findByWord (notes, block) { - const regExp = new RegExp(_.escapeRegExp(block), 'i') - return notes.filter((note) => { - if (_.isArray(note.tags) && note.tags.some((_tag) => { - return _tag.match(regExp) - })) { + if (_.isArray(note.tags) && note.tags.some((_tag) => _tag.match(tagRegExp))) { return true } if (note.type === 'SNIPPET_NOTE') { - return note.description.match(regExp) + return note.description.match(wordRegExp) } else if (note.type === 'MARKDOWN_NOTE') { - return note.content.match(regExp) + return note.content.match(wordRegExp) } return false }) diff --git a/tests/lib/search-test.js b/tests/lib/search-test.js index 1550a08f..2e288d26 100644 --- a/tests/lib/search-test.js +++ b/tests/lib/search-test.js @@ -20,18 +20,25 @@ test.before(t => { notes = [note1, note2, note3] }) -test('it can find notes by tags or words', t => { +test('it can find notes by tags and words', t => { // [input, expected content (Array)] - const testCases = [ + const testWithTags = [ ['#tag1', [note1.content, note2.content, note3.content]], ['#tag1 #tag2', [note2.content]], + ['#tag2 #tag1', [note2.content]], ['#tag1 #tag2 #tag3', []], ['content1', [note1.content, note2.content]], ['content1 content2', [note2.content]], ['content1 content2 content3', []], - ['#content4', [note3.content]] + ['#content4', [note3.content]], + ['#tag2 content1', [note2.content]], + ['content1 #tag2', [note2.content]] ] + const testWithTagsWithoutHash = testWithTags.map(function (testCase) { + return [testCase[0].replace(/#/g, ''), testCase[1]] + }) + const testCases = testWithTags.concat(testWithTagsWithoutHash) testCases.forEach((testCase) => { const [input, expectedContents] = testCase const results = searchFromNotes(notes, input)