diff --git a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/ContentViewModel.kt b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/ContentViewModel.kt index 5a581ea586b..88c72d94734 100644 --- a/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/ContentViewModel.kt +++ b/app/src/main/java/org/oppia/android/app/player/state/itemviewmodel/ContentViewModel.kt @@ -1,5 +1,8 @@ package org.oppia.android.app.player.state.itemviewmodel +import android.text.Spannable +import android.text.SpannableStringBuilder + /** [StateItemViewModel] for content-card state. */ class ContentViewModel( val htmlContent: CharSequence, @@ -7,4 +10,29 @@ class ContentViewModel( val hasConversationView: Boolean, val isSplitView: Boolean, val supportsConceptCards: Boolean -) : StateItemViewModel(ViewType.CONTENT) +) : StateItemViewModel(ViewType.CONTENT) { + + private val underscoreRegex = Regex("(?<=\\s|[,.;?!])_{3,}(?=\\s|[,.;?!])") + private val replacementText = "Blank" + + /** + * Replaces "2+ underscores, with space/punctuation on both sides" in the input text with a + * replacement string "blank", returning a Spannable. + * Adjusts offsets to handle text length changes during replacements. + */ + fun replaceRegexWithBlank(inputText: CharSequence): Spannable { + val spannableStringBuilder = SpannableStringBuilder(inputText) + val matches = underscoreRegex.findAll(inputText) + var lengthOffset = 0 + + for (match in matches) { + val matchStart = match.range.first + lengthOffset + val matchEnd = match.range.last + 1 + lengthOffset + spannableStringBuilder.replace(matchStart, matchEnd, replacementText) + + // Adjust offset due to change in length (difference between old and new text length) + lengthOffset += replacementText.length - (matchEnd - matchStart) + } + return spannableStringBuilder + } +} diff --git a/app/src/main/res/layout/content_item.xml b/app/src/main/res/layout/content_item.xml index c8571f1706f..09b1eb682ce 100644 --- a/app/src/main/res/layout/content_item.xml +++ b/app/src/main/res/layout/content_item.xml @@ -48,6 +48,7 @@ android:minWidth="48dp" android:minHeight="48dp" android:text="@{htmlContent}" + android:contentDescription="@{viewModel.replaceRegexWithBlank(htmlContent)}" android:textColor="@color/component_color_shared_primary_text_color" android:textColorLink="@color/component_color_shared_link_text_color" android:textSize="16sp"