react-native-enriched 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/README.md +15 -12
  2. package/android/build.gradle +77 -72
  3. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +18 -0
  4. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +6 -0
  5. package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.cpp +146 -0
  6. package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.h +140 -0
  7. package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/Props.cpp +10 -0
  8. package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/Props.h +194 -0
  9. package/android/lint.gradle +70 -0
  10. package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputConnectionWrapper.kt +140 -0
  11. package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt +245 -116
  12. package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewLayoutManager.kt +3 -1
  13. package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewManager.kt +162 -53
  14. package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewPackage.kt +1 -3
  15. package/android/src/main/java/com/swmansion/enriched/MeasurementStore.kt +70 -21
  16. package/android/src/main/java/com/swmansion/enriched/events/MentionHandler.kt +20 -10
  17. package/android/src/main/java/com/swmansion/enriched/events/OnChangeHtmlEvent.kt +8 -9
  18. package/android/src/main/java/com/swmansion/enriched/events/OnChangeSelectionEvent.kt +10 -9
  19. package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateDeprecatedEvent.kt +21 -0
  20. package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateEvent.kt +9 -12
  21. package/android/src/main/java/com/swmansion/enriched/events/OnChangeTextEvent.kt +10 -10
  22. package/android/src/main/java/com/swmansion/enriched/events/OnInputBlurEvent.kt +7 -9
  23. package/android/src/main/java/com/swmansion/enriched/events/OnInputFocusEvent.kt +7 -9
  24. package/android/src/main/java/com/swmansion/enriched/events/OnInputKeyPressEvent.kt +27 -0
  25. package/android/src/main/java/com/swmansion/enriched/events/OnLinkDetectedEvent.kt +13 -11
  26. package/android/src/main/java/com/swmansion/enriched/events/OnMentionDetectedEvent.kt +10 -9
  27. package/android/src/main/java/com/swmansion/enriched/events/OnMentionEvent.kt +9 -8
  28. package/android/src/main/java/com/swmansion/enriched/events/OnRequestHtmlResultEvent.kt +1 -2
  29. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBlockQuoteSpan.kt +21 -8
  30. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +5 -4
  31. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedCodeBlockSpan.kt +7 -5
  32. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +5 -4
  33. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +5 -4
  34. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +5 -4
  35. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH4Span.kt +24 -0
  36. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH5Span.kt +24 -0
  37. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH6Span.kt +24 -0
  38. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedImageSpan.kt +29 -17
  39. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedInlineCodeSpan.kt +5 -4
  40. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +5 -4
  41. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedLinkSpan.kt +7 -7
  42. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedMentionSpan.kt +11 -14
  43. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedOrderedListSpan.kt +15 -14
  44. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt +167 -71
  45. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +5 -4
  46. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +5 -4
  47. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnorderedListSpan.kt +8 -8
  48. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedBlockSpan.kt +3 -2
  49. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedHeadingSpan.kt +1 -2
  50. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +1 -2
  51. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedParagraphSpan.kt +3 -2
  52. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +1 -0
  53. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedZeroWidthSpaceSpan.kt +1 -2
  54. package/android/src/main/java/com/swmansion/enriched/spans/utils/ForceRedrawSpan.kt +2 -1
  55. package/android/src/main/java/com/swmansion/enriched/styles/HtmlStyle.kt +78 -21
  56. package/android/src/main/java/com/swmansion/enriched/styles/InlineStyles.kt +25 -8
  57. package/android/src/main/java/com/swmansion/enriched/styles/ListStyles.kt +60 -20
  58. package/android/src/main/java/com/swmansion/enriched/styles/ParagraphStyles.kt +86 -26
  59. package/android/src/main/java/com/swmansion/enriched/styles/ParametrizedStyles.kt +128 -52
  60. package/android/src/main/java/com/swmansion/enriched/utils/AsyncDrawable.kt +10 -7
  61. package/android/src/main/java/com/swmansion/enriched/utils/EnrichedConstants.kt +11 -0
  62. package/android/src/main/java/com/swmansion/enriched/utils/EnrichedEditableFactory.kt +17 -0
  63. package/android/src/main/java/com/swmansion/enriched/utils/EnrichedParser.java +128 -87
  64. package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSelection.kt +71 -42
  65. package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSpanState.kt +183 -48
  66. package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSpannable.kt +82 -0
  67. package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSpannableStringBuilder.kt +15 -0
  68. package/android/src/main/java/com/swmansion/enriched/utils/Utils.kt +0 -70
  69. package/android/src/main/java/com/swmansion/enriched/watchers/EnrichedSpanWatcher.kt +46 -14
  70. package/android/src/main/java/com/swmansion/enriched/watchers/EnrichedTextWatcher.kt +34 -11
  71. package/android/src/main/new_arch/CMakeLists.txt +6 -0
  72. package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/conversions.h +21 -1
  73. package/ios/EnrichedTextInputView.h +1 -1
  74. package/ios/EnrichedTextInputView.mm +381 -49
  75. package/ios/config/InputConfig.h +18 -0
  76. package/ios/config/InputConfig.mm +118 -8
  77. package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.cpp +146 -0
  78. package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.h +140 -0
  79. package/ios/generated/RNEnrichedTextInputViewSpec/Props.cpp +10 -0
  80. package/ios/generated/RNEnrichedTextInputViewSpec/Props.h +194 -0
  81. package/ios/generated/RNEnrichedTextInputViewSpec/RCTComponentViewHelpers.h +74 -0
  82. package/ios/inputParser/InputParser.mm +83 -10
  83. package/ios/{attachments → interfaces}/ImageAttachment.mm +3 -1
  84. package/ios/interfaces/LinkRegexConfig.h +19 -0
  85. package/ios/interfaces/LinkRegexConfig.mm +37 -0
  86. package/ios/{utils → interfaces}/MentionStyleProps.mm +2 -2
  87. package/ios/{utils → interfaces}/StyleHeaders.h +10 -0
  88. package/ios/{utils → interfaces}/StyleTypeEnum.h +3 -0
  89. package/ios/styles/BlockQuoteStyle.mm +5 -5
  90. package/ios/styles/BoldStyle.mm +21 -6
  91. package/ios/styles/CodeBlockStyle.mm +5 -5
  92. package/ios/styles/H4Style.mm +17 -0
  93. package/ios/styles/H5Style.mm +17 -0
  94. package/ios/styles/H6Style.mm +17 -0
  95. package/ios/styles/HeadingStyleBase.mm +27 -10
  96. package/ios/styles/ImageStyle.mm +5 -5
  97. package/ios/styles/InlineCodeStyle.mm +30 -19
  98. package/ios/styles/ItalicStyle.mm +5 -5
  99. package/ios/styles/LinkStyle.mm +98 -40
  100. package/ios/styles/MentionStyle.mm +4 -4
  101. package/ios/styles/OrderedListStyle.mm +5 -5
  102. package/ios/styles/StrikethroughStyle.mm +5 -5
  103. package/ios/styles/UnderlineStyle.mm +5 -5
  104. package/ios/styles/UnorderedListStyle.mm +5 -5
  105. package/ios/utils/ParagraphAttributesUtils.h +4 -0
  106. package/ios/utils/ParagraphAttributesUtils.mm +67 -0
  107. package/ios/utils/ParagraphsUtils.mm +4 -4
  108. package/lib/module/EnrichedTextInput.js +22 -1
  109. package/lib/module/EnrichedTextInput.js.map +1 -1
  110. package/lib/module/EnrichedTextInputNativeComponent.ts +138 -12
  111. package/lib/module/{normalizeHtmlStyle.js → utils/normalizeHtmlStyle.js} +12 -0
  112. package/lib/module/utils/normalizeHtmlStyle.js.map +1 -0
  113. package/lib/module/utils/regexParser.js +46 -0
  114. package/lib/module/utils/regexParser.js.map +1 -0
  115. package/lib/typescript/src/EnrichedTextInput.d.ts +23 -14
  116. package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
  117. package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts +123 -12
  118. package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +1 -1
  119. package/lib/typescript/src/index.d.ts +1 -1
  120. package/lib/typescript/src/index.d.ts.map +1 -1
  121. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +4 -0
  122. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -0
  123. package/lib/typescript/src/utils/regexParser.d.ts +3 -0
  124. package/lib/typescript/src/utils/regexParser.d.ts.map +1 -0
  125. package/package.json +10 -6
  126. package/src/EnrichedTextInput.tsx +51 -13
  127. package/src/EnrichedTextInputNativeComponent.ts +138 -12
  128. package/src/index.tsx +2 -0
  129. package/src/{normalizeHtmlStyle.ts → utils/normalizeHtmlStyle.ts} +14 -2
  130. package/src/utils/regexParser.ts +56 -0
  131. package/lib/module/normalizeHtmlStyle.js.map +0 -1
  132. package/lib/typescript/src/normalizeHtmlStyle.d.ts +0 -4
  133. package/lib/typescript/src/normalizeHtmlStyle.d.ts.map +0 -1
  134. /package/ios/{utils → extensions}/ColorExtension.h +0 -0
  135. /package/ios/{utils → extensions}/ColorExtension.mm +0 -0
  136. /package/ios/{utils → extensions}/FontExtension.h +0 -0
  137. /package/ios/{utils → extensions}/FontExtension.mm +0 -0
  138. /package/ios/{utils → extensions}/LayoutManagerExtension.h +0 -0
  139. /package/ios/{utils → extensions}/LayoutManagerExtension.mm +0 -0
  140. /package/ios/{utils → extensions}/StringExtension.h +0 -0
  141. /package/ios/{utils → extensions}/StringExtension.mm +0 -0
  142. /package/ios/{utils → interfaces}/BaseStyleProtocol.h +0 -0
  143. /package/ios/{attachments → interfaces}/ImageAttachment.h +0 -0
  144. /package/ios/{utils → interfaces}/ImageData.h +0 -0
  145. /package/ios/{utils → interfaces}/ImageData.mm +0 -0
  146. /package/ios/{utils → interfaces}/LinkData.h +0 -0
  147. /package/ios/{utils → interfaces}/LinkData.mm +0 -0
  148. /package/ios/{attachments → interfaces}/MediaAttachment.h +0 -0
  149. /package/ios/{attachments → interfaces}/MediaAttachment.mm +0 -0
  150. /package/ios/{utils → interfaces}/MentionParams.h +0 -0
  151. /package/ios/{utils → interfaces}/MentionParams.mm +0 -0
  152. /package/ios/{utils → interfaces}/MentionStyleProps.h +0 -0
  153. /package/ios/{utils → interfaces}/StylePair.h +0 -0
  154. /package/ios/{utils → interfaces}/StylePair.mm +0 -0
  155. /package/ios/{utils → interfaces}/TextDecorationLineEnum.h +0 -0
  156. /package/ios/{utils → interfaces}/TextDecorationLineEnum.mm +0 -0
@@ -6,10 +6,11 @@ import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
6
6
  import com.swmansion.enriched.styles.HtmlStyle
7
7
 
8
8
  @Suppress("UNUSED_PARAMETER")
9
- class EnrichedItalicSpan(private val htmlStyle: HtmlStyle) : StyleSpan(Typeface.ITALIC), EnrichedInlineSpan {
9
+ class EnrichedItalicSpan(
10
+ private val htmlStyle: HtmlStyle,
11
+ ) : StyleSpan(Typeface.ITALIC),
12
+ EnrichedInlineSpan {
10
13
  override val dependsOnHtmlStyle: Boolean = false
11
14
 
12
- override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedItalicSpan {
13
- return EnrichedItalicSpan(htmlStyle)
14
- }
15
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedItalicSpan = EnrichedItalicSpan(htmlStyle)
15
16
  }
@@ -6,7 +6,11 @@ import android.view.View
6
6
  import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
7
7
  import com.swmansion.enriched.styles.HtmlStyle
8
8
 
9
- class EnrichedLinkSpan(private val url: String, private val htmlStyle: HtmlStyle) : ClickableSpan(), EnrichedInlineSpan {
9
+ class EnrichedLinkSpan(
10
+ private val url: String,
11
+ private val htmlStyle: HtmlStyle,
12
+ ) : ClickableSpan(),
13
+ EnrichedInlineSpan {
10
14
  override val dependsOnHtmlStyle: Boolean = true
11
15
 
12
16
  override fun onClick(view: View) {
@@ -20,11 +24,7 @@ class EnrichedLinkSpan(private val url: String, private val htmlStyle: HtmlStyle
20
24
  textPaint.isUnderlineText = htmlStyle.aUnderline
21
25
  }
22
26
 
23
- fun getUrl(): String {
24
- return url
25
- }
27
+ fun getUrl(): String = url
26
28
 
27
- override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedLinkSpan {
28
- return EnrichedLinkSpan(url, htmlStyle)
29
- }
29
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedLinkSpan = EnrichedLinkSpan(url, htmlStyle)
30
30
  }
@@ -6,8 +6,13 @@ import android.view.View
6
6
  import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
7
7
  import com.swmansion.enriched.styles.HtmlStyle
8
8
 
9
- class EnrichedMentionSpan(private val text: String, private val indicator: String, private val attributes: Map<String, String>, private val htmlStyle: HtmlStyle) :
10
- ClickableSpan(), EnrichedInlineSpan {
9
+ class EnrichedMentionSpan(
10
+ private val text: String,
11
+ private val indicator: String,
12
+ private val attributes: Map<String, String>,
13
+ private val htmlStyle: HtmlStyle,
14
+ ) : ClickableSpan(),
15
+ EnrichedInlineSpan {
11
16
  override val dependsOnHtmlStyle: Boolean = true
12
17
 
13
18
  override fun onClick(view: View) {
@@ -24,19 +29,11 @@ class EnrichedMentionSpan(private val text: String, private val indicator: Strin
24
29
  textPaint.isUnderlineText = mentionsStyle.underline
25
30
  }
26
31
 
27
- fun getAttributes(): Map<String, String> {
28
- return attributes
29
- }
32
+ fun getAttributes(): Map<String, String> = attributes
30
33
 
31
- fun getText(): String {
32
- return text
33
- }
34
+ fun getText(): String = text
34
35
 
35
- fun getIndicator(): String {
36
- return indicator
37
- }
36
+ fun getIndicator(): String = indicator
38
37
 
39
- override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedMentionSpan {
40
- return EnrichedMentionSpan(text, indicator, attributes, htmlStyle)
41
- }
38
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedMentionSpan = EnrichedMentionSpan(text, indicator, attributes, htmlStyle)
42
39
  }
@@ -10,7 +10,12 @@ import android.text.style.MetricAffectingSpan
10
10
  import com.swmansion.enriched.spans.interfaces.EnrichedParagraphSpan
11
11
  import com.swmansion.enriched.styles.HtmlStyle
12
12
 
13
- class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: HtmlStyle) : MetricAffectingSpan(), LeadingMarginSpan, EnrichedParagraphSpan {
13
+ class EnrichedOrderedListSpan(
14
+ private var index: Int,
15
+ private val htmlStyle: HtmlStyle,
16
+ ) : MetricAffectingSpan(),
17
+ LeadingMarginSpan,
18
+ EnrichedParagraphSpan {
14
19
  override val dependsOnHtmlStyle: Boolean = true
15
20
 
16
21
  override fun updateMeasureState(p0: TextPaint) {
@@ -21,9 +26,7 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
21
26
  // Do nothing, but inform layout that this span affects text metrics
22
27
  }
23
28
 
24
- override fun getLeadingMargin(first: Boolean): Int {
25
- return htmlStyle.olMarginLeft + htmlStyle.olGapWidth
26
- }
29
+ override fun getLeadingMargin(first: Boolean): Int = htmlStyle.olMarginLeft + htmlStyle.olGapWidth
27
30
 
28
31
  override fun drawLeadingMargin(
29
32
  canvas: Canvas,
@@ -37,7 +40,7 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
37
40
  start: Int,
38
41
  end: Int,
39
42
  first: Boolean,
40
- layout: Layout?
43
+ layout: Layout?,
41
44
  ) {
42
45
  if (first) {
43
46
  val text = "$index."
@@ -58,8 +61,11 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
58
61
  }
59
62
  }
60
63
 
61
- private fun getTypeface(fontWeight: Int?, originalTypeface: Typeface): Typeface {
62
- return if (fontWeight == null) {
64
+ private fun getTypeface(
65
+ fontWeight: Int?,
66
+ originalTypeface: Typeface,
67
+ ): Typeface =
68
+ if (fontWeight == null) {
63
69
  originalTypeface
64
70
  } else if (android.os.Build.VERSION.SDK_INT >= 28) {
65
71
  Typeface.create(originalTypeface, fontWeight, false)
@@ -71,17 +77,12 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
71
77
  Typeface.create(originalTypeface, Typeface.NORMAL)
72
78
  }
73
79
  }
74
- }
75
80
 
76
- fun getIndex(): Int {
77
- return index
78
- }
81
+ fun getIndex(): Int = index
79
82
 
80
83
  fun setIndex(i: Int) {
81
84
  index = i
82
85
  }
83
86
 
84
- override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedOrderedListSpan {
85
- return EnrichedOrderedListSpan(index, htmlStyle)
86
- }
87
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedOrderedListSpan = EnrichedOrderedListSpan(index, htmlStyle)
87
88
  }
@@ -6,9 +6,19 @@ interface ISpanConfig {
6
6
  val clazz: Class<*>
7
7
  }
8
8
 
9
- data class BaseSpanConfig(override val clazz: Class<*>): ISpanConfig
10
- data class ParagraphSpanConfig(override val clazz: Class<*>, val isContinuous: Boolean): ISpanConfig
11
- data class ListSpanConfig(override val clazz: Class<*>, val shortcut: String) : ISpanConfig
9
+ data class BaseSpanConfig(
10
+ override val clazz: Class<*>,
11
+ ) : ISpanConfig
12
+
13
+ data class ParagraphSpanConfig(
14
+ override val clazz: Class<*>,
15
+ val isContinuous: Boolean,
16
+ ) : ISpanConfig
17
+
18
+ data class ListSpanConfig(
19
+ override val clazz: Class<*>,
20
+ val shortcut: String,
21
+ ) : ISpanConfig
12
22
 
13
23
  data class StylesMergingConfig(
14
24
  // styles that should be removed when we apply specific style
@@ -29,6 +39,9 @@ object EnrichedSpans {
29
39
  const val H1 = "h1"
30
40
  const val H2 = "h2"
31
41
  const val H3 = "h3"
42
+ const val H4 = "h4"
43
+ const val H5 = "h5"
44
+ const val H6 = "h6"
32
45
  const val BLOCK_QUOTE = "block_quote"
33
46
  const val CODE_BLOCK = "code_block"
34
47
 
@@ -41,96 +54,179 @@ object EnrichedSpans {
41
54
  const val IMAGE = "image"
42
55
  const val MENTION = "mention"
43
56
 
44
- val inlineSpans: Map<String, BaseSpanConfig> = mapOf(
45
- BOLD to BaseSpanConfig(EnrichedBoldSpan::class.java),
46
- ITALIC to BaseSpanConfig(EnrichedItalicSpan::class.java),
47
- UNDERLINE to BaseSpanConfig(EnrichedUnderlineSpan::class.java),
48
- STRIKETHROUGH to BaseSpanConfig(EnrichedStrikeThroughSpan::class.java),
49
- INLINE_CODE to BaseSpanConfig(EnrichedInlineCodeSpan::class.java),
50
- )
51
-
52
- val paragraphSpans: Map<String, ParagraphSpanConfig> = mapOf(
53
- H1 to ParagraphSpanConfig(EnrichedH1Span::class.java, false),
54
- H2 to ParagraphSpanConfig(EnrichedH2Span::class.java, false),
55
- H3 to ParagraphSpanConfig(EnrichedH3Span::class.java, false),
56
- BLOCK_QUOTE to ParagraphSpanConfig(EnrichedBlockQuoteSpan::class.java, true),
57
- CODE_BLOCK to ParagraphSpanConfig(EnrichedCodeBlockSpan::class.java, true),
58
- )
59
-
60
- val listSpans: Map<String, ListSpanConfig> = mapOf(
61
- UNORDERED_LIST to ListSpanConfig(EnrichedUnorderedListSpan::class.java, "- "),
62
- ORDERED_LIST to ListSpanConfig(EnrichedOrderedListSpan::class.java, "1. "),
63
- )
64
-
65
- val parametrizedStyles: Map<String, BaseSpanConfig> = mapOf(
66
- LINK to BaseSpanConfig(EnrichedLinkSpan::class.java),
67
- IMAGE to BaseSpanConfig(EnrichedImageSpan::class.java),
68
- MENTION to BaseSpanConfig(EnrichedMentionSpan::class.java),
69
- )
57
+ val inlineSpans: Map<String, BaseSpanConfig> =
58
+ mapOf(
59
+ BOLD to BaseSpanConfig(EnrichedBoldSpan::class.java),
60
+ ITALIC to BaseSpanConfig(EnrichedItalicSpan::class.java),
61
+ UNDERLINE to BaseSpanConfig(EnrichedUnderlineSpan::class.java),
62
+ STRIKETHROUGH to BaseSpanConfig(EnrichedStrikeThroughSpan::class.java),
63
+ INLINE_CODE to BaseSpanConfig(EnrichedInlineCodeSpan::class.java),
64
+ )
65
+
66
+ val paragraphSpans: Map<String, ParagraphSpanConfig> =
67
+ mapOf(
68
+ H1 to ParagraphSpanConfig(EnrichedH1Span::class.java, false),
69
+ H2 to ParagraphSpanConfig(EnrichedH2Span::class.java, false),
70
+ H3 to ParagraphSpanConfig(EnrichedH3Span::class.java, false),
71
+ H4 to ParagraphSpanConfig(EnrichedH4Span::class.java, false),
72
+ H5 to ParagraphSpanConfig(EnrichedH5Span::class.java, false),
73
+ H6 to ParagraphSpanConfig(EnrichedH6Span::class.java, false),
74
+ BLOCK_QUOTE to ParagraphSpanConfig(EnrichedBlockQuoteSpan::class.java, true),
75
+ CODE_BLOCK to ParagraphSpanConfig(EnrichedCodeBlockSpan::class.java, true),
76
+ )
77
+
78
+ val listSpans: Map<String, ListSpanConfig> =
79
+ mapOf(
80
+ UNORDERED_LIST to ListSpanConfig(EnrichedUnorderedListSpan::class.java, "- "),
81
+ ORDERED_LIST to ListSpanConfig(EnrichedOrderedListSpan::class.java, "1. "),
82
+ )
83
+
84
+ val parametrizedStyles: Map<String, BaseSpanConfig> =
85
+ mapOf(
86
+ LINK to BaseSpanConfig(EnrichedLinkSpan::class.java),
87
+ IMAGE to BaseSpanConfig(EnrichedImageSpan::class.java),
88
+ MENTION to BaseSpanConfig(EnrichedMentionSpan::class.java),
89
+ )
70
90
 
71
91
  val allSpans: Map<String, ISpanConfig> = inlineSpans + paragraphSpans + listSpans + parametrizedStyles
72
92
 
73
- fun getMergingConfigForStyle(style: String, htmlStyle: HtmlStyle): StylesMergingConfig? {
74
- return when (style) {
93
+ fun getMergingConfigForStyle(
94
+ style: String,
95
+ htmlStyle: HtmlStyle,
96
+ ): StylesMergingConfig? =
97
+ when (style) {
75
98
  BOLD -> {
76
99
  val blockingStyles = mutableListOf(CODE_BLOCK)
77
100
  if (htmlStyle.h1Bold) blockingStyles.add(H1)
78
101
  if (htmlStyle.h2Bold) blockingStyles.add(H2)
79
102
  if (htmlStyle.h3Bold) blockingStyles.add(H3)
103
+ if (htmlStyle.h4Bold) blockingStyles.add(H4)
104
+ if (htmlStyle.h5Bold) blockingStyles.add(H5)
105
+ if (htmlStyle.h6Bold) blockingStyles.add(H6)
80
106
  StylesMergingConfig(blockingStyles = blockingStyles.toTypedArray())
81
107
  }
82
- ITALIC -> StylesMergingConfig(
83
- blockingStyles = arrayOf(CODE_BLOCK)
84
- )
85
- UNDERLINE -> StylesMergingConfig(
86
- blockingStyles = arrayOf(CODE_BLOCK)
87
- )
88
- STRIKETHROUGH -> StylesMergingConfig(
89
- blockingStyles = arrayOf(CODE_BLOCK)
90
- )
91
- INLINE_CODE -> StylesMergingConfig(
92
- conflictingStyles = arrayOf(MENTION, LINK),
93
- blockingStyles = arrayOf(CODE_BLOCK)
94
- )
108
+
109
+ ITALIC -> {
110
+ StylesMergingConfig(
111
+ blockingStyles = arrayOf(CODE_BLOCK),
112
+ )
113
+ }
114
+
115
+ UNDERLINE -> {
116
+ StylesMergingConfig(
117
+ blockingStyles = arrayOf(CODE_BLOCK),
118
+ )
119
+ }
120
+
121
+ STRIKETHROUGH -> {
122
+ StylesMergingConfig(
123
+ blockingStyles = arrayOf(CODE_BLOCK),
124
+ )
125
+ }
126
+
127
+ INLINE_CODE -> {
128
+ StylesMergingConfig(
129
+ conflictingStyles = arrayOf(MENTION, LINK),
130
+ blockingStyles = arrayOf(CODE_BLOCK),
131
+ )
132
+ }
133
+
95
134
  H1 -> {
96
- val conflictingStyles = mutableListOf(H2, H3, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
135
+ val conflictingStyles = mutableListOf(H2, H3, H4, H5, H6, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
97
136
  if (htmlStyle.h1Bold) conflictingStyles.add(BOLD)
98
137
  StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
99
138
  }
139
+
100
140
  H2 -> {
101
- val conflictingStyles = mutableListOf(H1, H3, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
141
+ val conflictingStyles = mutableListOf(H1, H3, H4, H5, H6, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
102
142
  if (htmlStyle.h2Bold) conflictingStyles.add(BOLD)
103
143
  StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
104
144
  }
145
+
105
146
  H3 -> {
106
- val conflictingStyles = mutableListOf(H1, H2, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
147
+ val conflictingStyles = mutableListOf(H1, H2, H4, H5, H6, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
107
148
  if (htmlStyle.h3Bold) conflictingStyles.add(BOLD)
108
149
  StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
109
150
  }
110
- BLOCK_QUOTE -> StylesMergingConfig(
111
- conflictingStyles = arrayOf(H1, H2, H3, CODE_BLOCK, ORDERED_LIST, UNORDERED_LIST)
112
- )
113
- CODE_BLOCK -> StylesMergingConfig(
114
- conflictingStyles = arrayOf(H1, H2, H3, BOLD, ITALIC, UNDERLINE, STRIKETHROUGH, UNORDERED_LIST, ORDERED_LIST, BLOCK_QUOTE, INLINE_CODE)
115
- )
116
- UNORDERED_LIST -> StylesMergingConfig(
117
- conflictingStyles = arrayOf(H1, H2, H3, ORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE)
118
- )
119
- ORDERED_LIST -> StylesMergingConfig(
120
- conflictingStyles = arrayOf(H1, H2, H3, UNORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE),
121
- )
122
- LINK -> StylesMergingConfig(
123
- blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, MENTION)
124
- )
125
- IMAGE -> StylesMergingConfig()
126
- MENTION -> StylesMergingConfig(
127
- blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, LINK)
128
- )
129
- else -> null
151
+
152
+ H4 -> {
153
+ val conflictingStyles = mutableListOf(H1, H2, H3, H5, H6, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
154
+ if (htmlStyle.h4Bold) conflictingStyles.add(BOLD)
155
+ StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
156
+ }
157
+
158
+ H5 -> {
159
+ val conflictingStyles = mutableListOf(H1, H2, H3, H4, H6, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
160
+ if (htmlStyle.h5Bold) conflictingStyles.add(BOLD)
161
+ StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
162
+ }
163
+
164
+ H6 -> {
165
+ val conflictingStyles = mutableListOf(H1, H2, H3, H4, H5, ORDERED_LIST, UNORDERED_LIST, BLOCK_QUOTE, CODE_BLOCK)
166
+ if (htmlStyle.h6Bold) conflictingStyles.add(BOLD)
167
+ StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
168
+ }
169
+
170
+ BLOCK_QUOTE -> {
171
+ StylesMergingConfig(
172
+ conflictingStyles = arrayOf(H1, H2, H3, H4, H5, H6, CODE_BLOCK, ORDERED_LIST, UNORDERED_LIST),
173
+ )
174
+ }
175
+
176
+ CODE_BLOCK -> {
177
+ StylesMergingConfig(
178
+ conflictingStyles =
179
+ arrayOf(
180
+ H1,
181
+ H2,
182
+ H3,
183
+ H4,
184
+ H5,
185
+ H6,
186
+ BOLD,
187
+ ITALIC,
188
+ UNDERLINE,
189
+ STRIKETHROUGH,
190
+ UNORDERED_LIST,
191
+ ORDERED_LIST,
192
+ BLOCK_QUOTE,
193
+ INLINE_CODE,
194
+ ),
195
+ )
196
+ }
197
+
198
+ UNORDERED_LIST -> {
199
+ StylesMergingConfig(
200
+ conflictingStyles = arrayOf(H1, H2, H3, H4, H5, H6, ORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE),
201
+ )
202
+ }
203
+
204
+ ORDERED_LIST -> {
205
+ StylesMergingConfig(
206
+ conflictingStyles = arrayOf(H1, H2, H3, H4, H5, H6, UNORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE),
207
+ )
208
+ }
209
+
210
+ LINK -> {
211
+ StylesMergingConfig(
212
+ blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, MENTION),
213
+ )
214
+ }
215
+
216
+ IMAGE -> {
217
+ StylesMergingConfig()
218
+ }
219
+
220
+ MENTION -> {
221
+ StylesMergingConfig(
222
+ blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, LINK),
223
+ )
224
+ }
225
+
226
+ else -> {
227
+ null
228
+ }
130
229
  }
131
- }
132
230
 
133
- fun isTypeContinuous(type: Class<*>): Boolean {
134
- return paragraphSpans.values.find { it.clazz == type }?.isContinuous == true
135
- }
231
+ fun isTypeContinuous(type: Class<*>): Boolean = paragraphSpans.values.find { it.clazz == type }?.isContinuous == true
136
232
  }
@@ -5,10 +5,11 @@ import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
5
5
  import com.swmansion.enriched.styles.HtmlStyle
6
6
 
7
7
  @Suppress("UNUSED_PARAMETER")
8
- class EnrichedStrikeThroughSpan(private val htmlStyle: HtmlStyle) : StrikethroughSpan(), EnrichedInlineSpan {
8
+ class EnrichedStrikeThroughSpan(
9
+ private val htmlStyle: HtmlStyle,
10
+ ) : StrikethroughSpan(),
11
+ EnrichedInlineSpan {
9
12
  override val dependsOnHtmlStyle: Boolean = false
10
13
 
11
- override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedStrikeThroughSpan {
12
- return EnrichedStrikeThroughSpan(htmlStyle)
13
- }
14
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedStrikeThroughSpan = EnrichedStrikeThroughSpan(htmlStyle)
14
15
  }
@@ -5,10 +5,11 @@ import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
5
5
  import com.swmansion.enriched.styles.HtmlStyle
6
6
 
7
7
  @Suppress("UNUSED_PARAMETER")
8
- class EnrichedUnderlineSpan(private val htmlStyle: HtmlStyle) : UnderlineSpan(), EnrichedInlineSpan {
8
+ class EnrichedUnderlineSpan(
9
+ private val htmlStyle: HtmlStyle,
10
+ ) : UnderlineSpan(),
11
+ EnrichedInlineSpan {
9
12
  override val dependsOnHtmlStyle: Boolean = false
10
13
 
11
- override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnderlineSpan {
12
- return EnrichedUnderlineSpan(htmlStyle)
13
- }
14
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnderlineSpan = EnrichedUnderlineSpan(htmlStyle)
14
15
  }
@@ -11,7 +11,11 @@ import com.swmansion.enriched.spans.interfaces.EnrichedParagraphSpan
11
11
  import com.swmansion.enriched.styles.HtmlStyle
12
12
 
13
13
  // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/android/text/style/BulletSpan.java
14
- class EnrichedUnorderedListSpan(private val htmlStyle: HtmlStyle) : MetricAffectingSpan(), LeadingMarginSpan, EnrichedParagraphSpan {
14
+ class EnrichedUnorderedListSpan(
15
+ private val htmlStyle: HtmlStyle,
16
+ ) : MetricAffectingSpan(),
17
+ LeadingMarginSpan,
18
+ EnrichedParagraphSpan {
15
19
  override val dependsOnHtmlStyle: Boolean = true
16
20
 
17
21
  override fun updateMeasureState(p0: TextPaint) {
@@ -22,9 +26,7 @@ class EnrichedUnorderedListSpan(private val htmlStyle: HtmlStyle) : MetricAffect
22
26
  // Do nothing, but inform layout that this span affects text metrics
23
27
  }
24
28
 
25
- override fun getLeadingMargin(p0: Boolean): Int {
26
- return htmlStyle.ulBulletSize + htmlStyle.ulGapWidth + htmlStyle.ulMarginLeft
27
- }
29
+ override fun getLeadingMargin(p0: Boolean): Int = htmlStyle.ulBulletSize + htmlStyle.ulGapWidth + htmlStyle.ulMarginLeft
28
30
 
29
31
  override fun drawLeadingMargin(
30
32
  canvas: Canvas,
@@ -38,7 +40,7 @@ class EnrichedUnorderedListSpan(private val htmlStyle: HtmlStyle) : MetricAffect
38
40
  start: Int,
39
41
  end: Int,
40
42
  first: Boolean,
41
- layout: Layout?
43
+ layout: Layout?,
42
44
  ) {
43
45
  val spannedText = text as Spanned
44
46
 
@@ -59,7 +61,5 @@ class EnrichedUnorderedListSpan(private val htmlStyle: HtmlStyle) : MetricAffect
59
61
  }
60
62
  }
61
63
 
62
- override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnorderedListSpan {
63
- return EnrichedUnorderedListSpan(htmlStyle)
64
- }
64
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnorderedListSpan = EnrichedUnorderedListSpan(htmlStyle)
65
65
  }
@@ -1,4 +1,5 @@
1
1
  package com.swmansion.enriched.spans.interfaces
2
2
 
3
- interface EnrichedBlockSpan : EnrichedSpan, EnrichedZeroWidthSpaceSpan {
4
- }
3
+ interface EnrichedBlockSpan :
4
+ EnrichedSpan,
5
+ EnrichedZeroWidthSpaceSpan
@@ -1,4 +1,3 @@
1
1
  package com.swmansion.enriched.spans.interfaces
2
2
 
3
- interface EnrichedHeadingSpan : EnrichedParagraphSpan {
4
- }
3
+ interface EnrichedHeadingSpan : EnrichedParagraphSpan
@@ -1,4 +1,3 @@
1
1
  package com.swmansion.enriched.spans.interfaces
2
2
 
3
- interface EnrichedInlineSpan : EnrichedSpan {
4
- }
3
+ interface EnrichedInlineSpan : EnrichedSpan
@@ -1,4 +1,5 @@
1
1
  package com.swmansion.enriched.spans.interfaces
2
2
 
3
- interface EnrichedParagraphSpan : EnrichedSpan, EnrichedZeroWidthSpaceSpan {
4
- }
3
+ interface EnrichedParagraphSpan :
4
+ EnrichedSpan,
5
+ EnrichedZeroWidthSpaceSpan
@@ -4,5 +4,6 @@ import com.swmansion.enriched.styles.HtmlStyle
4
4
 
5
5
  interface EnrichedSpan {
6
6
  val dependsOnHtmlStyle: Boolean
7
+
7
8
  fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedSpan
8
9
  }
@@ -1,5 +1,4 @@
1
1
  package com.swmansion.enriched.spans.interfaces
2
2
 
3
3
  // Spans that are prefixed with zero-width space (\u200B) to ensure that they are visible even when empty.
4
- interface EnrichedZeroWidthSpaceSpan {
5
- }
4
+ interface EnrichedZeroWidthSpaceSpan
@@ -3,10 +3,11 @@ package com.swmansion.enriched.spans.utils
3
3
  import android.text.TextPaint
4
4
  import android.text.style.MetricAffectingSpan
5
5
 
6
- class ForceRedrawSpan: MetricAffectingSpan() {
6
+ class ForceRedrawSpan : MetricAffectingSpan() {
7
7
  override fun updateMeasureState(tp: TextPaint) {
8
8
  // Do nothing, we don't actually want to change how it looks
9
9
  }
10
+
10
11
  override fun updateDrawState(tp: TextPaint?) {
11
12
  // Do nothing
12
13
  }