From d75d13965b1f66f53612e0c4b633446dd3c7c540 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Thu, 22 Apr 2021 10:34:23 +0200 Subject: [PATCH] Faster accent replacement method implementation #964 --- .../keepass/database/search/SearchHelper.kt | 7 +++---- .../com/kunzisoft/keepass/utils/StringUtil.kt | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt b/app/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt index 8e11aa3e6..a824e67c7 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt @@ -29,7 +29,7 @@ import com.kunzisoft.keepass.model.SearchInfo import com.kunzisoft.keepass.otp.OtpEntryFields.OTP_FIELD import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.timeout.TimeoutHelper -import com.kunzisoft.keepass.utils.StringUtil.removeDiacriticalMarks +import com.kunzisoft.keepass.utils.StringUtil.flattenToAscii class SearchHelper { @@ -165,9 +165,8 @@ class SearchHelper { fun checkSearchQuery(stringToCheck: String, searchParameters: SearchParameters): Boolean { if (stringToCheck.isNotEmpty() && stringToCheck - .removeDiacriticalMarks() - .contains(searchParameters.searchQuery - .removeDiacriticalMarks(), + .flattenToAscii() + .contains(searchParameters.searchQuery.flattenToAscii(), searchParameters.ignoreCase)) { return true } diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/StringUtil.kt b/app/src/main/java/com/kunzisoft/keepass/utils/StringUtil.kt index d6c7f7c23..3f9aebce8 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/StringUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/StringUtil.kt @@ -12,9 +12,19 @@ object StringUtil { return this.replace("[\\r|\\n|\\t|\\s|\\u00A0]+".toRegex(), "") } - fun String.removeDiacriticalMarks(): String { - return "\\p{InCombiningDiacriticalMarks}+".toRegex() - .replace(Normalizer.normalize(this, Normalizer.Form.NFD), "") + fun String.flattenToAscii(): String { + var string = this + val out = CharArray(string.length) + string = Normalizer.normalize(string, Normalizer.Form.NFD) + var j = 0 + var i = 0 + val n = string.length + while (i < n) { + val c = string[i] + if (c <= '\u007F') out[j++] = c + ++i + } + return String(out) } fun ByteArray.toHexString() = joinToString("") { "%02X".format(it) }