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
@@ -0,0 +1,21 @@
1
+ package com.swmansion.enriched.events
2
+
3
+ import com.facebook.react.bridge.WritableMap
4
+ import com.facebook.react.uimanager.events.Event
5
+
6
+ class OnChangeStateDeprecatedEvent(
7
+ surfaceId: Int,
8
+ viewId: Int,
9
+ private val state: WritableMap,
10
+ private val experimentalSynchronousEvents: Boolean,
11
+ ) : Event<OnChangeStateDeprecatedEvent>(surfaceId, viewId) {
12
+ override fun getEventName(): String = EVENT_NAME
13
+
14
+ override fun getEventData(): WritableMap = state
15
+
16
+ override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
17
+
18
+ companion object {
19
+ const val EVENT_NAME: String = "onChangeStateDeprecated"
20
+ }
21
+ }
@@ -3,20 +3,17 @@ package com.swmansion.enriched.events
3
3
  import com.facebook.react.bridge.WritableMap
4
4
  import com.facebook.react.uimanager.events.Event
5
5
 
6
- class OnChangeStateEvent(surfaceId: Int, viewId: Int, private val state: WritableMap, private val experimentalSynchronousEvents: Boolean) :
7
- Event<OnChangeStateEvent>(surfaceId, viewId) {
6
+ class OnChangeStateEvent(
7
+ surfaceId: Int,
8
+ viewId: Int,
9
+ private val state: WritableMap,
10
+ private val experimentalSynchronousEvents: Boolean,
11
+ ) : Event<OnChangeStateEvent>(surfaceId, viewId) {
12
+ override fun getEventName(): String = EVENT_NAME
8
13
 
9
- override fun getEventName(): String {
10
- return EVENT_NAME
11
- }
12
-
13
- override fun getEventData(): WritableMap {
14
- return state
15
- }
14
+ override fun getEventData(): WritableMap = state
16
15
 
17
- override fun experimental_isSynchronous(): Boolean {
18
- return experimentalSynchronousEvents
19
- }
16
+ override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
20
17
 
21
18
  companion object {
22
19
  const val EVENT_NAME: String = "onChangeState"
@@ -4,25 +4,25 @@ import android.text.Editable
4
4
  import com.facebook.react.bridge.Arguments
5
5
  import com.facebook.react.bridge.WritableMap
6
6
  import com.facebook.react.uimanager.events.Event
7
+ import com.swmansion.enriched.utils.EnrichedConstants
7
8
 
8
- class OnChangeTextEvent(surfaceId: Int, viewId: Int, private val editable: Editable, private val experimentalSynchronousEvents: Boolean) :
9
- Event<OnChangeTextEvent>(surfaceId, viewId) {
10
-
11
- override fun getEventName(): String {
12
- return EVENT_NAME
13
- }
9
+ class OnChangeTextEvent(
10
+ surfaceId: Int,
11
+ viewId: Int,
12
+ private val editable: Editable,
13
+ private val experimentalSynchronousEvents: Boolean,
14
+ ) : Event<OnChangeTextEvent>(surfaceId, viewId) {
15
+ override fun getEventName(): String = EVENT_NAME
14
16
 
15
17
  override fun getEventData(): WritableMap {
16
18
  val eventData: WritableMap = Arguments.createMap()
17
19
  val text = editable.toString()
18
- val normalizedText = text.replace(Regex("\\u200B"), "")
20
+ val normalizedText = text.replace(Regex(EnrichedConstants.ZWS_STRING), "")
19
21
  eventData.putString("value", normalizedText)
20
22
  return eventData
21
23
  }
22
24
 
23
- override fun experimental_isSynchronous(): Boolean {
24
- return experimentalSynchronousEvents
25
- }
25
+ override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
26
26
 
27
27
  companion object {
28
28
  const val EVENT_NAME: String = "onChangeText"
@@ -4,12 +4,12 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class OnInputBlurEvent(surfaceId: Int, viewId: Int, private val experimentalSynchronousEvents: Boolean) :
8
- Event<OnInputBlurEvent>(surfaceId, viewId) {
9
-
10
- override fun getEventName(): String {
11
- return EVENT_NAME
12
- }
7
+ class OnInputBlurEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val experimentalSynchronousEvents: Boolean,
11
+ ) : Event<OnInputBlurEvent>(surfaceId, viewId) {
12
+ override fun getEventName(): String = EVENT_NAME
13
13
 
14
14
  override fun getEventData(): WritableMap {
15
15
  val eventData: WritableMap = Arguments.createMap()
@@ -17,9 +17,7 @@ class OnInputBlurEvent(surfaceId: Int, viewId: Int, private val experimentalSync
17
17
  return eventData
18
18
  }
19
19
 
20
- override fun experimental_isSynchronous(): Boolean {
21
- return experimentalSynchronousEvents
22
- }
20
+ override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
23
21
 
24
22
  companion object {
25
23
  const val EVENT_NAME: String = "onInputBlur"
@@ -4,12 +4,12 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class OnInputFocusEvent(surfaceId: Int, viewId: Int, private val experimentalSynchronousEvents: Boolean) :
8
- Event<OnInputFocusEvent>(surfaceId, viewId) {
9
-
10
- override fun getEventName(): String {
11
- return EVENT_NAME
12
- }
7
+ class OnInputFocusEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val experimentalSynchronousEvents: Boolean,
11
+ ) : Event<OnInputFocusEvent>(surfaceId, viewId) {
12
+ override fun getEventName(): String = EVENT_NAME
13
13
 
14
14
  override fun getEventData(): WritableMap {
15
15
  val eventData: WritableMap = Arguments.createMap()
@@ -17,9 +17,7 @@ class OnInputFocusEvent(surfaceId: Int, viewId: Int, private val experimentalSyn
17
17
  return eventData
18
18
  }
19
19
 
20
- override fun experimental_isSynchronous(): Boolean {
21
- return experimentalSynchronousEvents
22
- }
20
+ override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
23
21
 
24
22
  companion object {
25
23
  const val EVENT_NAME: String = "onInputFocus"
@@ -0,0 +1,27 @@
1
+ package com.swmansion.enriched.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class OnInputKeyPressEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val key: String,
11
+ private val experimentalSynchronousEvents: Boolean,
12
+ ) : Event<OnInputKeyPressEvent>(surfaceId, viewId) {
13
+ override fun getEventName(): String = EVENT_NAME
14
+
15
+ override fun getEventData(): WritableMap {
16
+ val eventData: WritableMap = Arguments.createMap()
17
+ eventData.putString("key", key)
18
+
19
+ return eventData
20
+ }
21
+
22
+ override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
23
+
24
+ companion object {
25
+ const val EVENT_NAME: String = "onInputKeyPress"
26
+ }
27
+ }
@@ -4,25 +4,27 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class OnLinkDetectedEvent(surfaceId: Int, viewId: Int, private val text: String, private val url: String, private val start: Int, private val end: Int, private val experimentalSynchronousEvents: Boolean) :
8
- Event<OnLinkDetectedEvent>(surfaceId, viewId) {
9
-
10
- override fun getEventName(): String {
11
- return EVENT_NAME
12
- }
7
+ class OnLinkDetectedEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val text: String,
11
+ private val url: String,
12
+ private val start: Int,
13
+ private val end: Int,
14
+ private val experimentalSynchronousEvents: Boolean,
15
+ ) : Event<OnLinkDetectedEvent>(surfaceId, viewId) {
16
+ override fun getEventName(): String = EVENT_NAME
13
17
 
14
18
  override fun getEventData(): WritableMap {
15
19
  val eventData: WritableMap = Arguments.createMap()
16
20
  eventData.putString("text", text)
17
21
  eventData.putString("url", url)
18
- eventData.putInt("start", start);
19
- eventData.putInt("end", end);
22
+ eventData.putInt("start", start)
23
+ eventData.putInt("end", end)
20
24
  return eventData
21
25
  }
22
26
 
23
- override fun experimental_isSynchronous(): Boolean {
24
- return experimentalSynchronousEvents
25
- }
27
+ override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
26
28
 
27
29
  companion object {
28
30
  const val EVENT_NAME: String = "onLinkDetected"
@@ -4,12 +4,15 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class OnMentionDetectedEvent(surfaceId: Int, viewId: Int, private val text: String, private val indicator: String, private val payload: String, private val experimentalSynchronousEvents: Boolean) :
8
- Event<OnMentionDetectedEvent>(surfaceId, viewId) {
9
-
10
- override fun getEventName(): String {
11
- return EVENT_NAME
12
- }
7
+ class OnMentionDetectedEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val text: String,
11
+ private val indicator: String,
12
+ private val payload: String,
13
+ private val experimentalSynchronousEvents: Boolean,
14
+ ) : Event<OnMentionDetectedEvent>(surfaceId, viewId) {
15
+ override fun getEventName(): String = EVENT_NAME
13
16
 
14
17
  override fun getEventData(): WritableMap {
15
18
  val eventData: WritableMap = Arguments.createMap()
@@ -19,9 +22,7 @@ class OnMentionDetectedEvent(surfaceId: Int, viewId: Int, private val text: Stri
19
22
  return eventData
20
23
  }
21
24
 
22
- override fun experimental_isSynchronous(): Boolean {
23
- return experimentalSynchronousEvents
24
- }
25
+ override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
25
26
 
26
27
  companion object {
27
28
  const val EVENT_NAME: String = "onMentionDetected"
@@ -4,11 +4,14 @@ import com.facebook.react.bridge.Arguments
4
4
  import com.facebook.react.bridge.WritableMap
5
5
  import com.facebook.react.uimanager.events.Event
6
6
 
7
- class OnMentionEvent(surfaceId: Int, viewId: Int, private val indicator: String, private val text: String?, private val experimentalSynchronousEvents: Boolean) : Event<OnMentionEvent>(surfaceId, viewId) {
8
-
9
- override fun getEventName(): String {
10
- return EVENT_NAME
11
- }
7
+ class OnMentionEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val indicator: String,
11
+ private val text: String?,
12
+ private val experimentalSynchronousEvents: Boolean,
13
+ ) : Event<OnMentionEvent>(surfaceId, viewId) {
14
+ override fun getEventName(): String = EVENT_NAME
12
15
 
13
16
  override fun getEventData(): WritableMap? {
14
17
  val eventData: WritableMap = Arguments.createMap()
@@ -23,9 +26,7 @@ class OnMentionEvent(surfaceId: Int, viewId: Int, private val indicator: String,
23
26
  return eventData
24
27
  }
25
28
 
26
- override fun experimental_isSynchronous(): Boolean {
27
- return experimentalSynchronousEvents
28
- }
29
+ override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
29
30
 
30
31
  companion object {
31
32
  const val EVENT_NAME: String = "onMention"
@@ -0,0 +1,32 @@
1
+ package com.swmansion.enriched.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class OnRequestHtmlResultEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val requestId: Int,
11
+ private val html: String?,
12
+ private val experimentalSynchronousEvents: Boolean,
13
+ ) : Event<OnRequestHtmlResultEvent>(surfaceId, viewId) {
14
+ override fun getEventName(): String = EVENT_NAME
15
+
16
+ override fun getEventData(): WritableMap {
17
+ val eventData: WritableMap = Arguments.createMap()
18
+ eventData.putInt("requestId", requestId)
19
+ if (html != null) {
20
+ eventData.putString("html", html)
21
+ } else {
22
+ eventData.putNull("html")
23
+ }
24
+ return eventData
25
+ }
26
+
27
+ override fun experimental_isSynchronous(): Boolean = experimentalSynchronousEvents
28
+
29
+ companion object {
30
+ const val EVENT_NAME: String = "onRequestHtmlResult"
31
+ }
32
+ }
@@ -10,16 +10,33 @@ import com.swmansion.enriched.spans.interfaces.EnrichedBlockSpan
10
10
  import com.swmansion.enriched.styles.HtmlStyle
11
11
 
12
12
  // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/android/text/style/QuoteSpan.java
13
- class EnrichedBlockQuoteSpan(private val htmlStyle: HtmlStyle) : MetricAffectingSpan(), LeadingMarginSpan, EnrichedBlockSpan {
13
+ class EnrichedBlockQuoteSpan(
14
+ private val htmlStyle: HtmlStyle,
15
+ ) : MetricAffectingSpan(),
16
+ LeadingMarginSpan,
17
+ EnrichedBlockSpan {
18
+ override val dependsOnHtmlStyle: Boolean = true
19
+
14
20
  override fun updateMeasureState(p0: TextPaint) {
15
21
  // Do nothing, but inform layout that this span affects text metrics
16
22
  }
17
23
 
18
- override fun getLeadingMargin(p0: Boolean): Int {
19
- return htmlStyle.blockquoteStripeWidth + htmlStyle.blockquoteGapWidth
20
- }
24
+ override fun getLeadingMargin(p0: Boolean): Int = htmlStyle.blockquoteStripeWidth + htmlStyle.blockquoteGapWidth
21
25
 
22
- override fun drawLeadingMargin(c: Canvas, p: Paint, x: Int, dir: Int, top: Int, baseline: Int, bottom: Int, text: CharSequence?, start: Int, end: Int, first: Boolean, layout: Layout?) {
26
+ override fun drawLeadingMargin(
27
+ c: Canvas,
28
+ p: Paint,
29
+ x: Int,
30
+ dir: Int,
31
+ top: Int,
32
+ baseline: Int,
33
+ bottom: Int,
34
+ text: CharSequence?,
35
+ start: Int,
36
+ end: Int,
37
+ first: Boolean,
38
+ layout: Layout?,
39
+ ) {
23
40
  val style = p.style
24
41
  val color = p.color
25
42
  p.style = Paint.Style.FILL
@@ -35,4 +52,6 @@ class EnrichedBlockQuoteSpan(private val htmlStyle: HtmlStyle) : MetricAffecting
35
52
  textPaint?.color = color
36
53
  }
37
54
  }
55
+
56
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedBlockQuoteSpan = EnrichedBlockQuoteSpan(htmlStyle)
38
57
  }
@@ -2,9 +2,16 @@ package com.swmansion.enriched.spans
2
2
 
3
3
  import android.graphics.Typeface
4
4
  import android.text.style.StyleSpan
5
+ import com.swmansion.enriched.spans.interfaces.EnrichedBlockSpan
5
6
  import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
6
7
  import com.swmansion.enriched.styles.HtmlStyle
7
8
 
8
9
  @Suppress("UNUSED_PARAMETER")
9
- class EnrichedBoldSpan(htmlStyle: HtmlStyle) : StyleSpan(Typeface.BOLD), EnrichedInlineSpan {
10
+ class EnrichedBoldSpan(
11
+ htmlStyle: HtmlStyle,
12
+ ) : StyleSpan(Typeface.BOLD),
13
+ EnrichedInlineSpan {
14
+ override val dependsOnHtmlStyle: Boolean = false
15
+
16
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedBoldSpan = EnrichedBoldSpan(htmlStyle)
10
17
  }
@@ -12,7 +12,13 @@ import android.text.style.MetricAffectingSpan
12
12
  import com.swmansion.enriched.spans.interfaces.EnrichedBlockSpan
13
13
  import com.swmansion.enriched.styles.HtmlStyle
14
14
 
15
- class EnrichedCodeBlockSpan(private val htmlStyle: HtmlStyle) : MetricAffectingSpan(), LineBackgroundSpan, EnrichedBlockSpan {
15
+ class EnrichedCodeBlockSpan(
16
+ private val htmlStyle: HtmlStyle,
17
+ ) : MetricAffectingSpan(),
18
+ LineBackgroundSpan,
19
+ EnrichedBlockSpan {
20
+ override val dependsOnHtmlStyle: Boolean = true
21
+
16
22
  override fun updateDrawState(paint: TextPaint) {
17
23
  paint.typeface = Typeface.MONOSPACE
18
24
  paint.color = htmlStyle.codeBlockColor
@@ -33,7 +39,7 @@ class EnrichedCodeBlockSpan(private val htmlStyle: HtmlStyle) : MetricAffectingS
33
39
  text: CharSequence,
34
40
  start: Int,
35
41
  end: Int,
36
- lineNum: Int
42
+ lineNum: Int,
37
43
  ) {
38
44
  if (text !is Spanned) {
39
45
  return
@@ -74,4 +80,6 @@ class EnrichedCodeBlockSpan(private val htmlStyle: HtmlStyle) : MetricAffectingS
74
80
  canvas.drawPath(path, p)
75
81
  p.color = previousColor
76
82
  }
83
+
84
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedCodeBlockSpan = EnrichedCodeBlockSpan(htmlStyle)
77
85
  }
@@ -6,7 +6,12 @@ import android.text.style.AbsoluteSizeSpan
6
6
  import com.swmansion.enriched.spans.interfaces.EnrichedHeadingSpan
7
7
  import com.swmansion.enriched.styles.HtmlStyle
8
8
 
9
- class EnrichedH1Span(private val style: HtmlStyle) : AbsoluteSizeSpan(style.h1FontSize), EnrichedHeadingSpan {
9
+ class EnrichedH1Span(
10
+ private val style: HtmlStyle,
11
+ ) : AbsoluteSizeSpan(style.h1FontSize),
12
+ EnrichedHeadingSpan {
13
+ override val dependsOnHtmlStyle: Boolean = true
14
+
10
15
  override fun updateDrawState(tp: TextPaint) {
11
16
  super.updateDrawState(tp)
12
17
  val bold = style.h1Bold
@@ -14,4 +19,6 @@ class EnrichedH1Span(private val style: HtmlStyle) : AbsoluteSizeSpan(style.h1Fo
14
19
  tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
15
20
  }
16
21
  }
22
+
23
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedH1Span = EnrichedH1Span(htmlStyle)
17
24
  }
@@ -6,7 +6,12 @@ import android.text.style.AbsoluteSizeSpan
6
6
  import com.swmansion.enriched.spans.interfaces.EnrichedHeadingSpan
7
7
  import com.swmansion.enriched.styles.HtmlStyle
8
8
 
9
- class EnrichedH2Span(private val htmlStyle: HtmlStyle) : AbsoluteSizeSpan(htmlStyle.h2FontSize), EnrichedHeadingSpan {
9
+ class EnrichedH2Span(
10
+ private val htmlStyle: HtmlStyle,
11
+ ) : AbsoluteSizeSpan(htmlStyle.h2FontSize),
12
+ EnrichedHeadingSpan {
13
+ override val dependsOnHtmlStyle: Boolean = true
14
+
10
15
  override fun updateDrawState(tp: TextPaint) {
11
16
  super.updateDrawState(tp)
12
17
  val bold = htmlStyle.h2Bold
@@ -14,4 +19,6 @@ class EnrichedH2Span(private val htmlStyle: HtmlStyle) : AbsoluteSizeSpan(htmlSt
14
19
  tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
15
20
  }
16
21
  }
22
+
23
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedH2Span = EnrichedH2Span(htmlStyle)
17
24
  }
@@ -6,7 +6,12 @@ import android.text.style.AbsoluteSizeSpan
6
6
  import com.swmansion.enriched.spans.interfaces.EnrichedHeadingSpan
7
7
  import com.swmansion.enriched.styles.HtmlStyle
8
8
 
9
- class EnrichedH3Span(private val htmlStyle: HtmlStyle) : AbsoluteSizeSpan(htmlStyle.h3FontSize), EnrichedHeadingSpan {
9
+ class EnrichedH3Span(
10
+ private val htmlStyle: HtmlStyle,
11
+ ) : AbsoluteSizeSpan(htmlStyle.h3FontSize),
12
+ EnrichedHeadingSpan {
13
+ override val dependsOnHtmlStyle: Boolean = true
14
+
10
15
  override fun updateDrawState(tp: TextPaint) {
11
16
  super.updateDrawState(tp)
12
17
  val bold = htmlStyle.h3Bold
@@ -14,4 +19,6 @@ class EnrichedH3Span(private val htmlStyle: HtmlStyle) : AbsoluteSizeSpan(htmlSt
14
19
  tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
15
20
  }
16
21
  }
22
+
23
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedH3Span = EnrichedH3Span(htmlStyle)
17
24
  }
@@ -0,0 +1,24 @@
1
+ package com.swmansion.enriched.spans
2
+
3
+ import android.graphics.Typeface
4
+ import android.text.TextPaint
5
+ import android.text.style.AbsoluteSizeSpan
6
+ import com.swmansion.enriched.spans.interfaces.EnrichedHeadingSpan
7
+ import com.swmansion.enriched.styles.HtmlStyle
8
+
9
+ class EnrichedH4Span(
10
+ private val htmlStyle: HtmlStyle,
11
+ ) : AbsoluteSizeSpan(htmlStyle.h4FontSize),
12
+ EnrichedHeadingSpan {
13
+ override val dependsOnHtmlStyle: Boolean = true
14
+
15
+ override fun updateDrawState(tp: TextPaint) {
16
+ super.updateDrawState(tp)
17
+ val bold = htmlStyle.h4Bold
18
+ if (bold) {
19
+ tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
20
+ }
21
+ }
22
+
23
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedH4Span = EnrichedH4Span(htmlStyle)
24
+ }
@@ -0,0 +1,24 @@
1
+ package com.swmansion.enriched.spans
2
+
3
+ import android.graphics.Typeface
4
+ import android.text.TextPaint
5
+ import android.text.style.AbsoluteSizeSpan
6
+ import com.swmansion.enriched.spans.interfaces.EnrichedHeadingSpan
7
+ import com.swmansion.enriched.styles.HtmlStyle
8
+
9
+ class EnrichedH5Span(
10
+ private val htmlStyle: HtmlStyle,
11
+ ) : AbsoluteSizeSpan(htmlStyle.h5FontSize),
12
+ EnrichedHeadingSpan {
13
+ override val dependsOnHtmlStyle: Boolean = true
14
+
15
+ override fun updateDrawState(tp: TextPaint) {
16
+ super.updateDrawState(tp)
17
+ val bold = htmlStyle.h5Bold
18
+ if (bold) {
19
+ tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
20
+ }
21
+ }
22
+
23
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedH5Span = EnrichedH5Span(htmlStyle)
24
+ }
@@ -0,0 +1,24 @@
1
+ package com.swmansion.enriched.spans
2
+
3
+ import android.graphics.Typeface
4
+ import android.text.TextPaint
5
+ import android.text.style.AbsoluteSizeSpan
6
+ import com.swmansion.enriched.spans.interfaces.EnrichedHeadingSpan
7
+ import com.swmansion.enriched.styles.HtmlStyle
8
+
9
+ class EnrichedH6Span(
10
+ private val htmlStyle: HtmlStyle,
11
+ ) : AbsoluteSizeSpan(htmlStyle.h6FontSize),
12
+ EnrichedHeadingSpan {
13
+ override val dependsOnHtmlStyle: Boolean = true
14
+
15
+ override fun updateDrawState(tp: TextPaint) {
16
+ super.updateDrawState(tp)
17
+ val bold = htmlStyle.h6Bold
18
+ if (bold) {
19
+ tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
20
+ }
21
+ }
22
+
23
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedH6Span = EnrichedH6Span(htmlStyle)
24
+ }
@@ -12,15 +12,20 @@ import android.text.Spannable
12
12
  import android.text.style.ImageSpan
13
13
  import android.util.Log
14
14
  import androidx.core.graphics.drawable.DrawableCompat
15
- import androidx.core.graphics.withSave
16
- import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
17
- import com.swmansion.enriched.utils.AsyncDrawable
18
15
  import androidx.core.graphics.drawable.toDrawable
16
+ import androidx.core.graphics.withSave
19
17
  import com.swmansion.enriched.R
18
+ import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
20
19
  import com.swmansion.enriched.spans.utils.ForceRedrawSpan
20
+ import com.swmansion.enriched.styles.HtmlStyle
21
+ import com.swmansion.enriched.utils.AsyncDrawable
21
22
  import com.swmansion.enriched.utils.ResourceManager
22
23
 
23
- class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
24
+ class EnrichedImageSpan :
25
+ ImageSpan,
26
+ EnrichedInlineSpan {
27
+ override val dependsOnHtmlStyle: Boolean = false
28
+
24
29
  private var width: Int = 0
25
30
  private var height: Int = 0
26
31
 
@@ -30,11 +35,18 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
30
35
  }
31
36
 
32
37
  override fun draw(
33
- canvas: Canvas, text: CharSequence?, start: Int, end: Int, x: Float,
34
- top: Int, y: Int, bottom: Int, paint: Paint
38
+ canvas: Canvas,
39
+ text: CharSequence?,
40
+ start: Int,
41
+ end: Int,
42
+ x: Float,
43
+ top: Int,
44
+ y: Int,
45
+ bottom: Int,
46
+ paint: Paint,
35
47
  ) {
36
48
  val drawable = drawable
37
- canvas.withSave() {
49
+ canvas.withSave {
38
50
  val transY = bottom - drawable.bounds.bottom - paint.fontMetricsInt.descent
39
51
  translate(x, transY.toFloat())
40
52
  drawable.draw(this)
@@ -45,7 +57,7 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
45
57
  val drawable = super.getDrawable()
46
58
  val scale = Resources.getSystem().displayMetrics.density
47
59
 
48
- drawable.setBounds(0, 0, (width * scale).toInt() , (height * scale).toInt())
60
+ drawable.setBounds(0, 0, (width * scale).toInt(), (height * scale).toInt())
49
61
  return drawable
50
62
  }
51
63
 
@@ -54,7 +66,7 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
54
66
  text: CharSequence?,
55
67
  start: Int,
56
68
  end: Int,
57
- fm: Paint.FontMetricsInt?
69
+ fm: Paint.FontMetricsInt?,
58
70
  ): Int {
59
71
  val d = drawable
60
72
  val rect = d.bounds
@@ -76,7 +88,10 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
76
88
  return rect.right
77
89
  }
78
90
 
79
- private fun registerDrawableLoadCallback (d: AsyncDrawable, text: Editable?) {
91
+ private fun registerDrawableLoadCallback(
92
+ d: AsyncDrawable,
93
+ text: Editable?,
94
+ ) {
80
95
  d.onLoaded = onLoaded@{
81
96
  val spannable = text as? Spannable
82
97
 
@@ -111,16 +126,18 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
111
126
  }
112
127
  }
113
128
 
114
- fun getWidth(): Int {
115
- return width
116
- }
129
+ fun getWidth(): Int = width
117
130
 
118
- fun getHeight(): Int {
119
- return height
120
- }
131
+ fun getHeight(): Int = height
132
+
133
+ override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedImageSpan = this
121
134
 
122
135
  companion object {
123
- fun createEnrichedImageSpan(src: String, width: Int, height: Int): EnrichedImageSpan {
136
+ fun createEnrichedImageSpan(
137
+ src: String,
138
+ width: Int,
139
+ height: Int,
140
+ ): EnrichedImageSpan {
124
141
  var imgDrawable = prepareDrawableForImage(src)
125
142
 
126
143
  if (imgDrawable == null) {