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`);