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
@@ -17,6 +17,7 @@ NS_ASSUME_NONNULL_BEGIN
17
17
  - (void)focus;
18
18
  - (void)blur;
19
19
  - (void)setValue:(NSString *)text;
20
+ - (void)setSelection:(NSInteger)start end:(NSInteger)end;
20
21
  - (void)toggleBold;
21
22
  - (void)toggleItalic;
22
23
  - (void)toggleUnderline;
@@ -25,10 +26,14 @@ NS_ASSUME_NONNULL_BEGIN
25
26
  - (void)toggleH1;
26
27
  - (void)toggleH2;
27
28
  - (void)toggleH3;
29
+ - (void)toggleH4;
30
+ - (void)toggleH5;
31
+ - (void)toggleH6;
28
32
  - (void)toggleCodeBlock;
29
33
  - (void)toggleBlockQuote;
30
34
  - (void)toggleOrderedList;
31
35
  - (void)toggleUnorderedList;
36
+ - (void)toggleCheckboxList:(BOOL)checked;
32
37
  - (void)addLink:(NSInteger)start end:(NSInteger)end text:(NSString *)text url:(NSString *)url;
33
38
  - (void)addImage:(NSString *)uri width:(float)width height:(float)height;
34
39
  - (void)startMention:(NSString *)indicator;
@@ -89,6 +94,34 @@ if ([commandName isEqualToString:@"setValue"]) {
89
94
  return;
90
95
  }
91
96
 
97
+ if ([commandName isEqualToString:@"setSelection"]) {
98
+ #if RCT_DEBUG
99
+ if ([args count] != 2) {
100
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedTextInputView", commandName, (int)[args count], 2);
101
+ return;
102
+ }
103
+ #endif
104
+
105
+ NSObject *arg0 = args[0];
106
+ #if RCT_DEBUG
107
+ if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSNumber class], @"number", @"EnrichedTextInputView", commandName, @"1st")) {
108
+ return;
109
+ }
110
+ #endif
111
+ NSInteger start = [(NSNumber *)arg0 intValue];
112
+
113
+ NSObject *arg1 = args[1];
114
+ #if RCT_DEBUG
115
+ if (!RCTValidateTypeOfViewCommandArgument(arg1, [NSNumber class], @"number", @"EnrichedTextInputView", commandName, @"2nd")) {
116
+ return;
117
+ }
118
+ #endif
119
+ NSInteger end = [(NSNumber *)arg1 intValue];
120
+
121
+ [componentView setSelection:start end:end];
122
+ return;
123
+ }
124
+
92
125
  if ([commandName isEqualToString:@"toggleBold"]) {
93
126
  #if RCT_DEBUG
94
127
  if ([args count] != 0) {
@@ -201,6 +234,48 @@ if ([commandName isEqualToString:@"toggleH3"]) {
201
234
  return;
202
235
  }
203
236
 
237
+ if ([commandName isEqualToString:@"toggleH4"]) {
238
+ #if RCT_DEBUG
239
+ if ([args count] != 0) {
240
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedTextInputView", commandName, (int)[args count], 0);
241
+ return;
242
+ }
243
+ #endif
244
+
245
+
246
+
247
+ [componentView toggleH4];
248
+ return;
249
+ }
250
+
251
+ if ([commandName isEqualToString:@"toggleH5"]) {
252
+ #if RCT_DEBUG
253
+ if ([args count] != 0) {
254
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedTextInputView", commandName, (int)[args count], 0);
255
+ return;
256
+ }
257
+ #endif
258
+
259
+
260
+
261
+ [componentView toggleH5];
262
+ return;
263
+ }
264
+
265
+ if ([commandName isEqualToString:@"toggleH6"]) {
266
+ #if RCT_DEBUG
267
+ if ([args count] != 0) {
268
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedTextInputView", commandName, (int)[args count], 0);
269
+ return;
270
+ }
271
+ #endif
272
+
273
+
274
+
275
+ [componentView toggleH6];
276
+ return;
277
+ }
278
+
204
279
  if ([commandName isEqualToString:@"toggleCodeBlock"]) {
205
280
  #if RCT_DEBUG
206
281
  if ([args count] != 0) {
@@ -257,6 +332,26 @@ if ([commandName isEqualToString:@"toggleUnorderedList"]) {
257
332
  return;
258
333
  }
259
334
 
335
+ if ([commandName isEqualToString:@"toggleCheckboxList"]) {
336
+ #if RCT_DEBUG
337
+ if ([args count] != 1) {
338
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedTextInputView", commandName, (int)[args count], 1);
339
+ return;
340
+ }
341
+ #endif
342
+
343
+ NSObject *arg0 = args[0];
344
+ #if RCT_DEBUG
345
+ if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSNumber class], @"boolean", @"EnrichedTextInputView", commandName, @"1st")) {
346
+ return;
347
+ }
348
+ #endif
349
+ BOOL checked = [(NSNumber *)arg0 boolValue];
350
+
351
+ [componentView toggleCheckboxList:checked];
352
+ return;
353
+ }
354
+
260
355
  if ([commandName isEqualToString:@"addLink"]) {
261
356
  #if RCT_DEBUG
262
357
  if ([args count] != 4) {
@@ -7,11 +7,13 @@
7
7
 
8
8
  @implementation InputParser {
9
9
  EnrichedTextInputView *_input;
10
+ NSInteger _precedingImageCount;
10
11
  }
11
12
 
12
13
  - (instancetype)initWithInput:(id)input {
13
14
  self = [super init];
14
15
  _input = (EnrichedTextInputView *)input;
16
+ _precedingImageCount = 0;
15
17
  return self;
16
18
  }
17
19
 
@@ -31,6 +33,7 @@
31
33
  BOOL inOrderedList = NO;
32
34
  BOOL inBlockQuote = NO;
33
35
  BOOL inCodeBlock = NO;
36
+ BOOL inCheckboxList = NO;
34
37
  unichar lastCharacter = 0;
35
38
 
36
39
  for (int i = 0; i < text.length; i++) {
@@ -105,6 +108,21 @@
105
108
  [result appendString:@"\n</codeblock>\n<br>"];
106
109
  inCodeBlock = NO;
107
110
  }
111
+ } else if (inCheckboxList) {
112
+ CheckboxListStyle *cbLStyle = _input->stylesDict[@(CheckboxList)];
113
+ BOOL detected =
114
+ [cbLStyle detectStyle:NSMakeRange(currentRange.location, 0)];
115
+ if (detected) {
116
+ BOOL checked = [cbLStyle getCheckboxStateAt:currentRange.location];
117
+ if (checked) {
118
+ [result appendString:@"\n<li checked></li>"];
119
+ } else {
120
+ [result appendString:@"\n<li></li>"];
121
+ }
122
+ } else {
123
+ [result appendString:@"\n</ul>\n<br>"];
124
+ inCheckboxList = NO;
125
+ }
108
126
  } else {
109
127
  [result appendString:@"\n<br>"];
110
128
  }
@@ -137,10 +155,15 @@
137
155
  [previousActiveStyles containsObject:@([H1Style getStyleType])] ||
138
156
  [previousActiveStyles containsObject:@([H2Style getStyleType])] ||
139
157
  [previousActiveStyles containsObject:@([H3Style getStyleType])] ||
158
+ [previousActiveStyles containsObject:@([H4Style getStyleType])] ||
159
+ [previousActiveStyles containsObject:@([H5Style getStyleType])] ||
160
+ [previousActiveStyles containsObject:@([H6Style getStyleType])] ||
140
161
  [previousActiveStyles
141
162
  containsObject:@([BlockQuoteStyle getStyleType])] ||
142
163
  [previousActiveStyles
143
- containsObject:@([CodeBlockStyle getStyleType])]) {
164
+ containsObject:@([CodeBlockStyle getStyleType])] ||
165
+ [previousActiveStyles
166
+ containsObject:@([CheckboxListStyle getStyleType])]) {
144
167
  // do nothing, proper closing paragraph tags have been already
145
168
  // appended
146
169
  } else {
@@ -186,6 +209,13 @@
186
209
  inCodeBlock = NO;
187
210
  [result appendString:@"\n</codeblock>"];
188
211
  }
212
+ // handle ending checkbox list
213
+ if (inCheckboxList &&
214
+ ![currentActiveStyles
215
+ containsObject:@([CheckboxListStyle getStyleType])]) {
216
+ inCheckboxList = NO;
217
+ [result appendString:@"\n</ul>"];
218
+ }
189
219
 
190
220
  // handle starting unordered list
191
221
  if (!inUnorderedList &&
@@ -215,6 +245,13 @@
215
245
  inCodeBlock = YES;
216
246
  [result appendString:@"\n<codeblock>"];
217
247
  }
248
+ // handle starting checkbox list
249
+ if (!inCheckboxList &&
250
+ [currentActiveStyles
251
+ containsObject:@([CheckboxListStyle getStyleType])]) {
252
+ inCheckboxList = YES;
253
+ [result appendString:@"\n<ul data-type=\"checkbox\">"];
254
+ }
218
255
 
219
256
  // don't add the <p> tag if some paragraph styles are present
220
257
  if ([currentActiveStyles
@@ -224,10 +261,15 @@
224
261
  [currentActiveStyles containsObject:@([H1Style getStyleType])] ||
225
262
  [currentActiveStyles containsObject:@([H2Style getStyleType])] ||
226
263
  [currentActiveStyles containsObject:@([H3Style getStyleType])] ||
264
+ [currentActiveStyles containsObject:@([H4Style getStyleType])] ||
265
+ [currentActiveStyles containsObject:@([H5Style getStyleType])] ||
266
+ [currentActiveStyles containsObject:@([H6Style getStyleType])] ||
227
267
  [currentActiveStyles
228
268
  containsObject:@([BlockQuoteStyle getStyleType])] ||
229
269
  [currentActiveStyles
230
- containsObject:@([CodeBlockStyle getStyleType])]) {
270
+ containsObject:@([CodeBlockStyle getStyleType])] ||
271
+ [currentActiveStyles
272
+ containsObject:@([CheckboxListStyle getStyleType])]) {
231
273
  [result appendString:@"\n"];
232
274
  } else {
233
275
  [result appendString:@"\n<p>"];
@@ -373,13 +415,22 @@
373
415
  } else if ([previousActiveStyles
374
416
  containsObject:@([CodeBlockStyle getStyleType])]) {
375
417
  [result appendString:@"\n</codeblock>"];
418
+ } else if ([previousActiveStyles
419
+ containsObject:@([CheckboxListStyle getStyleType])]) {
420
+ [result appendString:@"\n</ul>"];
376
421
  } else if ([previousActiveStyles
377
422
  containsObject:@([H1Style getStyleType])] ||
378
423
  [previousActiveStyles
379
424
  containsObject:@([H2Style getStyleType])] ||
380
425
  [previousActiveStyles
381
- containsObject:@([H3Style getStyleType])]) {
382
- // do nothing, heading closing tag has already ben appended
426
+ containsObject:@([H3Style getStyleType])] ||
427
+ [previousActiveStyles
428
+ containsObject:@([H4Style getStyleType])] ||
429
+ [previousActiveStyles
430
+ containsObject:@([H5Style getStyleType])] ||
431
+ [previousActiveStyles
432
+ containsObject:@([H6Style getStyleType])]) {
433
+ // do nothing, heading closing tag has already been appended
383
434
  } else {
384
435
  [result appendString:@"</p>"];
385
436
  }
@@ -401,10 +452,20 @@
401
452
  inCodeBlock = NO;
402
453
  [result appendString:@"\n</codeblock>"];
403
454
  }
455
+ if (inCheckboxList) {
456
+ inCheckboxList = NO;
457
+ [result appendString:@"\n</ul>"];
458
+ }
404
459
  }
405
460
 
406
461
  [result appendString:@"\n</html>"];
407
462
 
463
+ // remove Object Replacement Characters in the very end
464
+ [result replaceOccurrencesOfString:@"\uFFFC"
465
+ withString:@""
466
+ options:0
467
+ range:NSMakeRange(0, result.length)];
468
+
408
469
  // remove zero width spaces in the very end
409
470
  [result replaceOccurrencesOfString:@"\u200B"
410
471
  withString:@""
@@ -507,9 +568,29 @@
507
568
  return @"h2";
508
569
  } else if ([style isEqualToNumber:@([H3Style getStyleType])]) {
509
570
  return @"h3";
571
+ } else if ([style isEqualToNumber:@([H4Style getStyleType])]) {
572
+ return @"h4";
573
+ } else if ([style isEqualToNumber:@([H5Style getStyleType])]) {
574
+ return @"h5";
575
+ } else if ([style isEqualToNumber:@([H6Style getStyleType])]) {
576
+ return @"h6";
510
577
  } else if ([style isEqualToNumber:@([UnorderedListStyle getStyleType])] ||
511
578
  [style isEqualToNumber:@([OrderedListStyle getStyleType])]) {
512
579
  return @"li";
580
+ } else if ([style isEqualToNumber:@([CheckboxListStyle getStyleType])]) {
581
+ if (openingTag) {
582
+ CheckboxListStyle *checkboxListStyleClass =
583
+ (CheckboxListStyle *)
584
+ _input->stylesDict[@([CheckboxListStyle getStyleType])];
585
+ BOOL checked = [checkboxListStyleClass getCheckboxStateAt:location];
586
+
587
+ if (checked) {
588
+ return @"li checked";
589
+ }
590
+ return @"li";
591
+ } else {
592
+ return @"li";
593
+ }
513
594
  } else if ([style isEqualToNumber:@([BlockQuoteStyle getStyleType])] ||
514
595
  [style isEqualToNumber:@([CodeBlockStyle getStyleType])]) {
515
596
  // blockquotes and codeblock use <p> tags the same way lists use <li>
@@ -608,6 +689,28 @@
608
689
  [((ImageStyle *)baseStyle) addImageAtRange:styleRange
609
690
  imageData:imgData
610
691
  withSelection:NO];
692
+ } else if ([styleType
693
+ isEqualToNumber:@([CheckboxListStyle getStyleType])]) {
694
+ NSDictionary *checkboxStates = (NSDictionary *)stylePair.styleValue;
695
+ CheckboxListStyle *cbLStyle = (CheckboxListStyle *)baseStyle;
696
+
697
+ // First apply the checkbox list style to the entire range with
698
+ // unchecked value
699
+ BOOL shouldAddTypingAttr =
700
+ styleRange.location + styleRange.length == plainTextLength;
701
+ [cbLStyle addAttributes:styleRange withTypingAttr:shouldAddTypingAttr];
702
+
703
+ if (!checkboxStates && checkboxStates.count == 0) {
704
+ continue;
705
+ }
706
+ // Then toggle checked checkboxes
707
+ for (NSNumber *key in checkboxStates) {
708
+ NSUInteger checkboxPosition = offset + [key unsignedIntegerValue];
709
+ BOOL isChecked = [checkboxStates[key] boolValue];
710
+ if (isChecked) {
711
+ [cbLStyle toggleCheckedAt:checkboxPosition];
712
+ }
713
+ }
611
714
  } else {
612
715
  BOOL shouldAddTypingAttr =
613
716
  styleRange.location + styleRange.length == plainTextLength;
@@ -726,6 +829,10 @@
726
829
  inString:fixedHtml
727
830
  leading:YES
728
831
  trailing:NO];
832
+ fixedHtml = [self stringByAddingNewlinesToTag:@"<li checked>"
833
+ inString:fixedHtml
834
+ leading:YES
835
+ trailing:NO];
729
836
  fixedHtml = [self stringByAddingNewlinesToTag:@"<h1>"
730
837
  inString:fixedHtml
731
838
  leading:YES
@@ -738,6 +845,18 @@
738
845
  inString:fixedHtml
739
846
  leading:YES
740
847
  trailing:NO];
848
+ fixedHtml = [self stringByAddingNewlinesToTag:@"<h4>"
849
+ inString:fixedHtml
850
+ leading:YES
851
+ trailing:NO];
852
+ fixedHtml = [self stringByAddingNewlinesToTag:@"<h5>"
853
+ inString:fixedHtml
854
+ leading:YES
855
+ trailing:NO];
856
+ fixedHtml = [self stringByAddingNewlinesToTag:@"<h6>"
857
+ inString:fixedHtml
858
+ leading:YES
859
+ trailing:NO];
741
860
 
742
861
  // line closing tags
743
862
  fixedHtml = [self stringByAddingNewlinesToTag:@"</p>"
@@ -760,6 +879,18 @@
760
879
  inString:fixedHtml
761
880
  leading:NO
762
881
  trailing:YES];
882
+ fixedHtml = [self stringByAddingNewlinesToTag:@"</h4>"
883
+ inString:fixedHtml
884
+ leading:NO
885
+ trailing:YES];
886
+ fixedHtml = [self stringByAddingNewlinesToTag:@"</h5>"
887
+ inString:fixedHtml
888
+ leading:NO
889
+ trailing:YES];
890
+ fixedHtml = [self stringByAddingNewlinesToTag:@"</h6>"
891
+ inString:fixedHtml
892
+ leading:NO
893
+ trailing:YES];
763
894
 
764
895
  // this is more like a hack but for some reason the last <br> in
765
896
  // <blockquote> and <codeblock> are not properly changed into zero width
@@ -788,11 +919,11 @@
788
919
  * APPROACH:
789
920
  * This function treats the HTML as having two distinct states:
790
921
  * 1. Structure Mode (Depth == 0): We are inside or between container tags (like
791
- * <blockquote>, <ul>, <codeblock>). In this mode whitespace and newlines are
922
+ * blockquote, ul, codeblock). In this mode whitespace and newlines are
792
923
  * considered layout artifacts and are REMOVED to prevent the parser from
793
924
  * creating unwanted spaces.
794
- * 2. Content Mode (Depth > 0): We are inside a text-containing tag (like <p>,
795
- * <b>, <li>). In this mode, all whitespace is PRESERVED exactly as is, ensuring
925
+ * 2. Content Mode (Depth > 0): We are inside a text-containing tag (like p,
926
+ * b, li). In this mode, all whitespace is PRESERVED exactly as is, ensuring
796
927
  * that sentences and inline formatting remain readable.
797
928
  *
798
929
  * The function iterates character-by-character, using a depth counter to track
@@ -800,13 +931,13 @@
800
931
  *
801
932
  * IMPORTANT:
802
933
  * The `textTags` set acts as a whitelist for "Content Mode". If you add support
803
- * for a new HTML tag that contains visible text (e.g., <h4>, <h5>, <h6>),
934
+ * for a new HTML tag that contains visible text (e.g., h4, h5, h6),
804
935
  * you MUST add it to the `textTags` set below.
805
936
  */
806
937
  - (NSString *)stripExtraWhiteSpacesAndNewlines:(NSString *)html {
807
- NSSet *textTags =
808
- [NSSet setWithObjects:@"p", @"h1", @"h2", @"h3", @"li", @"b", @"a", @"s",
809
- @"mention", @"code", @"u", @"i", nil];
938
+ NSSet *textTags = [NSSet setWithObjects:@"p", @"h1", @"h2", @"h3", @"h4",
939
+ @"h5", @"h6", @"li", @"b", @"a", @"s",
940
+ @"mention", @"code", @"u", @"i", nil];
810
941
 
811
942
  NSMutableString *output = [NSMutableString stringWithCapacity:html.length];
812
943
  NSMutableString *currentTagBuffer = [NSMutableString string];
@@ -901,7 +1032,19 @@
901
1032
 
902
1033
  NSArray *tagData = ongoingTags[tagName];
903
1034
  NSInteger tagLocation = [((NSNumber *)tagData[0]) intValue];
904
- NSRange tagRange = NSMakeRange(tagLocation, plainText.length - tagLocation);
1035
+
1036
+ // 'tagLocation' is an index based on 'plainText' which currently only holds
1037
+ // raw text.
1038
+ //
1039
+ // Since 'plainText' does not yet contain the special placeholders for images,
1040
+ // the indices for any text following an image are lower than they will be
1041
+ // in the final NSTextStorage.
1042
+ //
1043
+ // We add '_precedingImageCount' to shift the start index forward, aligning
1044
+ // this style's range with the actual position in the final text (where each
1045
+ // image adds 1 character).
1046
+ NSRange tagRange = NSMakeRange(tagLocation + _precedingImageCount,
1047
+ plainText.length - tagLocation);
905
1048
 
906
1049
  [tagEntry addObject:[tagName copy]];
907
1050
  [tagEntry addObject:[NSValue valueWithRange:tagRange]];
@@ -911,12 +1054,19 @@
911
1054
 
912
1055
  [processedTags addObject:tagEntry];
913
1056
  [ongoingTags removeObjectForKey:tagName];
1057
+
1058
+ if ([tagName isEqualToString:@"img"]) {
1059
+ _precedingImageCount++;
1060
+ }
914
1061
  }
915
1062
 
916
1063
  - (NSArray *)getTextAndStylesFromHtml:(NSString *)fixedHtml {
917
1064
  NSMutableString *plainText = [[NSMutableString alloc] initWithString:@""];
918
1065
  NSMutableDictionary *ongoingTags = [[NSMutableDictionary alloc] init];
919
1066
  NSMutableArray *initiallyProcessedTags = [[NSMutableArray alloc] init];
1067
+ NSMutableDictionary *checkboxStates = [[NSMutableDictionary alloc] init];
1068
+ BOOL insideCheckboxList = NO;
1069
+ _precedingImageCount = 0;
920
1070
  BOOL insideTag = NO;
921
1071
  BOOL gettingTagName = NO;
922
1072
  BOOL gettingTagParams = NO;
@@ -956,9 +1106,14 @@
956
1106
  }
957
1107
 
958
1108
  if ([currentTagName isEqualToString:@"p"] ||
959
- [currentTagName isEqualToString:@"br"] ||
960
- [currentTagName isEqualToString:@"li"]) {
1109
+ [currentTagName isEqualToString:@"br"]) {
961
1110
  // do nothing, we don't include these tags in styles
1111
+ } else if ([currentTagName isEqualToString:@"li"]) {
1112
+ // Only track checkbox state if we're inside a checkbox list
1113
+ if (insideCheckboxList && !closingTag) {
1114
+ BOOL isChecked = [currentTagParams containsString:@"checked"];
1115
+ checkboxStates[@(plainText.length)] = @(isChecked);
1116
+ }
962
1117
  } else if (!closingTag) {
963
1118
  // we finish opening tag - get its location and optionally params and
964
1119
  // put them under tag name key in ongoingTags
@@ -969,6 +1124,12 @@
969
1124
  }
970
1125
  ongoingTags[currentTagName] = tagArr;
971
1126
 
1127
+ // Check if this is a checkbox list
1128
+ if ([currentTagName isEqualToString:@"ul"] &&
1129
+ [self isUlCheckboxList:currentTagParams]) {
1130
+ insideCheckboxList = YES;
1131
+ }
1132
+
972
1133
  // skip one newline after opening tags that are in separate lines
973
1134
  // intentionally
974
1135
  if ([currentTagName isEqualToString:@"ul"] ||
@@ -988,6 +1149,12 @@
988
1149
  // we finish closing tags - pack tag name, tag range and optionally tag
989
1150
  // params into an entry that goes inside initiallyProcessedTags
990
1151
 
1152
+ // Check if we're closing a checkbox list by looking at the params
1153
+ if ([currentTagName isEqualToString:@"ul"] &&
1154
+ [self isUlCheckboxList:currentTagParams]) {
1155
+ insideCheckboxList = NO;
1156
+ }
1157
+
991
1158
  // skip one newline that was added before some closing tags that are in
992
1159
  // separate lines
993
1160
  if ([currentTagName isEqualToString:@"ul"] ||
@@ -1148,7 +1315,7 @@
1148
1315
  [styleArr addObject:@([MentionStyle getStyleType])];
1149
1316
  // extract html expression into dict using some regex
1150
1317
  NSMutableDictionary *paramsDict = [[NSMutableDictionary alloc] init];
1151
- NSString *pattern = @"(\\w+)=\"([^\"]*)\"";
1318
+ NSString *pattern = @"(\\w+)=(['\"])(.*?)\\2";
1152
1319
  NSRegularExpression *regex =
1153
1320
  [NSRegularExpression regularExpressionWithPattern:pattern
1154
1321
  options:0
@@ -1160,11 +1327,11 @@
1160
1327
  usingBlock:^(NSTextCheckingResult *_Nullable result,
1161
1328
  NSMatchingFlags flags,
1162
1329
  BOOL *_Nonnull stop) {
1163
- if (result.numberOfRanges == 3) {
1330
+ if (result.numberOfRanges == 4) {
1164
1331
  NSString *key = [params
1165
1332
  substringWithRange:[result rangeAtIndex:1]];
1166
1333
  NSString *value = [params
1167
- substringWithRange:[result rangeAtIndex:2]];
1334
+ substringWithRange:[result rangeAtIndex:3]];
1168
1335
  paramsDict[key] = value;
1169
1336
  }
1170
1337
  }];
@@ -1192,9 +1359,22 @@
1192
1359
  [styleArr addObject:@([H2Style getStyleType])];
1193
1360
  } else if ([tagName isEqualToString:@"h3"]) {
1194
1361
  [styleArr addObject:@([H3Style getStyleType])];
1362
+ } else if ([tagName isEqualToString:@"h4"]) {
1363
+ [styleArr addObject:@([H4Style getStyleType])];
1364
+ } else if ([tagName isEqualToString:@"h5"]) {
1365
+ [styleArr addObject:@([H5Style getStyleType])];
1366
+ } else if ([tagName isEqualToString:@"h6"]) {
1367
+ [styleArr addObject:@([H6Style getStyleType])];
1195
1368
  }
1196
1369
  } else if ([tagName isEqualToString:@"ul"]) {
1197
- [styleArr addObject:@([UnorderedListStyle getStyleType])];
1370
+ if ([self isUlCheckboxList:params]) {
1371
+ [styleArr addObject:@([CheckboxListStyle getStyleType])];
1372
+ stylePair.styleValue =
1373
+ [self prepareCheckboxListStyleValue:tagRangeValue
1374
+ checkboxStates:checkboxStates];
1375
+ } else {
1376
+ [styleArr addObject:@([UnorderedListStyle getStyleType])];
1377
+ }
1198
1378
  } else if ([tagName isEqualToString:@"ol"]) {
1199
1379
  [styleArr addObject:@([OrderedListStyle getStyleType])];
1200
1380
  } else if ([tagName isEqualToString:@"blockquote"]) {
@@ -1215,4 +1395,24 @@
1215
1395
  return @[ plainText, processedStyles ];
1216
1396
  }
1217
1397
 
1398
+ - (BOOL)isUlCheckboxList:(NSString *)params {
1399
+ return ([params containsString:@"data-type=\"checkbox\""] ||
1400
+ [params containsString:@"data-type='checkbox'"]);
1401
+ }
1402
+
1403
+ - (NSDictionary *)prepareCheckboxListStyleValue:(NSValue *)rangeValue
1404
+ checkboxStates:(NSDictionary *)checkboxStates {
1405
+ NSRange range = [rangeValue rangeValue];
1406
+ NSMutableDictionary *statesInRange = [[NSMutableDictionary alloc] init];
1407
+
1408
+ for (NSNumber *key in checkboxStates) {
1409
+ NSUInteger pos = [key unsignedIntegerValue];
1410
+ if (pos >= range.location && pos < range.location + range.length) {
1411
+ [statesInRange setObject:checkboxStates[key] forKey:key];
1412
+ }
1413
+ }
1414
+
1415
+ return statesInRange;
1416
+ }
1417
+
1218
1418
  @end