diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemFragment.kt index c6aecdbd684c71b50d7368be96a7556866ea2ef9..f547b4548c3a4a3bd5359fc8ac4d5d4534308213 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/aliasitem/AliasItemFragment.kt @@ -39,6 +39,7 @@ import de.kuschku.quasseldroid.settings.AutoCompleteSettings import de.kuschku.quasseldroid.settings.MessageSettings import de.kuschku.quasseldroid.ui.chat.input.* import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment +import de.kuschku.quasseldroid.util.compatibility.AndroidCrashFixer import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer import de.kuschku.quasseldroid.util.irc.format.IrcFormatSerializer import de.kuschku.quasseldroid.viewmodel.EditorViewModel @@ -130,7 +131,7 @@ class AliasItemFragment : SettingsFragment(), SettingsFragment.Savable, } rule?.let { data -> - name.setText(data.name) + name.setText(AndroidCrashFixer.removeCrashableCharacters(data.name)) expansion.setText(formatDeserializer.formatString(data.expansion, true)) } diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/compatibility/AndroidCrashFixer.kt b/app/src/main/java/de/kuschku/quasseldroid/util/compatibility/AndroidCrashFixer.kt new file mode 100644 index 0000000000000000000000000000000000000000..93654d0206eb8b148ef50e61368a84734081490f --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid/util/compatibility/AndroidCrashFixer.kt @@ -0,0 +1,43 @@ +/* + * Quasseldroid - Quassel client for Android + * + * Copyright (c) 2018 Janne Koschinski + * Copyright (c) 2018 The Quassel Project + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3 as published + * by the Free Software Foundation. + * + * 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 <http://www.gnu.org/licenses/>. + */ + +package de.kuschku.quasseldroid.util.compatibility + +object AndroidCrashFixer { + fun removeCrashableCharacters(text: String): String { + var previousRtlModifier = 0.toChar() + return text.fold(StringBuilder()) { builder, char -> + previousRtlModifier = if (char != '\u200E' && char != '\u200F') { + if (!char.isWhitespace()) { + if (previousRtlModifier != 0.toChar()) { + builder.append(previousRtlModifier) + } + builder.append(char) + 0.toChar() + } else { + builder.append(char) + previousRtlModifier + } + } else { + char + } + builder + }.toString() + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatDeserializer.kt b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatDeserializer.kt index 478539c6a0ade78d783e33e1859f04a9b46caaa7..5a2fbd7fd30f6d2bdff6789ca687600cb77b45ce 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatDeserializer.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatDeserializer.kt @@ -23,6 +23,7 @@ import android.content.Context import android.text.SpannableStringBuilder import android.text.Spanned import de.kuschku.quasseldroid.R +import de.kuschku.quasseldroid.util.compatibility.AndroidCrashFixer import de.kuschku.quasseldroid.util.helper.getColorCompat import de.kuschku.quasseldroid.util.irc.format.spans.* import javax.inject.Inject @@ -66,8 +67,10 @@ class IrcFormatDeserializer @Inject constructor(context: Context) { * @param str mIRC formatted String * @return a CharSequence with Android’s span format representing the input string */ - fun formatString(str: String?, colorize: Boolean): CharSequence { - if (str == null) return "" + fun formatString(content: String?, colorize: Boolean): CharSequence { + if (content == null) return "" + + val str = AndroidCrashFixer.removeCrashableCharacters(content) val plainText = SpannableStringBuilder() var bold: FormatDescription<BoldIrcFormat>? = null diff --git a/app/src/test/java/de/kuschku/quasseldroid/util/compatibility/AndroidCrashFixerTest.kt b/app/src/test/java/de/kuschku/quasseldroid/util/compatibility/AndroidCrashFixerTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..a00fe3920f6c3e92b7f6a41da882003519a9b259 --- /dev/null +++ b/app/src/test/java/de/kuschku/quasseldroid/util/compatibility/AndroidCrashFixerTest.kt @@ -0,0 +1,15 @@ +package de.kuschku.quasseldroid.util.compatibility + +import org.junit.Assert.assertFalse +import org.junit.Test + +class AndroidCrashFixerTest { + private val crashingText = "<⚫> \uD83D\uDC48\uD83C\uDFFB \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F \u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u200E\u200F\u2067\u202E" + + @Test + fun removeCrashableCharacters() { + val result = AndroidCrashFixer.removeCrashableCharacters(crashingText) + assertFalse(Regex("\u200F\\s*\u200E").containsMatchIn(result)) + assertFalse(Regex("\u200E\\s*\u200F").containsMatchIn(result)) + } +}