react-native-enriched-markdown-scaffold 0.7.4-scaffold.9 → 1.0.2-scaffold.2

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 (469) hide show
  1. package/README.md +54 -8
  2. package/ReactNativeEnrichedMarkdown.podspec +82 -73
  3. package/android/build.gradle +186 -1
  4. package/android/consumer-rules.pro +1 -1
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerDelegate.java +9 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerInterface.java +3 -0
  7. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerDelegate.java +24 -0
  8. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerInterface.java +8 -0
  9. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +9 -0
  10. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +3 -0
  11. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +75 -0
  12. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +63 -0
  13. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +35 -0
  14. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +886 -23
  15. package/android/src/main/baseline-prof.txt +1 -1
  16. package/android/src/main/cpp/jni-adapter.cpp +74 -0
  17. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt +189 -13
  18. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownInternalText.kt +17 -0
  19. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownManager.kt +50 -0
  20. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +48 -1
  21. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager.kt +10 -1
  22. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +42 -0
  23. package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +82 -4
  24. package/android/src/main/java/com/swmansion/enriched/markdown/events/CopyPressEvent.kt +24 -0
  25. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager.kt +54 -4
  26. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +901 -462
  27. package/android/src/main/java/com/swmansion/enriched/markdown/input/MarkdownClipboard.kt +42 -0
  28. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/BlockEditCoordinator.kt +196 -0
  29. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/ClipboardCoordinator.kt +73 -0
  30. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditContext.kt +19 -0
  31. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditPipeline.kt +248 -0
  32. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditSession.kt +52 -0
  33. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/InputConnectionWrapper.kt +101 -7
  34. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/LinkCoordinator.kt +69 -0
  35. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownTextWatcher.kt +3 -3
  36. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MentionCoordinator.kt +118 -0
  37. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnChangeStateEvent.kt +26 -0
  38. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnContextMenuItemPressEvent.kt +26 -0
  39. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnInputKeyPressEvent.kt +24 -0
  40. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnPasteEvent.kt +24 -0
  41. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/BlockStore.kt +254 -0
  42. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/FormattingStore.kt +80 -87
  43. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputFormatter.kt +109 -1
  44. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputParser.kt +116 -22
  45. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/MarkdownSerializer.kt +167 -38
  46. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/RangeEditAdjustment.kt +149 -0
  47. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt +66 -5
  48. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputMeasurementStore.kt +4 -2
  49. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockRange.kt +27 -0
  50. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockType.kt +48 -0
  51. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/FormattingRange.kt +9 -4
  52. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/InputFormatterStyle.kt +39 -2
  53. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathAtom.kt +20 -0
  54. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathChipStyle.kt +1 -1
  55. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MutableRangeBounds.kt +11 -0
  56. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputBulletSpan.kt +82 -0
  57. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputHeadingSpan.kt +58 -0
  58. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputListItemSpacingSpan.kt +37 -0
  59. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputOrderedListMarkerSpan.kt +63 -0
  60. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/BlockHandler.kt +54 -0
  61. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/HeadingBlockHandler.kt +27 -0
  62. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/OrderedListBlockHandler.kt +38 -0
  63. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/UnorderedListBlockHandler.kt +37 -0
  64. package/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt +8 -26
  65. package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +1 -0
  66. package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +1 -0
  67. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +9 -2
  68. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +100 -12
  69. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +16 -1
  70. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +4 -0
  71. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +2 -1
  72. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +74 -18
  73. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +43 -4
  74. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +9 -1
  75. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SoftBreakRenderer.kt +16 -0
  76. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +30 -27
  77. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +24 -0
  78. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +174 -24
  79. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +27 -3
  80. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +13 -16
  81. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +1 -1
  82. package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +1 -1
  83. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +182 -46
  84. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListItemSpacingSpan.kt +33 -0
  85. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListMarkerAnchorSpan.kt +38 -0
  86. package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +2 -0
  87. package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +1 -1
  88. package/android/src/main/java/com/swmansion/enriched/markdown/spans/TaskListSpan.kt +3 -2
  89. package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +3 -2
  90. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +6 -0
  91. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +26 -0
  92. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +7 -1
  93. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +4 -1
  94. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +13 -4
  95. package/android/src/main/java/com/swmansion/enriched/markdown/styles/TableStyle.kt +6 -0
  96. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockHighlighter.kt +90 -0
  97. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockNode.kt +57 -0
  98. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/FeatureFlags.kt +1 -0
  99. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownSegment.kt +9 -0
  100. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownViewManagerUtils.kt +37 -7
  101. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/ReadableMapExtensions.kt +3 -0
  102. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/RenderedSegment.kt +10 -0
  103. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/SegmentSignature.kt +1 -0
  104. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/StreamingMarkdownFilter.kt +83 -5
  105. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/serialization/MarkdownASTSerializer.kt +4 -0
  106. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/MarkdownStyleParser.kt +74 -44
  107. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/PasteTextUtils.kt +20 -0
  108. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageCache.kt +26 -3
  109. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageDownloader.kt +22 -9
  110. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/LocalImageLoader.kt +161 -0
  111. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/extensions/TextPaintExtensions.kt +23 -0
  112. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/CheckboxTouchHelper.kt +7 -0
  113. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/TaskListTapUtils.kt +41 -21
  114. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/span/BlockSpacing.kt +15 -8
  115. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLongPressMovementMethod.kt +58 -27
  116. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionActionMode.kt +49 -15
  117. package/android/src/main/java/com/swmansion/enriched/markdown/views/BlockMenuOptions.kt +45 -0
  118. package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +396 -0
  119. package/android/src/main/java/com/swmansion/enriched/markdown/views/ContextMenuPopup.kt +9 -6
  120. package/android/src/main/java/com/swmansion/enriched/markdown/views/CopyGlyph.kt +101 -0
  121. package/android/src/main/java/com/swmansion/enriched/markdown/views/TableContainerView.kt +36 -9
  122. package/android/src/main/jni/CMakeLists.txt +53 -0
  123. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp +10 -0
  124. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h +11 -2
  125. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +10 -0
  126. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +12 -2
  127. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.cpp +9 -0
  128. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.h +24 -0
  129. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +16 -0
  130. package/android/src/math/java/com/swmansion/enriched/markdown/input/math/MathChipControllerImpl.kt +21 -4
  131. package/android/src/math/java/com/swmansion/enriched/markdown/renderer/MathInlineRenderer.kt +7 -2
  132. package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathChipSpan.kt +1 -1
  133. package/android/src/math/java/com/swmansion/enriched/markdown/views/MathContainerView.kt +6 -4
  134. package/cpp/highlight/CodeBlockHighlighter.cpp +284 -0
  135. package/cpp/highlight/CodeBlockHighlighter.hpp +66 -0
  136. package/cpp/highlight/CodeBlockLanguages.cpp +138 -0
  137. package/cpp/highlight/CodeBlockLanguages.hpp +25 -0
  138. package/cpp/highlight/HighlightGrammars.hpp +28 -0
  139. package/cpp/highlight/code_highlight_podspec.rb +211 -0
  140. package/cpp/highlight/gen-registry.mjs +155 -0
  141. package/cpp/highlight/grammar-versions.json +159 -0
  142. package/cpp/highlight/vendor/generated/generated_queries.h +1665 -0
  143. package/cpp/highlight/vendor/generated/generated_registry.cpp +59 -0
  144. package/cpp/parser/MD4CParser.cpp +173 -61
  145. package/cpp/parser/MD4CParser.hpp +1 -0
  146. package/cpp/parser/MarkdownASTNode.hpp +2 -1
  147. package/cpp/wasm/ASTSerializer.cpp +2 -0
  148. package/cpp/wasm/build.sh +1 -0
  149. package/cpp/wasm/md4c_wasm.cpp +3 -1
  150. package/docs/ACCESSIBILITY.md +14 -2
  151. package/docs/API_REFERENCE.md +234 -12
  152. package/docs/BREAKING_CHANGES.md +129 -0
  153. package/docs/CODE_HIGHLIGHT.md +133 -0
  154. package/docs/COPY_OPTIONS.md +47 -3
  155. package/docs/ELEMENTS_STRUCTURE.md +52 -4
  156. package/docs/IMAGE_CACHING.md +30 -0
  157. package/docs/INPUT.md +108 -11
  158. package/docs/LATEX_MATH.md +87 -45
  159. package/docs/MACOS.md +1 -1
  160. package/docs/MARKDOWN_STREAMING.md +27 -1
  161. package/docs/NATIVE_ASSETS.md +127 -0
  162. package/docs/RTL.md +1 -1
  163. package/docs/STYLES.md +46 -6
  164. package/docs/TESTING.md +112 -0
  165. package/docs/TEXT.md +16 -6
  166. package/docs/WEB.md +3 -1
  167. package/ios/EnrichedMarkdown.h +7 -0
  168. package/ios/EnrichedMarkdown.mm +284 -75
  169. package/ios/EnrichedMarkdownText.h +7 -0
  170. package/ios/EnrichedMarkdownText.mm +101 -73
  171. package/ios/attachments/ENRMImageAttachment.h +9 -0
  172. package/ios/attachments/ENRMImageAttachment.m +143 -40
  173. package/ios/attachments/ENRMMathInlineAttachment.h +2 -0
  174. package/ios/attachments/ENRMMathInlineAttachment.m +48 -81
  175. package/ios/attachments/ENRMMathInlineAttachmentShared.h +2 -0
  176. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.cpp +75 -0
  177. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.h +63 -0
  178. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.cpp +35 -0
  179. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +886 -23
  180. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +131 -0
  181. package/ios/input/ENRMAutoLinkDetector.h +2 -1
  182. package/ios/input/ENRMAutoLinkDetector.mm +79 -41
  183. package/ios/input/ENRMBlockEditCoordinator.h +71 -0
  184. package/ios/input/ENRMBlockEditCoordinator.mm +195 -0
  185. package/ios/input/ENRMBlockRange.h +28 -0
  186. package/ios/input/ENRMBlockRange.mm +30 -0
  187. package/ios/input/ENRMBlockStore.h +56 -0
  188. package/ios/input/ENRMBlockStore.mm +275 -0
  189. package/ios/input/ENRMClipboardCoordinator.h +45 -0
  190. package/ios/input/ENRMClipboardCoordinator.mm +120 -0
  191. package/ios/input/ENRMDetectorPipeline.h +2 -1
  192. package/ios/input/ENRMEditPipeline.h +76 -0
  193. package/ios/input/ENRMEditPipeline.mm +228 -0
  194. package/ios/input/ENRMEditSession.h +36 -0
  195. package/ios/input/ENRMEditSession.mm +63 -0
  196. package/ios/input/ENRMFormattingStore.h +17 -0
  197. package/ios/input/ENRMFormattingStore.mm +95 -105
  198. package/ios/input/ENRMInputBlockType.h +91 -0
  199. package/ios/input/ENRMInputBlockType.mm +5 -0
  200. package/ios/input/ENRMInputDecorationDrawer.h +18 -0
  201. package/ios/input/ENRMInputEventEmitter.h +56 -0
  202. package/ios/input/ENRMInputEventEmitter.mm +308 -0
  203. package/ios/input/ENRMInputFormatter.h +29 -69
  204. package/ios/input/ENRMInputFormatter.mm +216 -124
  205. package/ios/input/ENRMInputFormatterStyle.h +99 -0
  206. package/ios/input/ENRMInputFormatterStyle.mm +188 -0
  207. package/ios/input/ENRMInputLayoutManager.h +9 -0
  208. package/ios/input/ENRMInputLayoutManager.mm +30 -0
  209. package/ios/input/ENRMInputListMarkerDrawer.h +32 -0
  210. package/ios/input/ENRMInputListMarkerDrawer.mm +426 -0
  211. package/ios/input/ENRMInputParser.h +5 -6
  212. package/ios/input/ENRMInputParser.mm +461 -178
  213. package/ios/input/ENRMInputRemend.mm +2 -2
  214. package/ios/input/ENRMInputStyleStateBuilder.h +40 -0
  215. package/ios/input/ENRMInputStyleStateBuilder.mm +60 -0
  216. package/ios/input/ENRMInputTextView.mm +103 -8
  217. package/ios/input/ENRMInputTypingAttributesController.h +42 -0
  218. package/ios/input/ENRMInputTypingAttributesController.mm +203 -0
  219. package/ios/input/ENRMLinkCoordinator.h +41 -0
  220. package/ios/input/ENRMLinkCoordinator.mm +89 -0
  221. package/ios/input/ENRMMarkdownSerializer.h +29 -5
  222. package/ios/input/ENRMMarkdownSerializer.mm +170 -48
  223. package/ios/input/ENRMMathAtom.h +26 -0
  224. package/ios/input/ENRMMathAtom.mm +12 -0
  225. package/ios/input/ENRMMentionCoordinator.h +45 -0
  226. package/ios/input/ENRMMentionCoordinator.mm +167 -0
  227. package/ios/input/ENRMRangeEditAdjustment.h +38 -0
  228. package/ios/input/ENRMRangeEditAdjustment.mm +91 -0
  229. package/ios/input/ENRMRangeStoreUtils.h +39 -0
  230. package/ios/input/EnrichedMarkdownTextInput+ContextMenu.mm +6 -6
  231. package/ios/input/EnrichedMarkdownTextInput+Internal.h +11 -3
  232. package/ios/input/EnrichedMarkdownTextInput.h +7 -1
  233. package/ios/input/EnrichedMarkdownTextInput.mm +1089 -1023
  234. package/ios/input/InputStylePropsUtils.h +109 -68
  235. package/ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm +2 -1
  236. package/ios/input/styles/ENRMBlockHandler.h +46 -0
  237. package/ios/input/styles/ENRMHeadingBlockHandler.h +15 -0
  238. package/ios/input/styles/ENRMHeadingBlockHandler.mm +38 -0
  239. package/ios/input/styles/ENRMOrderedListBlockHandler.h +14 -0
  240. package/ios/input/styles/ENRMOrderedListBlockHandler.mm +48 -0
  241. package/ios/input/styles/ENRMUnorderedListBlockHandler.h +15 -0
  242. package/ios/input/styles/ENRMUnorderedListBlockHandler.mm +51 -0
  243. package/ios/internals/ENRMViewFreeMeasurement.h +331 -0
  244. package/ios/internals/EnrichedMarkdownShadowNode.h +1 -3
  245. package/ios/internals/EnrichedMarkdownShadowNode.mm +16 -20
  246. package/ios/internals/EnrichedMarkdownTextShadowNode.h +1 -3
  247. package/ios/internals/EnrichedMarkdownTextShadowNode.mm +15 -20
  248. package/ios/internals/MeasurementCache.h +33 -7
  249. package/ios/internals/ShadowMeasurementUtils.h +63 -58
  250. package/ios/math/ENRMMathChipController.h +74 -0
  251. package/ios/math/ENRMMathChipController.mm +476 -0
  252. package/ios/math/ENRMRaTeXBridge.swift +4 -1
  253. package/ios/parser/ENRMMarkdownParser.h +1 -8
  254. package/ios/parser/ENRMMarkdownParser.mm +2 -11
  255. package/ios/parser/MarkdownASTNode.h +2 -1
  256. package/ios/parser/MarkdownParserBridge.mm +4 -0
  257. package/ios/renderer/AttributedRenderer.m +20 -2
  258. package/ios/renderer/BaseRenderer.h +17 -2
  259. package/ios/renderer/BaseRenderer.m +30 -0
  260. package/ios/renderer/BlockquoteRenderer.h +1 -1
  261. package/ios/renderer/BlockquoteRenderer.m +144 -35
  262. package/ios/renderer/CodeBlockRenderer.h +1 -1
  263. package/ios/renderer/CodeBlockRenderer.m +27 -23
  264. package/ios/renderer/CodeRenderer.h +1 -1
  265. package/ios/renderer/CodeRenderer.m +3 -1
  266. package/ios/renderer/ENRMImageRenderer.h +1 -1
  267. package/ios/renderer/ENRMImageRenderer.m +5 -1
  268. package/ios/renderer/ENRMMathInlineRenderer.h +1 -1
  269. package/ios/renderer/ENRMMathInlineRenderer.m +5 -1
  270. package/ios/renderer/ENRMSpoilerRenderer.h +1 -1
  271. package/ios/renderer/ENRMSpoilerRenderer.m +3 -1
  272. package/ios/renderer/EmphasisRenderer.h +1 -1
  273. package/ios/renderer/EmphasisRenderer.m +3 -1
  274. package/ios/renderer/HeadingRenderer.h +1 -1
  275. package/ios/renderer/HeadingRenderer.m +13 -6
  276. package/ios/renderer/HighlightRenderer.h +1 -1
  277. package/ios/renderer/HighlightRenderer.m +3 -1
  278. package/ios/renderer/LinkRenderer.h +1 -1
  279. package/ios/renderer/LinkRenderer.m +3 -1
  280. package/ios/renderer/ListItemRenderer.h +13 -1
  281. package/ios/renderer/ListItemRenderer.m +102 -44
  282. package/ios/renderer/ListRenderer.h +2 -2
  283. package/ios/renderer/ListRenderer.m +63 -25
  284. package/ios/renderer/ParagraphRenderer.h +1 -1
  285. package/ios/renderer/ParagraphRenderer.m +16 -8
  286. package/ios/renderer/RenderContext.h +10 -0
  287. package/ios/renderer/RenderContext.m +44 -0
  288. package/ios/renderer/RendererFactory.m +14 -0
  289. package/ios/renderer/StrikethroughRenderer.h +1 -1
  290. package/ios/renderer/StrikethroughRenderer.m +3 -1
  291. package/ios/renderer/StrongRenderer.h +1 -1
  292. package/ios/renderer/StrongRenderer.m +3 -1
  293. package/ios/renderer/SubscriptRenderer.h +1 -1
  294. package/ios/renderer/SubscriptRenderer.m +3 -1
  295. package/ios/renderer/SuperscriptRenderer.h +1 -1
  296. package/ios/renderer/SuperscriptRenderer.m +3 -1
  297. package/ios/renderer/TextRenderer.h +2 -2
  298. package/ios/renderer/TextRenderer.m +3 -1
  299. package/ios/renderer/ThematicBreakRenderer.h +1 -1
  300. package/ios/renderer/ThematicBreakRenderer.m +3 -1
  301. package/ios/renderer/UnderlineRenderer.h +1 -1
  302. package/ios/renderer/UnderlineRenderer.m +3 -1
  303. package/ios/styles/StyleConfig.h +22 -0
  304. package/ios/styles/StyleConfig.mm +132 -0
  305. package/ios/utils/BlockquoteBorder.h +6 -0
  306. package/ios/utils/BlockquoteBorder.m +249 -52
  307. package/ios/utils/CodeBlockBackground.m +16 -2
  308. package/ios/utils/ENRMAtomicSize.h +65 -0
  309. package/ios/utils/ENRMBlockMenu.h +57 -0
  310. package/ios/utils/ENRMCodeBlockContent.h +37 -0
  311. package/ios/utils/ENRMCodeBlockContent.mm +79 -0
  312. package/ios/utils/ENRMCodeBlockHighlighter.h +37 -0
  313. package/ios/utils/ENRMCodeBlockHighlighter.mm +51 -0
  314. package/ios/utils/ENRMFeatureFlags.h +7 -0
  315. package/ios/utils/ENRMImageDownloader.h +11 -1
  316. package/ios/utils/ENRMImageDownloader.m +60 -16
  317. package/ios/utils/ENRMLocalImageLoader.h +31 -0
  318. package/ios/utils/ENRMLocalImageLoader.m +68 -0
  319. package/ios/utils/ENRMMathFallback.h +26 -0
  320. package/ios/utils/ENRMMathFallback.m +18 -0
  321. package/ios/utils/ENRMTextViewSetup.h +35 -17
  322. package/ios/utils/EditMenuUtils.h +22 -5
  323. package/ios/utils/EditMenuUtils.m +53 -9
  324. package/ios/utils/ImageRequestHeaderUtils.h +35 -0
  325. package/ios/utils/LastElementUtils.h +1 -0
  326. package/ios/utils/ListMarkerDrawer.m +29 -42
  327. package/ios/utils/MarkdownASTSerializer.m +4 -0
  328. package/ios/utils/ParagraphStyleUtils.h +5 -0
  329. package/ios/utils/ParagraphStyleUtils.m +77 -17
  330. package/ios/utils/RenderedMarkdownSegment.h +13 -1
  331. package/ios/utils/RenderedMarkdownSegment.m +20 -0
  332. package/ios/utils/SegmentRenderer.m +17 -4
  333. package/ios/utils/StreamingMarkdownFilter.h +11 -1
  334. package/ios/utils/StreamingMarkdownFilter.m +98 -2
  335. package/ios/utils/StylePropsUtils.h +63 -0
  336. package/ios/utils/TaskListTapUtils.m +24 -0
  337. package/ios/views/ENRMCodeBlockContainerView.h +53 -0
  338. package/ios/views/ENRMCodeBlockContainerView.m +559 -0
  339. package/ios/views/ENRMMathContainerView.h +16 -0
  340. package/ios/views/ENRMMathContainerView.m +74 -19
  341. package/ios/views/TableContainerView.h +22 -0
  342. package/ios/views/TableContainerView.m +261 -175
  343. package/jest.d.ts +1 -0
  344. package/jest.js +5 -0
  345. package/lib/module/EnrichedMarkdownNativeComponent.ts +73 -0
  346. package/lib/module/EnrichedMarkdownTextInput.js +84 -5
  347. package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
  348. package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  349. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +74 -0
  350. package/lib/module/headingDefaults.js +34 -0
  351. package/lib/module/headingDefaults.js.map +1 -0
  352. package/lib/module/index.js.map +1 -1
  353. package/lib/module/jest/index.js +191 -0
  354. package/lib/module/jest/index.js.map +1 -0
  355. package/lib/module/native/EnrichedMarkdownText.js +37 -5
  356. package/lib/module/native/EnrichedMarkdownText.js.map +1 -1
  357. package/lib/module/normalizeMarkdownStyle.js +81 -19
  358. package/lib/module/normalizeMarkdownStyle.js.map +1 -1
  359. package/lib/module/normalizeMarkdownStyle.web.js +56 -18
  360. package/lib/module/normalizeMarkdownStyle.web.js.map +1 -1
  361. package/lib/module/normalizeMarkdownTextInputStyle.js +62 -15
  362. package/lib/module/normalizeMarkdownTextInputStyle.js.map +1 -1
  363. package/lib/module/normalizeMenuItem.js +1 -1
  364. package/lib/module/utils/textInputState.js +26 -0
  365. package/lib/module/utils/textInputState.js.map +1 -0
  366. package/lib/module/web/EnrichedMarkdownText.js +9 -5
  367. package/lib/module/web/EnrichedMarkdownText.js.map +1 -1
  368. package/lib/module/web/parseMarkdown.js +4 -3
  369. package/lib/module/web/parseMarkdown.js.map +1 -1
  370. package/lib/module/web/renderers/InlineRenderers.js +6 -0
  371. package/lib/module/web/renderers/InlineRenderers.js.map +1 -1
  372. package/lib/module/web/renderers/ListRenderers.js +7 -2
  373. package/lib/module/web/renderers/ListRenderers.js.map +1 -1
  374. package/lib/module/web/renderers/index.js +7 -4
  375. package/lib/module/web/renderers/index.js.map +1 -1
  376. package/lib/module/web/styles.js +83 -6
  377. package/lib/module/web/styles.js.map +1 -1
  378. package/lib/module/web/utils.js +1 -0
  379. package/lib/module/web/utils.js.map +1 -1
  380. package/lib/module/web/wasm/md4c.js +0 -0
  381. package/lib/module/web/wasm/md4c.js.map +1 -1
  382. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts +66 -0
  383. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
  384. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +94 -9
  385. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
  386. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +69 -5
  387. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
  388. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +66 -0
  389. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
  390. package/lib/typescript/src/headingDefaults.d.ts +9 -0
  391. package/lib/typescript/src/headingDefaults.d.ts.map +1 -0
  392. package/lib/typescript/src/index.d.ts +2 -2
  393. package/lib/typescript/src/index.d.ts.map +1 -1
  394. package/lib/typescript/src/index.web.d.ts +1 -1
  395. package/lib/typescript/src/index.web.d.ts.map +1 -1
  396. package/lib/typescript/src/jest/index.d.ts +6 -0
  397. package/lib/typescript/src/jest/index.d.ts.map +1 -0
  398. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts +3 -3
  399. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts.map +1 -1
  400. package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -1
  401. package/lib/typescript/src/normalizeMarkdownStyle.web.d.ts.map +1 -1
  402. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts +19 -5
  403. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts.map +1 -1
  404. package/lib/typescript/src/types/MarkdownStyle.d.ts +72 -0
  405. package/lib/typescript/src/types/MarkdownStyle.d.ts.map +1 -1
  406. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts +27 -0
  407. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts.map +1 -1
  408. package/lib/typescript/src/types/MarkdownTextProps.d.ts +104 -9
  409. package/lib/typescript/src/types/MarkdownTextProps.d.ts.map +1 -1
  410. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts +19 -0
  411. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts.map +1 -1
  412. package/lib/typescript/src/types/events.d.ts +19 -0
  413. package/lib/typescript/src/types/events.d.ts.map +1 -1
  414. package/lib/typescript/src/utils/textInputState.d.ts +24 -0
  415. package/lib/typescript/src/utils/textInputState.d.ts.map +1 -0
  416. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts +1 -1
  417. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts.map +1 -1
  418. package/lib/typescript/src/web/parseMarkdown.d.ts +1 -1
  419. package/lib/typescript/src/web/parseMarkdown.d.ts.map +1 -1
  420. package/lib/typescript/src/web/renderers/InlineRenderers.d.ts.map +1 -1
  421. package/lib/typescript/src/web/renderers/ListRenderers.d.ts.map +1 -1
  422. package/lib/typescript/src/web/renderers/index.d.ts +2 -1
  423. package/lib/typescript/src/web/renderers/index.d.ts.map +1 -1
  424. package/lib/typescript/src/web/styles.d.ts +2 -1
  425. package/lib/typescript/src/web/styles.d.ts.map +1 -1
  426. package/lib/typescript/src/web/types.d.ts +6 -2
  427. package/lib/typescript/src/web/types.d.ts.map +1 -1
  428. package/lib/typescript/src/web/utils.d.ts.map +1 -1
  429. package/package.json +36 -9
  430. package/postinstall.mjs +131 -0
  431. package/ratex-version.json +21 -0
  432. package/src/EnrichedMarkdownNativeComponent.ts +73 -0
  433. package/src/EnrichedMarkdownTextInput.tsx +159 -8
  434. package/src/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  435. package/src/EnrichedMarkdownTextNativeComponent.ts +74 -0
  436. package/src/headingDefaults.ts +21 -0
  437. package/src/index.tsx +9 -0
  438. package/src/index.web.tsx +1 -0
  439. package/src/jest/index.tsx +215 -0
  440. package/src/native/EnrichedMarkdownText.tsx +53 -2
  441. package/src/normalizeMarkdownStyle.ts +102 -16
  442. package/src/normalizeMarkdownStyle.web.ts +63 -15
  443. package/src/normalizeMarkdownTextInputStyle.ts +110 -35
  444. package/src/normalizeMenuItem.ts +1 -1
  445. package/src/types/MarkdownStyle.ts +74 -0
  446. package/src/types/MarkdownStyleInternal.ts +39 -0
  447. package/src/types/MarkdownTextProps.ts +101 -9
  448. package/src/types/MarkdownTextProps.web.ts +19 -0
  449. package/src/types/events.ts +21 -0
  450. package/src/utils/textInputState.ts +35 -0
  451. package/src/web/EnrichedMarkdownText.tsx +16 -2
  452. package/src/web/parseMarkdown.ts +6 -2
  453. package/src/web/renderers/InlineRenderers.tsx +5 -0
  454. package/src/web/renderers/ListRenderers.tsx +14 -2
  455. package/src/web/renderers/index.tsx +6 -2
  456. package/src/web/styles.ts +89 -5
  457. package/src/web/types.ts +6 -1
  458. package/src/web/utils.ts +1 -0
  459. package/src/web/wasm/md4c.js +0 -0
  460. package/vendor-grammars.mjs +511 -0
  461. package/vendor-ratex.mjs +173 -0
  462. package/app.plugin.js +0 -2
  463. package/plugin/build/withAndroidMath.js +0 -19
  464. package/plugin/build/withIosMath.js +0 -28
  465. package/plugin/build/withReactNativeEnrichedMarkdown.js +0 -11
  466. package/plugin/src/withAndroidMath.ts +0 -24
  467. package/plugin/src/withIosMath.ts +0 -35
  468. package/plugin/src/withReactNativeEnrichedMarkdown.ts +0 -17
  469. package/plugin/tsconfig.build.json +0 -16
@@ -0,0 +1,91 @@
1
+ #pragma once
2
+
3
+ #import <Foundation/Foundation.h>
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ /// Block-level (paragraph-scoped) element types. A block covers whole lines,
8
+ /// unlike inline styles (ENRMInputStyleType) which cover character ranges.
9
+ ///
10
+ /// Paragraph is the default: every line is a paragraph until a block handler
11
+ /// claims it. Concrete block types (headings, list items, etc.) are appended
12
+ /// here as their handlers are added — each new case must have a matching
13
+ /// id<ENRMBlockHandler> registered in ENRMInputFormatter.
14
+ typedef NS_ENUM(NSInteger, ENRMInputBlockType) {
15
+ ENRMInputBlockTypeParagraph = 0,
16
+ ENRMInputBlockTypeHeading1 = 1,
17
+ ENRMInputBlockTypeHeading2 = 2,
18
+ ENRMInputBlockTypeHeading3 = 3,
19
+ ENRMInputBlockTypeHeading4 = 4,
20
+ ENRMInputBlockTypeHeading5 = 5,
21
+ ENRMInputBlockTypeHeading6 = 6,
22
+ ENRMInputBlockTypeUnorderedListItem = 7,
23
+ ENRMInputBlockTypeOrderedListItem = 8,
24
+ };
25
+
26
+ /// Whether the type is a list item (nesting depth rides in the range's level).
27
+ static inline BOOL ENRMBlockTypeIsListItem(ENRMInputBlockType type)
28
+ {
29
+ return type == ENRMInputBlockTypeUnorderedListItem || type == ENRMInputBlockTypeOrderedListItem;
30
+ }
31
+
32
+ /// Maximum bullet-list nesting depth (0-based). Depth is carried as the block's
33
+ /// level payload (ENRMBlockRange.level), clamped into [0, kENRMMaxListDepth].
34
+ static const NSInteger kENRMMaxListDepth = 5;
35
+
36
+ /// Bullet-list layout metrics (points). Shared by the list block handler (which
37
+ /// reserves the head-indent column via the paragraph style) and the layout
38
+ /// manager (which draws the marker glyph into that column). Text for a list item
39
+ /// at depth d starts at (d + 1) * kENRMListIndentPerDepth from the leading edge;
40
+ /// the marker is centered kENRMListBulletGap before the text.
41
+ static const CGFloat kENRMListIndentPerDepth = 18.0;
42
+ static const CGFloat kENRMListBulletGap = 9.0;
43
+
44
+ /// Maps a heading level (1-6) to its ENRMInputBlockType. Levels outside 1-6 are
45
+ /// clamped into range. The contiguous Heading1..Heading6 enum values make this a
46
+ /// simple offset from the Heading1 base.
47
+ static inline ENRMInputBlockType ENRMBlockTypeForHeadingLevel(NSInteger level)
48
+ {
49
+ if (level < 1) {
50
+ level = 1;
51
+ } else if (level > 6) {
52
+ level = 6;
53
+ }
54
+ return (ENRMInputBlockType)(ENRMInputBlockTypeHeading1 + (level - 1));
55
+ }
56
+
57
+ /// The heading level (1-6) for a heading block type, or 0 if the type is not a
58
+ /// heading. Inverse of ENRMBlockTypeForHeadingLevel.
59
+ static inline NSInteger ENRMHeadingLevelForBlockType(ENRMInputBlockType type)
60
+ {
61
+ if (type >= ENRMInputBlockTypeHeading1 && type <= ENRMInputBlockTypeHeading6) {
62
+ return (NSInteger)(type - ENRMInputBlockTypeHeading1) + 1;
63
+ }
64
+ return 0;
65
+ }
66
+
67
+ /// Whether an emptied line of this type keeps a zero-length anchor (an emptied
68
+ /// heading stays a heading, an emptied bullet keeps its marker) instead of
69
+ /// reverting to a plain paragraph.
70
+ static inline BOOL ENRMBlockTypePersistsWhenEmpty(ENRMInputBlockType type)
71
+ {
72
+ return (type >= ENRMInputBlockTypeHeading1 && type <= ENRMInputBlockTypeHeading6) || ENRMBlockTypeIsListItem(type);
73
+ }
74
+
75
+ /// NSAttributedString attribute carrying the ENRMInputBlockType (boxed NSNumber)
76
+ /// of the paragraph a character belongs to. Set by ENRMInputFormatter on the
77
+ /// paragraphs a block claims; the next block pass uses it to find and strip the
78
+ /// previous pass's styling before re-applying.
79
+ extern NSAttributedStringKey const ENRMBlockTypeAttributeName;
80
+
81
+ /// NSAttributedString attribute carrying the block's integer payload (boxed
82
+ /// NSNumber) — e.g. heading level or list depth. See ENRMBlockRange.level.
83
+ /// Applied and stripped alongside ENRMBlockTypeAttributeName.
84
+ extern NSAttributedStringKey const ENRMBlockLevelAttributeName;
85
+
86
+ /// NSAttributedString attribute carrying an ordered item's 1-based ordinal
87
+ /// (boxed NSNumber) so the layout manager can draw its number. Applied and
88
+ /// stripped alongside ENRMBlockTypeAttributeName.
89
+ extern NSAttributedStringKey const ENRMBlockOrdinalAttributeName;
90
+
91
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,5 @@
1
+ #import "ENRMInputBlockType.h"
2
+
3
+ NSAttributedStringKey const ENRMBlockTypeAttributeName = @"ENRMBlockType";
4
+ NSAttributedStringKey const ENRMBlockLevelAttributeName = @"ENRMBlockLevel";
5
+ NSAttributedStringKey const ENRMBlockOrdinalAttributeName = @"ENRMBlockOrdinal";
@@ -0,0 +1,18 @@
1
+ #pragma once
2
+
3
+ #import "ENRMUIKit.h"
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ /// Draws decorations (markers, borders, backgrounds) for the input layout manager.
8
+ @protocol ENRMInputDecorationDrawer <NSObject>
9
+
10
+ - (void)drawDecorationsForGlyphRange:(NSRange)glyphRange
11
+ layoutManager:(NSLayoutManager *)layoutManager
12
+ atPoint:(CGPoint)origin;
13
+
14
+ - (void)drawEmptyEditorDecorationsWithInset:(UIEdgeInsets)inset layoutManager:(NSLayoutManager *)layoutManager;
15
+
16
+ @end
17
+
18
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,56 @@
1
+ #pragma once
2
+
3
+ #import "ENRMInputStyleStateBuilder.h"
4
+ #import "ENRMUIKit.h"
5
+ #import <Foundation/Foundation.h>
6
+
7
+ #ifdef __cplusplus
8
+ #import <ReactNativeEnrichedMarkdown/EventEmitters.h>
9
+ #import <memory>
10
+ #endif
11
+
12
+ NS_ASSUME_NONNULL_BEGIN
13
+
14
+ @protocol ENRMInputEventEmitterDataSource <ENRMInputStyleStateDataSource>
15
+
16
+ #ifdef __cplusplus
17
+ - (std::shared_ptr<facebook::react::EnrichedMarkdownTextInputEventEmitter const>)fabricEventEmitter;
18
+ #endif
19
+
20
+ - (NSString *)plainText;
21
+ - (NSString *)currentMarkdown;
22
+ - (CGRect)computeCaretRect;
23
+
24
+ @end
25
+
26
+ @interface ENRMInputEventEmitter : NSObject
27
+
28
+ @property (nonatomic, assign) BOOL emitMarkdown;
29
+
30
+ - (instancetype)initWithDataSource:(id<ENRMInputEventEmitterDataSource>)dataSource;
31
+
32
+ - (void)emitOnChangeText;
33
+ - (void)emitOnKeyPress:(NSString *)text;
34
+ - (void)emitOnChangeMarkdown;
35
+ - (void)emitOnChangeSelection;
36
+ - (void)emitOnChangeState;
37
+ - (void)emitFormattingChanged;
38
+ - (void)emitCaretRectChangeIfNeeded;
39
+ - (void)invalidateCachedState;
40
+ - (void)emitContextMenuItemPress:(NSString *)itemText;
41
+ - (void)emitOnFocus;
42
+ - (void)emitOnBlur;
43
+ - (void)emitOnLinkDetectedWithText:(NSString *)text url:(NSString *)url range:(NSRange)range;
44
+ - (void)emitOnStartMention:(NSString *)indicator;
45
+ - (void)emitOnChangeMentionWithIndicator:(NSString *)indicator text:(NSString *)text;
46
+ - (void)emitOnEndMention:(NSString *)indicator;
47
+ /// `rect` is the chip's glyph rect in the host view's coordinates, in points —
48
+ /// JS positions its formula editor against it.
49
+ - (void)emitOnMathPressWithLatex:(NSString *)latex range:(NSRange)range displayMode:(BOOL)displayMode rect:(CGRect)rect;
50
+ - (void)emitOnPasteWithText:(NSString *)text markdown:(NSString *)markdown;
51
+ - (void)requestMarkdown:(NSInteger)requestId;
52
+ - (void)requestCaretRect:(NSInteger)requestId;
53
+
54
+ @end
55
+
56
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,308 @@
1
+ #import "ENRMInputEventEmitter.h"
2
+
3
+ using namespace facebook::react;
4
+
5
+ static EnrichedMarkdownTextInputEventEmitter::OnChangeState ENRMFabricChangeState(ENRMInputStyleSnapshot s)
6
+ {
7
+ return {
8
+ .bold = {.isActive = s.bold},
9
+ .italic = {.isActive = s.italic},
10
+ .underline = {.isActive = s.underline},
11
+ .strikethrough = {.isActive = s.strikethrough},
12
+ .spoiler = {.isActive = s.spoiler},
13
+ .link = {.isActive = s.link},
14
+ .heading = {.isActive = s.headingLevel > 0, .level = static_cast<int>(s.headingLevel)},
15
+ .unorderedList = {.isActive = s.unorderedList, .depth = static_cast<int>(s.unorderedList ? s.listDepth : 0)},
16
+ .orderedList = {.isActive = s.orderedList, .depth = static_cast<int>(s.orderedList ? s.listDepth : 0)},
17
+ };
18
+ }
19
+
20
+ static EnrichedMarkdownTextInputEventEmitter::OnContextMenuItemPressStyleState
21
+ ENRMFabricContextMenuStyleState(ENRMInputStyleSnapshot s)
22
+ {
23
+ return {
24
+ .bold = {.isActive = s.bold},
25
+ .italic = {.isActive = s.italic},
26
+ .underline = {.isActive = s.underline},
27
+ .strikethrough = {.isActive = s.strikethrough},
28
+ .spoiler = {.isActive = s.spoiler},
29
+ .link = {.isActive = s.link},
30
+ .heading = {.isActive = s.headingLevel > 0, .level = static_cast<int>(s.headingLevel)},
31
+ .unorderedList = {.isActive = s.unorderedList, .depth = static_cast<int>(s.unorderedList ? s.listDepth : 0)},
32
+ .orderedList = {.isActive = s.orderedList, .depth = static_cast<int>(s.orderedList ? s.listDepth : 0)},
33
+ };
34
+ }
35
+
36
+ #define ENRM_GUARD_EMITTER(name) \
37
+ auto name = [self emitter]; \
38
+ if (name == nullptr) { \
39
+ return; \
40
+ }
41
+
42
+ @implementation ENRMInputEventEmitter {
43
+ __weak id<ENRMInputEventEmitterDataSource> _dataSource;
44
+
45
+ struct {
46
+ BOOL bold, italic, underline, strikethrough, spoiler, link, initialized;
47
+ NSInteger headingLevel;
48
+ BOOL unorderedList;
49
+ NSInteger unorderedListDepth;
50
+ BOOL orderedList;
51
+ NSInteger orderedListDepth;
52
+ } _prevState;
53
+
54
+ std::optional<CGRect> _prevCaretRect;
55
+ }
56
+
57
+ - (instancetype)initWithDataSource:(id<ENRMInputEventEmitterDataSource>)dataSource
58
+ {
59
+ self = [super init];
60
+ if (self) {
61
+ _dataSource = dataSource;
62
+ }
63
+ return self;
64
+ }
65
+
66
+ #pragma mark - Private
67
+
68
+ - (std::shared_ptr<EnrichedMarkdownTextInputEventEmitter const>)emitter
69
+ {
70
+ return [_dataSource fabricEventEmitter];
71
+ }
72
+
73
+ #pragma mark - Simple emitters
74
+
75
+ - (void)emitOnChangeText
76
+ {
77
+ ENRM_GUARD_EMITTER(emitter);
78
+ NSString *plainText = [_dataSource plainText];
79
+ emitter->onChangeText({.value = std::string([plainText UTF8String] ?: "")});
80
+ }
81
+
82
+ /// Maps the replacement text of a pending edit to RN TextInput's
83
+ /// `onKeyPress` key names: empty text means deletion ("Backspace"), and
84
+ /// leading \n, \t and ESC map to "Enter", "Tab" and "Escape".
85
+ - (void)emitOnKeyPress:(NSString *)text
86
+ {
87
+ ENRM_GUARD_EMITTER(emitter);
88
+ NSString *key;
89
+ if (text.length == 0) {
90
+ key = @"Backspace";
91
+ } else {
92
+ switch ([text characterAtIndex:0]) {
93
+ case '\n':
94
+ key = @"Enter";
95
+ break;
96
+ case '\t':
97
+ key = @"Tab";
98
+ break;
99
+ case 0x1B:
100
+ key = @"Escape";
101
+ break;
102
+ default:
103
+ key = text;
104
+ break;
105
+ }
106
+ }
107
+ emitter->onInputKeyPress({.key = std::string([key UTF8String] ?: "")});
108
+ }
109
+
110
+ - (void)emitOnChangeMarkdown
111
+ {
112
+ ENRM_GUARD_EMITTER(emitter);
113
+ NSString *markdown = [_dataSource currentMarkdown];
114
+ emitter->onChangeMarkdown({.value = std::string([markdown UTF8String] ?: "")});
115
+ }
116
+
117
+ - (void)emitOnChangeSelection
118
+ {
119
+ ENRM_GUARD_EMITTER(emitter);
120
+ NSRange selection = [_dataSource selectedRange];
121
+ emitter->onChangeSelection({
122
+ .start = static_cast<int>(selection.location),
123
+ .end = static_cast<int>(NSMaxRange(selection)),
124
+ });
125
+ }
126
+
127
+ - (void)emitOnFocus
128
+ {
129
+ ENRM_GUARD_EMITTER(emitter);
130
+ emitter->onInputFocus({});
131
+ }
132
+
133
+ - (void)emitOnBlur
134
+ {
135
+ ENRM_GUARD_EMITTER(emitter);
136
+ emitter->onInputBlur({});
137
+ }
138
+
139
+ - (void)emitOnLinkDetectedWithText:(NSString *)text url:(NSString *)url range:(NSRange)range
140
+ {
141
+ ENRM_GUARD_EMITTER(emitter);
142
+ emitter->onLinkDetected({
143
+ .text = std::string([text UTF8String] ?: ""),
144
+ .url = std::string([url UTF8String] ?: ""),
145
+ .start = static_cast<int>(range.location),
146
+ .end = static_cast<int>(range.location + range.length),
147
+ });
148
+ }
149
+
150
+ - (void)emitOnMathPressWithLatex:(NSString *)latex range:(NSRange)range displayMode:(BOOL)displayMode rect:(CGRect)rect
151
+ {
152
+ ENRM_GUARD_EMITTER(emitter);
153
+ emitter->onMathPress({
154
+ .latex = std::string([latex UTF8String] ?: ""),
155
+ .start = static_cast<int>(range.location),
156
+ .end = static_cast<int>(NSMaxRange(range)),
157
+ .displayMode = displayMode ? true : false,
158
+ .x = rect.origin.x,
159
+ .y = rect.origin.y,
160
+ .width = rect.size.width,
161
+ .height = rect.size.height,
162
+ });
163
+ }
164
+
165
+ - (void)emitOnPasteWithText:(NSString *)text markdown:(NSString *)markdown
166
+ {
167
+ ENRM_GUARD_EMITTER(emitter);
168
+ emitter->onPaste({
169
+ .text = std::string([text UTF8String] ?: ""),
170
+ .markdown = std::string([markdown UTF8String] ?: ""),
171
+ });
172
+ }
173
+
174
+ - (void)emitOnStartMention:(NSString *)indicator
175
+ {
176
+ ENRM_GUARD_EMITTER(emitter);
177
+ emitter->onStartMention({.indicator = std::string([indicator UTF8String] ?: "")});
178
+ }
179
+
180
+ - (void)emitOnChangeMentionWithIndicator:(NSString *)indicator text:(NSString *)text
181
+ {
182
+ ENRM_GUARD_EMITTER(emitter);
183
+ emitter->onChangeMention({
184
+ .indicator = std::string([indicator UTF8String] ?: ""),
185
+ .text = std::string([text UTF8String] ?: ""),
186
+ });
187
+ }
188
+
189
+ - (void)emitOnEndMention:(NSString *)indicator
190
+ {
191
+ ENRM_GUARD_EMITTER(emitter);
192
+ emitter->onEndMention({.indicator = std::string([indicator UTF8String] ?: "")});
193
+ }
194
+
195
+ #pragma mark - Stateful emitters
196
+
197
+ - (void)emitOnChangeState
198
+ {
199
+ ENRM_GUARD_EMITTER(emitter);
200
+
201
+ ENRMInputStyleSnapshot snapshot = [ENRMInputStyleStateBuilder snapshotAtCurrentCursor:_dataSource];
202
+
203
+ if (_prevState.initialized && _prevState.bold == snapshot.bold && _prevState.italic == snapshot.italic &&
204
+ _prevState.underline == snapshot.underline && _prevState.strikethrough == snapshot.strikethrough &&
205
+ _prevState.spoiler == snapshot.spoiler && _prevState.link == snapshot.link &&
206
+ _prevState.headingLevel == snapshot.headingLevel && _prevState.unorderedList == snapshot.unorderedList &&
207
+ _prevState.unorderedListDepth == snapshot.listDepth && _prevState.orderedList == snapshot.orderedList &&
208
+ _prevState.orderedListDepth == snapshot.listDepth) {
209
+ return;
210
+ }
211
+
212
+ _prevState.bold = snapshot.bold;
213
+ _prevState.italic = snapshot.italic;
214
+ _prevState.underline = snapshot.underline;
215
+ _prevState.strikethrough = snapshot.strikethrough;
216
+ _prevState.spoiler = snapshot.spoiler;
217
+ _prevState.link = snapshot.link;
218
+ _prevState.headingLevel = snapshot.headingLevel;
219
+ _prevState.unorderedList = snapshot.unorderedList;
220
+ _prevState.unorderedListDepth = snapshot.listDepth;
221
+ _prevState.orderedList = snapshot.orderedList;
222
+ _prevState.orderedListDepth = snapshot.listDepth;
223
+ _prevState.initialized = YES;
224
+
225
+ emitter->onChangeState(ENRMFabricChangeState(snapshot));
226
+ }
227
+
228
+ - (void)emitCaretRectChangeIfNeeded
229
+ {
230
+ ENRM_GUARD_EMITTER(emitter);
231
+
232
+ CGRect caretRect = [_dataSource computeCaretRect];
233
+
234
+ if (_prevCaretRect.has_value() && CGRectEqualToRect(_prevCaretRect.value(), caretRect)) {
235
+ return;
236
+ }
237
+
238
+ _prevCaretRect = caretRect;
239
+
240
+ emitter->onCaretRectChange({
241
+ .x = caretRect.origin.x,
242
+ .y = caretRect.origin.y,
243
+ .width = caretRect.size.width,
244
+ .height = caretRect.size.height,
245
+ });
246
+ }
247
+
248
+ - (void)invalidateCachedState
249
+ {
250
+ _prevState.initialized = NO;
251
+ _prevCaretRect.reset();
252
+ }
253
+
254
+ - (void)emitContextMenuItemPress:(NSString *)itemText
255
+ {
256
+ ENRM_GUARD_EMITTER(eventEmitter);
257
+
258
+ NSRange selectedRange = [_dataSource selectedRange];
259
+ NSString *selectedText = selectedRange.length > 0 ? [[_dataSource plainText] substringWithRange:selectedRange] : @"";
260
+
261
+ ENRMInputStyleSnapshot snapshot = [ENRMInputStyleStateBuilder snapshotForRange:selectedRange dataSource:_dataSource];
262
+
263
+ eventEmitter->onContextMenuItemPress({
264
+ .itemText = std::string(itemText.UTF8String),
265
+ .selectedText = std::string(selectedText.UTF8String),
266
+ .selectionStart = static_cast<int>(selectedRange.location),
267
+ .selectionEnd = static_cast<int>(NSMaxRange(selectedRange)),
268
+ .styleState = ENRMFabricContextMenuStyleState(snapshot),
269
+ });
270
+ }
271
+
272
+ #pragma mark - Compound helpers
273
+
274
+ - (void)emitFormattingChanged
275
+ {
276
+ [self emitOnChangeState];
277
+ if (_emitMarkdown) {
278
+ [self emitOnChangeMarkdown];
279
+ }
280
+ }
281
+
282
+ #pragma mark - Request-response
283
+
284
+ - (void)requestMarkdown:(NSInteger)requestId
285
+ {
286
+ ENRM_GUARD_EMITTER(emitter);
287
+ NSString *markdown = [_dataSource currentMarkdown];
288
+ emitter->onRequestMarkdownResult({
289
+ .requestId = static_cast<int>(requestId),
290
+ .markdown = std::string([markdown UTF8String] ?: ""),
291
+ });
292
+ }
293
+
294
+ - (void)requestCaretRect:(NSInteger)requestId
295
+ {
296
+ ENRM_GUARD_EMITTER(emitter);
297
+
298
+ CGRect caretRect = [_dataSource computeCaretRect];
299
+ emitter->onRequestCaretRectResult({
300
+ .requestId = static_cast<int>(requestId),
301
+ .x = caretRect.origin.x,
302
+ .y = caretRect.origin.y,
303
+ .width = caretRect.size.width,
304
+ .height = caretRect.size.height,
305
+ });
306
+ }
307
+
308
+ @end
@@ -1,88 +1,48 @@
1
1
  #pragma once
2
2
 
3
+ #import "ENRMBlockRange.h"
3
4
  #import "ENRMFormattingRange.h"
4
- #import "ENRMUIKit.h"
5
+ #import "ENRMInputFormatterStyle.h"
5
6
 
6
7
  NS_ASSUME_NONNULL_BEGIN
7
8
 
8
9
  @protocol ENRMStyleHandler;
9
-
10
- @interface ENRMInputLinkVariantStyle : NSObject
11
-
12
- @property (nonatomic, copy) NSString *pattern;
13
- @property (nonatomic, strong) RCTUIColor *color;
14
- @property (nonatomic, assign) BOOL underline;
15
- @property (nonatomic, strong, nullable) RCTUIColor *backgroundColor;
16
- @property (nonatomic, strong, nullable) NSRegularExpression *regex;
17
-
18
- @end
19
-
20
- @interface ENRMInputFormatterStyle : NSObject <NSCopying>
21
-
22
- /// Base text properties
23
- @property (nonatomic, strong) UIFont *baseFont;
24
- @property (nonatomic, strong) RCTUIColor *baseTextColor;
25
-
26
- /// Bold — color override (nil = inherit baseTextColor)
27
- @property (nonatomic, strong, nullable) RCTUIColor *boldColor;
28
-
29
- /// Italic — color override (nil = inherit baseTextColor)
30
- @property (nonatomic, strong, nullable) RCTUIColor *italicColor;
31
-
32
- /// Link
33
- @property (nonatomic, strong, nullable) RCTUIColor *linkColor;
34
- @property (nonatomic, assign) BOOL linkUnderline;
35
- @property (nonatomic, strong, nullable) RCTUIColor *linkBackgroundColor;
36
- @property (nonatomic, copy) NSArray<ENRMInputLinkVariantStyle *> *linkVariants;
37
-
38
- /// Spoiler
39
- @property (nonatomic, strong, nullable) RCTUIColor *spoilerColor;
40
- @property (nonatomic, strong, nullable) RCTUIColor *spoilerBackgroundColor;
41
-
42
- /// Math (inline `$...$`)
43
- @property (nonatomic, strong, nullable) RCTUIColor *mathColor;
44
- @property (nonatomic, assign) CGFloat mathFontSize;
45
- @property (nonatomic, strong, nullable) RCTUIColor *mathBackgroundColor;
46
- @property (nonatomic, strong, nullable) RCTUIColor *mathBorderColor;
47
- @property (nonatomic, assign) CGFloat mathBorderWidth;
48
- @property (nonatomic, assign) CGFloat mathBorderRadius;
49
- @property (nonatomic, assign) CGFloat mathPaddingHorizontal;
50
- @property (nonatomic, assign) CGFloat mathPaddingVertical;
51
- @property (nonatomic, strong, nullable) RCTUIColor *mathSelectedBackgroundColor;
52
- @property (nonatomic, strong, nullable) RCTUIColor *mathSelectedBorderColor;
53
- /// Raw `fontWeight` string; narrowed at the draw site (see ENRMMathFontWeight.h).
54
- @property (nonatomic, copy, nullable) NSString *mathFontWeight;
55
-
56
- /// Math block (`$$...$$`)
57
- @property (nonatomic, strong, nullable) RCTUIColor *mathBlockColor;
58
- @property (nonatomic, assign) CGFloat mathBlockFontSize;
59
- @property (nonatomic, strong, nullable) RCTUIColor *mathBlockBackgroundColor;
60
- @property (nonatomic, strong, nullable) RCTUIColor *mathBlockBorderColor;
61
- @property (nonatomic, assign) CGFloat mathBlockBorderWidth;
62
- @property (nonatomic, assign) CGFloat mathBlockBorderRadius;
63
- @property (nonatomic, assign) CGFloat mathBlockPaddingHorizontal;
64
- @property (nonatomic, assign) CGFloat mathBlockPaddingVertical;
65
- @property (nonatomic, strong, nullable) RCTUIColor *mathBlockSelectedBackgroundColor;
66
- @property (nonatomic, strong, nullable) RCTUIColor *mathBlockSelectedBorderColor;
67
- @property (nonatomic, assign) CGFloat mathBlockMarginTop;
68
- @property (nonatomic, assign) CGFloat mathBlockMarginBottom;
69
- @property (nonatomic, assign) NSTextAlignment mathBlockAlignment;
70
- /// Raw `fontWeight` string; narrowed at the draw site (see ENRMMathFontWeight.h).
71
- @property (nonatomic, copy, nullable) NSString *mathBlockFontWeight;
72
-
73
- - (UIFont *)fontForTraits:(UIFontDescriptorSymbolicTraits)traits;
74
- - (void)invalidateFontCache;
75
-
76
- @end
10
+ @protocol ENRMBlockHandler;
77
11
 
78
12
  @interface ENRMInputFormatter : NSObject
79
13
 
80
14
  - (nullable id<ENRMStyleHandler>)handlerForStyleType:(ENRMInputStyleType)type;
15
+ - (nullable id<ENRMBlockHandler>)handlerForBlockType:(ENRMInputBlockType)type;
81
16
 
82
17
  - (void)applyFormattingRanges:(NSArray<ENRMFormattingRange *> *)ranges
83
18
  toTextView:(ENRMPlatformTextView *)textView
84
19
  style:(ENRMInputFormatterStyle *)style;
85
20
 
21
+ /// Same as above, but resets and re-applies attributes only within `scope`
22
+ /// (ranges straddling the boundary are clipped — attributes outside the scope
23
+ /// are already consistent because they move with the text on edits). Pass the
24
+ /// full text range for a wholesale re-apply (import / style change).
25
+ - (void)applyFormattingRanges:(NSArray<ENRMFormattingRange *> *)ranges
26
+ toTextView:(ENRMPlatformTextView *)textView
27
+ style:(ENRMInputFormatterStyle *)style
28
+ scopedToRange:(NSRange)scope;
29
+
30
+ /// Applies paragraph-level attributes for each block range via its handler,
31
+ /// after first stripping the attributes applied on the previous pass (so
32
+ /// removed blocks don't leave stale paragraph styling behind). With no
33
+ /// handlers registered (PR1) this is a no-op.
34
+ - (void)applyBlockRanges:(NSArray<ENRMBlockRange *> *)blockRanges
35
+ toTextView:(ENRMPlatformTextView *)textView
36
+ style:(ENRMInputFormatterStyle *)style;
37
+
38
+ /// Same as above, scoped: strips markers only within `scope` and re-applies
39
+ /// only the block ranges intersecting it. `scope` must cover whole lines
40
+ /// (blocks are line-scoped) — pass a line-expanded edit window.
41
+ - (void)applyBlockRanges:(NSArray<ENRMBlockRange *> *)blockRanges
42
+ toTextView:(ENRMPlatformTextView *)textView
43
+ style:(ENRMInputFormatterStyle *)style
44
+ scopedToRange:(NSRange)scope;
45
+
86
46
  @end
87
47
 
88
48
  NS_ASSUME_NONNULL_END