react-native-enriched 0.3.0 → 0.4.1

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 (202) hide show
  1. package/README.md +6 -4
  2. package/android/build.gradle +3 -3
  3. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +3 -0
  4. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +1 -0
  5. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
  6. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
  7. package/{ios/generated/RNEnrichedTextInputViewSpec → android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec}/EventEmitters.cpp +31 -29
  8. package/{ios/generated/RNEnrichedTextInputViewSpec → android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec}/EventEmitters.h +22 -25
  9. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +57 -0
  10. package/android/gradle.properties +5 -5
  11. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewPackage.kt → ReactNativeEnrichedPackage.kt} +3 -2
  12. package/android/src/main/java/com/swmansion/enriched/{utils → common}/AsyncDrawable.kt +40 -8
  13. package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
  14. package/android/src/main/java/com/swmansion/enriched/{utils → common}/EnrichedConstants.kt +1 -1
  15. package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
  16. package/android/src/main/java/com/swmansion/enriched/{spans/utils → common}/ForceRedrawSpan.kt +1 -1
  17. package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
  18. package/android/src/main/java/com/swmansion/enriched/{utils → common}/ResourceManager.kt +1 -1
  19. package/android/src/main/java/com/swmansion/enriched/{utils → common/parser}/EnrichedParser.java +126 -99
  20. package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
  21. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedBlockQuoteSpan.kt +9 -13
  22. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
  23. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +91 -0
  24. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt +8 -12
  25. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
  26. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
  27. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
  28. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
  29. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
  30. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
  31. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedImageSpan.kt +43 -38
  32. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedInlineCodeSpan.kt +7 -11
  33. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
  34. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedLinkSpan.kt +7 -11
  35. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedMentionSpan.kt +6 -10
  36. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedOrderedListSpan.kt +12 -21
  37. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
  38. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
  39. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedUnorderedListSpan.kt +9 -13
  40. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedBlockSpan.kt +1 -1
  41. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedHeadingSpan.kt +1 -1
  42. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
  43. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedParagraphSpan.kt +1 -1
  44. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
  45. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedZeroWidthSpaceSpan.kt +1 -1
  46. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputConnectionWrapper.kt → textinput/EnrichedTextInputConnectionWrapper.kt} +2 -2
  47. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
  48. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputView.kt → textinput/EnrichedTextInputView.kt} +87 -51
  49. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewLayoutManager.kt → textinput/EnrichedTextInputViewLayoutManager.kt} +1 -1
  50. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewManager.kt → textinput/EnrichedTextInputViewManager.kt} +24 -17
  51. package/android/src/main/java/com/swmansion/enriched/{MeasurementStore.kt → textinput/MeasurementStore.kt} +5 -4
  52. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt +2 -2
  53. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeHtmlEvent.kt +1 -1
  54. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeSelectionEvent.kt +1 -1
  55. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeStateEvent.kt +1 -1
  56. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeTextEvent.kt +2 -2
  57. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputBlurEvent.kt +1 -1
  58. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputFocusEvent.kt +1 -1
  59. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputKeyPressEvent.kt +1 -1
  60. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnLinkDetectedEvent.kt +1 -1
  61. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionDetectedEvent.kt +1 -1
  62. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionEvent.kt +1 -1
  63. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
  64. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnRequestHtmlResultEvent.kt +1 -1
  65. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
  66. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
  67. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
  68. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
  69. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
  70. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
  71. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
  72. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
  73. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
  74. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
  75. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
  76. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
  77. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
  78. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +15 -0
  79. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
  80. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
  81. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
  82. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
  83. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
  84. package/android/src/main/java/com/swmansion/enriched/{spans → textinput/spans}/EnrichedSpans.kt +39 -30
  85. package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
  86. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/HtmlStyle.kt +58 -43
  87. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt +4 -4
  88. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ListStyles.kt +77 -26
  89. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt +30 -25
  90. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParametrizedStyles.kt +19 -19
  91. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedEditableFactory.kt +2 -2
  92. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt +15 -14
  93. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpanState.kt +15 -50
  94. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpannable.kt +3 -3
  95. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpannableStringBuilder.kt +2 -1
  96. package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
  97. package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
  98. package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedSpanWatcher.kt +10 -10
  99. package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedTextWatcher.kt +3 -3
  100. package/android/src/main/new_arch/CMakeLists.txt +1 -1
  101. package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
  102. package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
  103. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.h +1 -1
  104. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.h +2 -2
  105. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/conversions.h +1 -1
  106. package/ios/EnrichedTextInputView.h +1 -0
  107. package/ios/EnrichedTextInputView.mm +274 -55
  108. package/ios/config/InputConfig.h +10 -0
  109. package/ios/config/InputConfig.mm +119 -0
  110. package/ios/extensions/ImageExtension.h +35 -0
  111. package/ios/extensions/ImageExtension.mm +156 -0
  112. package/ios/extensions/LayoutManagerExtension.mm +115 -95
  113. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
  114. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
  115. package/{android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec → ios/generated/ReactNativeEnrichedSpec}/EventEmitters.cpp +31 -29
  116. package/{android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec → ios/generated/ReactNativeEnrichedSpec}/EventEmitters.h +22 -25
  117. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +57 -0
  118. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/RCTComponentViewHelpers.h +21 -0
  119. package/ios/inputParser/InputParser.mm +135 -8
  120. package/ios/inputTextView/InputTextView.mm +118 -0
  121. package/ios/interfaces/ImageAttachment.h +1 -0
  122. package/ios/interfaces/ImageAttachment.mm +43 -4
  123. package/ios/interfaces/StyleHeaders.h +13 -2
  124. package/ios/interfaces/StyleTypeEnum.h +1 -0
  125. package/ios/internals/EnrichedTextInputViewState.cpp +6 -6
  126. package/ios/styles/CheckboxListStyle.mm +321 -0
  127. package/ios/styles/H1Style.mm +3 -0
  128. package/ios/styles/H2Style.mm +3 -0
  129. package/ios/styles/H3Style.mm +3 -0
  130. package/ios/styles/H4Style.mm +3 -0
  131. package/ios/styles/H5Style.mm +3 -0
  132. package/ios/styles/H6Style.mm +3 -0
  133. package/ios/styles/HeadingStyleBase.mm +150 -78
  134. package/ios/utils/CheckboxHitTestUtils.h +10 -0
  135. package/ios/utils/CheckboxHitTestUtils.mm +123 -0
  136. package/ios/utils/ParagraphAttributesUtils.mm +83 -53
  137. package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
  138. package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
  139. package/ios/utils/ZeroWidthSpaceUtils.mm +14 -3
  140. package/lib/module/EnrichedTextInput.js +36 -11
  141. package/lib/module/EnrichedTextInput.js.map +1 -1
  142. package/lib/module/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +40 -9
  143. package/lib/module/types.js +4 -0
  144. package/lib/module/types.js.map +1 -0
  145. package/lib/module/utils/normalizeHtmlStyle.js +6 -0
  146. package/lib/module/utils/normalizeHtmlStyle.js.map +1 -1
  147. package/lib/module/utils/nullthrows.js +9 -0
  148. package/lib/module/utils/nullthrows.js.map +1 -0
  149. package/lib/typescript/src/EnrichedTextInput.d.ts +9 -49
  150. package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
  151. package/lib/typescript/src/index.d.ts +2 -1
  152. package/lib/typescript/src/index.d.ts.map +1 -1
  153. package/lib/typescript/src/{EnrichedTextInputNativeComponent.d.ts → spec/EnrichedTextInputNativeComponent.d.ts} +33 -8
  154. package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
  155. package/lib/typescript/src/types.d.ts +58 -0
  156. package/lib/typescript/src/types.d.ts.map +1 -0
  157. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +2 -2
  158. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -1
  159. package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
  160. package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
  161. package/lib/typescript/src/utils/regexParser.d.ts +1 -1
  162. package/lib/typescript/src/utils/regexParser.d.ts.map +1 -1
  163. package/package.json +4 -4
  164. package/src/EnrichedTextInput.tsx +49 -62
  165. package/src/index.tsx +3 -1
  166. package/src/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +40 -9
  167. package/src/types.ts +59 -0
  168. package/src/utils/normalizeHtmlStyle.ts +8 -5
  169. package/src/utils/nullthrows.ts +7 -0
  170. package/src/utils/regexParser.ts +1 -1
  171. package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateDeprecatedEvent.kt +0 -21
  172. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +0 -17
  173. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +0 -24
  174. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +0 -24
  175. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +0 -24
  176. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH4Span.kt +0 -24
  177. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH5Span.kt +0 -24
  178. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH6Span.kt +0 -24
  179. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +0 -16
  180. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +0 -15
  181. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +0 -15
  182. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +0 -3
  183. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +0 -9
  184. package/android/src/main/java/com/swmansion/enriched/utils/Utils.kt +0 -21
  185. package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +0 -22
  186. package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +0 -26
  187. package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +0 -1
  188. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +0 -0
  189. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
  190. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
  191. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
  192. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
  193. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputComponentDescriptor.h +0 -0
  194. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.cpp +0 -0
  195. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.cpp +0 -0
  196. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.cpp +0 -0
  197. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.h +0 -0
  198. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +0 -0
  199. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
  200. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
  201. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
  202. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
@@ -1,4 +1,4 @@
1
- package com.swmansion.enriched.styles
1
+ package com.swmansion.enriched.textinput.styles
2
2
 
3
3
  import android.graphics.Color
4
4
  import com.facebook.react.bridge.ColorPropConverter
@@ -6,63 +6,70 @@ import com.facebook.react.bridge.ReactContext
6
6
  import com.facebook.react.bridge.ReadableMap
7
7
  import com.facebook.react.uimanager.PixelUtil
8
8
  import com.facebook.react.views.text.ReactTypefaceUtils.parseFontWeight
9
- import com.swmansion.enriched.EnrichedTextInputView
9
+ import com.swmansion.enriched.common.EnrichedStyle
10
+ import com.swmansion.enriched.common.MentionStyle
11
+ import com.swmansion.enriched.textinput.EnrichedTextInputView
10
12
  import kotlin.Float
11
13
  import kotlin.Int
12
14
  import kotlin.String
13
15
  import kotlin.math.ceil
14
16
 
15
- class HtmlStyle {
17
+ class HtmlStyle : EnrichedStyle {
16
18
  private var style: ReadableMap? = null
17
19
  private var view: EnrichedTextInputView? = null
18
20
 
19
21
  // Default values are ignored as they are specified on the JS side.
20
22
  // They are specified only because they are required by the constructor.
21
23
  // JS passes them as a prop - so they are initialized after the constructor is called.
22
- var h1FontSize: Int = 72
23
- var h1Bold: Boolean = false
24
+ override var h1FontSize: Int = 72
25
+ override var h1Bold: Boolean = false
24
26
 
25
- var h2FontSize: Int = 64
26
- var h2Bold: Boolean = false
27
+ override var h2FontSize: Int = 64
28
+ override var h2Bold: Boolean = false
27
29
 
28
- var h3FontSize: Int = 56
29
- var h3Bold: Boolean = false
30
+ override var h3FontSize: Int = 56
31
+ override var h3Bold: Boolean = false
30
32
 
31
- var h4FontSize: Int = 48
32
- var h4Bold: Boolean = false
33
+ override var h4FontSize: Int = 48
34
+ override var h4Bold: Boolean = false
33
35
 
34
- var h5FontSize: Int = 40
35
- var h5Bold: Boolean = false
36
+ override var h5FontSize: Int = 40
37
+ override var h5Bold: Boolean = false
36
38
 
37
- var h6FontSize: Int = 32
38
- var h6Bold: Boolean = false
39
+ override var h6FontSize: Int = 32
40
+ override var h6Bold: Boolean = false
39
41
 
40
- var blockquoteColor: Int? = null
41
- var blockquoteBorderColor: Int = Color.BLACK
42
- var blockquoteStripeWidth: Int = 2
43
- var blockquoteGapWidth: Int = 16
42
+ override var blockquoteColor: Int? = null
43
+ override var blockquoteBorderColor: Int = Color.BLACK
44
+ override var blockquoteStripeWidth: Int = 2
45
+ override var blockquoteGapWidth: Int = 16
44
46
 
45
- var olGapWidth: Int = 16
46
- var olMarginLeft: Int = 24
47
- var olMarkerFontWeight: Int? = null
48
- var olMarkerColor: Int? = null
47
+ override var olGapWidth: Int = 16
48
+ override var olMarginLeft: Int = 24
49
+ override var olMarkerFontWeight: Int? = null
50
+ override var olMarkerColor: Int? = null
49
51
 
50
- var ulGapWidth: Int = 16
51
- var ulMarginLeft: Int = 24
52
- var ulBulletSize: Int = 8
53
- var ulBulletColor: Int = Color.BLACK
52
+ override var ulGapWidth: Int = 16
53
+ override var ulMarginLeft: Int = 24
54
+ override var ulBulletSize: Int = 8
55
+ override var ulBulletColor: Int = Color.BLACK
54
56
 
55
- var aColor: Int = Color.BLACK
56
- var aUnderline: Boolean = true
57
+ override var ulCheckboxBoxSize: Int = 50
58
+ override var ulCheckboxGapWidth: Int = 16
59
+ override var ulCheckboxMarginLeft: Int = 24
60
+ override var ulCheckboxBoxColor: Int = Color.BLACK
57
61
 
58
- var codeBlockColor: Int = Color.BLACK
59
- var codeBlockBackgroundColor: Int = Color.BLACK
60
- var codeBlockRadius: Float = 4f
62
+ override var aColor: Int = Color.BLACK
63
+ override var aUnderline: Boolean = true
61
64
 
62
- var inlineCodeColor: Int = Color.BLACK
63
- var inlineCodeBackgroundColor: Int = Color.BLACK
65
+ override var codeBlockColor: Int = Color.BLACK
66
+ override var codeBlockBackgroundColor: Int = Color.BLACK
67
+ override var codeBlockRadius: Float = 4f
64
68
 
65
- var mentionsStyle: MutableMap<String, MentionStyle> = mutableMapOf()
69
+ override var inlineCodeColor: Int = Color.BLACK
70
+ override var inlineCodeBackgroundColor: Int = Color.BLACK
71
+
72
+ override var mentionsStyle: MutableMap<String, MentionStyle> = mutableMapOf()
66
73
 
67
74
  constructor(view: EnrichedTextInputView?, style: ReadableMap?) {
68
75
  this.view = view
@@ -118,6 +125,12 @@ class HtmlStyle {
118
125
  ulMarginLeft = parseFloat(ulStyle, "marginLeft").toInt()
119
126
  ulBulletSize = parseFloat(ulStyle, "bulletSize").toInt()
120
127
 
128
+ val ulCheckboxStyle = style.getMap("ulCheckbox")
129
+ ulCheckboxBoxSize = parseFloat(ulCheckboxStyle, "boxSize").toInt()
130
+ ulCheckboxGapWidth = parseFloat(ulCheckboxStyle, "gapWidth").toInt()
131
+ ulCheckboxMarginLeft = parseFloat(ulCheckboxStyle, "marginLeft").toInt()
132
+ ulCheckboxBoxColor = parseColor(ulCheckboxStyle, "boxColor")
133
+
121
134
  val aStyle = style.getMap("a")
122
135
  aColor = parseColor(aStyle, "color")
123
136
  aUnderline = parseIsUnderline(aStyle)
@@ -290,6 +303,11 @@ class HtmlStyle {
290
303
  ulBulletSize == other.ulBulletSize &&
291
304
  ulBulletColor == other.ulBulletColor &&
292
305
 
306
+ ulCheckboxBoxSize == other.ulCheckboxBoxSize &&
307
+ ulCheckboxGapWidth == other.ulCheckboxGapWidth &&
308
+ ulCheckboxMarginLeft == other.ulCheckboxMarginLeft &&
309
+ ulCheckboxBoxColor == other.ulCheckboxBoxColor &&
310
+
293
311
  aColor == other.aColor &&
294
312
  aUnderline == other.aUnderline &&
295
313
 
@@ -332,6 +350,11 @@ class HtmlStyle {
332
350
  result = 31 * result + ulBulletSize.hashCode()
333
351
  result = 31 * result + ulBulletColor.hashCode()
334
352
 
353
+ result = 31 * result + ulCheckboxBoxSize.hashCode()
354
+ result = 31 * result + ulCheckboxGapWidth.hashCode()
355
+ result = 31 * result + ulCheckboxMarginLeft.hashCode()
356
+ result = 31 * result + ulCheckboxBoxColor.hashCode()
357
+
335
358
  result = 31 * result + aColor.hashCode()
336
359
  result = 31 * result + aUnderline.hashCode()
337
360
 
@@ -346,12 +369,4 @@ class HtmlStyle {
346
369
 
347
370
  return result
348
371
  }
349
-
350
- companion object {
351
- data class MentionStyle(
352
- val color: Int,
353
- val backgroundColor: Int,
354
- val underline: Boolean,
355
- )
356
- }
357
372
  }
@@ -1,10 +1,10 @@
1
- package com.swmansion.enriched.styles
1
+ package com.swmansion.enriched.textinput.styles
2
2
 
3
3
  import android.text.Editable
4
4
  import android.text.Spannable
5
- import com.swmansion.enriched.EnrichedTextInputView
6
- import com.swmansion.enriched.spans.EnrichedSpans
7
- import com.swmansion.enriched.utils.getSafeSpanBoundaries
5
+ import com.swmansion.enriched.textinput.EnrichedTextInputView
6
+ import com.swmansion.enriched.textinput.spans.EnrichedSpans
7
+ import com.swmansion.enriched.textinput.utils.getSafeSpanBoundaries
8
8
 
9
9
  class InlineStyles(
10
10
  private val view: EnrichedTextInputView,
@@ -1,17 +1,18 @@
1
- package com.swmansion.enriched.styles
1
+ package com.swmansion.enriched.textinput.styles
2
2
 
3
3
  import android.text.Editable
4
4
  import android.text.Spannable
5
5
  import android.text.SpannableStringBuilder
6
6
  import android.text.Spanned
7
- import com.swmansion.enriched.EnrichedTextInputView
8
- import com.swmansion.enriched.spans.EnrichedOrderedListSpan
9
- import com.swmansion.enriched.spans.EnrichedSpans
10
- import com.swmansion.enriched.spans.EnrichedUnorderedListSpan
11
- import com.swmansion.enriched.utils.EnrichedConstants
12
- import com.swmansion.enriched.utils.getParagraphBounds
13
- import com.swmansion.enriched.utils.getSafeSpanBoundaries
14
- import com.swmansion.enriched.utils.removeZWS
7
+ import com.swmansion.enriched.common.EnrichedConstants
8
+ import com.swmansion.enriched.textinput.EnrichedTextInputView
9
+ import com.swmansion.enriched.textinput.spans.EnrichedInputCheckboxListSpan
10
+ import com.swmansion.enriched.textinput.spans.EnrichedInputOrderedListSpan
11
+ import com.swmansion.enriched.textinput.spans.EnrichedInputUnorderedListSpan
12
+ import com.swmansion.enriched.textinput.spans.EnrichedSpans
13
+ import com.swmansion.enriched.textinput.utils.getParagraphBounds
14
+ import com.swmansion.enriched.textinput.utils.getSafeSpanBoundaries
15
+ import com.swmansion.enriched.textinput.utils.removeZWS
15
16
 
16
17
  class ListStyles(
17
18
  private val view: EnrichedTextInputView,
@@ -47,8 +48,8 @@ class ListStyles(
47
48
  spannable: Spannable,
48
49
  s: Int,
49
50
  ): Int {
50
- val span = getPreviousParagraphSpan(spannable, s, EnrichedOrderedListSpan::class.java)
51
- val index = span?.getIndex() ?: 0
51
+ val span = getPreviousParagraphSpan(spannable, s, EnrichedInputOrderedListSpan::class.java)
52
+ val index = span?.getListIndex() ?: 0
52
53
  return index + 1
53
54
  }
54
55
 
@@ -57,19 +58,29 @@ class ListStyles(
57
58
  name: String,
58
59
  start: Int,
59
60
  end: Int,
61
+ isChecked: Boolean? = false,
60
62
  ) {
61
63
  val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, end)
62
64
 
63
- if (name == EnrichedSpans.UNORDERED_LIST) {
64
- val span = EnrichedUnorderedListSpan(view.htmlStyle)
65
- spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
66
- return
67
- }
65
+ when (name) {
66
+ EnrichedSpans.UNORDERED_LIST -> {
67
+ val span = EnrichedInputUnorderedListSpan(view.htmlStyle)
68
+ spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
69
+ }
70
+
71
+ EnrichedSpans.ORDERED_LIST -> {
72
+ val index = getOrderedListIndex(spannable, safeStart)
73
+ val span = EnrichedInputOrderedListSpan(index, view.htmlStyle)
74
+ spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
75
+ }
76
+
77
+ EnrichedSpans.CHECKBOX_LIST -> {
78
+ val span = EnrichedInputCheckboxListSpan(isChecked ?: false, view.htmlStyle)
79
+ spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
68
80
 
69
- if (name == EnrichedSpans.ORDERED_LIST) {
70
- val index = getOrderedListIndex(spannable, safeStart)
71
- val span = EnrichedOrderedListSpan(index, view.htmlStyle)
72
- spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
81
+ // Invalidate layout to update checkbox drawing in case checkbox is bigger than line height
82
+ view.layoutManager.invalidateLayout()
83
+ }
73
84
  }
74
85
  }
75
86
 
@@ -95,16 +106,19 @@ class ListStyles(
95
106
  text: Spannable,
96
107
  position: Int,
97
108
  ) {
98
- val spans = text.getSpans(position + 1, text.length, EnrichedOrderedListSpan::class.java)
109
+ val spans = text.getSpans(position + 1, text.length, EnrichedInputOrderedListSpan::class.java)
99
110
  val sortedSpans = spans.sortedBy { text.getSpanStart(it) }
100
111
  for (span in sortedSpans) {
101
112
  val spanStart = text.getSpanStart(span)
102
113
  val index = getOrderedListIndex(text, spanStart)
103
- span.setIndex(index)
114
+ span.setListIndex(index)
104
115
  }
105
116
  }
106
117
 
107
- fun toggleStyle(name: String) {
118
+ private fun toggleStyle(
119
+ name: String,
120
+ checkboxState: Boolean?,
121
+ ) {
108
122
  if (view.selection == null) return
109
123
  val config = EnrichedSpans.listSpans[name] ?: return
110
124
  val spannable = view.text as SpannableStringBuilder
@@ -123,7 +137,7 @@ class ListStyles(
123
137
  spannable.insert(start, EnrichedConstants.ZWS_STRING)
124
138
  view.spanState?.setStart(name, start + 1)
125
139
  removeSpansForRange(spannable, start, end, config.clazz)
126
- setSpan(spannable, name, start, end + 1)
140
+ setSpan(spannable, name, start, end + 1, checkboxState)
127
141
 
128
142
  return
129
143
  }
@@ -135,7 +149,7 @@ class ListStyles(
135
149
  for (paragraph in paragraphs) {
136
150
  spannable.insert(currentStart, EnrichedConstants.ZWS_STRING)
137
151
  val currentEnd = currentStart + paragraph.length + 1
138
- setSpan(spannable, name, currentStart, currentEnd)
152
+ setSpan(spannable, name, currentStart, currentEnd, checkboxState)
139
153
 
140
154
  currentStart = currentEnd + 1
141
155
  }
@@ -143,6 +157,14 @@ class ListStyles(
143
157
  view.spanState?.setStart(name, currentStart)
144
158
  }
145
159
 
160
+ fun toggleStyle(name: String) {
161
+ toggleStyle(name, false)
162
+ }
163
+
164
+ fun toggleCheckboxListStyle(checked: Boolean) {
165
+ toggleStyle(EnrichedSpans.CHECKBOX_LIST, checked)
166
+ }
167
+
146
168
  private fun handleAfterTextChanged(
147
169
  s: Editable,
148
170
  name: String,
@@ -155,7 +177,7 @@ class ListStyles(
155
177
 
156
178
  val isBackspace = previousTextLength > s.length
157
179
  val isNewLine = cursorPosition > 0 && s[cursorPosition - 1] == '\n'
158
- val isShortcut = s.substring(start, end).startsWith(config.shortcut)
180
+ val isShortcut = config.shortcut?.let { s.substring(start, end).startsWith(it) } ?: false
159
181
  val spans = s.getSpans(start, end, config.clazz)
160
182
 
161
183
  // Remove spans if cursor is at the start of the paragraph and spans exist
@@ -173,6 +195,19 @@ class ListStyles(
173
195
  }
174
196
 
175
197
  if (!isBackspace && isNewLine && isPreviousParagraphList(s, start, config.clazz)) {
198
+ // Check if the span from the previous line "leaked" into this one
199
+ if (spans.isNotEmpty()) {
200
+ val existingSpan = spans[0]
201
+ val spanStart = s.getSpanStart(existingSpan)
202
+
203
+ // If the span started before the current paragraph (belongs to the previous item)
204
+ // update it to end at the newline (start - 1)
205
+ if (spanStart < start) {
206
+ val spanFlags = s.getSpanFlags(existingSpan)
207
+ s.setSpan(existingSpan, spanStart, start - 1, spanFlags)
208
+ }
209
+ }
210
+
176
211
  s.insert(cursorPosition, EnrichedConstants.ZWS_STRING)
177
212
  setSpan(s, name, start, end + 1)
178
213
  // Inform that new span has been added
@@ -180,6 +215,21 @@ class ListStyles(
180
215
  return
181
216
  }
182
217
 
218
+ if (name === EnrichedSpans.CHECKBOX_LIST) {
219
+ if (spans.isNotEmpty()) {
220
+ val previousSpan = spans[0] as EnrichedInputCheckboxListSpan
221
+ val isChecked = previousSpan.isChecked
222
+
223
+ for (span in spans) {
224
+ s.removeSpan(span)
225
+ }
226
+
227
+ setSpan(s, EnrichedSpans.CHECKBOX_LIST, start, end, isChecked)
228
+ }
229
+
230
+ return
231
+ }
232
+
183
233
  if (spans.isNotEmpty()) {
184
234
  for (span in spans) {
185
235
  s.removeSpan(span)
@@ -196,6 +246,7 @@ class ListStyles(
196
246
  ) {
197
247
  handleAfterTextChanged(s, EnrichedSpans.ORDERED_LIST, endCursorPosition, previousTextLength)
198
248
  handleAfterTextChanged(s, EnrichedSpans.UNORDERED_LIST, endCursorPosition, previousTextLength)
249
+ handleAfterTextChanged(s, EnrichedSpans.CHECKBOX_LIST, endCursorPosition, previousTextLength)
199
250
  }
200
251
 
201
252
  fun getStyleRange(): Pair<Int, Int> = view.selection?.getParagraphSelection() ?: Pair(0, 0)
@@ -1,16 +1,16 @@
1
- package com.swmansion.enriched.styles
1
+ package com.swmansion.enriched.textinput.styles
2
2
 
3
3
  import android.text.Editable
4
4
  import android.text.Spannable
5
5
  import android.text.SpannableStringBuilder
6
6
  import android.util.Log
7
- import com.swmansion.enriched.EnrichedTextInputView
8
- import com.swmansion.enriched.spans.EnrichedSpans
9
- import com.swmansion.enriched.spans.interfaces.EnrichedSpan
10
- import com.swmansion.enriched.utils.EnrichedConstants
11
- import com.swmansion.enriched.utils.getParagraphBounds
12
- import com.swmansion.enriched.utils.getSafeSpanBoundaries
13
- import com.swmansion.enriched.utils.removeZWS
7
+ import com.swmansion.enriched.common.EnrichedConstants
8
+ import com.swmansion.enriched.textinput.EnrichedTextInputView
9
+ import com.swmansion.enriched.textinput.spans.EnrichedSpans
10
+ import com.swmansion.enriched.textinput.spans.interfaces.EnrichedInputSpan
11
+ import com.swmansion.enriched.textinput.utils.getParagraphBounds
12
+ import com.swmansion.enriched.textinput.utils.getSafeSpanBoundaries
13
+ import com.swmansion.enriched.textinput.utils.removeZWS
14
14
 
15
15
  class ParagraphStyles(
16
16
  private val view: EnrichedTextInputView,
@@ -108,6 +108,9 @@ class ParagraphStyles(
108
108
  spannable.setSpan(span, safeStart, safeEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
109
109
  }
110
110
 
111
+ // Removes spans of the given type in the specified range.
112
+ // If the removed span intersects with the range, it will be split and the remaining part will be re-applied after the removal
113
+ // Returns true if any spans were removed, false otherwise
111
114
  private fun <T> removeSpansForRange(
112
115
  spannable: Spannable,
113
116
  start: Int,
@@ -115,21 +118,24 @@ class ParagraphStyles(
115
118
  clazz: Class<T>,
116
119
  ): Boolean {
117
120
  val ssb = spannable as SpannableStringBuilder
118
- var finalStart = start
119
- var finalEnd = end
120
-
121
121
  val spans = ssb.getSpans(start, end, clazz)
122
122
  if (spans.isEmpty()) return false
123
123
 
124
124
  for (span in spans) {
125
- finalStart = ssb.getSpanStart(span).coerceAtMost(finalStart)
126
- finalEnd = ssb.getSpanEnd(span).coerceAtLeast(finalEnd)
127
-
125
+ val spanStart = ssb.getSpanStart(span)
126
+ val spanEnd = ssb.getSpanEnd(span)
128
127
  ssb.removeSpan(span)
129
- }
130
128
 
131
- ssb.removeZWS(finalStart, finalEnd)
129
+ if (spanStart < start) {
130
+ setSpan(ssb, clazz, spanStart, start - 1)
131
+ }
132
132
 
133
+ if (spanEnd > end) {
134
+ setSpan(ssb, clazz, end + 1, spanEnd)
135
+ }
136
+ }
137
+
138
+ ssb.removeZWS(start, end)
133
139
  return true
134
140
  }
135
141
 
@@ -215,11 +221,7 @@ class ParagraphStyles(
215
221
  }
216
222
 
217
223
  val currSpan = currParagraphSpans[0]
218
- val nextSpan = getNextParagraphSpan(s, end, type)
219
-
220
- if (nextSpan == null) {
221
- return
222
- }
224
+ val nextSpan = getNextParagraphSpan(s, end, type) ?: return
223
225
 
224
226
  val newStart = s.getSpanStart(currSpan)
225
227
  val newEnd = s.getSpanEnd(nextSpan)
@@ -259,7 +261,7 @@ class ParagraphStyles(
259
261
  }
260
262
 
261
263
  for (span in spans) {
262
- extendStyleOnWholeParagraph(s, span as EnrichedSpan, conflictingType, paragraphEnd)
264
+ extendStyleOnWholeParagraph(s, span as EnrichedInputSpan, conflictingType, paragraphEnd)
263
265
  }
264
266
  }
265
267
 
@@ -294,7 +296,7 @@ class ParagraphStyles(
294
296
 
295
297
  private fun <T> extendStyleOnWholeParagraph(
296
298
  s: Editable,
297
- span: EnrichedSpan,
299
+ span: EnrichedInputSpan,
298
300
  type: Class<T>,
299
301
  paragraphEnd: Int,
300
302
  ) {
@@ -325,7 +327,7 @@ class ParagraphStyles(
325
327
  for (span in spans) {
326
328
  // handle conflicts when entering paragraph with some paragraph style applied
327
329
  deleteConflictingAndBlockingStyles(s, style, start, end)
328
- extendStyleOnWholeParagraph(s, span as EnrichedSpan, config.clazz, end)
330
+ extendStyleOnWholeParagraph(s, span as EnrichedInputSpan, config.clazz, end)
329
331
  }
330
332
  }
331
333
 
@@ -341,9 +343,12 @@ class ParagraphStyles(
341
343
  continue
342
344
  }
343
345
 
346
+ // If removing text at the beginning of the line, we want to remove the span for the whole paragraph
344
347
  if (isBackspace) {
345
- endCursorPosition -= 1
348
+ val currentParagraphBounds = s.getParagraphBounds(endCursorPosition)
349
+ removeSpansForRange(s, currentParagraphBounds.first, currentParagraphBounds.second, config.clazz)
346
350
  spanState.setStart(style, null)
351
+ continue
347
352
  } else {
348
353
  s.insert(endCursorPosition, EnrichedConstants.ZWS_STRING)
349
354
  endCursorPosition += 1
@@ -1,17 +1,17 @@
1
- package com.swmansion.enriched.styles
1
+ package com.swmansion.enriched.textinput.styles
2
2
 
3
3
  import android.text.Editable
4
4
  import android.text.Spannable
5
5
  import android.text.SpannableStringBuilder
6
6
  import android.text.Spanned
7
- import com.swmansion.enriched.EnrichedTextInputView
8
- import com.swmansion.enriched.spans.EnrichedImageSpan
9
- import com.swmansion.enriched.spans.EnrichedLinkSpan
10
- import com.swmansion.enriched.spans.EnrichedMentionSpan
11
- import com.swmansion.enriched.spans.EnrichedSpans
12
- import com.swmansion.enriched.utils.EnrichedConstants
13
- import com.swmansion.enriched.utils.getSafeSpanBoundaries
14
- import com.swmansion.enriched.utils.removeZWS
7
+ import com.swmansion.enriched.common.EnrichedConstants
8
+ import com.swmansion.enriched.textinput.EnrichedTextInputView
9
+ import com.swmansion.enriched.textinput.spans.EnrichedInputImageSpan
10
+ import com.swmansion.enriched.textinput.spans.EnrichedInputLinkSpan
11
+ import com.swmansion.enriched.textinput.spans.EnrichedInputMentionSpan
12
+ import com.swmansion.enriched.textinput.spans.EnrichedSpans
13
+ import com.swmansion.enriched.textinput.utils.getSafeSpanBoundaries
14
+ import com.swmansion.enriched.textinput.utils.removeZWS
15
15
 
16
16
  class ParametrizedStyles(
17
17
  private val view: EnrichedTextInputView,
@@ -49,7 +49,7 @@ class ParametrizedStyles(
49
49
  isSettingLinkSpan = true
50
50
 
51
51
  val spannable = view.text as SpannableStringBuilder
52
- val spans = spannable.getSpans(start, end, EnrichedLinkSpan::class.java)
52
+ val spans = spannable.getSpans(start, end, EnrichedInputLinkSpan::class.java)
53
53
  for (span in spans) {
54
54
  spannable.removeSpan(span)
55
55
  }
@@ -61,7 +61,7 @@ class ParametrizedStyles(
61
61
  }
62
62
 
63
63
  val spanEnd = start + text.length
64
- val span = EnrichedLinkSpan(url, view.htmlStyle)
64
+ val span = EnrichedInputLinkSpan(url, view.htmlStyle)
65
65
  val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, spanEnd)
66
66
  spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
67
67
 
@@ -86,7 +86,7 @@ class ParametrizedStyles(
86
86
  val regex = view.linkRegex ?: return
87
87
  val contextText = spannable.subSequence(start, end).toString()
88
88
 
89
- val spans = spannable.getSpans(start, end, EnrichedLinkSpan::class.java)
89
+ val spans = spannable.getSpans(start, end, EnrichedInputLinkSpan::class.java)
90
90
  for (span in spans) {
91
91
  spannable.removeSpan(span)
92
92
  }
@@ -97,7 +97,7 @@ class ParametrizedStyles(
97
97
  var wordStart = wordMatch.range.first
98
98
 
99
99
  // Do not include zero-width space in link detection
100
- if (word.startsWith("\u200B")) {
100
+ if (word.startsWith(EnrichedConstants.ZWS_STRING)) {
101
101
  word = word.substring(1)
102
102
  wordStart += 1
103
103
  }
@@ -111,7 +111,7 @@ class ParametrizedStyles(
111
111
  val spanStart = start + wordStart + linkStart
112
112
  val spanEnd = start + wordStart + linkEnd
113
113
 
114
- val span = EnrichedLinkSpan(matcher.group(), view.htmlStyle)
114
+ val span = EnrichedInputLinkSpan(matcher.group(), view.htmlStyle)
115
115
  val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(spanStart, spanEnd)
116
116
 
117
117
  spannable.setSpan(
@@ -209,7 +209,7 @@ class ParametrizedStyles(
209
209
  val mentionIndicatorRegex = Regex("^($indicatorsPattern)")
210
210
  val mentionRegex = Regex("^($indicatorsPattern)\\w*")
211
211
 
212
- val spans = spannable.getSpans(currentWord.start, currentWord.end, EnrichedMentionSpan::class.java)
212
+ val spans = spannable.getSpans(currentWord.start, currentWord.end, EnrichedInputMentionSpan::class.java)
213
213
  for (span in spans) {
214
214
  spannable.removeSpan(span)
215
215
  }
@@ -266,7 +266,7 @@ class ParametrizedStyles(
266
266
  if (start == originalEnd) {
267
267
  spannable.insert(start, EnrichedConstants.ORC_STRING)
268
268
  } else {
269
- val spans = spannable.getSpans(start, originalEnd, EnrichedImageSpan::class.java)
269
+ val spans = spannable.getSpans(start, originalEnd, EnrichedInputImageSpan::class.java)
270
270
  for (s in spans) {
271
271
  spannable.removeSpan(s)
272
272
  }
@@ -275,7 +275,7 @@ class ParametrizedStyles(
275
275
  }
276
276
 
277
277
  val (imageStart, imageEnd) = spannable.getSafeSpanBoundaries(start, start + 1)
278
- val span = EnrichedImageSpan.createEnrichedImageSpan(src, width.toInt(), height.toInt())
278
+ val span = EnrichedInputImageSpan.createEnrichedImageSpan(src, width.toInt(), height.toInt())
279
279
  span.observeAsyncDrawableLoaded(view.text)
280
280
 
281
281
  spannable.setSpan(span, imageStart, imageEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
@@ -303,7 +303,7 @@ class ParametrizedStyles(
303
303
 
304
304
  val spannable = view.text as SpannableStringBuilder
305
305
  val (selectionStart, selectionEnd) = selection.getInlineSelection()
306
- val spans = spannable.getSpans(selectionStart, selectionEnd, EnrichedMentionSpan::class.java)
306
+ val spans = spannable.getSpans(selectionStart, selectionEnd, EnrichedInputMentionSpan::class.java)
307
307
 
308
308
  for (span in spans) {
309
309
  spannable.removeSpan(span)
@@ -314,7 +314,7 @@ class ParametrizedStyles(
314
314
  view.runAsATransaction {
315
315
  spannable.replace(start, selectionEnd, text)
316
316
 
317
- val span = EnrichedMentionSpan(text, indicator, attributes, view.htmlStyle)
317
+ val span = EnrichedInputMentionSpan(text, indicator, attributes, view.htmlStyle)
318
318
  val spanEnd = start + text.length
319
319
  val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, spanEnd)
320
320
  spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
@@ -1,9 +1,9 @@
1
- package com.swmansion.enriched.utils
1
+ package com.swmansion.enriched.textinput.utils
2
2
 
3
3
  import android.text.Editable
4
4
  import android.text.Spannable
5
5
  import android.text.SpannableStringBuilder
6
- import com.swmansion.enriched.watchers.EnrichedSpanWatcher
6
+ import com.swmansion.enriched.textinput.watchers.EnrichedSpanWatcher
7
7
 
8
8
  class EnrichedEditableFactory(
9
9
  private val watcher: EnrichedSpanWatcher,
@@ -1,16 +1,17 @@
1
- package com.swmansion.enriched.utils
1
+ package com.swmansion.enriched.textinput.utils
2
2
 
3
3
  import android.text.Editable
4
4
  import android.text.Spannable
5
5
  import com.facebook.react.bridge.ReactContext
6
6
  import com.facebook.react.uimanager.UIManagerHelper
7
- import com.swmansion.enriched.EnrichedTextInputView
8
- import com.swmansion.enriched.events.OnChangeSelectionEvent
9
- import com.swmansion.enriched.events.OnLinkDetectedEvent
10
- import com.swmansion.enriched.events.OnMentionDetectedEvent
11
- import com.swmansion.enriched.spans.EnrichedLinkSpan
12
- import com.swmansion.enriched.spans.EnrichedMentionSpan
13
- import com.swmansion.enriched.spans.EnrichedSpans
7
+ import com.swmansion.enriched.common.EnrichedConstants
8
+ import com.swmansion.enriched.textinput.EnrichedTextInputView
9
+ import com.swmansion.enriched.textinput.events.OnChangeSelectionEvent
10
+ import com.swmansion.enriched.textinput.events.OnLinkDetectedEvent
11
+ import com.swmansion.enriched.textinput.events.OnMentionDetectedEvent
12
+ import com.swmansion.enriched.textinput.spans.EnrichedInputLinkSpan
13
+ import com.swmansion.enriched.textinput.spans.EnrichedInputMentionSpan
14
+ import com.swmansion.enriched.textinput.spans.EnrichedSpans
14
15
  import org.json.JSONObject
15
16
 
16
17
  class EnrichedSelection(
@@ -190,8 +191,8 @@ class EnrichedSelection(
190
191
  val (start, end) = getInlineSelection()
191
192
  val spannable = view.text as Spannable
192
193
  val spans = spannable.getSpans(start, end, type)
193
- val isLinkType = type == EnrichedLinkSpan::class.java
194
- val isMentionType = type == EnrichedMentionSpan::class.java
194
+ val isLinkType = type == EnrichedInputLinkSpan::class.java
195
+ val isMentionType = type == EnrichedInputMentionSpan::class.java
195
196
 
196
197
  if (isLinkType && spans.isEmpty()) {
197
198
  emitLinkDetectedEvent(spannable, null, start, end)
@@ -208,9 +209,9 @@ class EnrichedSelection(
208
209
  val spanEnd = spannable.getSpanEnd(span)
209
210
 
210
211
  if (start >= spanStart && end <= spanEnd) {
211
- if (isLinkType && span is EnrichedLinkSpan) {
212
+ if (isLinkType && span is EnrichedInputLinkSpan) {
212
213
  emitLinkDetectedEvent(spannable, span, spanStart, spanEnd)
213
- } else if (isMentionType && span is EnrichedMentionSpan) {
214
+ } else if (isMentionType && span is EnrichedInputMentionSpan) {
214
215
  emitMentionDetectedEvent(spannable, span, spanStart, spanEnd)
215
216
  }
216
217
 
@@ -247,7 +248,7 @@ class EnrichedSelection(
247
248
 
248
249
  private fun emitLinkDetectedEvent(
249
250
  spannable: Spannable,
250
- span: EnrichedLinkSpan?,
251
+ span: EnrichedInputLinkSpan?,
251
252
  start: Int,
252
253
  end: Int,
253
254
  ) {
@@ -278,7 +279,7 @@ class EnrichedSelection(
278
279
 
279
280
  private fun emitMentionDetectedEvent(
280
281
  spannable: Spannable,
281
- span: EnrichedMentionSpan?,
282
+ span: EnrichedInputMentionSpan?,
282
283
  start: Int,
283
284
  end: Int,
284
285
  ) {