From b23ead8097f87f68c990fbe915151dc2aeadda58 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Sun, 21 Nov 2021 15:27:50 +0000 Subject: [PATCH] Fix: Highlighting searched term should ignore accents (#2364) * fixed accent highlighting not working * fixed * fixes * improvements --- package-lock.json | 5 +++++ package.json | 1 + src/services/search/services/search.js | 23 ++++++++++++++--------- src/services/utils.js | 9 +++++++-- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index c5b09edeb..f712d3d6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6009,6 +6009,11 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, + "normalize-strings": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/normalize-strings/-/normalize-strings-1.1.1.tgz", + "integrity": "sha512-fARPRdTwmrQDLYhmeh7j/eZwrCP6WzxD6uKOdK/hT/uKACAE9AG2Bc2dgqOZLkfmmctHpfcJ9w3AQnfLgg3GYg==" + }, "normalize-url": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", diff --git a/package.json b/package.json index cbc6084a6..8b83f45f0 100644 --- a/package.json +++ b/package.json @@ -60,6 +60,7 @@ "mime-types": "2.1.34", "multer": "1.4.3", "node-abi": "3.5.0", + "normalize-strings": "^1.1.1", "open": "8.4.0", "portscanner": "2.2.0", "rand-token": "1.0.1", diff --git a/src/services/search/services/search.js b/src/services/search/services/search.js index 1e9c3479b..1ce41a75b 100644 --- a/src/services/search/services/search.js +++ b/src/services/search/services/search.js @@ -1,5 +1,6 @@ "use strict"; +const normalizeString = require("normalize-strings"); const lex = require('./lex'); const handleParens = require('./handle_parens'); const parse = require('./parse'); @@ -83,12 +84,8 @@ function findResultsWithExpression(expression, searchContext) { throw new Error(`Can't find note path for note ${JSON.stringify(note.getPojo())}`); } - if (notePathArray.includes("hidden")) { - return null; - } - return new SearchResult(notePathArray); - }).filter(Boolean); + }); for (const res of searchResults) { res.computeScore(searchContext.highlightedTokens); @@ -222,11 +219,19 @@ function highlightSearchResults(searchResults, highlightedTokens) { } for (const token of highlightedTokens) { - // this approach won't work for strings with diacritics - const tokenRegex = new RegExp("(" + utils.escapeRegExp(token) + ")", "gi"); - for (const result of searchResults) { - result.highlightedNotePathTitle = result.highlightedNotePathTitle.replace(tokenRegex, "{$1}"); + // Reset token + const tokenRegex = new RegExp(utils.escapeRegExp(token), "gi"); + let match; + + // Find all matches + while ((match = tokenRegex.exec(normalizeString(result.highlightedNotePathTitle))) !== null) { + console.log(match) + result.highlightedNotePathTitle = utils.wrapText(result.highlightedNotePathTitle, match.index, token.length, "{", "}"); + + // 2 characters are added, so we need to adjust the index + tokenRegex.lastIndex += 2; + } } } diff --git a/src/services/utils.js b/src/services/utils.js index 4ff2027a1..1795546dc 100644 --- a/src/services/utils.js +++ b/src/services/utils.js @@ -264,7 +264,7 @@ function timeLimit(promise, limitMs, errorMessage) { res(result); }) - .catch(error => rej(error)); + .catch(error => rej(error)); setTimeout(() => { if (!resolved) { @@ -302,6 +302,10 @@ function filterAttributeName(name) { return name.replace(/[^\p{L}\p{N}_:]/ug, ""); } +function wrapText(text, start, length, prefix, suffix) { + return text.substring(0, start) + prefix + text.substr(start, length) + suffix + text.substring(start + length); +} + module.exports = { randomSecureToken, randomString, @@ -336,5 +340,6 @@ module.exports = { deferred, removeDiacritic, normalize, - filterAttributeName + filterAttributeName, + wrapText };