Skip to content

Commit aee9b96

Browse files
fix: handle style conflicts during automatic links detection
1 parent 684eeec commit aee9b96

2 files changed

Lines changed: 31 additions & 4 deletions

File tree

android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package com.swmansion.enriched.spans
22

3-
data class BaseSpanConfig(val clazz: Class<*>)
4-
data class ParagraphSpanConfig(val clazz: Class<*>, val isContinuous: Boolean)
5-
data class ListSpanConfig(val clazz: Class<*>, val shortcut: String)
3+
interface ISpanConfig {
4+
val clazz: Class<*>
5+
}
6+
7+
data class BaseSpanConfig(override val clazz: Class<*>): ISpanConfig
8+
data class ParagraphSpanConfig(override val clazz: Class<*>, val isContinuous: Boolean): ISpanConfig
9+
data class ListSpanConfig(override val clazz: Class<*>, val shortcut: String) : ISpanConfig
10+
611

712
data class StylesMergingConfig(
813
// styles that should be removed when we apply specific style
@@ -62,6 +67,7 @@ object EnrichedSpans {
6267
MENTION to BaseSpanConfig(EnrichedMentionSpan::class.java),
6368
)
6469

70+
val allSpans: Map<String, ISpanConfig> = inlineSpans + paragraphSpans + listSpans + parametrizedStyles
6571
val mergingConfig: Map<String, StylesMergingConfig> = mapOf(
6672
BOLD to StylesMergingConfig(
6773
blockingStyles = arrayOf(CODE_BLOCK)

android/src/main/java/com/swmansion/enriched/styles/ParametrizedStyles.kt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,36 @@ class ParametrizedStyles(private val view: EnrichedTextInputView) {
104104
return Triple(result, start, end)
105105
}
106106

107+
private fun detectLinkConflicts(spannable: Spannable, start: Int, end: Int): Boolean {
108+
val mergingConfig = EnrichedSpans.mergingConfig[EnrichedSpans.LINK] ?: return false
109+
val conflictingStyles = mergingConfig.conflictingStyles
110+
val blockingStyles = mergingConfig.blockingStyles
111+
112+
for (style in blockingStyles) {
113+
val spans = spannable.getSpans(start, end, EnrichedSpans.allSpans[style]?.clazz)
114+
if (spans.isNotEmpty()) return true
115+
}
116+
117+
for (style in conflictingStyles) {
118+
val spans = spannable.getSpans(start, end, EnrichedSpans.allSpans[style]?.clazz)
119+
if (spans.isNotEmpty()) return true
120+
}
121+
122+
return false
123+
}
124+
107125
private fun afterTextChangedLinks(result: Triple<String, Int, Int>) {
108126
// Do not detect link if it's applied manually
109127
if (isSettingLinkSpan) return
110128
val spannable = view.text as Spannable
111129
val (word, start, end) = result
112130

131+
if (detectLinkConflicts(spannable, start, end)) {
132+
return
133+
}
134+
113135
// TODO: Consider using more reliable regex, this one matches almost anything
114136
val urlPattern = android.util.Patterns.WEB_URL.matcher(word)
115-
116137
val spans = spannable.getSpans(start, end, EnrichedLinkSpan::class.java)
117138
for (span in spans) {
118139
spannable.removeSpan(span)

0 commit comments

Comments
 (0)