react-native-enriched 0.2.0 → 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 (186) hide show
  1. package/README.md +16 -17
  2. package/android/build.gradle +77 -72
  3. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +21 -0
  4. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +7 -0
  5. package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.cpp +156 -0
  6. package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.h +147 -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 +304 -83
  12. package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewLayoutManager.kt +3 -1
  13. package/android/src/main/java/com/swmansion/enriched/EnrichedTextInputViewManager.kt +166 -51
  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 +21 -11
  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 +32 -0
  29. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBlockQuoteSpan.kt +24 -5
  30. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +8 -1
  31. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedCodeBlockSpan.kt +10 -2
  32. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +8 -1
  33. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +8 -1
  34. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +8 -1
  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 +34 -17
  39. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedInlineCodeSpan.kt +8 -1
  40. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +7 -1
  41. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedLinkSpan.kt +10 -4
  42. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedMentionSpan.kt +14 -11
  43. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedOrderedListSpan.kt +18 -11
  44. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt +174 -72
  45. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +7 -1
  46. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +7 -1
  47. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnorderedListSpan.kt +11 -5
  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 +5 -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 +155 -20
  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 +161 -25
  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 +136 -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/RNEnrichedTextInputViewSpec.cpp +6 -6
  73. package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +6 -6
  74. package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputComponentDescriptor.h +19 -19
  75. package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputMeasurementManager.cpp +40 -51
  76. package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputMeasurementManager.h +13 -15
  77. package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputShadowNode.cpp +23 -21
  78. package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputShadowNode.h +35 -36
  79. package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputState.cpp +4 -4
  80. package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/EnrichedTextInputState.h +13 -14
  81. package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/conversions.h +33 -14
  82. package/ios/EnrichedTextInputView.h +26 -14
  83. package/ios/EnrichedTextInputView.mm +1209 -586
  84. package/ios/config/InputConfig.h +24 -6
  85. package/ios/config/InputConfig.mm +154 -38
  86. package/ios/{utils → extensions}/ColorExtension.mm +7 -5
  87. package/ios/extensions/FontExtension.mm +106 -0
  88. package/ios/{utils → extensions}/LayoutManagerExtension.h +1 -1
  89. package/ios/extensions/LayoutManagerExtension.mm +396 -0
  90. package/ios/{utils → extensions}/StringExtension.mm +19 -16
  91. package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.cpp +156 -0
  92. package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.h +147 -0
  93. package/ios/generated/RNEnrichedTextInputViewSpec/Props.cpp +10 -0
  94. package/ios/generated/RNEnrichedTextInputViewSpec/Props.h +194 -0
  95. package/ios/generated/RNEnrichedTextInputViewSpec/RCTComponentViewHelpers.h +95 -0
  96. package/ios/inputParser/InputParser.h +5 -5
  97. package/ios/inputParser/InputParser.mm +864 -380
  98. package/ios/inputTextView/InputTextView.h +1 -1
  99. package/ios/inputTextView/InputTextView.mm +100 -59
  100. package/ios/{utils → interfaces}/BaseStyleProtocol.h +2 -2
  101. package/ios/interfaces/ImageAttachment.h +10 -0
  102. package/ios/interfaces/ImageAttachment.mm +36 -0
  103. package/ios/interfaces/LinkRegexConfig.h +19 -0
  104. package/ios/interfaces/LinkRegexConfig.mm +37 -0
  105. package/ios/interfaces/MediaAttachment.h +23 -0
  106. package/ios/interfaces/MediaAttachment.mm +31 -0
  107. package/ios/{utils → interfaces}/MentionParams.h +0 -1
  108. package/ios/{utils → interfaces}/MentionStyleProps.mm +27 -20
  109. package/ios/{utils → interfaces}/StyleHeaders.h +37 -15
  110. package/ios/{utils → interfaces}/StyleTypeEnum.h +3 -0
  111. package/ios/internals/EnrichedTextInputViewComponentDescriptor.h +11 -9
  112. package/ios/internals/EnrichedTextInputViewShadowNode.h +28 -25
  113. package/ios/internals/EnrichedTextInputViewShadowNode.mm +45 -40
  114. package/ios/internals/EnrichedTextInputViewState.h +3 -1
  115. package/ios/styles/BlockQuoteStyle.mm +189 -118
  116. package/ios/styles/BoldStyle.mm +110 -63
  117. package/ios/styles/CodeBlockStyle.mm +204 -128
  118. package/ios/styles/H1Style.mm +10 -4
  119. package/ios/styles/H2Style.mm +10 -4
  120. package/ios/styles/H3Style.mm +10 -4
  121. package/ios/styles/H4Style.mm +17 -0
  122. package/ios/styles/H5Style.mm +17 -0
  123. package/ios/styles/H6Style.mm +17 -0
  124. package/ios/styles/HeadingStyleBase.mm +148 -86
  125. package/ios/styles/ImageStyle.mm +75 -73
  126. package/ios/styles/InlineCodeStyle.mm +162 -88
  127. package/ios/styles/ItalicStyle.mm +76 -52
  128. package/ios/styles/LinkStyle.mm +411 -232
  129. package/ios/styles/MentionStyle.mm +363 -246
  130. package/ios/styles/OrderedListStyle.mm +171 -106
  131. package/ios/styles/StrikethroughStyle.mm +52 -35
  132. package/ios/styles/UnderlineStyle.mm +68 -46
  133. package/ios/styles/UnorderedListStyle.mm +169 -106
  134. package/ios/utils/OccurenceUtils.h +42 -42
  135. package/ios/utils/OccurenceUtils.mm +142 -119
  136. package/ios/utils/ParagraphAttributesUtils.h +10 -2
  137. package/ios/utils/ParagraphAttributesUtils.mm +182 -71
  138. package/ios/utils/ParagraphsUtils.h +2 -1
  139. package/ios/utils/ParagraphsUtils.mm +41 -27
  140. package/ios/utils/TextInsertionUtils.h +13 -2
  141. package/ios/utils/TextInsertionUtils.mm +38 -20
  142. package/ios/utils/WordsUtils.h +2 -1
  143. package/ios/utils/WordsUtils.mm +32 -22
  144. package/ios/utils/ZeroWidthSpaceUtils.h +3 -1
  145. package/ios/utils/ZeroWidthSpaceUtils.mm +145 -79
  146. package/lib/module/EnrichedTextInput.js +61 -2
  147. package/lib/module/EnrichedTextInput.js.map +1 -1
  148. package/lib/module/EnrichedTextInputNativeComponent.ts +149 -12
  149. package/lib/module/{normalizeHtmlStyle.js → utils/normalizeHtmlStyle.js} +12 -0
  150. package/lib/module/utils/normalizeHtmlStyle.js.map +1 -0
  151. package/lib/module/utils/regexParser.js +46 -0
  152. package/lib/module/utils/regexParser.js.map +1 -0
  153. package/lib/typescript/src/EnrichedTextInput.d.ts +24 -14
  154. package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
  155. package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts +129 -12
  156. package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +1 -1
  157. package/lib/typescript/src/index.d.ts +1 -1
  158. package/lib/typescript/src/index.d.ts.map +1 -1
  159. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +4 -0
  160. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -0
  161. package/lib/typescript/src/utils/regexParser.d.ts +3 -0
  162. package/lib/typescript/src/utils/regexParser.d.ts.map +1 -0
  163. package/package.json +17 -6
  164. package/src/EnrichedTextInput.tsx +96 -13
  165. package/src/EnrichedTextInputNativeComponent.ts +149 -12
  166. package/src/index.tsx +2 -0
  167. package/src/{normalizeHtmlStyle.ts → utils/normalizeHtmlStyle.ts} +14 -2
  168. package/src/utils/regexParser.ts +56 -0
  169. package/ios/utils/FontExtension.mm +0 -91
  170. package/ios/utils/LayoutManagerExtension.mm +0 -286
  171. package/lib/module/normalizeHtmlStyle.js.map +0 -1
  172. package/lib/typescript/src/normalizeHtmlStyle.d.ts +0 -4
  173. package/lib/typescript/src/normalizeHtmlStyle.d.ts.map +0 -1
  174. package/ios/{utils → extensions}/ColorExtension.h +0 -0
  175. package/ios/{utils → extensions}/FontExtension.h +0 -0
  176. package/ios/{utils → extensions}/StringExtension.h +1 -1
  177. package/ios/{utils → interfaces}/ImageData.h +0 -0
  178. package/ios/{utils → interfaces}/ImageData.mm +0 -0
  179. package/ios/{utils → interfaces}/LinkData.h +0 -0
  180. package/ios/{utils → interfaces}/LinkData.mm +0 -0
  181. package/ios/{utils → interfaces}/MentionParams.mm +0 -0
  182. package/ios/{utils → interfaces}/MentionStyleProps.h +1 -1
  183. /package/ios/{utils → interfaces}/StylePair.h +0 -0
  184. /package/ios/{utils → interfaces}/StylePair.mm +0 -0
  185. /package/ios/{utils → interfaces}/TextDecorationLineEnum.h +0 -0
  186. /package/ios/{utils → interfaces}/TextDecorationLineEnum.mm +0 -0
@@ -6,7 +6,12 @@ import android.text.style.MetricAffectingSpan
6
6
  import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
7
7
  import com.swmansion.enriched.styles.HtmlStyle
8
8
 
9
- class EnrichedInlineCodeSpan(private val htmlStyle: HtmlStyle) : MetricAffectingSpan(), EnrichedInlineSpan {
9
+ class EnrichedInlineCodeSpan(
10
+ private val htmlStyle: HtmlStyle,
11
+ ) : MetricAffectingSpan(),
12
+ EnrichedInlineSpan {
13
+ override val dependsOnHtmlStyle: Boolean = true
14
+
10
15
  override fun updateDrawState(textPaint: TextPaint) {
11
16
  val typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL)
12
17
  textPaint.typeface = typeface
@@ -18,4 +23,6 @@ class EnrichedInlineCodeSpan(private val htmlStyle: HtmlStyle) : MetricAffecting
18
23
  val typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL)
19
24
  textPaint.typeface = typeface
20
25
  }
26
+
27
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedInlineCodeSpan = EnrichedInlineCodeSpan(htmlStyle)
21
28
  }
@@ -6,5 +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 {
13
+ override val dependsOnHtmlStyle: Boolean = false
14
+
15
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedItalicSpan = EnrichedItalicSpan(htmlStyle)
10
16
  }
@@ -6,7 +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 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 {
14
+ override val dependsOnHtmlStyle: Boolean = true
15
+
10
16
  override fun onClick(view: View) {
11
17
  // Do nothing, links inside the input are not clickable.
12
18
  // We are using `ClickableSpan` to allow the text to be styled as a link.
@@ -18,7 +24,7 @@ class EnrichedLinkSpan(private val url: String, private val htmlStyle: HtmlStyle
18
24
  textPaint.isUnderlineText = htmlStyle.aUnderline
19
25
  }
20
26
 
21
- fun getUrl(): String {
22
- return url
23
- }
27
+ fun getUrl(): String = url
28
+
29
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedLinkSpan = EnrichedLinkSpan(url, htmlStyle)
24
30
  }
@@ -6,8 +6,15 @@ 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 {
16
+ override val dependsOnHtmlStyle: Boolean = true
17
+
11
18
  override fun onClick(view: View) {
12
19
  // Do nothing. Mentions inside the input are not clickable.
13
20
  // We are using `ClickableSpan` to allow the text to be styled as a clickable element.
@@ -22,15 +29,11 @@ class EnrichedMentionSpan(private val text: String, private val indicator: Strin
22
29
  textPaint.isUnderlineText = mentionsStyle.underline
23
30
  }
24
31
 
25
- fun getAttributes(): Map<String, String> {
26
- return attributes
27
- }
32
+ fun getAttributes(): Map<String, String> = attributes
28
33
 
29
- fun getText(): String {
30
- return text
31
- }
34
+ fun getText(): String = text
32
35
 
33
- fun getIndicator(): String {
34
- return indicator
35
- }
36
+ fun getIndicator(): String = indicator
37
+
38
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedMentionSpan = EnrichedMentionSpan(text, indicator, attributes, htmlStyle)
36
39
  }
@@ -10,7 +10,14 @@ 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 {
19
+ override val dependsOnHtmlStyle: Boolean = true
20
+
14
21
  override fun updateMeasureState(p0: TextPaint) {
15
22
  // Do nothing, but inform layout that this span affects text metrics
16
23
  }
@@ -19,9 +26,7 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
19
26
  // Do nothing, but inform layout that this span affects text metrics
20
27
  }
21
28
 
22
- override fun getLeadingMargin(first: Boolean): Int {
23
- return htmlStyle.olMarginLeft + htmlStyle.olGapWidth
24
- }
29
+ override fun getLeadingMargin(first: Boolean): Int = htmlStyle.olMarginLeft + htmlStyle.olGapWidth
25
30
 
26
31
  override fun drawLeadingMargin(
27
32
  canvas: Canvas,
@@ -35,7 +40,7 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
35
40
  start: Int,
36
41
  end: Int,
37
42
  first: Boolean,
38
- layout: Layout?
43
+ layout: Layout?,
39
44
  ) {
40
45
  if (first) {
41
46
  val text = "$index."
@@ -56,8 +61,11 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
56
61
  }
57
62
  }
58
63
 
59
- private fun getTypeface(fontWeight: Int?, originalTypeface: Typeface): Typeface {
60
- return if (fontWeight == null) {
64
+ private fun getTypeface(
65
+ fontWeight: Int?,
66
+ originalTypeface: Typeface,
67
+ ): Typeface =
68
+ if (fontWeight == null) {
61
69
  originalTypeface
62
70
  } else if (android.os.Build.VERSION.SDK_INT >= 28) {
63
71
  Typeface.create(originalTypeface, fontWeight, false)
@@ -69,13 +77,12 @@ class EnrichedOrderedListSpan(private var index: Int, private val htmlStyle: Htm
69
77
  Typeface.create(originalTypeface, Typeface.NORMAL)
70
78
  }
71
79
  }
72
- }
73
80
 
74
- fun getIndex(): Int {
75
- return index
76
- }
81
+ fun getIndex(): Int = index
77
82
 
78
83
  fun setIndex(i: Int) {
79
84
  index = i
80
85
  }
86
+
87
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedOrderedListSpan = EnrichedOrderedListSpan(index, htmlStyle)
81
88
  }
@@ -2,9 +2,23 @@ package com.swmansion.enriched.spans
2
2
 
3
3
  import com.swmansion.enriched.styles.HtmlStyle
4
4
 
5
- data class BaseSpanConfig(val clazz: Class<*>)
6
- data class ParagraphSpanConfig(val clazz: Class<*>, val isContinuous: Boolean)
7
- data class ListSpanConfig(val clazz: Class<*>, val shortcut: String)
5
+ interface ISpanConfig {
6
+ val clazz: Class<*>
7
+ }
8
+
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
8
22
 
9
23
  data class StylesMergingConfig(
10
24
  // styles that should be removed when we apply specific style
@@ -25,6 +39,9 @@ object EnrichedSpans {
25
39
  const val H1 = "h1"
26
40
  const val H2 = "h2"
27
41
  const val H3 = "h3"
42
+ const val H4 = "h4"
43
+ const val H5 = "h5"
44
+ const val H6 = "h6"
28
45
  const val BLOCK_QUOTE = "block_quote"
29
46
  const val CODE_BLOCK = "code_block"
30
47
 
@@ -37,94 +54,179 @@ object EnrichedSpans {
37
54
  const val IMAGE = "image"
38
55
  const val MENTION = "mention"
39
56
 
40
- val inlineSpans: Map<String, BaseSpanConfig> = mapOf(
41
- BOLD to BaseSpanConfig(EnrichedBoldSpan::class.java),
42
- ITALIC to BaseSpanConfig(EnrichedItalicSpan::class.java),
43
- UNDERLINE to BaseSpanConfig(EnrichedUnderlineSpan::class.java),
44
- STRIKETHROUGH to BaseSpanConfig(EnrichedStrikeThroughSpan::class.java),
45
- INLINE_CODE to BaseSpanConfig(EnrichedInlineCodeSpan::class.java),
46
- )
47
-
48
- val paragraphSpans: Map<String, ParagraphSpanConfig> = mapOf(
49
- H1 to ParagraphSpanConfig(EnrichedH1Span::class.java, false),
50
- H2 to ParagraphSpanConfig(EnrichedH2Span::class.java, false),
51
- H3 to ParagraphSpanConfig(EnrichedH3Span::class.java, false),
52
- BLOCK_QUOTE to ParagraphSpanConfig(EnrichedBlockQuoteSpan::class.java, true),
53
- CODE_BLOCK to ParagraphSpanConfig(EnrichedCodeBlockSpan::class.java, true),
54
- )
55
-
56
- val listSpans: Map<String, ListSpanConfig> = mapOf(
57
- UNORDERED_LIST to ListSpanConfig(EnrichedUnorderedListSpan::class.java, "- "),
58
- ORDERED_LIST to ListSpanConfig(EnrichedOrderedListSpan::class.java, "1. "),
59
- )
60
-
61
- val parametrizedStyles: Map<String, BaseSpanConfig> = mapOf(
62
- LINK to BaseSpanConfig(EnrichedLinkSpan::class.java),
63
- IMAGE to BaseSpanConfig(EnrichedImageSpan::class.java),
64
- MENTION to BaseSpanConfig(EnrichedMentionSpan::class.java),
65
- )
66
-
67
- fun getMergingConfigForStyle(style: String, htmlStyle: HtmlStyle): StylesMergingConfig? {
68
- return when (style) {
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
+ )
90
+
91
+ val allSpans: Map<String, ISpanConfig> = inlineSpans + paragraphSpans + listSpans + parametrizedStyles
92
+
93
+ fun getMergingConfigForStyle(
94
+ style: String,
95
+ htmlStyle: HtmlStyle,
96
+ ): StylesMergingConfig? =
97
+ when (style) {
69
98
  BOLD -> {
70
99
  val blockingStyles = mutableListOf(CODE_BLOCK)
71
100
  if (htmlStyle.h1Bold) blockingStyles.add(H1)
72
101
  if (htmlStyle.h2Bold) blockingStyles.add(H2)
73
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)
74
106
  StylesMergingConfig(blockingStyles = blockingStyles.toTypedArray())
75
107
  }
76
- ITALIC -> StylesMergingConfig(
77
- blockingStyles = arrayOf(CODE_BLOCK)
78
- )
79
- UNDERLINE -> StylesMergingConfig(
80
- blockingStyles = arrayOf(CODE_BLOCK)
81
- )
82
- STRIKETHROUGH -> StylesMergingConfig(
83
- blockingStyles = arrayOf(CODE_BLOCK)
84
- )
85
- INLINE_CODE -> StylesMergingConfig(
86
- conflictingStyles = arrayOf(MENTION, LINK),
87
- blockingStyles = arrayOf(CODE_BLOCK)
88
- )
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
+
89
134
  H1 -> {
90
- 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)
91
136
  if (htmlStyle.h1Bold) conflictingStyles.add(BOLD)
92
137
  StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
93
138
  }
139
+
94
140
  H2 -> {
95
- 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)
96
142
  if (htmlStyle.h2Bold) conflictingStyles.add(BOLD)
97
143
  StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
98
144
  }
145
+
99
146
  H3 -> {
100
- 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)
101
148
  if (htmlStyle.h3Bold) conflictingStyles.add(BOLD)
102
149
  StylesMergingConfig(conflictingStyles = conflictingStyles.toTypedArray())
103
150
  }
104
- BLOCK_QUOTE -> StylesMergingConfig(
105
- conflictingStyles = arrayOf(H1, H2, H3, CODE_BLOCK, ORDERED_LIST, UNORDERED_LIST)
106
- )
107
- CODE_BLOCK -> StylesMergingConfig(
108
- conflictingStyles = arrayOf(H1, H2, H3, BOLD, ITALIC, UNDERLINE, STRIKETHROUGH, UNORDERED_LIST, ORDERED_LIST, BLOCK_QUOTE, INLINE_CODE)
109
- )
110
- UNORDERED_LIST -> StylesMergingConfig(
111
- conflictingStyles = arrayOf(H1, H2, H3, ORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE)
112
- )
113
- ORDERED_LIST -> StylesMergingConfig(
114
- conflictingStyles = arrayOf(H1, H2, H3, UNORDERED_LIST, CODE_BLOCK, BLOCK_QUOTE),
115
- )
116
- LINK -> StylesMergingConfig(
117
- blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, MENTION)
118
- )
119
- IMAGE -> StylesMergingConfig()
120
- MENTION -> StylesMergingConfig(
121
- blockingStyles = arrayOf(INLINE_CODE, CODE_BLOCK, LINK)
122
- )
123
- 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
+ }
124
229
  }
125
- }
126
230
 
127
- fun isTypeContinuous(type: Class<*>): Boolean {
128
- return paragraphSpans.values.find { it.clazz == type }?.isContinuous == true
129
- }
231
+ fun isTypeContinuous(type: Class<*>): Boolean = paragraphSpans.values.find { it.clazz == type }?.isContinuous == true
130
232
  }
@@ -5,5 +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 {
12
+ override val dependsOnHtmlStyle: Boolean = false
13
+
14
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedStrikeThroughSpan = EnrichedStrikeThroughSpan(htmlStyle)
9
15
  }
@@ -5,5 +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 {
12
+ override val dependsOnHtmlStyle: Boolean = false
13
+
14
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnderlineSpan = EnrichedUnderlineSpan(htmlStyle)
9
15
  }
@@ -11,7 +11,13 @@ 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 {
19
+ override val dependsOnHtmlStyle: Boolean = true
20
+
15
21
  override fun updateMeasureState(p0: TextPaint) {
16
22
  // Do nothing, but inform layout that this span affects text metrics
17
23
  }
@@ -20,9 +26,7 @@ class EnrichedUnorderedListSpan(private val htmlStyle: HtmlStyle) : MetricAffect
20
26
  // Do nothing, but inform layout that this span affects text metrics
21
27
  }
22
28
 
23
- override fun getLeadingMargin(p0: Boolean): Int {
24
- return htmlStyle.ulBulletSize + htmlStyle.ulGapWidth + htmlStyle.ulMarginLeft
25
- }
29
+ override fun getLeadingMargin(p0: Boolean): Int = htmlStyle.ulBulletSize + htmlStyle.ulGapWidth + htmlStyle.ulMarginLeft
26
30
 
27
31
  override fun drawLeadingMargin(
28
32
  canvas: Canvas,
@@ -36,7 +40,7 @@ class EnrichedUnorderedListSpan(private val htmlStyle: HtmlStyle) : MetricAffect
36
40
  start: Int,
37
41
  end: Int,
38
42
  first: Boolean,
39
- layout: Layout?
43
+ layout: Layout?,
40
44
  ) {
41
45
  val spannedText = text as Spanned
42
46
 
@@ -56,4 +60,6 @@ class EnrichedUnorderedListSpan(private val htmlStyle: HtmlStyle) : MetricAffect
56
60
  paint.style = style
57
61
  }
58
62
  }
63
+
64
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedUnorderedListSpan = EnrichedUnorderedListSpan(htmlStyle)
59
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
@@ -1,4 +1,9 @@
1
1
  package com.swmansion.enriched.spans.interfaces
2
2
 
3
+ import com.swmansion.enriched.styles.HtmlStyle
4
+
3
5
  interface EnrichedSpan {
6
+ val dependsOnHtmlStyle: Boolean
7
+
8
+ fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedSpan
4
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
  }