diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt b/AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt index 540a249e4627..c4047e01be4c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/CardBrowser.kt @@ -382,7 +382,6 @@ open class CardBrowser : ) val launchOptions = intent?.toCardBrowserLaunchOptions() // must be called after super.onCreate() - // must be called once we have an accessible collection viewModel = createViewModel(launchOptions) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt b/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt index 6836b8badc9b..ace8ccef3b22 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/browser/CardBrowserViewModel.kt @@ -47,6 +47,7 @@ import com.ichi2.anki.model.CardsOrNotes.NOTES import com.ichi2.anki.model.SortType import com.ichi2.anki.pages.CardInfoDestination import com.ichi2.anki.preferences.SharedPreferencesProvider +import com.ichi2.anki.utils.ext.normalizeForSearch import com.ichi2.annotations.NeedsTest import com.ichi2.libanki.Card import com.ichi2.libanki.CardId @@ -85,9 +86,7 @@ import java.io.DataOutputStream import java.io.File import java.io.FileInputStream import java.io.FileOutputStream -import java.text.Normalizer import java.util.Collections -import java.util.regex.Pattern import kotlin.math.max import kotlin.math.min @@ -969,11 +968,6 @@ class CardBrowserViewModel( private suspend fun shouldIgnoreAccents() = withCol { config.getBool(ConfigKey.Bool.IGNORE_ACCENTS_IN_SEARCH) } - private fun String.normalizeForSearch(): String { - val normalized = Normalizer.normalize(this, Normalizer.Form.NFD) - return Pattern.compile("\\p{InCombiningDiacriticalMarks}+").matcher(normalized).replaceAll("") - } - /** * @see com.ichi2.anki.searchForRows */ diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/utils/ext/String.kt b/AnkiDroid/src/main/java/com/ichi2/anki/utils/ext/String.kt new file mode 100644 index 000000000000..95141abb79e2 --- /dev/null +++ b/AnkiDroid/src/main/java/com/ichi2/anki/utils/ext/String.kt @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2025 Ashish Yadav + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 3 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +package com.ichi2.anki.utils.ext + +import java.text.Normalizer +import java.util.regex.Pattern + +private val DIACRITICAL_MARKS_PATTERN = Pattern.compile("\\p{InCombiningDiacriticalMarks}+") + +/** + * Normalizes the given string by removing diacritical marks (accents) to enable accent-insensitive searches. + * + * This method uses Unicode normalization in **NFD (Normalization Form Decomposition)** mode, which separates + * base characters from their diacritical marks. Then, it removes all combining diacritical marks using a regex. + * + * Example usage: + * ``` + * val input = "café naïve résumé" + * val normalized = input.normalizeForSearch() + * println(normalized) // Output: "cafe naive resume" + * ``` + * + * @receiver The input string that may contain accented characters. + * @return A new string with accents removed. + */ +fun String.normalizeForSearch(): String { + val normalized = Normalizer.normalize(this, Normalizer.Form.NFD) + return DIACRITICAL_MARKS_PATTERN.matcher(normalized).replaceAll("") +} diff --git a/AnkiDroid/src/main/res/xml/preferences_general.xml b/AnkiDroid/src/main/res/xml/preferences_general.xml index 0afa8294eb1a..1196b96c0739 100644 --- a/AnkiDroid/src/main/res/xml/preferences_general.xml +++ b/AnkiDroid/src/main/res/xml/preferences_general.xml @@ -24,7 +24,6 @@