From bcbb4d2b440ff5dd55f8d19c24b9e2df21897203 Mon Sep 17 00:00:00 2001 From: Igor Furgala Date: Thu, 13 Nov 2025 10:41:50 +0100 Subject: [PATCH] fix: conflicting headings and bold --- .../enriched/EnrichedTextInputView.kt | 2 +- .../enriched/EnrichedTextInputViewManager.kt | 1 - .../swmansion/enriched/spans/EnrichedSpans.kt | 107 ++++++++++-------- 3 files changed, 62 insertions(+), 48 deletions(-) diff --git a/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt b/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt index bae67e50b..2c820f455 100644 --- a/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt +++ b/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt @@ -438,7 +438,7 @@ class EnrichedTextInputView : AppCompatEditText { } private fun verifyStyle(name: String): Boolean { - val mergingConfig = EnrichedSpans.mergingConfig[name] ?: return true + val mergingConfig = EnrichedSpans.getMergingConfigForStyle(name, htmlStyle) ?: return true val conflictingStyles = mergingConfig.conflictingStyles val blockingStyles = mergingConfig.blockingStyles val isEnabling = spanState?.getStart(name) == null diff --git a/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewManager.kt b/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewManager.kt index 418c3fb2a..1e6957518 100644 --- a/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewManager.kt +++ b/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewManager.kt @@ -1,7 +1,6 @@ package com.swmansion.enriched import android.content.Context -import android.util.Log import com.facebook.react.bridge.ReadableArray import com.facebook.react.bridge.ReadableMap import com.facebook.react.module.annotations.ReactModule diff --git a/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt b/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt index 85e47b28c..ef1b408ee 100644 --- a/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt +++ b/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt @@ -1,5 +1,7 @@ package com.swmansion.enriched.spans +import com.swmansion.enriched.styles.HtmlStyle + data class BaseSpanConfig(val clazz: Class<*>) data class ParagraphSpanConfig(val clazz: Class<*>, val isContinuous: Boolean) data class ListSpanConfig(val clazz: Class<*>, val shortcut: String) @@ -62,50 +64,63 @@ object EnrichedSpans { MENTION to BaseSpanConfig(EnrichedMentionSpan::class.java), ) - val mergingConfig: Map = mapOf( - BOLD to StylesMergingConfig( - blockingStyles = arrayOf(CODE_BLOCK) - ), - ITALIC to StylesMergingConfig( - blockingStyles = arrayOf(CODE_BLOCK) - ), - UNDERLINE to StylesMergingConfig( - blockingStyles = arrayOf(CODE_BLOCK) - ), - STRIKETHROUGH to StylesMergingConfig( - blockingStyles = arrayOf(CODE_BLOCK) - ), - INLINE_CODE to StylesMergingConfig( - conflictingStyles = arrayOf(MENTION, LINK), - blockingStyles = arrayOf(CODE_BLOCK) - ), - H1 to StylesMergingConfig( - conflictingStyles = arrayOf(H2, H3, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK), - ), - H2 to StylesMergingConfig( - conflictingStyles = arrayOf(H1, H3, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK), - ), - H3 to StylesMergingConfig( - conflictingStyles = arrayOf(H1, H2, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK), - ), - BLOCK_QUOTE to StylesMergingConfig( - conflictingStyles = arrayOf(H1, H2, H3, CODE_BLOCK, ORDERED_LIST, UNORDERED_LIST), - ), - CODE_BLOCK to StylesMergingConfig( - conflictingStyles = arrayOf(H1, H2, H3, BOLD, ITALIC, UNDERLINE, STRIKETHROUGH, UNORDERED_LIST, ORDERED_LIST, BLOCK_QUOTE, INLINE_CODE), - ), - UNORDERED_LIST to StylesMergingConfig( - conflictingStyles = arrayOf(H1, H2, H3, ORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE), - ), - ORDERED_LIST to StylesMergingConfig( - conflictingStyles = arrayOf(H1, H2, H3, UNORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE), - ), - LINK to StylesMergingConfig( - blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, MENTION) - ), - IMAGE to StylesMergingConfig(), - MENTION to StylesMergingConfig( - blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, LINK) - ), - ) + fun getMergingConfigForStyle(style: String, htmlStyle: HtmlStyle): StylesMergingConfig? { + return when (style) { + BOLD -> { + val blockingStyles = mutableListOf(CODE_BLOCK) + if (htmlStyle.h1Bold) blockingStyles.add(H1) + if (htmlStyle.h2Bold) blockingStyles.add(H2) + if (htmlStyle.h3Bold) blockingStyles.add(H3) + StylesMergingConfig(blockingStyles = blockingStyles.toTypedArray()) + } + ITALIC -> StylesMergingConfig( + blockingStyles = arrayOf(CODE_BLOCK) + ) + UNDERLINE -> StylesMergingConfig( + blockingStyles = arrayOf(CODE_BLOCK) + ) + STRIKETHROUGH -> StylesMergingConfig( + blockingStyles = arrayOf(CODE_BLOCK) + ) + INLINE_CODE -> StylesMergingConfig( + conflictingStyles = arrayOf(MENTION, LINK), + blockingStyles = arrayOf(CODE_BLOCK) + ) + H1 -> { + val conflictingStyles = mutableListOf(H2, H3, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK) + if (htmlStyle.h1Bold) conflictingStyles.add(BOLD) + StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray()) + } + H2 -> { + val conflictingStyles = mutableListOf(H1, H3, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK) + if (htmlStyle.h2Bold) conflictingStyles.add(BOLD) + StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray()) + } + H3 -> { + val conflictingStyles = mutableListOf(H1, H2, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK) + if (htmlStyle.h3Bold) conflictingStyles.add(BOLD) + StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray()) + } + BLOCK_QUOTE -> StylesMergingConfig( + conflictingStyles = arrayOf(H1, H2, H3, CODE_BLOCK, ORDERED_LIST, UNORDERED_LIST) + ) + CODE_BLOCK -> StylesMergingConfig( + conflictingStyles = arrayOf(H1, H2, H3, BOLD, ITALIC, UNDERLINE, STRIKETHROUGH, UNORDERED_LIST, ORDERED_LIST, BLOCK_QUOTE, INLINE_CODE) + ) + UNORDERED_LIST -> StylesMergingConfig( + conflictingStyles = arrayOf(H1, H2, H3, ORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE) + ) + ORDERED_LIST -> StylesMergingConfig( + conflictingStyles = arrayOf(H1, H2, H3, UNORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE), + ) + LINK -> StylesMergingConfig( + blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, MENTION) + ) + IMAGE -> StylesMergingConfig() + MENTION -> StylesMergingConfig( + blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, LINK) + ) + else -> null + } + } }