react-native-enriched 0.2.1 → 0.4.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 (263) hide show
  1. package/README.md +21 -16
  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 → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
  6. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
  7. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
  8. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
  9. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
  10. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
  11. package/android/gradle.properties +5 -5
  12. package/android/lint.gradle +70 -0
  13. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewPackage.kt → ReactNativeEnrichedPackage.kt} +4 -5
  14. package/android/src/main/java/com/swmansion/enriched/{utils → common}/AsyncDrawable.kt +50 -15
  15. package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
  16. package/android/src/main/java/com/swmansion/enriched/common/EnrichedConstants.kt +11 -0
  17. package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
  18. package/android/src/main/java/com/swmansion/enriched/{spans/utils → common}/ForceRedrawSpan.kt +3 -2
  19. package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
  20. package/android/src/main/java/com/swmansion/enriched/{utils → common}/ResourceManager.kt +1 -1
  21. package/android/src/main/java/com/swmansion/enriched/{utils → common/parser}/EnrichedParser.java +228 -160
  22. package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
  23. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBlockQuoteSpan.kt +53 -0
  24. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
  25. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +91 -0
  26. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt +12 -14
  27. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
  28. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
  29. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
  30. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
  31. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
  32. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
  33. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedImageSpan.kt +68 -51
  34. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedInlineCodeSpan.kt +24 -0
  35. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
  36. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedLinkSpan.kt +26 -0
  37. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedMentionSpan.kt +35 -0
  38. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedOrderedListSpan.kt +21 -29
  39. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
  40. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
  41. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedUnorderedListSpan.kt +13 -17
  42. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedBlockSpan.kt +5 -0
  43. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedHeadingSpan.kt +3 -0
  44. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
  45. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedParagraphSpan.kt +5 -0
  46. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
  47. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedZeroWidthSpaceSpan.kt +2 -3
  48. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputConnectionWrapper.kt +140 -0
  49. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
  50. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputView.kt → textinput/EnrichedTextInputView.kt} +322 -157
  51. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewLayoutManager.kt → textinput/EnrichedTextInputViewLayoutManager.kt} +4 -2
  52. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewManager.kt → textinput/EnrichedTextInputViewManager.kt} +182 -66
  53. package/android/src/main/java/com/swmansion/enriched/{MeasurementStore.kt → textinput/MeasurementStore.kt} +75 -25
  54. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt +22 -12
  55. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeHtmlEvent.kt +27 -0
  56. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeSelectionEvent.kt +11 -10
  57. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeStateEvent.kt +21 -0
  58. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeTextEvent.kt +30 -0
  59. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputBlurEvent.kt +25 -0
  60. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputFocusEvent.kt +25 -0
  61. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputKeyPressEvent.kt +27 -0
  62. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnLinkDetectedEvent.kt +32 -0
  63. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionDetectedEvent.kt +11 -10
  64. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionEvent.kt +10 -9
  65. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
  66. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnRequestHtmlResultEvent.kt +2 -3
  67. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
  68. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
  69. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
  70. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
  71. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
  72. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
  73. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
  74. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
  75. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
  76. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
  77. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
  78. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
  79. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
  80. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +15 -0
  81. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
  82. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
  83. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
  84. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
  85. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
  86. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedSpans.kt +241 -0
  87. package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
  88. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/HtmlStyle.kt +129 -57
  89. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt +30 -13
  90. package/android/src/main/java/com/swmansion/enriched/textinput/styles/ListStyles.kt +263 -0
  91. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt +94 -34
  92. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParametrizedStyles.kt +143 -67
  93. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt +17 -0
  94. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt +84 -54
  95. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpanState.kt +304 -0
  96. package/android/src/main/java/com/swmansion/enriched/{utils/Utils.kt → textinput/utils/EnrichedSpannable.kt} +22 -31
  97. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannableStringBuilder.kt +16 -0
  98. package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
  99. package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
  100. package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedSpanWatcher.kt +56 -24
  101. package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedTextWatcher.kt +37 -14
  102. package/android/src/main/new_arch/CMakeLists.txt +7 -1
  103. package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
  104. package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
  105. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.h +1 -1
  106. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.h +2 -2
  107. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/conversions.h +46 -0
  108. package/ios/EnrichedTextInputView.h +2 -1
  109. package/ios/EnrichedTextInputView.mm +603 -60
  110. package/ios/config/InputConfig.h +28 -0
  111. package/ios/config/InputConfig.mm +237 -8
  112. package/ios/extensions/ImageExtension.h +35 -0
  113. package/ios/extensions/ImageExtension.mm +156 -0
  114. package/ios/{utils → extensions}/LayoutManagerExtension.mm +115 -95
  115. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
  116. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
  117. package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
  118. package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
  119. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
  120. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
  121. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/RCTComponentViewHelpers.h +95 -0
  122. package/ios/inputParser/InputParser.mm +218 -18
  123. package/ios/inputTextView/InputTextView.mm +118 -0
  124. package/ios/{attachments → interfaces}/ImageAttachment.h +1 -0
  125. package/ios/interfaces/ImageAttachment.mm +46 -0
  126. package/ios/interfaces/LinkRegexConfig.h +19 -0
  127. package/ios/interfaces/LinkRegexConfig.mm +37 -0
  128. package/ios/{utils → interfaces}/MentionStyleProps.mm +2 -2
  129. package/ios/{utils → interfaces}/StyleHeaders.h +22 -1
  130. package/ios/{utils → interfaces}/StyleTypeEnum.h +4 -0
  131. package/ios/internals/EnrichedTextInputViewState.cpp +6 -6
  132. package/ios/styles/BlockQuoteStyle.mm +5 -5
  133. package/ios/styles/BoldStyle.mm +21 -6
  134. package/ios/styles/CheckboxListStyle.mm +321 -0
  135. package/ios/styles/CodeBlockStyle.mm +5 -5
  136. package/ios/styles/H1Style.mm +3 -0
  137. package/ios/styles/H2Style.mm +3 -0
  138. package/ios/styles/H3Style.mm +3 -0
  139. package/ios/styles/H4Style.mm +20 -0
  140. package/ios/styles/H5Style.mm +20 -0
  141. package/ios/styles/H6Style.mm +20 -0
  142. package/ios/styles/HeadingStyleBase.mm +161 -72
  143. package/ios/styles/ImageStyle.mm +5 -5
  144. package/ios/styles/InlineCodeStyle.mm +30 -19
  145. package/ios/styles/ItalicStyle.mm +5 -5
  146. package/ios/styles/LinkStyle.mm +98 -40
  147. package/ios/styles/MentionStyle.mm +4 -4
  148. package/ios/styles/OrderedListStyle.mm +5 -5
  149. package/ios/styles/StrikethroughStyle.mm +5 -5
  150. package/ios/styles/UnderlineStyle.mm +5 -5
  151. package/ios/styles/UnorderedListStyle.mm +5 -5
  152. package/ios/utils/CheckboxHitTestUtils.h +10 -0
  153. package/ios/utils/CheckboxHitTestUtils.mm +123 -0
  154. package/ios/utils/ParagraphAttributesUtils.h +4 -0
  155. package/ios/utils/ParagraphAttributesUtils.mm +142 -45
  156. package/ios/utils/ParagraphsUtils.mm +4 -4
  157. package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
  158. package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
  159. package/ios/utils/ZeroWidthSpaceUtils.mm +14 -3
  160. package/lib/module/EnrichedTextInput.js +57 -11
  161. package/lib/module/EnrichedTextInput.js.map +1 -1
  162. package/lib/module/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
  163. package/lib/module/types.js +4 -0
  164. package/lib/module/types.js.map +1 -0
  165. package/lib/module/{normalizeHtmlStyle.js → utils/normalizeHtmlStyle.js} +18 -0
  166. package/lib/module/utils/normalizeHtmlStyle.js.map +1 -0
  167. package/lib/module/utils/nullthrows.js +9 -0
  168. package/lib/module/utils/nullthrows.js.map +1 -0
  169. package/lib/module/utils/regexParser.js +46 -0
  170. package/lib/module/utils/regexParser.js.map +1 -0
  171. package/lib/typescript/src/EnrichedTextInput.d.ts +20 -51
  172. package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
  173. package/lib/typescript/src/index.d.ts +2 -1
  174. package/lib/typescript/src/index.d.ts.map +1 -1
  175. package/lib/typescript/src/{EnrichedTextInputNativeComponent.d.ts → spec/EnrichedTextInputNativeComponent.d.ts} +154 -18
  176. package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
  177. package/lib/typescript/src/types.d.ts +58 -0
  178. package/lib/typescript/src/types.d.ts.map +1 -0
  179. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +4 -0
  180. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -0
  181. package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
  182. package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
  183. package/lib/typescript/src/utils/regexParser.d.ts +3 -0
  184. package/lib/typescript/src/utils/regexParser.d.ts.map +1 -0
  185. package/package.json +13 -9
  186. package/src/EnrichedTextInput.tsx +88 -63
  187. package/src/index.tsx +5 -1
  188. package/src/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
  189. package/src/types.ts +59 -0
  190. package/src/{normalizeHtmlStyle.ts → utils/normalizeHtmlStyle.ts} +20 -5
  191. package/src/utils/nullthrows.ts +7 -0
  192. package/src/utils/regexParser.ts +56 -0
  193. package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
  194. package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
  195. package/android/src/main/java/com/swmansion/enriched/events/OnChangeHtmlEvent.kt +0 -28
  196. package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateEvent.kt +0 -24
  197. package/android/src/main/java/com/swmansion/enriched/events/OnChangeTextEvent.kt +0 -30
  198. package/android/src/main/java/com/swmansion/enriched/events/OnInputBlurEvent.kt +0 -27
  199. package/android/src/main/java/com/swmansion/enriched/events/OnInputFocusEvent.kt +0 -27
  200. package/android/src/main/java/com/swmansion/enriched/events/OnLinkDetectedEvent.kt +0 -30
  201. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBlockQuoteSpan.kt +0 -44
  202. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +0 -16
  203. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +0 -23
  204. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +0 -23
  205. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +0 -23
  206. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedInlineCodeSpan.kt +0 -27
  207. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +0 -15
  208. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedLinkSpan.kt +0 -30
  209. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedMentionSpan.kt +0 -42
  210. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt +0 -136
  211. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +0 -14
  212. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +0 -14
  213. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedBlockSpan.kt +0 -4
  214. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedHeadingSpan.kt +0 -4
  215. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +0 -4
  216. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedParagraphSpan.kt +0 -4
  217. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +0 -8
  218. package/android/src/main/java/com/swmansion/enriched/styles/ListStyles.kt +0 -172
  219. package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSpanState.kt +0 -204
  220. package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +0 -22
  221. package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +0 -26
  222. package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/conversions.h +0 -26
  223. package/ios/attachments/ImageAttachment.mm +0 -34
  224. package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
  225. package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
  226. package/lib/module/normalizeHtmlStyle.js.map +0 -1
  227. package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +0 -1
  228. package/lib/typescript/src/normalizeHtmlStyle.d.ts +0 -4
  229. package/lib/typescript/src/normalizeHtmlStyle.d.ts.map +0 -1
  230. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
  231. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
  232. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
  233. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
  234. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputComponentDescriptor.h +0 -0
  235. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.cpp +0 -0
  236. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.cpp +0 -0
  237. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.cpp +0 -0
  238. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.h +0 -0
  239. /package/ios/{utils → extensions}/ColorExtension.h +0 -0
  240. /package/ios/{utils → extensions}/ColorExtension.mm +0 -0
  241. /package/ios/{utils → extensions}/FontExtension.h +0 -0
  242. /package/ios/{utils → extensions}/FontExtension.mm +0 -0
  243. /package/ios/{utils → extensions}/LayoutManagerExtension.h +0 -0
  244. /package/ios/{utils → extensions}/StringExtension.h +0 -0
  245. /package/ios/{utils → extensions}/StringExtension.mm +0 -0
  246. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
  247. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
  248. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
  249. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
  250. /package/ios/{utils → interfaces}/BaseStyleProtocol.h +0 -0
  251. /package/ios/{utils → interfaces}/ImageData.h +0 -0
  252. /package/ios/{utils → interfaces}/ImageData.mm +0 -0
  253. /package/ios/{utils → interfaces}/LinkData.h +0 -0
  254. /package/ios/{utils → interfaces}/LinkData.mm +0 -0
  255. /package/ios/{attachments → interfaces}/MediaAttachment.h +0 -0
  256. /package/ios/{attachments → interfaces}/MediaAttachment.mm +0 -0
  257. /package/ios/{utils → interfaces}/MentionParams.h +0 -0
  258. /package/ios/{utils → interfaces}/MentionParams.mm +0 -0
  259. /package/ios/{utils → interfaces}/MentionStyleProps.h +0 -0
  260. /package/ios/{utils → interfaces}/StylePair.h +0 -0
  261. /package/ios/{utils → interfaces}/StylePair.mm +0 -0
  262. /package/ios/{utils → interfaces}/TextDecorationLineEnum.h +0 -0
  263. /package/ios/{utils → interfaces}/TextDecorationLineEnum.mm +0 -0
@@ -0,0 +1,263 @@
1
+ package com.swmansion.enriched.textinput.styles
2
+
3
+ import android.text.Editable
4
+ import android.text.Spannable
5
+ import android.text.SpannableStringBuilder
6
+ import android.text.Spanned
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
16
+
17
+ class ListStyles(
18
+ private val view: EnrichedTextInputView,
19
+ ) {
20
+ private fun <T> getPreviousParagraphSpan(
21
+ spannable: Spannable,
22
+ s: Int,
23
+ type: Class<T>,
24
+ ): T? {
25
+ if (s <= 0) return null
26
+
27
+ val (previousParagraphStart, previousParagraphEnd) = spannable.getParagraphBounds(s - 1)
28
+ val spans = spannable.getSpans(previousParagraphStart, previousParagraphEnd, type)
29
+
30
+ if (spans.isNotEmpty()) {
31
+ return spans.last()
32
+ }
33
+
34
+ return null
35
+ }
36
+
37
+ private fun <T> isPreviousParagraphList(
38
+ spannable: Spannable,
39
+ s: Int,
40
+ type: Class<T>,
41
+ ): Boolean {
42
+ val previousSpan = getPreviousParagraphSpan(spannable, s, type)
43
+
44
+ return previousSpan != null
45
+ }
46
+
47
+ private fun getOrderedListIndex(
48
+ spannable: Spannable,
49
+ s: Int,
50
+ ): Int {
51
+ val span = getPreviousParagraphSpan(spannable, s, EnrichedInputOrderedListSpan::class.java)
52
+ val index = span?.getListIndex() ?: 0
53
+ return index + 1
54
+ }
55
+
56
+ private fun setSpan(
57
+ spannable: Spannable,
58
+ name: String,
59
+ start: Int,
60
+ end: Int,
61
+ isChecked: Boolean? = false,
62
+ ) {
63
+ val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, end)
64
+
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)
80
+
81
+ // Invalidate layout to update checkbox drawing in case checkbox is bigger than line height
82
+ view.layoutManager.invalidateLayout()
83
+ }
84
+ }
85
+ }
86
+
87
+ private fun <T> removeSpansForRange(
88
+ spannable: Spannable,
89
+ start: Int,
90
+ end: Int,
91
+ clazz: Class<T>,
92
+ ): Boolean {
93
+ val ssb = spannable as SpannableStringBuilder
94
+ val spans = ssb.getSpans(start, end, clazz)
95
+ if (spans.isEmpty()) return false
96
+
97
+ for (span in spans) {
98
+ ssb.removeSpan(span)
99
+ }
100
+
101
+ ssb.removeZWS(start, end)
102
+ return true
103
+ }
104
+
105
+ fun updateOrderedListIndexes(
106
+ text: Spannable,
107
+ position: Int,
108
+ ) {
109
+ val spans = text.getSpans(position + 1, text.length, EnrichedInputOrderedListSpan::class.java)
110
+ val sortedSpans = spans.sortedBy { text.getSpanStart(it) }
111
+ for (span in sortedSpans) {
112
+ val spanStart = text.getSpanStart(span)
113
+ val index = getOrderedListIndex(text, spanStart)
114
+ span.setListIndex(index)
115
+ }
116
+ }
117
+
118
+ private fun toggleStyle(
119
+ name: String,
120
+ checkboxState: Boolean?,
121
+ ) {
122
+ if (view.selection == null) return
123
+ val config = EnrichedSpans.listSpans[name] ?: return
124
+ val spannable = view.text as SpannableStringBuilder
125
+ val (start, end) = view.selection.getParagraphSelection()
126
+ val styleStart = view.spanState?.getStart(name)
127
+
128
+ if (styleStart != null) {
129
+ view.spanState.setStart(name, null)
130
+ removeSpansForRange(spannable, start, end, config.clazz)
131
+ view.selection.validateStyles()
132
+
133
+ return
134
+ }
135
+
136
+ if (start == end) {
137
+ spannable.insert(start, EnrichedConstants.ZWS_STRING)
138
+ view.spanState?.setStart(name, start + 1)
139
+ removeSpansForRange(spannable, start, end, config.clazz)
140
+ setSpan(spannable, name, start, end + 1, checkboxState)
141
+
142
+ return
143
+ }
144
+
145
+ var currentStart = start
146
+ val paragraphs = spannable.substring(start, end).split("\n")
147
+ removeSpansForRange(spannable, start, end, config.clazz)
148
+
149
+ for (paragraph in paragraphs) {
150
+ spannable.insert(currentStart, EnrichedConstants.ZWS_STRING)
151
+ val currentEnd = currentStart + paragraph.length + 1
152
+ setSpan(spannable, name, currentStart, currentEnd, checkboxState)
153
+
154
+ currentStart = currentEnd + 1
155
+ }
156
+
157
+ view.spanState?.setStart(name, currentStart)
158
+ }
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
+
168
+ private fun handleAfterTextChanged(
169
+ s: Editable,
170
+ name: String,
171
+ endCursorPosition: Int,
172
+ previousTextLength: Int,
173
+ ) {
174
+ val config = EnrichedSpans.listSpans[name] ?: return
175
+ val cursorPosition = endCursorPosition.coerceAtMost(s.length)
176
+ val (start, end) = s.getParagraphBounds(cursorPosition)
177
+
178
+ val isBackspace = previousTextLength > s.length
179
+ val isNewLine = cursorPosition > 0 && s[cursorPosition - 1] == '\n'
180
+ val isShortcut = config.shortcut?.let { s.substring(start, end).startsWith(it) } ?: false
181
+ val spans = s.getSpans(start, end, config.clazz)
182
+
183
+ // Remove spans if cursor is at the start of the paragraph and spans exist
184
+ if (isBackspace && start == cursorPosition && spans.isNotEmpty()) {
185
+ removeSpansForRange(s, start, end, config.clazz)
186
+ return
187
+ }
188
+
189
+ if (!isBackspace && isShortcut) {
190
+ s.replace(start, cursorPosition, EnrichedConstants.ZWS_STRING)
191
+ setSpan(s, name, start, start + 1)
192
+ // Inform that new span has been added
193
+ view.selection?.validateStyles()
194
+ return
195
+ }
196
+
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
+
211
+ s.insert(cursorPosition, EnrichedConstants.ZWS_STRING)
212
+ setSpan(s, name, start, end + 1)
213
+ // Inform that new span has been added
214
+ view.selection?.validateStyles()
215
+ return
216
+ }
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
+
233
+ if (spans.isNotEmpty()) {
234
+ for (span in spans) {
235
+ s.removeSpan(span)
236
+ }
237
+
238
+ setSpan(s, name, start, end)
239
+ }
240
+ }
241
+
242
+ fun afterTextChanged(
243
+ s: Editable,
244
+ endCursorPosition: Int,
245
+ previousTextLength: Int,
246
+ ) {
247
+ handleAfterTextChanged(s, EnrichedSpans.ORDERED_LIST, endCursorPosition, previousTextLength)
248
+ handleAfterTextChanged(s, EnrichedSpans.UNORDERED_LIST, endCursorPosition, previousTextLength)
249
+ handleAfterTextChanged(s, EnrichedSpans.CHECKBOX_LIST, endCursorPosition, previousTextLength)
250
+ }
251
+
252
+ fun getStyleRange(): Pair<Int, Int> = view.selection?.getParagraphSelection() ?: Pair(0, 0)
253
+
254
+ fun removeStyle(
255
+ name: String,
256
+ start: Int,
257
+ end: Int,
258
+ ): Boolean {
259
+ val config = EnrichedSpans.listSpans[name] ?: return false
260
+ val spannable = view.text as Spannable
261
+ return removeSpansForRange(spannable, start, end, config.clazz)
262
+ }
263
+ }
@@ -1,17 +1,25 @@
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.getParagraphBounds
11
- import com.swmansion.enriched.utils.getSafeSpanBoundaries
12
-
13
- class ParagraphStyles(private val view: EnrichedTextInputView) {
14
- private fun <T>getPreviousParagraphSpan(spannable: Spannable, paragraphStart: Int, type: Class<T>): T? {
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
+
15
+ class ParagraphStyles(
16
+ private val view: EnrichedTextInputView,
17
+ ) {
18
+ private fun <T> getPreviousParagraphSpan(
19
+ spannable: Spannable,
20
+ paragraphStart: Int,
21
+ type: Class<T>,
22
+ ): T? {
15
23
  if (paragraphStart <= 0) return null
16
24
 
17
25
  val (previousParagraphStart, previousParagraphEnd) = spannable.getParagraphBounds(paragraphStart - 1)
@@ -30,7 +38,11 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
30
38
  return null
31
39
  }
32
40
 
33
- private fun <T>getNextParagraphSpan(spannable: Spannable, paragraphEnd: Int, type: Class<T>): T? {
41
+ private fun <T> getNextParagraphSpan(
42
+ spannable: Spannable,
43
+ paragraphEnd: Int,
44
+ type: Class<T>,
45
+ ): T? {
34
46
  if (paragraphEnd >= spannable.length - 1) return null
35
47
 
36
48
  val (nextParagraphStart, nextParagraphEnd) = spannable.getParagraphBounds(paragraphEnd + 1)
@@ -54,7 +66,12 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
54
66
  * Applies a continuous span to the specified range.
55
67
  * If the new range touches existing continuous spans, they are coalesced into a single span
56
68
  */
57
- private fun <T>setContinuousSpan(spannable: Spannable, start: Int, end: Int, type: Class<T>) {
69
+ private fun <T> setContinuousSpan(
70
+ spannable: Spannable,
71
+ start: Int,
72
+ end: Int,
73
+ type: Class<T>,
74
+ ) {
58
75
  val span = type.getDeclaredConstructor(HtmlStyle::class.java).newInstance(view.htmlStyle)
59
76
  val previousSpan = getPreviousParagraphSpan(spannable, start, type)
60
77
  val nextSpan = getNextParagraphSpan(spannable, end, type)
@@ -75,8 +92,12 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
75
92
  spannable.setSpan(span, safeStart, safeEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
76
93
  }
77
94
 
78
-
79
- private fun <T>setSpan(spannable: Spannable, type: Class<T>, start: Int, end: Int) {
95
+ private fun <T> setSpan(
96
+ spannable: Spannable,
97
+ type: Class<T>,
98
+ start: Int,
99
+ end: Int,
100
+ ) {
80
101
  if (EnrichedSpans.isTypeContinuous(type)) {
81
102
  setContinuousSpan(spannable, start, end, type)
82
103
  return
@@ -87,7 +108,12 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
87
108
  spannable.setSpan(span, safeStart, safeEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
88
109
  }
89
110
 
90
- private fun <T>removeSpansForRange(spannable: Spannable, start: Int, end: Int, clazz: Class<T>): Boolean {
111
+ private fun <T> removeSpansForRange(
112
+ spannable: Spannable,
113
+ start: Int,
114
+ end: Int,
115
+ clazz: Class<T>,
116
+ ): Boolean {
91
117
  val ssb = spannable as SpannableStringBuilder
92
118
  var finalStart = start
93
119
  var finalEnd = end
@@ -102,11 +128,17 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
102
128
  ssb.removeSpan(span)
103
129
  }
104
130
 
105
- ssb.replace(finalStart, finalEnd, ssb.substring(finalStart, finalEnd).replace("\u200B", ""))
131
+ ssb.removeZWS(finalStart, finalEnd)
132
+
106
133
  return true
107
134
  }
108
135
 
109
- private fun <T>setAndMergeSpans(spannable: Spannable, type: Class<T>, start: Int, end: Int) {
136
+ private fun <T> setAndMergeSpans(
137
+ spannable: Spannable,
138
+ type: Class<T>,
139
+ start: Int,
140
+ end: Int,
141
+ ) {
110
142
  val spans = spannable.getSpans(start, end, type)
111
143
 
112
144
  // No spans setup for current selection, means we just need to assign new span
@@ -157,7 +189,11 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
157
189
  }
158
190
  }
159
191
 
160
- private fun <T>isSpanEnabledInNextLine(spannable: Spannable, index: Int, type: Class<T>): Boolean {
192
+ private fun <T> isSpanEnabledInNextLine(
193
+ spannable: Spannable,
194
+ index: Int,
195
+ type: Class<T>,
196
+ ): Boolean {
161
197
  val selection = view.selection ?: return false
162
198
  if (index + 1 >= spannable.length) return false
163
199
  val (start, end) = selection.getParagraphSelection()
@@ -166,7 +202,11 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
166
202
  return spans.isNotEmpty()
167
203
  }
168
204
 
169
- private fun <T>mergeAdjacentStyleSpans(s: Editable, endCursorPosition: Int, type: Class<T>) {
205
+ private fun <T> mergeAdjacentStyleSpans(
206
+ s: Editable,
207
+ endCursorPosition: Int,
208
+ type: Class<T>,
209
+ ) {
170
210
  val (start, end) = s.getParagraphBounds(endCursorPosition)
171
211
  val currParagraphSpans = s.getSpans(start, end, type)
172
212
 
@@ -193,7 +233,12 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
193
233
  s.setSpan(span, safeStart, safeEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
194
234
  }
195
235
 
196
- private fun handleConflictsDuringNewlineDeletion(s: Editable, style: String, paragraphStart: Int, paragraphEnd: Int): Boolean {
236
+ private fun handleConflictsDuringNewlineDeletion(
237
+ s: Editable,
238
+ style: String,
239
+ paragraphStart: Int,
240
+ paragraphEnd: Int,
241
+ ): Boolean {
197
242
  val spanState = view.spanState ?: return false
198
243
  val mergingConfig = EnrichedSpans.getMergingConfigForStyle(style, view.htmlStyle) ?: return false
199
244
  var isConflicting = false
@@ -214,12 +259,12 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
214
259
  }
215
260
 
216
261
  for (span in spans) {
217
- extendStyleOnWholeParagraph(s, span as EnrichedSpan, conflictingType, paragraphEnd)
262
+ extendStyleOnWholeParagraph(s, span as EnrichedInputSpan, conflictingType, paragraphEnd)
218
263
  }
219
264
  }
220
265
 
221
266
  if (isConflicting) {
222
- val styleStart = spanState.getStart(style) ?: return false
267
+ val styleStart = spanState.getStart(style) ?: return false
223
268
  spanState.setStart(style, null)
224
269
  removeStyle(style, styleStart, paragraphEnd)
225
270
  return true
@@ -228,8 +273,12 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
228
273
  return false
229
274
  }
230
275
 
231
-
232
- private fun deleteConflictingAndBlockingStyles(s: Editable, style: String, paragraphStart: Int, paragraphEnd: Int) {
276
+ private fun deleteConflictingAndBlockingStyles(
277
+ s: Editable,
278
+ style: String,
279
+ paragraphStart: Int,
280
+ paragraphEnd: Int,
281
+ ) {
233
282
  val mergingConfig = EnrichedSpans.getMergingConfigForStyle(style, view.htmlStyle) ?: return
234
283
  val stylesToCheck = mergingConfig.blockingStyles + mergingConfig.conflictingStyles
235
284
 
@@ -243,17 +292,26 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
243
292
  }
244
293
  }
245
294
 
246
- private fun <T>extendStyleOnWholeParagraph(s: Editable, span: EnrichedSpan, type: Class<T>, paragraphEnd: Int) {
295
+ private fun <T> extendStyleOnWholeParagraph(
296
+ s: Editable,
297
+ span: EnrichedInputSpan,
298
+ type: Class<T>,
299
+ paragraphEnd: Int,
300
+ ) {
247
301
  val currStyleStart = s.getSpanStart(span)
248
302
  s.removeSpan(span)
249
303
  val (safeStart, safeEnd) = s.getSafeSpanBoundaries(currStyleStart, paragraphEnd)
250
304
  setSpan(s, type, safeStart, safeEnd)
251
305
  }
252
306
 
253
- fun afterTextChanged(s: Editable, endPosition: Int, previousTextLength: Int) {
307
+ fun afterTextChanged(
308
+ s: Editable,
309
+ endPosition: Int,
310
+ previousTextLength: Int,
311
+ ) {
254
312
  var endCursorPosition = endPosition
255
313
  val isBackspace = s.length < previousTextLength
256
- val isNewLine = endCursorPosition == 0 || endCursorPosition > 0 && s[endCursorPosition - 1] == '\n'
314
+ val isNewLine = endCursorPosition == 0 || (endCursorPosition > 0 && s[endCursorPosition - 1] == '\n')
257
315
  val spanState = view.spanState ?: return
258
316
 
259
317
  for ((style, config) in EnrichedSpans.paragraphSpans) {
@@ -267,7 +325,7 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
267
325
  for (span in spans) {
268
326
  // handle conflicts when entering paragraph with some paragraph style applied
269
327
  deleteConflictingAndBlockingStyles(s, style, start, end)
270
- extendStyleOnWholeParagraph(s, span as EnrichedSpan, config.clazz, end)
328
+ extendStyleOnWholeParagraph(s, span as EnrichedInputSpan, config.clazz, end)
271
329
  }
272
330
  }
273
331
 
@@ -287,7 +345,7 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
287
345
  endCursorPosition -= 1
288
346
  spanState.setStart(style, null)
289
347
  } else {
290
- s.insert(endCursorPosition, "\u200B")
348
+ s.insert(endCursorPosition, EnrichedConstants.ZWS_STRING)
291
349
  endCursorPosition += 1
292
350
  }
293
351
  }
@@ -336,7 +394,7 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
336
394
  }
337
395
 
338
396
  if (start == end) {
339
- spannable.insert(start, "\u200B")
397
+ spannable.insert(start, EnrichedConstants.ZWS_STRING)
340
398
  setAndMergeSpans(spannable, type, start, end + 1)
341
399
  view.selection.validateStyles()
342
400
 
@@ -348,7 +406,7 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
348
406
  val paragraphs = spannable.substring(start, end).split("\n")
349
407
 
350
408
  for (paragraph in paragraphs) {
351
- spannable.insert(currentStart, "\u200B")
409
+ spannable.insert(currentStart, EnrichedConstants.ZWS_STRING)
352
410
  currentEnd = currentStart + paragraph.length + 1
353
411
  currentStart = currentEnd + 1
354
412
  }
@@ -357,11 +415,13 @@ class ParagraphStyles(private val view: EnrichedTextInputView) {
357
415
  view.selection.validateStyles()
358
416
  }
359
417
 
360
- fun getStyleRange(): Pair<Int, Int> {
361
- return view.selection?.getParagraphSelection() ?: Pair(0, 0)
362
- }
418
+ fun getStyleRange(): Pair<Int, Int> = view.selection?.getParagraphSelection() ?: Pair(0, 0)
363
419
 
364
- fun removeStyle(name: String, start: Int, end: Int): Boolean {
420
+ fun removeStyle(
421
+ name: String,
422
+ start: Int,
423
+ end: Int,
424
+ ): Boolean {
365
425
  val config = EnrichedSpans.paragraphSpans[name] ?: return false
366
426
  val spannable = view.text as Spannable
367
427
  return removeSpansForRange(spannable, start, end, config.clazz)