From adb95fbae354aa32f57eb3b3d285f160cd1633ec Mon Sep 17 00:00:00 2001 From: Robbie Antenesse Date: Fri, 8 May 2020 00:42:43 -0600 Subject: [PATCH] Include principal parts in searches by name --- src/js/search.js | 34 +++++++++++++++++++++++++++++----- src/js/view/search.js | 33 ++++++++++++++++++++++++++++----- 2 files changed, 57 insertions(+), 10 deletions(-) diff --git a/src/js/search.js b/src/js/search.js index b2424a4..38fd787 100644 --- a/src/js/search.js +++ b/src/js/search.js @@ -63,15 +63,25 @@ export function getMatchingSearchWords() { let details = filters.orthography ? parseReferences(word.details) : word.details; details = filters.ignoreDiacritics ? removeDiacritics(details) : details; details = filters.caseSensitive ? details : details.toLowerCase(); + let principalParts = typeof word.principalParts === 'undefined' ? [] : word.principalParts; + principalParts = filters.orthography ? principalParts.map(part => translateOrthography(part)) : principalParts; + principalParts = filters.ignoreDiacritics ? principalParts.map(part => removeDiacritics(part)) : principalParts; + principalParts = filters.caseSensitive ? principalParts : principalParts.map(part => part.toLowerCase()); const isInName = filters.name && (filters.exact - ? searchTerm == name - : new RegExp(searchTerm, 'g').test(name)); + ? searchTerm == name + : new RegExp(searchTerm, 'g').test(name) + ); const isInDefinition = filters.definition && (filters.exact - ? searchTerm == definition - : new RegExp(searchTerm, 'g').test(definition)); + ? searchTerm == definition + : new RegExp(searchTerm, 'g').test(definition) + ); const isInDetails = filters.details && new RegExp(searchTerm, 'g').test(details); - return searchTerm === '' || isInName || isInDefinition || isInDetails; + const isInPrincipalParts = filters.name && (filters.exact + ? principalParts.includes(searchTerm) + : principalParts.some(part => new RegExp(searchTerm, 'g').test(part)) + ); + return searchTerm === '' || isInName || isInDefinition || isInDetails || isInPrincipalParts; }); return matchingWords; } @@ -99,6 +109,16 @@ export function highlightSearchTerm(word) { + '' + markedUpWord.name.substr(wordIndex, searchTermLength) + '' + markedUpWord.name.substr(wordIndex + searchTermLength); }); + + if (markedUpWord.principalParts !== null) { + const part = getIndicesOf(searchTerm, removeDiacritics(markedUpWord.principalParts), filters.caseSensitive); + part.forEach((wordIndex, i) => { + wordIndex += ''.length * i; + markedUpWord.principalParts = markedUpWord.principalParts.substring(0, wordIndex) + + '' + markedUpWord.principalParts.substr(wordIndex, searchTermLength) + '' + + markedUpWord.principalParts.substr(wordIndex + searchTermLength); + }); + } } if (filters.definition) { const definitionMatches = getIndicesOf(searchTerm, removeDiacritics(markedUpWord.definition), filters.caseSensitive); @@ -122,6 +142,10 @@ export function highlightSearchTerm(word) { const regexMethod = 'g' + (filters.caseSensitive ? '' : 'i'); if (filters.name) { markedUpWord.name = markedUpWord.name.replace(new RegExp(`(${searchTerm})`, regexMethod), `$1`); + + if (markedUpWord.principalParts !== null) { + markedUpWord.principalParts = markedUpWord.principalParts.replace(new RegExp(`(${searchTerm})`, regexMethod), `$1`); + } } if (filters.definition) { markedUpWord.definition = markedUpWord.definition.replace(new RegExp(`(${searchTerm})`, regexMethod), `$1`); diff --git a/src/js/view/search.js b/src/js/view/search.js index da64814..685c91b 100644 --- a/src/js/view/search.js +++ b/src/js/view/search.js @@ -60,15 +60,24 @@ export function getMatchingSearchWords() { definition = filters.caseSensitive ? definition : definition.toLowerCase(); let details = filters.ignoreDiacritics ? removeDiacritics(word.details) : word.details; details = filters.caseSensitive ? details : details.toLowerCase(); + let principalParts = typeof word.principalParts === 'undefined' ? [] : word.principalParts; + principalParts = filters.ignoreDiacritics ? principalParts.map(part => removeDiacritics(part)) : principalParts; + principalParts = filters.caseSensitive ? principalParts : principalParts.map(part => part.toLowerCase()); const isInName = filters.name && (filters.exact - ? searchTerm == name - : new RegExp(searchTerm, 'g').test(name)); + ? searchTerm == name + : new RegExp(searchTerm, 'g').test(name) + ); const isInDefinition = filters.definition && (filters.exact - ? searchTerm == definition - : new RegExp(searchTerm, 'g').test(definition)); + ? searchTerm == definition + : new RegExp(searchTerm, 'g').test(definition) + ); const isInDetails = filters.details && new RegExp(searchTerm, 'g').test(details); - return searchTerm === '' || isInName || isInDefinition || isInDetails; + const isInPrincipalParts = filters.name && (filters.exact + ? principalParts.includes(searchTerm) + : principalParts.some(part => new RegExp(searchTerm, 'g').test(part)) + ); + return searchTerm === '' || isInName || isInDefinition || isInDetails || isInPrincipalParts; }); return matchingWords; } @@ -92,6 +101,16 @@ export function highlightSearchTerm(word) { + '' + markedUpWord.name.substr(wordIndex, searchTermLength) + '' + markedUpWord.name.substr(wordIndex + searchTermLength); }); + + if (markedUpWord.principalParts !== null) { + const part = getIndicesOf(searchTerm, removeDiacritics(markedUpWord.principalParts), filters.caseSensitive); + part.forEach((wordIndex, i) => { + wordIndex += ''.length * i; + markedUpWord.principalParts = markedUpWord.principalParts.substring(0, wordIndex) + + '' + markedUpWord.principalParts.substr(wordIndex, searchTermLength) + '' + + markedUpWord.principalParts.substr(wordIndex + searchTermLength); + }); + } } if (filters.definition) { const definitionMatches = getIndicesOf(searchTerm, removeDiacritics(markedUpWord.definition), filters.caseSensitive); @@ -115,6 +134,10 @@ export function highlightSearchTerm(word) { const regexMethod = 'g' + (filters.caseSensitive ? '' : 'i'); if (filters.name) { markedUpWord.name = markedUpWord.name.replace(new RegExp(`(${searchTerm})`, regexMethod), `$1`); + + if (markedUpWord.principalParts !== null) { + markedUpWord.principalParts = markedUpWord.principalParts.replace(new RegExp(`(${searchTerm})`, regexMethod), `$1`); + } } if (filters.definition) { markedUpWord.definition = markedUpWord.definition.replace(new RegExp(`(${searchTerm})`, regexMethod), `$1`);