@fendent/react-native-enriched 0.5.2-fork.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 (278) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +343 -0
  3. package/ReactNativeEnriched.podspec +31 -0
  4. package/android/build.gradle +106 -0
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +197 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +72 -0
  7. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ComponentDescriptors.cpp +22 -0
  8. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ComponentDescriptors.h +24 -0
  9. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.cpp +434 -0
  10. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.h +391 -0
  11. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/Props.cpp +173 -0
  12. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/Props.h +833 -0
  13. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ShadowNodes.cpp +17 -0
  14. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/ShadowNodes.h +23 -0
  15. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/States.cpp +16 -0
  16. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/States.h +20 -0
  17. package/android/gradle.properties +5 -0
  18. package/android/lint.gradle +70 -0
  19. package/android/src/main/AndroidManifest.xml +3 -0
  20. package/android/src/main/AndroidManifestNew.xml +2 -0
  21. package/android/src/main/java/com/swmansion/enriched/ReactNativeEnrichedPackage.kt +20 -0
  22. package/android/src/main/java/com/swmansion/enriched/common/AsyncDrawable.kt +126 -0
  23. package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
  24. package/android/src/main/java/com/swmansion/enriched/common/EnrichedConstants.kt +11 -0
  25. package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
  26. package/android/src/main/java/com/swmansion/enriched/common/ForceRedrawSpan.kt +14 -0
  27. package/android/src/main/java/com/swmansion/enriched/common/GumboNormalizer.kt +5 -0
  28. package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
  29. package/android/src/main/java/com/swmansion/enriched/common/ResourceManager.kt +26 -0
  30. package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedParser.java +956 -0
  31. package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
  32. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBlockQuoteSpan.kt +53 -0
  33. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
  34. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +92 -0
  35. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCodeBlockSpan.kt +81 -0
  36. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
  37. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
  38. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
  39. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
  40. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
  41. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
  42. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedImageSpan.kt +184 -0
  43. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedInlineCodeSpan.kt +24 -0
  44. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
  45. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedLinkSpan.kt +29 -0
  46. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedMentionSpan.kt +35 -0
  47. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedOrderedListSpan.kt +79 -0
  48. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
  49. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
  50. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnorderedListSpan.kt +62 -0
  51. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedBlockSpan.kt +5 -0
  52. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedHeadingSpan.kt +3 -0
  53. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
  54. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedParagraphSpan.kt +5 -0
  55. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
  56. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedZeroWidthSpaceSpan.kt +4 -0
  57. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputConnectionWrapper.kt +140 -0
  58. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
  59. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputView.kt +1120 -0
  60. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputViewLayoutManager.kt +27 -0
  61. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputViewManager.kt +478 -0
  62. package/android/src/main/java/com/swmansion/enriched/textinput/MeasurementStore.kt +225 -0
  63. package/android/src/main/java/com/swmansion/enriched/textinput/events/MentionHandler.kt +55 -0
  64. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeHtmlEvent.kt +27 -0
  65. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeSelectionEvent.kt +30 -0
  66. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeStateEvent.kt +21 -0
  67. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeTextEvent.kt +30 -0
  68. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnContextMenuItemPressEvent.kt +35 -0
  69. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputBlurEvent.kt +25 -0
  70. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputFocusEvent.kt +25 -0
  71. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputKeyPressEvent.kt +27 -0
  72. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnLinkDetectedEvent.kt +32 -0
  73. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnMentionDetectedEvent.kt +30 -0
  74. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnMentionEvent.kt +34 -0
  75. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
  76. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnRequestHtmlResultEvent.kt +32 -0
  77. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnSubmitEditingEvent.kt +29 -0
  78. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
  79. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
  80. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
  81. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
  82. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
  83. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
  84. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
  85. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
  86. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
  87. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
  88. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
  89. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
  90. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
  91. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +16 -0
  92. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
  93. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
  94. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
  95. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
  96. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
  97. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedLineHeightSpan.kt +44 -0
  98. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedSpans.kt +241 -0
  99. package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
  100. package/android/src/main/java/com/swmansion/enriched/textinput/styles/HtmlStyle.kt +372 -0
  101. package/android/src/main/java/com/swmansion/enriched/textinput/styles/InlineStyles.kt +164 -0
  102. package/android/src/main/java/com/swmansion/enriched/textinput/styles/ListStyles.kt +263 -0
  103. package/android/src/main/java/com/swmansion/enriched/textinput/styles/ParagraphStyles.kt +434 -0
  104. package/android/src/main/java/com/swmansion/enriched/textinput/styles/ParametrizedStyles.kt +394 -0
  105. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt +17 -0
  106. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSelection.kt +320 -0
  107. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpanState.kt +310 -0
  108. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannable.kt +106 -0
  109. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannableStringBuilder.kt +24 -0
  110. package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
  111. package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
  112. package/android/src/main/java/com/swmansion/enriched/textinput/watchers/EnrichedSpanWatcher.kt +107 -0
  113. package/android/src/main/java/com/swmansion/enriched/textinput/watchers/EnrichedTextWatcher.kt +74 -0
  114. package/android/src/main/new_arch/CMakeLists.txt +62 -0
  115. package/android/src/main/new_arch/GumboNormalizerJni.cpp +14 -0
  116. package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
  117. package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
  118. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputComponentDescriptor.h +35 -0
  119. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputMeasurementManager.cpp +53 -0
  120. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputMeasurementManager.h +25 -0
  121. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputShadowNode.cpp +35 -0
  122. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputShadowNode.h +53 -0
  123. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputState.cpp +9 -0
  124. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/EnrichedTextInputState.h +24 -0
  125. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/conversions.h +27 -0
  126. package/android/src/main/res/drawable/broken_image.xml +10 -0
  127. package/cpp/CMakeLists.txt +50 -0
  128. package/cpp/GumboParser/GumboParser.h +34043 -0
  129. package/cpp/README.md +59 -0
  130. package/cpp/parser/GumboNormalizer.c +915 -0
  131. package/cpp/parser/GumboParser.cpp +16 -0
  132. package/cpp/parser/GumboParser.hpp +23 -0
  133. package/cpp/tests/GumboParserTest.cpp +457 -0
  134. package/ios/EnrichedTextInputView.h +53 -0
  135. package/ios/EnrichedTextInputView.mm +2360 -0
  136. package/ios/EnrichedTextInputViewManager.mm +13 -0
  137. package/ios/attributesManager/AttributesManager.h +17 -0
  138. package/ios/attributesManager/AttributesManager.mm +195 -0
  139. package/ios/config/InputConfig.h +104 -0
  140. package/ios/config/InputConfig.mm +664 -0
  141. package/ios/extensions/ColorExtension.h +7 -0
  142. package/ios/extensions/ColorExtension.mm +38 -0
  143. package/ios/extensions/FontExtension.h +11 -0
  144. package/ios/extensions/FontExtension.mm +72 -0
  145. package/ios/extensions/ImageExtension.h +34 -0
  146. package/ios/extensions/ImageExtension.mm +165 -0
  147. package/ios/extensions/LayoutManagerExtension.h +6 -0
  148. package/ios/extensions/LayoutManagerExtension.mm +443 -0
  149. package/ios/extensions/StringExtension.h +15 -0
  150. package/ios/extensions/StringExtension.mm +69 -0
  151. package/ios/generated/ReactNativeEnrichedSpec/ComponentDescriptors.cpp +22 -0
  152. package/ios/generated/ReactNativeEnrichedSpec/ComponentDescriptors.h +24 -0
  153. package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.cpp +434 -0
  154. package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.h +391 -0
  155. package/ios/generated/ReactNativeEnrichedSpec/Props.cpp +173 -0
  156. package/ios/generated/ReactNativeEnrichedSpec/Props.h +833 -0
  157. package/ios/generated/ReactNativeEnrichedSpec/RCTComponentViewHelpers.h +582 -0
  158. package/ios/generated/ReactNativeEnrichedSpec/ShadowNodes.cpp +17 -0
  159. package/ios/generated/ReactNativeEnrichedSpec/ShadowNodes.h +23 -0
  160. package/ios/generated/ReactNativeEnrichedSpec/States.cpp +16 -0
  161. package/ios/generated/ReactNativeEnrichedSpec/States.h +20 -0
  162. package/ios/inputParser/InputParser.h +11 -0
  163. package/ios/inputParser/InputParser.mm +1463 -0
  164. package/ios/inputTextView/InputTextView.h +6 -0
  165. package/ios/inputTextView/InputTextView.mm +285 -0
  166. package/ios/interfaces/AttributeEntry.h +9 -0
  167. package/ios/interfaces/AttributeEntry.mm +4 -0
  168. package/ios/interfaces/BaseStyleProtocol.h +17 -0
  169. package/ios/interfaces/ImageAttachment.h +11 -0
  170. package/ios/interfaces/ImageAttachment.mm +107 -0
  171. package/ios/interfaces/ImageData.h +10 -0
  172. package/ios/interfaces/ImageData.mm +4 -0
  173. package/ios/interfaces/LinkData.h +11 -0
  174. package/ios/interfaces/LinkData.mm +29 -0
  175. package/ios/interfaces/LinkRegexConfig.h +19 -0
  176. package/ios/interfaces/LinkRegexConfig.mm +37 -0
  177. package/ios/interfaces/MediaAttachment.h +23 -0
  178. package/ios/interfaces/MediaAttachment.mm +31 -0
  179. package/ios/interfaces/MentionParams.h +8 -0
  180. package/ios/interfaces/MentionParams.mm +4 -0
  181. package/ios/interfaces/MentionStyleProps.h +13 -0
  182. package/ios/interfaces/MentionStyleProps.mm +63 -0
  183. package/ios/interfaces/StyleBase.h +36 -0
  184. package/ios/interfaces/StyleBase.mm +256 -0
  185. package/ios/interfaces/StyleHeaders.h +102 -0
  186. package/ios/interfaces/StylePair.h +9 -0
  187. package/ios/interfaces/StylePair.mm +4 -0
  188. package/ios/interfaces/StyleTypeEnum.h +26 -0
  189. package/ios/interfaces/TextDecorationLineEnum.h +6 -0
  190. package/ios/interfaces/TextDecorationLineEnum.mm +4 -0
  191. package/ios/internals/EnrichedTextInputViewComponentDescriptor.h +19 -0
  192. package/ios/internals/EnrichedTextInputViewShadowNode.h +44 -0
  193. package/ios/internals/EnrichedTextInputViewShadowNode.mm +103 -0
  194. package/ios/internals/EnrichedTextInputViewState.cpp +10 -0
  195. package/ios/internals/EnrichedTextInputViewState.h +22 -0
  196. package/ios/styles/BlockQuoteStyle.mm +55 -0
  197. package/ios/styles/BoldStyle.mm +37 -0
  198. package/ios/styles/CheckboxListStyle.mm +153 -0
  199. package/ios/styles/CodeBlockStyle.mm +49 -0
  200. package/ios/styles/H1Style.mm +20 -0
  201. package/ios/styles/H2Style.mm +20 -0
  202. package/ios/styles/H3Style.mm +20 -0
  203. package/ios/styles/H4Style.mm +20 -0
  204. package/ios/styles/H5Style.mm +20 -0
  205. package/ios/styles/H6Style.mm +20 -0
  206. package/ios/styles/HeadingStyleBase.mm +65 -0
  207. package/ios/styles/ImageStyle.mm +146 -0
  208. package/ios/styles/InlineCodeStyle.mm +65 -0
  209. package/ios/styles/ItalicStyle.mm +37 -0
  210. package/ios/styles/LinkStyle.mm +532 -0
  211. package/ios/styles/MentionStyle.mm +538 -0
  212. package/ios/styles/OrderedListStyle.mm +86 -0
  213. package/ios/styles/StrikethroughStyle.mm +25 -0
  214. package/ios/styles/UnderlineStyle.mm +24 -0
  215. package/ios/styles/UnorderedListStyle.mm +86 -0
  216. package/ios/utils/CheckboxHitTestUtils.h +10 -0
  217. package/ios/utils/CheckboxHitTestUtils.mm +122 -0
  218. package/ios/utils/DotReplacementUtils.h +10 -0
  219. package/ios/utils/DotReplacementUtils.mm +68 -0
  220. package/ios/utils/KeyboardUtils.h +7 -0
  221. package/ios/utils/KeyboardUtils.mm +31 -0
  222. package/ios/utils/OccurenceUtils.h +44 -0
  223. package/ios/utils/OccurenceUtils.mm +179 -0
  224. package/ios/utils/ParagraphAttributesUtils.h +15 -0
  225. package/ios/utils/ParagraphAttributesUtils.mm +257 -0
  226. package/ios/utils/RangeUtils.h +12 -0
  227. package/ios/utils/RangeUtils.mm +183 -0
  228. package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
  229. package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
  230. package/ios/utils/TextInsertionUtils.h +17 -0
  231. package/ios/utils/TextInsertionUtils.mm +64 -0
  232. package/ios/utils/WordsUtils.h +7 -0
  233. package/ios/utils/WordsUtils.mm +98 -0
  234. package/ios/utils/ZeroWidthSpaceUtils.h +9 -0
  235. package/ios/utils/ZeroWidthSpaceUtils.mm +270 -0
  236. package/lib/module/index.js +4 -0
  237. package/lib/module/index.js.map +1 -0
  238. package/lib/module/native/EnrichedTextInput.js +304 -0
  239. package/lib/module/native/EnrichedTextInput.js.map +1 -0
  240. package/lib/module/package.json +1 -0
  241. package/lib/module/spec/EnrichedTextInputNativeComponent.ts +517 -0
  242. package/lib/module/types.js +4 -0
  243. package/lib/module/types.js.map +1 -0
  244. package/lib/module/utils/EnrichedTextInputDefaultProps.js +12 -0
  245. package/lib/module/utils/EnrichedTextInputDefaultProps.js.map +1 -0
  246. package/lib/module/utils/normalizeHtmlStyle.js +155 -0
  247. package/lib/module/utils/normalizeHtmlStyle.js.map +1 -0
  248. package/lib/module/utils/nullthrows.js +9 -0
  249. package/lib/module/utils/nullthrows.js.map +1 -0
  250. package/lib/module/utils/regexParser.js +46 -0
  251. package/lib/module/utils/regexParser.js.map +1 -0
  252. package/lib/typescript/package.json +1 -0
  253. package/lib/typescript/src/index.d.ts +3 -0
  254. package/lib/typescript/src/index.d.ts.map +1 -0
  255. package/lib/typescript/src/native/EnrichedTextInput.d.ts +3 -0
  256. package/lib/typescript/src/native/EnrichedTextInput.d.ts.map +1 -0
  257. package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts +397 -0
  258. package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
  259. package/lib/typescript/src/types.d.ts +447 -0
  260. package/lib/typescript/src/types.d.ts.map +1 -0
  261. package/lib/typescript/src/utils/EnrichedTextInputDefaultProps.d.ts +10 -0
  262. package/lib/typescript/src/utils/EnrichedTextInputDefaultProps.d.ts.map +1 -0
  263. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +4 -0
  264. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -0
  265. package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
  266. package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
  267. package/lib/typescript/src/utils/regexParser.d.ts +3 -0
  268. package/lib/typescript/src/utils/regexParser.d.ts.map +1 -0
  269. package/package.json +226 -0
  270. package/react-native.config.js +13 -0
  271. package/src/index.tsx +20 -0
  272. package/src/native/EnrichedTextInput.tsx +370 -0
  273. package/src/spec/EnrichedTextInputNativeComponent.ts +517 -0
  274. package/src/types.ts +499 -0
  275. package/src/utils/EnrichedTextInputDefaultProps.ts +9 -0
  276. package/src/utils/normalizeHtmlStyle.ts +199 -0
  277. package/src/utils/nullthrows.ts +7 -0
  278. package/src/utils/regexParser.ts +56 -0
@@ -0,0 +1,29 @@
1
+ package com.swmansion.enriched.common.spans
2
+
3
+ import android.text.TextPaint
4
+ import android.text.style.ClickableSpan
5
+ import android.view.View
6
+ import com.swmansion.enriched.common.EnrichedStyle
7
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
8
+
9
+ open class EnrichedLinkSpan(
10
+ private val url: String,
11
+ private val enrichedStyle: EnrichedStyle,
12
+ private val isManual: Boolean,
13
+ ) : ClickableSpan(),
14
+ EnrichedInlineSpan {
15
+ override fun onClick(view: View) {
16
+ // Do nothing, links inside the input are not clickable.
17
+ // We are using `ClickableSpan` to allow the text to be styled as a link.
18
+ }
19
+
20
+ override fun updateDrawState(textPaint: TextPaint) {
21
+ super.updateDrawState(textPaint)
22
+ textPaint.color = enrichedStyle.aColor
23
+ textPaint.isUnderlineText = enrichedStyle.aUnderline
24
+ }
25
+
26
+ fun getUrl(): String = url
27
+
28
+ fun getIsManual(): Boolean = isManual
29
+ }
@@ -0,0 +1,35 @@
1
+ package com.swmansion.enriched.common.spans
2
+
3
+ import android.text.TextPaint
4
+ import android.text.style.ClickableSpan
5
+ import android.view.View
6
+ import com.swmansion.enriched.common.EnrichedStyle
7
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
8
+
9
+ open class EnrichedMentionSpan(
10
+ private val text: String,
11
+ private val indicator: String,
12
+ private val attributes: Map<String, String>,
13
+ private val enrichedStyle: EnrichedStyle,
14
+ ) : ClickableSpan(),
15
+ EnrichedInlineSpan {
16
+ override fun onClick(view: View) {
17
+ // Do nothing. Mentions inside the input are not clickable.
18
+ // We are using `ClickableSpan` to allow the text to be styled as a clickable element.
19
+ }
20
+
21
+ override fun updateDrawState(textPaint: TextPaint) {
22
+ super.updateDrawState(textPaint)
23
+
24
+ val mentionsStyle = enrichedStyle.mentionsStyle[indicator] ?: return
25
+ textPaint.color = mentionsStyle.color
26
+ textPaint.bgColor = mentionsStyle.backgroundColor
27
+ textPaint.isUnderlineText = mentionsStyle.underline
28
+ }
29
+
30
+ fun getAttributes(): Map<String, String> = attributes
31
+
32
+ fun getText(): String = text
33
+
34
+ fun getIndicator(): String = indicator
35
+ }
@@ -0,0 +1,79 @@
1
+ package com.swmansion.enriched.common.spans
2
+
3
+ import android.graphics.Canvas
4
+ import android.graphics.Paint
5
+ import android.graphics.Typeface
6
+ import android.os.Build
7
+ import android.text.Layout
8
+ import android.text.TextPaint
9
+ import android.text.style.LeadingMarginSpan
10
+ import android.text.style.MetricAffectingSpan
11
+ import com.swmansion.enriched.common.EnrichedStyle
12
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedParagraphSpan
13
+
14
+ open class EnrichedOrderedListSpan(
15
+ var index: Int,
16
+ private val enrichedStyle: EnrichedStyle,
17
+ ) : MetricAffectingSpan(),
18
+ LeadingMarginSpan,
19
+ EnrichedParagraphSpan {
20
+ override fun updateMeasureState(p0: TextPaint) {
21
+ // Do nothing, but inform layout that this span affects text metrics
22
+ }
23
+
24
+ override fun updateDrawState(p0: TextPaint?) {
25
+ // Do nothing, but inform layout that this span affects text metrics
26
+ }
27
+
28
+ override fun getLeadingMargin(first: Boolean): Int = enrichedStyle.olMarginLeft + enrichedStyle.olGapWidth
29
+
30
+ override fun drawLeadingMargin(
31
+ canvas: Canvas,
32
+ paint: Paint,
33
+ x: Int,
34
+ dir: Int,
35
+ top: Int,
36
+ baseline: Int,
37
+ bottom: Int,
38
+ t: CharSequence?,
39
+ start: Int,
40
+ end: Int,
41
+ first: Boolean,
42
+ layout: Layout?,
43
+ ) {
44
+ if (first) {
45
+ val text = "$index."
46
+ val width = paint.measureText(text)
47
+
48
+ val yPosition = baseline.toFloat()
49
+ val xPosition = (enrichedStyle.olMarginLeft + x - width / 2) * dir
50
+
51
+ val originalColor = paint.color
52
+ val originalTypeface = paint.typeface
53
+
54
+ paint.color = enrichedStyle.olMarkerColor ?: originalColor
55
+ paint.typeface = getTypeface(enrichedStyle.olMarkerFontWeight, originalTypeface)
56
+ canvas.drawText(text, xPosition, yPosition, paint)
57
+
58
+ paint.color = originalColor
59
+ paint.typeface = originalTypeface
60
+ }
61
+ }
62
+
63
+ private fun getTypeface(
64
+ fontWeight: Int?,
65
+ originalTypeface: Typeface,
66
+ ): Typeface =
67
+ if (fontWeight == null) {
68
+ originalTypeface
69
+ } else if (Build.VERSION.SDK_INT >= 28) {
70
+ Typeface.create(originalTypeface, fontWeight, false)
71
+ } else {
72
+ // Fallback for API < 28: only bold/normal supported
73
+ if (fontWeight == Typeface.BOLD) {
74
+ Typeface.create(originalTypeface, Typeface.BOLD)
75
+ } else {
76
+ Typeface.create(originalTypeface, Typeface.NORMAL)
77
+ }
78
+ }
79
+ }
@@ -0,0 +1,11 @@
1
+ package com.swmansion.enriched.common.spans
2
+
3
+ import android.text.style.StrikethroughSpan
4
+ import com.swmansion.enriched.common.EnrichedStyle
5
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
6
+
7
+ @Suppress("UNUSED_PARAMETER")
8
+ open class EnrichedStrikeThroughSpan(
9
+ private val enrichedStyle: EnrichedStyle,
10
+ ) : StrikethroughSpan(),
11
+ EnrichedInlineSpan
@@ -0,0 +1,11 @@
1
+ package com.swmansion.enriched.common.spans
2
+
3
+ import android.text.style.UnderlineSpan
4
+ import com.swmansion.enriched.common.EnrichedStyle
5
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
6
+
7
+ @Suppress("UNUSED_PARAMETER")
8
+ open class EnrichedUnderlineSpan(
9
+ private val enrichedStyle: EnrichedStyle,
10
+ ) : UnderlineSpan(),
11
+ EnrichedInlineSpan
@@ -0,0 +1,62 @@
1
+ package com.swmansion.enriched.common.spans
2
+
3
+ import android.graphics.Canvas
4
+ import android.graphics.Paint
5
+ import android.text.Layout
6
+ import android.text.Spanned
7
+ import android.text.TextPaint
8
+ import android.text.style.LeadingMarginSpan
9
+ import android.text.style.MetricAffectingSpan
10
+ import com.swmansion.enriched.common.EnrichedStyle
11
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedParagraphSpan
12
+
13
+ // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/android/text/style/BulletSpan.java
14
+ open class EnrichedUnorderedListSpan(
15
+ private val enrichedStyle: EnrichedStyle,
16
+ ) : MetricAffectingSpan(),
17
+ LeadingMarginSpan,
18
+ EnrichedParagraphSpan {
19
+ override fun updateMeasureState(p0: TextPaint) {
20
+ // Do nothing, but inform layout that this span affects text metrics
21
+ }
22
+
23
+ override fun updateDrawState(p0: TextPaint?) {
24
+ // Do nothing, but inform layout that this span affects text metrics
25
+ }
26
+
27
+ override fun getLeadingMargin(p0: Boolean): Int = enrichedStyle.ulBulletSize + enrichedStyle.ulGapWidth + enrichedStyle.ulMarginLeft
28
+
29
+ override fun drawLeadingMargin(
30
+ canvas: Canvas,
31
+ paint: Paint,
32
+ x: Int,
33
+ dir: Int,
34
+ top: Int,
35
+ baseline: Int,
36
+ bottom: Int,
37
+ text: CharSequence,
38
+ start: Int,
39
+ end: Int,
40
+ first: Boolean,
41
+ layout: Layout?,
42
+ ) {
43
+ val spannedText = text as Spanned
44
+
45
+ if (spannedText.getSpanStart(this) == start) {
46
+ val style = paint.style
47
+ val oldColor = paint.color
48
+ paint.color = enrichedStyle.ulBulletColor
49
+ paint.style = Paint.Style.FILL
50
+
51
+ val bulletRadius = enrichedStyle.ulBulletSize / 2f
52
+ val fm = paint.fontMetricsInt
53
+ val yPosition = baseline + (fm.ascent + fm.descent) / 2f
54
+ val xPosition = x + dir * bulletRadius + enrichedStyle.ulMarginLeft
55
+
56
+ canvas.drawCircle(xPosition, yPosition, bulletRadius, paint)
57
+
58
+ paint.color = oldColor
59
+ paint.style = style
60
+ }
61
+ }
62
+ }
@@ -0,0 +1,5 @@
1
+ package com.swmansion.enriched.common.spans.interfaces
2
+
3
+ interface EnrichedBlockSpan :
4
+ EnrichedSpan,
5
+ EnrichedZeroWidthSpaceSpan
@@ -0,0 +1,3 @@
1
+ package com.swmansion.enriched.common.spans.interfaces
2
+
3
+ interface EnrichedHeadingSpan : EnrichedParagraphSpan
@@ -0,0 +1,3 @@
1
+ package com.swmansion.enriched.common.spans.interfaces
2
+
3
+ interface EnrichedInlineSpan : EnrichedSpan
@@ -0,0 +1,5 @@
1
+ package com.swmansion.enriched.common.spans.interfaces
2
+
3
+ interface EnrichedParagraphSpan :
4
+ EnrichedSpan,
5
+ EnrichedZeroWidthSpaceSpan
@@ -0,0 +1,3 @@
1
+ package com.swmansion.enriched.common.spans.interfaces
2
+
3
+ interface EnrichedSpan
@@ -0,0 +1,4 @@
1
+ package com.swmansion.enriched.common.spans.interfaces
2
+
3
+ // Spans that are prefixed with zero-width space (\u200B) to ensure that they are visible even when empty.
4
+ interface EnrichedZeroWidthSpaceSpan
@@ -0,0 +1,140 @@
1
+ package com.swmansion.enriched.textinput
2
+
3
+ import android.view.KeyEvent
4
+ import android.view.inputmethod.InputConnection
5
+ import android.view.inputmethod.InputConnectionWrapper
6
+ import com.facebook.react.bridge.ReactContext
7
+ import com.facebook.react.uimanager.UIManagerHelper
8
+ import com.swmansion.enriched.textinput.events.OnInputKeyPressEvent
9
+
10
+ // This class is based on the implementation from Facebook React Native to provide 'onKeyPress' API on android.
11
+ // Original source:
12
+ // https://github.com/facebook/react-native/blob/v0.83.1/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditTextInputConnectionWrapper.kt
13
+ class EnrichedTextInputConnectionWrapper(
14
+ target: InputConnection,
15
+ private val reactContext: ReactContext,
16
+ private val editText: EnrichedTextInputView,
17
+ private val experimentalSynchronousEvents: Boolean,
18
+ ) : InputConnectionWrapper(target, false) {
19
+ private var isBatchEdit = false
20
+ private var key: String? = null
21
+
22
+ override fun beginBatchEdit(): Boolean {
23
+ isBatchEdit = true
24
+ return super.beginBatchEdit()
25
+ }
26
+
27
+ override fun endBatchEdit(): Boolean {
28
+ isBatchEdit = false
29
+ key?.let { k ->
30
+ dispatchKeyEvent(k)
31
+ key = null
32
+ }
33
+ return super.endBatchEdit()
34
+ }
35
+
36
+ override fun setComposingText(
37
+ text: CharSequence,
38
+ newCursorPosition: Int,
39
+ ): Boolean {
40
+ val previousSelectionStart = editText.selectionStart
41
+ val previousSelectionEnd = editText.selectionEnd
42
+
43
+ val consumed = super.setComposingText(text, newCursorPosition)
44
+
45
+ val currentSelectionStart = editText.selectionStart
46
+ val noPreviousSelection = previousSelectionStart == previousSelectionEnd
47
+ val cursorDidNotMove = currentSelectionStart == previousSelectionStart
48
+ val cursorMovedBackwardsOrAtBeginningOfInput =
49
+ currentSelectionStart < previousSelectionStart || currentSelectionStart <= 0
50
+
51
+ val inputKey =
52
+ if (
53
+ cursorMovedBackwardsOrAtBeginningOfInput || (!noPreviousSelection && cursorDidNotMove)
54
+ ) {
55
+ BACKSPACE_KEY_VALUE
56
+ } else {
57
+ editText.text?.get(currentSelectionStart - 1).toString()
58
+ }
59
+
60
+ dispatchKeyEventOrEnqueue(inputKey)
61
+ return consumed
62
+ }
63
+
64
+ override fun commitText(
65
+ text: CharSequence,
66
+ newCursorPosition: Int,
67
+ ): Boolean {
68
+ var inputKey = text.toString()
69
+ // Assume not a keyPress if length > 1 (or 2 if unicode)
70
+ if (inputKey.length <= 2) {
71
+ if (inputKey.isEmpty()) {
72
+ inputKey = BACKSPACE_KEY_VALUE
73
+ }
74
+ dispatchKeyEventOrEnqueue(inputKey)
75
+ }
76
+ return super.commitText(text, newCursorPosition)
77
+ }
78
+
79
+ override fun deleteSurroundingText(
80
+ beforeLength: Int,
81
+ afterLength: Int,
82
+ ): Boolean {
83
+ dispatchKeyEvent(BACKSPACE_KEY_VALUE)
84
+ return super.deleteSurroundingText(beforeLength, afterLength)
85
+ }
86
+
87
+ // Called by SwiftKey when cursor at beginning of input when there is a delete
88
+ // or when enter is pressed anywhere in the text. Whereas stock Android Keyboard calls
89
+ // [InputConnection.deleteSurroundingText] & [InputConnection.commitText]
90
+ // in each case, respectively.
91
+ override fun sendKeyEvent(event: KeyEvent): Boolean {
92
+ if (event.action == KeyEvent.ACTION_DOWN) {
93
+ val isNumberKey = event.unicodeChar in 48..57
94
+ when (event.keyCode) {
95
+ KeyEvent.KEYCODE_DEL -> {
96
+ dispatchKeyEvent(BACKSPACE_KEY_VALUE)
97
+ }
98
+
99
+ KeyEvent.KEYCODE_ENTER -> {
100
+ dispatchKeyEvent(ENTER_KEY_VALUE)
101
+ }
102
+
103
+ else -> {
104
+ if (isNumberKey) {
105
+ dispatchKeyEvent(event.number.toString())
106
+ }
107
+ }
108
+ }
109
+ }
110
+ return super.sendKeyEvent(event)
111
+ }
112
+
113
+ private fun dispatchKeyEventOrEnqueue(inputKey: String) {
114
+ if (isBatchEdit) {
115
+ key = inputKey
116
+ } else {
117
+ dispatchKeyEvent(inputKey)
118
+ }
119
+ }
120
+
121
+ private fun dispatchKeyEvent(inputKey: String) {
122
+ val resolvedKey = if (inputKey == NEWLINE_RAW_VALUE) ENTER_KEY_VALUE else inputKey
123
+ val surfaceId = UIManagerHelper.getSurfaceId(editText)
124
+ val eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, editText.id)
125
+ eventDispatcher?.dispatchEvent(
126
+ OnInputKeyPressEvent(
127
+ surfaceId = surfaceId,
128
+ viewId = editText.id,
129
+ key = resolvedKey,
130
+ experimentalSynchronousEvents = experimentalSynchronousEvents,
131
+ ),
132
+ )
133
+ }
134
+
135
+ companion object {
136
+ const val NEWLINE_RAW_VALUE: String = "\n"
137
+ const val BACKSPACE_KEY_VALUE: String = "Backspace"
138
+ const val ENTER_KEY_VALUE: String = "Enter"
139
+ }
140
+ }
@@ -0,0 +1,83 @@
1
+ package com.swmansion.enriched.textinput
2
+
3
+ import com.swmansion.enriched.common.parser.EnrichedSpanFactory
4
+ import com.swmansion.enriched.common.spans.EnrichedCheckboxListSpan
5
+ import com.swmansion.enriched.common.spans.EnrichedImageSpan
6
+ import com.swmansion.enriched.textinput.spans.EnrichedInputBlockQuoteSpan
7
+ import com.swmansion.enriched.textinput.spans.EnrichedInputBoldSpan
8
+ import com.swmansion.enriched.textinput.spans.EnrichedInputCheckboxListSpan
9
+ import com.swmansion.enriched.textinput.spans.EnrichedInputCodeBlockSpan
10
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH1Span
11
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH2Span
12
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH3Span
13
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH4Span
14
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH5Span
15
+ import com.swmansion.enriched.textinput.spans.EnrichedInputH6Span
16
+ import com.swmansion.enriched.textinput.spans.EnrichedInputImageSpan
17
+ import com.swmansion.enriched.textinput.spans.EnrichedInputInlineCodeSpan
18
+ import com.swmansion.enriched.textinput.spans.EnrichedInputItalicSpan
19
+ import com.swmansion.enriched.textinput.spans.EnrichedInputLinkSpan
20
+ import com.swmansion.enriched.textinput.spans.EnrichedInputMentionSpan
21
+ import com.swmansion.enriched.textinput.spans.EnrichedInputOrderedListSpan
22
+ import com.swmansion.enriched.textinput.spans.EnrichedInputStrikeThroughSpan
23
+ import com.swmansion.enriched.textinput.spans.EnrichedInputUnderlineSpan
24
+ import com.swmansion.enriched.textinput.spans.EnrichedInputUnorderedListSpan
25
+ import com.swmansion.enriched.textinput.styles.HtmlStyle
26
+
27
+ class EnrichedTextInputSpannableFactory : EnrichedSpanFactory<HtmlStyle> {
28
+ override fun createBoldSpan(style: HtmlStyle) = EnrichedInputBoldSpan(style)
29
+
30
+ override fun createItalicSpan(style: HtmlStyle) = EnrichedInputItalicSpan(style)
31
+
32
+ override fun createUnderlineSpan(style: HtmlStyle) = EnrichedInputUnderlineSpan(style)
33
+
34
+ override fun createStrikeThroughSpan(style: HtmlStyle) = EnrichedInputStrikeThroughSpan(style)
35
+
36
+ override fun createInlineCodeSpan(style: HtmlStyle) = EnrichedInputInlineCodeSpan(style)
37
+
38
+ override fun createLinkSpan(
39
+ url: String,
40
+ style: HtmlStyle,
41
+ ) = EnrichedInputLinkSpan(url, style, true)
42
+
43
+ override fun createMentionSpan(
44
+ text: String,
45
+ indicator: String,
46
+ attributes: Map<String, String>,
47
+ style: HtmlStyle,
48
+ ) = EnrichedInputMentionSpan(text, indicator, attributes, style)
49
+
50
+ override fun createImageSpan(
51
+ source: String,
52
+ width: Int,
53
+ height: Int,
54
+ ): EnrichedImageSpan = EnrichedInputImageSpan.createEnrichedImageSpan(source, width, height)
55
+
56
+ override fun createH1Span(style: HtmlStyle) = EnrichedInputH1Span(style)
57
+
58
+ override fun createH2Span(style: HtmlStyle) = EnrichedInputH2Span(style)
59
+
60
+ override fun createH3Span(style: HtmlStyle) = EnrichedInputH3Span(style)
61
+
62
+ override fun createH4Span(style: HtmlStyle) = EnrichedInputH4Span(style)
63
+
64
+ override fun createH5Span(style: HtmlStyle) = EnrichedInputH5Span(style)
65
+
66
+ override fun createH6Span(style: HtmlStyle) = EnrichedInputH6Span(style)
67
+
68
+ override fun createOrderedListSpan(
69
+ index: Int,
70
+ style: HtmlStyle,
71
+ ) = EnrichedInputOrderedListSpan(index, style)
72
+
73
+ override fun createUnorderedListSpan(style: HtmlStyle) = EnrichedInputUnorderedListSpan(style)
74
+
75
+ override fun createCheckboxListSpan(
76
+ isChecked: Boolean,
77
+ style: HtmlStyle,
78
+ ) = EnrichedInputCheckboxListSpan(isChecked, style)
79
+
80
+ override fun createBlockQuoteSpan(style: HtmlStyle) = EnrichedInputBlockQuoteSpan(style)
81
+
82
+ override fun createCodeBlockSpan(style: HtmlStyle) = EnrichedInputCodeBlockSpan(style)
83
+ }