react-native-enriched-markdown-scaffold 0.7.4-scaffold.9 → 1.0.2-scaffold.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 (466) 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 +838 -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 +175 -11
  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 +33 -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 +19 -2
  117. package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +388 -0
  118. package/android/src/main/java/com/swmansion/enriched/markdown/views/ContextMenuPopup.kt +9 -6
  119. package/android/src/main/java/com/swmansion/enriched/markdown/views/CopyGlyph.kt +101 -0
  120. package/android/src/main/java/com/swmansion/enriched/markdown/views/TableContainerView.kt +32 -5
  121. package/android/src/main/jni/CMakeLists.txt +53 -0
  122. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp +10 -0
  123. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h +11 -2
  124. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +10 -0
  125. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +12 -2
  126. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.cpp +9 -0
  127. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.h +24 -0
  128. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +16 -0
  129. package/android/src/math/java/com/swmansion/enriched/markdown/input/math/MathChipControllerImpl.kt +21 -4
  130. package/android/src/math/java/com/swmansion/enriched/markdown/renderer/MathInlineRenderer.kt +7 -2
  131. package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathChipSpan.kt +1 -1
  132. package/android/src/math/java/com/swmansion/enriched/markdown/views/MathContainerView.kt +2 -0
  133. package/cpp/highlight/CodeBlockHighlighter.cpp +284 -0
  134. package/cpp/highlight/CodeBlockHighlighter.hpp +66 -0
  135. package/cpp/highlight/CodeBlockLanguages.cpp +138 -0
  136. package/cpp/highlight/CodeBlockLanguages.hpp +25 -0
  137. package/cpp/highlight/HighlightGrammars.hpp +28 -0
  138. package/cpp/highlight/code_highlight_podspec.rb +211 -0
  139. package/cpp/highlight/gen-registry.mjs +155 -0
  140. package/cpp/highlight/grammar-versions.json +159 -0
  141. package/cpp/highlight/vendor/generated/generated_queries.h +1665 -0
  142. package/cpp/highlight/vendor/generated/generated_registry.cpp +59 -0
  143. package/cpp/parser/MD4CParser.cpp +173 -61
  144. package/cpp/parser/MD4CParser.hpp +1 -0
  145. package/cpp/parser/MarkdownASTNode.hpp +2 -1
  146. package/cpp/wasm/ASTSerializer.cpp +2 -0
  147. package/cpp/wasm/build.sh +1 -0
  148. package/cpp/wasm/md4c_wasm.cpp +3 -1
  149. package/docs/ACCESSIBILITY.md +14 -2
  150. package/docs/API_REFERENCE.md +222 -8
  151. package/docs/BREAKING_CHANGES.md +129 -0
  152. package/docs/CODE_HIGHLIGHT.md +133 -0
  153. package/docs/COPY_OPTIONS.md +21 -3
  154. package/docs/ELEMENTS_STRUCTURE.md +52 -4
  155. package/docs/IMAGE_CACHING.md +30 -0
  156. package/docs/INPUT.md +108 -11
  157. package/docs/LATEX_MATH.md +87 -45
  158. package/docs/MACOS.md +1 -1
  159. package/docs/MARKDOWN_STREAMING.md +27 -1
  160. package/docs/NATIVE_ASSETS.md +127 -0
  161. package/docs/RTL.md +1 -1
  162. package/docs/STYLES.md +46 -6
  163. package/docs/TESTING.md +112 -0
  164. package/docs/TEXT.md +16 -6
  165. package/docs/WEB.md +3 -1
  166. package/ios/EnrichedMarkdown.h +7 -0
  167. package/ios/EnrichedMarkdown.mm +262 -67
  168. package/ios/EnrichedMarkdownText.h +7 -0
  169. package/ios/EnrichedMarkdownText.mm +97 -68
  170. package/ios/attachments/ENRMImageAttachment.h +9 -0
  171. package/ios/attachments/ENRMImageAttachment.m +143 -40
  172. package/ios/attachments/ENRMMathInlineAttachment.h +2 -0
  173. package/ios/attachments/ENRMMathInlineAttachment.m +48 -81
  174. package/ios/attachments/ENRMMathInlineAttachmentShared.h +2 -0
  175. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.cpp +75 -0
  176. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.h +63 -0
  177. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.cpp +35 -0
  178. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +838 -23
  179. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +131 -0
  180. package/ios/input/ENRMAutoLinkDetector.h +2 -1
  181. package/ios/input/ENRMAutoLinkDetector.mm +79 -41
  182. package/ios/input/ENRMBlockEditCoordinator.h +71 -0
  183. package/ios/input/ENRMBlockEditCoordinator.mm +195 -0
  184. package/ios/input/ENRMBlockRange.h +28 -0
  185. package/ios/input/ENRMBlockRange.mm +30 -0
  186. package/ios/input/ENRMBlockStore.h +56 -0
  187. package/ios/input/ENRMBlockStore.mm +275 -0
  188. package/ios/input/ENRMClipboardCoordinator.h +45 -0
  189. package/ios/input/ENRMClipboardCoordinator.mm +120 -0
  190. package/ios/input/ENRMDetectorPipeline.h +2 -1
  191. package/ios/input/ENRMEditPipeline.h +76 -0
  192. package/ios/input/ENRMEditPipeline.mm +228 -0
  193. package/ios/input/ENRMEditSession.h +36 -0
  194. package/ios/input/ENRMEditSession.mm +63 -0
  195. package/ios/input/ENRMFormattingStore.h +17 -0
  196. package/ios/input/ENRMFormattingStore.mm +95 -105
  197. package/ios/input/ENRMInputBlockType.h +91 -0
  198. package/ios/input/ENRMInputBlockType.mm +5 -0
  199. package/ios/input/ENRMInputDecorationDrawer.h +18 -0
  200. package/ios/input/ENRMInputEventEmitter.h +56 -0
  201. package/ios/input/ENRMInputEventEmitter.mm +308 -0
  202. package/ios/input/ENRMInputFormatter.h +29 -69
  203. package/ios/input/ENRMInputFormatter.mm +216 -124
  204. package/ios/input/ENRMInputFormatterStyle.h +99 -0
  205. package/ios/input/ENRMInputFormatterStyle.mm +188 -0
  206. package/ios/input/ENRMInputLayoutManager.h +9 -0
  207. package/ios/input/ENRMInputLayoutManager.mm +30 -0
  208. package/ios/input/ENRMInputListMarkerDrawer.h +32 -0
  209. package/ios/input/ENRMInputListMarkerDrawer.mm +426 -0
  210. package/ios/input/ENRMInputParser.h +5 -6
  211. package/ios/input/ENRMInputParser.mm +461 -178
  212. package/ios/input/ENRMInputRemend.mm +2 -2
  213. package/ios/input/ENRMInputStyleStateBuilder.h +40 -0
  214. package/ios/input/ENRMInputStyleStateBuilder.mm +60 -0
  215. package/ios/input/ENRMInputTextView.mm +103 -8
  216. package/ios/input/ENRMInputTypingAttributesController.h +42 -0
  217. package/ios/input/ENRMInputTypingAttributesController.mm +203 -0
  218. package/ios/input/ENRMLinkCoordinator.h +41 -0
  219. package/ios/input/ENRMLinkCoordinator.mm +89 -0
  220. package/ios/input/ENRMMarkdownSerializer.h +29 -5
  221. package/ios/input/ENRMMarkdownSerializer.mm +170 -48
  222. package/ios/input/ENRMMathAtom.h +26 -0
  223. package/ios/input/ENRMMathAtom.mm +12 -0
  224. package/ios/input/ENRMMentionCoordinator.h +45 -0
  225. package/ios/input/ENRMMentionCoordinator.mm +167 -0
  226. package/ios/input/ENRMRangeEditAdjustment.h +38 -0
  227. package/ios/input/ENRMRangeEditAdjustment.mm +91 -0
  228. package/ios/input/ENRMRangeStoreUtils.h +39 -0
  229. package/ios/input/EnrichedMarkdownTextInput+ContextMenu.mm +6 -6
  230. package/ios/input/EnrichedMarkdownTextInput+Internal.h +11 -3
  231. package/ios/input/EnrichedMarkdownTextInput.h +7 -1
  232. package/ios/input/EnrichedMarkdownTextInput.mm +1089 -1023
  233. package/ios/input/InputStylePropsUtils.h +109 -68
  234. package/ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm +2 -1
  235. package/ios/input/styles/ENRMBlockHandler.h +46 -0
  236. package/ios/input/styles/ENRMHeadingBlockHandler.h +15 -0
  237. package/ios/input/styles/ENRMHeadingBlockHandler.mm +38 -0
  238. package/ios/input/styles/ENRMOrderedListBlockHandler.h +14 -0
  239. package/ios/input/styles/ENRMOrderedListBlockHandler.mm +48 -0
  240. package/ios/input/styles/ENRMUnorderedListBlockHandler.h +15 -0
  241. package/ios/input/styles/ENRMUnorderedListBlockHandler.mm +51 -0
  242. package/ios/internals/ENRMViewFreeMeasurement.h +331 -0
  243. package/ios/internals/EnrichedMarkdownShadowNode.h +1 -3
  244. package/ios/internals/EnrichedMarkdownShadowNode.mm +16 -20
  245. package/ios/internals/EnrichedMarkdownTextShadowNode.h +1 -3
  246. package/ios/internals/EnrichedMarkdownTextShadowNode.mm +15 -20
  247. package/ios/internals/MeasurementCache.h +33 -7
  248. package/ios/internals/ShadowMeasurementUtils.h +63 -58
  249. package/ios/math/ENRMMathChipController.h +74 -0
  250. package/ios/math/ENRMMathChipController.mm +476 -0
  251. package/ios/math/ENRMRaTeXBridge.swift +4 -1
  252. package/ios/parser/ENRMMarkdownParser.h +1 -8
  253. package/ios/parser/ENRMMarkdownParser.mm +2 -11
  254. package/ios/parser/MarkdownASTNode.h +2 -1
  255. package/ios/parser/MarkdownParserBridge.mm +4 -0
  256. package/ios/renderer/AttributedRenderer.m +20 -2
  257. package/ios/renderer/BaseRenderer.h +17 -2
  258. package/ios/renderer/BaseRenderer.m +30 -0
  259. package/ios/renderer/BlockquoteRenderer.h +1 -1
  260. package/ios/renderer/BlockquoteRenderer.m +144 -35
  261. package/ios/renderer/CodeBlockRenderer.h +1 -1
  262. package/ios/renderer/CodeBlockRenderer.m +27 -23
  263. package/ios/renderer/CodeRenderer.h +1 -1
  264. package/ios/renderer/CodeRenderer.m +3 -1
  265. package/ios/renderer/ENRMImageRenderer.h +1 -1
  266. package/ios/renderer/ENRMImageRenderer.m +5 -1
  267. package/ios/renderer/ENRMMathInlineRenderer.h +1 -1
  268. package/ios/renderer/ENRMMathInlineRenderer.m +5 -1
  269. package/ios/renderer/ENRMSpoilerRenderer.h +1 -1
  270. package/ios/renderer/ENRMSpoilerRenderer.m +3 -1
  271. package/ios/renderer/EmphasisRenderer.h +1 -1
  272. package/ios/renderer/EmphasisRenderer.m +3 -1
  273. package/ios/renderer/HeadingRenderer.h +1 -1
  274. package/ios/renderer/HeadingRenderer.m +13 -6
  275. package/ios/renderer/HighlightRenderer.h +1 -1
  276. package/ios/renderer/HighlightRenderer.m +3 -1
  277. package/ios/renderer/LinkRenderer.h +1 -1
  278. package/ios/renderer/LinkRenderer.m +3 -1
  279. package/ios/renderer/ListItemRenderer.h +13 -1
  280. package/ios/renderer/ListItemRenderer.m +102 -44
  281. package/ios/renderer/ListRenderer.h +2 -2
  282. package/ios/renderer/ListRenderer.m +63 -25
  283. package/ios/renderer/ParagraphRenderer.h +1 -1
  284. package/ios/renderer/ParagraphRenderer.m +16 -8
  285. package/ios/renderer/RenderContext.h +10 -0
  286. package/ios/renderer/RenderContext.m +44 -0
  287. package/ios/renderer/RendererFactory.m +14 -0
  288. package/ios/renderer/StrikethroughRenderer.h +1 -1
  289. package/ios/renderer/StrikethroughRenderer.m +3 -1
  290. package/ios/renderer/StrongRenderer.h +1 -1
  291. package/ios/renderer/StrongRenderer.m +3 -1
  292. package/ios/renderer/SubscriptRenderer.h +1 -1
  293. package/ios/renderer/SubscriptRenderer.m +3 -1
  294. package/ios/renderer/SuperscriptRenderer.h +1 -1
  295. package/ios/renderer/SuperscriptRenderer.m +3 -1
  296. package/ios/renderer/TextRenderer.h +2 -2
  297. package/ios/renderer/TextRenderer.m +3 -1
  298. package/ios/renderer/ThematicBreakRenderer.h +1 -1
  299. package/ios/renderer/ThematicBreakRenderer.m +3 -1
  300. package/ios/renderer/UnderlineRenderer.h +1 -1
  301. package/ios/renderer/UnderlineRenderer.m +3 -1
  302. package/ios/styles/StyleConfig.h +22 -0
  303. package/ios/styles/StyleConfig.mm +132 -0
  304. package/ios/utils/BlockquoteBorder.h +6 -0
  305. package/ios/utils/BlockquoteBorder.m +249 -52
  306. package/ios/utils/CodeBlockBackground.m +16 -2
  307. package/ios/utils/ENRMAtomicSize.h +65 -0
  308. package/ios/utils/ENRMCodeBlockContent.h +37 -0
  309. package/ios/utils/ENRMCodeBlockContent.mm +79 -0
  310. package/ios/utils/ENRMCodeBlockHighlighter.h +37 -0
  311. package/ios/utils/ENRMCodeBlockHighlighter.mm +51 -0
  312. package/ios/utils/ENRMFeatureFlags.h +7 -0
  313. package/ios/utils/ENRMImageDownloader.h +11 -1
  314. package/ios/utils/ENRMImageDownloader.m +60 -16
  315. package/ios/utils/ENRMLocalImageLoader.h +31 -0
  316. package/ios/utils/ENRMLocalImageLoader.m +68 -0
  317. package/ios/utils/ENRMMathFallback.h +26 -0
  318. package/ios/utils/ENRMMathFallback.m +18 -0
  319. package/ios/utils/ENRMTextViewSetup.h +35 -17
  320. package/ios/utils/EditMenuUtils.m +22 -1
  321. package/ios/utils/ImageRequestHeaderUtils.h +35 -0
  322. package/ios/utils/LastElementUtils.h +1 -0
  323. package/ios/utils/ListMarkerDrawer.m +29 -42
  324. package/ios/utils/MarkdownASTSerializer.m +4 -0
  325. package/ios/utils/ParagraphStyleUtils.h +5 -0
  326. package/ios/utils/ParagraphStyleUtils.m +77 -17
  327. package/ios/utils/RenderedMarkdownSegment.h +13 -1
  328. package/ios/utils/RenderedMarkdownSegment.m +20 -0
  329. package/ios/utils/SegmentRenderer.m +17 -4
  330. package/ios/utils/StreamingMarkdownFilter.h +11 -1
  331. package/ios/utils/StreamingMarkdownFilter.m +98 -2
  332. package/ios/utils/StylePropsUtils.h +63 -0
  333. package/ios/utils/TaskListTapUtils.m +24 -0
  334. package/ios/views/ENRMCodeBlockContainerView.h +46 -0
  335. package/ios/views/ENRMCodeBlockContainerView.m +566 -0
  336. package/ios/views/ENRMMathContainerView.h +12 -0
  337. package/ios/views/ENRMMathContainerView.m +71 -1
  338. package/ios/views/TableContainerView.h +18 -0
  339. package/ios/views/TableContainerView.m +259 -159
  340. package/jest.d.ts +1 -0
  341. package/jest.js +5 -0
  342. package/lib/module/EnrichedMarkdownNativeComponent.ts +65 -0
  343. package/lib/module/EnrichedMarkdownTextInput.js +84 -5
  344. package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
  345. package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  346. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +66 -0
  347. package/lib/module/headingDefaults.js +34 -0
  348. package/lib/module/headingDefaults.js.map +1 -0
  349. package/lib/module/index.js.map +1 -1
  350. package/lib/module/jest/index.js +191 -0
  351. package/lib/module/jest/index.js.map +1 -0
  352. package/lib/module/native/EnrichedMarkdownText.js +30 -4
  353. package/lib/module/native/EnrichedMarkdownText.js.map +1 -1
  354. package/lib/module/normalizeMarkdownStyle.js +81 -19
  355. package/lib/module/normalizeMarkdownStyle.js.map +1 -1
  356. package/lib/module/normalizeMarkdownStyle.web.js +56 -18
  357. package/lib/module/normalizeMarkdownStyle.web.js.map +1 -1
  358. package/lib/module/normalizeMarkdownTextInputStyle.js +62 -15
  359. package/lib/module/normalizeMarkdownTextInputStyle.js.map +1 -1
  360. package/lib/module/normalizeMenuItem.js +1 -1
  361. package/lib/module/utils/textInputState.js +26 -0
  362. package/lib/module/utils/textInputState.js.map +1 -0
  363. package/lib/module/web/EnrichedMarkdownText.js +9 -5
  364. package/lib/module/web/EnrichedMarkdownText.js.map +1 -1
  365. package/lib/module/web/parseMarkdown.js +4 -3
  366. package/lib/module/web/parseMarkdown.js.map +1 -1
  367. package/lib/module/web/renderers/InlineRenderers.js +6 -0
  368. package/lib/module/web/renderers/InlineRenderers.js.map +1 -1
  369. package/lib/module/web/renderers/ListRenderers.js +7 -2
  370. package/lib/module/web/renderers/ListRenderers.js.map +1 -1
  371. package/lib/module/web/renderers/index.js +7 -4
  372. package/lib/module/web/renderers/index.js.map +1 -1
  373. package/lib/module/web/styles.js +83 -6
  374. package/lib/module/web/styles.js.map +1 -1
  375. package/lib/module/web/utils.js +1 -0
  376. package/lib/module/web/utils.js.map +1 -1
  377. package/lib/module/web/wasm/md4c.js +0 -0
  378. package/lib/module/web/wasm/md4c.js.map +1 -1
  379. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts +62 -0
  380. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
  381. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +94 -9
  382. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
  383. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +69 -5
  384. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
  385. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +62 -0
  386. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
  387. package/lib/typescript/src/headingDefaults.d.ts +9 -0
  388. package/lib/typescript/src/headingDefaults.d.ts.map +1 -0
  389. package/lib/typescript/src/index.d.ts +2 -2
  390. package/lib/typescript/src/index.d.ts.map +1 -1
  391. package/lib/typescript/src/index.web.d.ts +1 -1
  392. package/lib/typescript/src/index.web.d.ts.map +1 -1
  393. package/lib/typescript/src/jest/index.d.ts +6 -0
  394. package/lib/typescript/src/jest/index.d.ts.map +1 -0
  395. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts +3 -3
  396. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts.map +1 -1
  397. package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -1
  398. package/lib/typescript/src/normalizeMarkdownStyle.web.d.ts.map +1 -1
  399. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts +19 -5
  400. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts.map +1 -1
  401. package/lib/typescript/src/types/MarkdownStyle.d.ts +72 -0
  402. package/lib/typescript/src/types/MarkdownStyle.d.ts.map +1 -1
  403. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts +27 -0
  404. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts.map +1 -1
  405. package/lib/typescript/src/types/MarkdownTextProps.d.ts +65 -1
  406. package/lib/typescript/src/types/MarkdownTextProps.d.ts.map +1 -1
  407. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts +19 -0
  408. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts.map +1 -1
  409. package/lib/typescript/src/types/events.d.ts +19 -0
  410. package/lib/typescript/src/types/events.d.ts.map +1 -1
  411. package/lib/typescript/src/utils/textInputState.d.ts +24 -0
  412. package/lib/typescript/src/utils/textInputState.d.ts.map +1 -0
  413. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts +1 -1
  414. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts.map +1 -1
  415. package/lib/typescript/src/web/parseMarkdown.d.ts +1 -1
  416. package/lib/typescript/src/web/parseMarkdown.d.ts.map +1 -1
  417. package/lib/typescript/src/web/renderers/InlineRenderers.d.ts.map +1 -1
  418. package/lib/typescript/src/web/renderers/ListRenderers.d.ts.map +1 -1
  419. package/lib/typescript/src/web/renderers/index.d.ts +2 -1
  420. package/lib/typescript/src/web/renderers/index.d.ts.map +1 -1
  421. package/lib/typescript/src/web/styles.d.ts +2 -1
  422. package/lib/typescript/src/web/styles.d.ts.map +1 -1
  423. package/lib/typescript/src/web/types.d.ts +6 -2
  424. package/lib/typescript/src/web/types.d.ts.map +1 -1
  425. package/lib/typescript/src/web/utils.d.ts.map +1 -1
  426. package/package.json +36 -9
  427. package/postinstall.mjs +131 -0
  428. package/ratex-version.json +21 -0
  429. package/src/EnrichedMarkdownNativeComponent.ts +65 -0
  430. package/src/EnrichedMarkdownTextInput.tsx +159 -8
  431. package/src/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  432. package/src/EnrichedMarkdownTextNativeComponent.ts +66 -0
  433. package/src/headingDefaults.ts +21 -0
  434. package/src/index.tsx +9 -0
  435. package/src/index.web.tsx +1 -0
  436. package/src/jest/index.tsx +215 -0
  437. package/src/native/EnrichedMarkdownText.tsx +40 -2
  438. package/src/normalizeMarkdownStyle.ts +102 -16
  439. package/src/normalizeMarkdownStyle.web.ts +63 -15
  440. package/src/normalizeMarkdownTextInputStyle.ts +110 -35
  441. package/src/normalizeMenuItem.ts +1 -1
  442. package/src/types/MarkdownStyle.ts +74 -0
  443. package/src/types/MarkdownStyleInternal.ts +39 -0
  444. package/src/types/MarkdownTextProps.ts +65 -0
  445. package/src/types/MarkdownTextProps.web.ts +19 -0
  446. package/src/types/events.ts +21 -0
  447. package/src/utils/textInputState.ts +35 -0
  448. package/src/web/EnrichedMarkdownText.tsx +16 -2
  449. package/src/web/parseMarkdown.ts +6 -2
  450. package/src/web/renderers/InlineRenderers.tsx +5 -0
  451. package/src/web/renderers/ListRenderers.tsx +14 -2
  452. package/src/web/renderers/index.tsx +6 -2
  453. package/src/web/styles.ts +89 -5
  454. package/src/web/types.ts +6 -1
  455. package/src/web/utils.ts +1 -0
  456. package/src/web/wasm/md4c.js +0 -0
  457. package/vendor-grammars.mjs +511 -0
  458. package/vendor-ratex.mjs +173 -0
  459. package/app.plugin.js +0 -2
  460. package/plugin/build/withAndroidMath.js +0 -19
  461. package/plugin/build/withIosMath.js +0 -28
  462. package/plugin/build/withReactNativeEnrichedMarkdown.js +0 -11
  463. package/plugin/src/withAndroidMath.ts +0 -24
  464. package/plugin/src/withIosMath.ts +0 -35
  465. package/plugin/src/withReactNativeEnrichedMarkdown.ts +0 -17
  466. package/plugin/tsconfig.build.json +0 -16
@@ -18,6 +18,35 @@ static inline UITextAutocapitalizationType ENRMAutocapitalizationTypeFromString(
18
18
  }
19
19
  #endif
20
20
 
21
+ /// Headings h1..h6 share an identical struct shape (fontSize / fontWeight /
22
+ /// color) but are distinct codegen types, hence the template.
23
+ template <typename HeadingProps>
24
+ static BOOL applyHeadingLevelProps(ENRMInputFormatterStyle *style, NSInteger level, const HeadingProps &newHeading,
25
+ const HeadingProps &oldHeading)
26
+ {
27
+ BOOL changed = NO;
28
+
29
+ if (newHeading.fontSize != oldHeading.fontSize) {
30
+ [style setHeadingFontSize:newHeading.fontSize forLevel:level];
31
+ changed = YES;
32
+ }
33
+
34
+ if (newHeading.fontWeight != oldHeading.fontWeight) {
35
+ NSString *weight =
36
+ newHeading.fontWeight.empty() ? nil : [NSString stringWithUTF8String:newHeading.fontWeight.c_str()];
37
+ [style setHeadingFontWeight:weight forLevel:level];
38
+ changed = YES;
39
+ }
40
+
41
+ if (newHeading.color != oldHeading.color) {
42
+ RCTUIColor *color = isColorMeaningful(newHeading.color) ? RCTUIColorFromSharedColor(newHeading.color) : nil;
43
+ [style setHeadingColor:color forLevel:level];
44
+ changed = YES;
45
+ }
46
+
47
+ return changed;
48
+ }
49
+
21
50
  template <typename InputProps>
22
51
  BOOL applyInputStyleProps(ENRMInputFormatterStyle *style, const InputProps &newProps, const InputProps &oldProps)
23
52
  {
@@ -140,7 +169,76 @@ BOOL applyInputStyleProps(ENRMInputFormatterStyle *style, const InputProps &newP
140
169
  changed = YES;
141
170
  }
142
171
 
143
- // Math (inline `$...$`)
172
+ if (newProps.markdownStyle.list.itemSpacing != oldProps.markdownStyle.list.itemSpacing) {
173
+ style.listItemSpacing = newProps.markdownStyle.list.itemSpacing;
174
+ changed = YES;
175
+ }
176
+
177
+ changed |= applyHeadingLevelProps(style, 1, newProps.markdownStyle.h1, oldProps.markdownStyle.h1);
178
+ changed |= applyHeadingLevelProps(style, 2, newProps.markdownStyle.h2, oldProps.markdownStyle.h2);
179
+ changed |= applyHeadingLevelProps(style, 3, newProps.markdownStyle.h3, oldProps.markdownStyle.h3);
180
+ changed |= applyHeadingLevelProps(style, 4, newProps.markdownStyle.h4, oldProps.markdownStyle.h4);
181
+ changed |= applyHeadingLevelProps(style, 5, newProps.markdownStyle.h5, oldProps.markdownStyle.h5);
182
+ changed |= applyHeadingLevelProps(style, 6, newProps.markdownStyle.h6, oldProps.markdownStyle.h6);
183
+
184
+ // Inline math chip (`$...$`) — markdownStyle.inlineMath
185
+ if (newProps.markdownStyle.inlineMath.color != oldProps.markdownStyle.inlineMath.color) {
186
+ style.inlineMathColor = isColorMeaningful(newProps.markdownStyle.inlineMath.color)
187
+ ? RCTUIColorFromSharedColor(newProps.markdownStyle.inlineMath.color)
188
+ : nil;
189
+ changed = YES;
190
+ }
191
+ if (newProps.markdownStyle.inlineMath.fontSize != oldProps.markdownStyle.inlineMath.fontSize) {
192
+ style.inlineMathFontSize =
193
+ newProps.markdownStyle.inlineMath.fontSize > 0 ? newProps.markdownStyle.inlineMath.fontSize : 16.0;
194
+ changed = YES;
195
+ }
196
+ if (newProps.markdownStyle.inlineMath.backgroundColor != oldProps.markdownStyle.inlineMath.backgroundColor) {
197
+ RCTUIColor *bg = RCTUIColorFromSharedColor(newProps.markdownStyle.inlineMath.backgroundColor);
198
+ style.inlineMathBackgroundColor = (bg && CGColorGetAlpha(bg.CGColor) > 0) ? bg : nil;
199
+ changed = YES;
200
+ }
201
+ if (newProps.markdownStyle.inlineMath.borderColor != oldProps.markdownStyle.inlineMath.borderColor) {
202
+ RCTUIColor *bc = RCTUIColorFromSharedColor(newProps.markdownStyle.inlineMath.borderColor);
203
+ style.inlineMathBorderColor = (bc && CGColorGetAlpha(bc.CGColor) > 0) ? bc : nil;
204
+ changed = YES;
205
+ }
206
+ if (newProps.markdownStyle.inlineMath.borderWidth != oldProps.markdownStyle.inlineMath.borderWidth) {
207
+ style.inlineMathBorderWidth = newProps.markdownStyle.inlineMath.borderWidth;
208
+ changed = YES;
209
+ }
210
+ if (newProps.markdownStyle.inlineMath.borderRadius != oldProps.markdownStyle.inlineMath.borderRadius) {
211
+ style.inlineMathBorderRadius = newProps.markdownStyle.inlineMath.borderRadius;
212
+ changed = YES;
213
+ }
214
+ if (newProps.markdownStyle.inlineMath.paddingHorizontal != oldProps.markdownStyle.inlineMath.paddingHorizontal) {
215
+ style.inlineMathPaddingHorizontal = newProps.markdownStyle.inlineMath.paddingHorizontal;
216
+ changed = YES;
217
+ }
218
+ if (newProps.markdownStyle.inlineMath.paddingVertical != oldProps.markdownStyle.inlineMath.paddingVertical) {
219
+ style.inlineMathPaddingVertical = newProps.markdownStyle.inlineMath.paddingVertical;
220
+ changed = YES;
221
+ }
222
+ if (newProps.markdownStyle.inlineMath.selectedBackgroundColor !=
223
+ oldProps.markdownStyle.inlineMath.selectedBackgroundColor) {
224
+ RCTUIColor *sbg = RCTUIColorFromSharedColor(newProps.markdownStyle.inlineMath.selectedBackgroundColor);
225
+ style.inlineMathSelectedBackgroundColor = (sbg && CGColorGetAlpha(sbg.CGColor) > 0) ? sbg : nil;
226
+ changed = YES;
227
+ }
228
+ if (newProps.markdownStyle.inlineMath.selectedBorderColor != oldProps.markdownStyle.inlineMath.selectedBorderColor) {
229
+ RCTUIColor *sbc = RCTUIColorFromSharedColor(newProps.markdownStyle.inlineMath.selectedBorderColor);
230
+ style.inlineMathSelectedBorderColor = (sbc && CGColorGetAlpha(sbc.CGColor) > 0) ? sbc : nil;
231
+ changed = YES;
232
+ }
233
+ if (newProps.markdownStyle.inlineMath.fontWeight != oldProps.markdownStyle.inlineMath.fontWeight) {
234
+ if (!newProps.markdownStyle.inlineMath.fontWeight.empty()) {
235
+ style.inlineMathFontWeight =
236
+ [[NSString alloc] initWithUTF8String:newProps.markdownStyle.inlineMath.fontWeight.c_str()];
237
+ changed = YES;
238
+ }
239
+ }
240
+
241
+ // Block math chip (`$$...$$`) — markdownStyle.math
144
242
  if (newProps.markdownStyle.math.color != oldProps.markdownStyle.math.color) {
145
243
  style.mathColor = isColorMeaningful(newProps.markdownStyle.math.color)
146
244
  ? RCTUIColorFromSharedColor(newProps.markdownStyle.math.color)
@@ -148,7 +246,7 @@ BOOL applyInputStyleProps(ENRMInputFormatterStyle *style, const InputProps &newP
148
246
  changed = YES;
149
247
  }
150
248
  if (newProps.markdownStyle.math.fontSize != oldProps.markdownStyle.math.fontSize) {
151
- style.mathFontSize = newProps.markdownStyle.math.fontSize > 0 ? newProps.markdownStyle.math.fontSize : 16.0;
249
+ style.mathFontSize = newProps.markdownStyle.math.fontSize > 0 ? newProps.markdownStyle.math.fontSize : 20.0;
152
250
  changed = YES;
153
251
  }
154
252
  if (newProps.markdownStyle.math.backgroundColor != oldProps.markdownStyle.math.backgroundColor) {
@@ -193,79 +291,22 @@ BOOL applyInputStyleProps(ENRMInputFormatterStyle *style, const InputProps &newP
193
291
  changed = YES;
194
292
  }
195
293
  }
196
-
197
- // Math block (`$$...$$`)
198
- if (newProps.markdownStyle.mathBlock.color != oldProps.markdownStyle.mathBlock.color) {
199
- style.mathBlockColor = isColorMeaningful(newProps.markdownStyle.mathBlock.color)
200
- ? RCTUIColorFromSharedColor(newProps.markdownStyle.mathBlock.color)
201
- : nil;
202
- changed = YES;
203
- }
204
- if (newProps.markdownStyle.mathBlock.fontSize != oldProps.markdownStyle.mathBlock.fontSize) {
205
- style.mathBlockFontSize =
206
- newProps.markdownStyle.mathBlock.fontSize > 0 ? newProps.markdownStyle.mathBlock.fontSize : 20.0;
207
- changed = YES;
208
- }
209
- if (newProps.markdownStyle.mathBlock.backgroundColor != oldProps.markdownStyle.mathBlock.backgroundColor) {
210
- RCTUIColor *bg = RCTUIColorFromSharedColor(newProps.markdownStyle.mathBlock.backgroundColor);
211
- style.mathBlockBackgroundColor = (bg && CGColorGetAlpha(bg.CGColor) > 0) ? bg : nil;
212
- changed = YES;
213
- }
214
- if (newProps.markdownStyle.mathBlock.borderColor != oldProps.markdownStyle.mathBlock.borderColor) {
215
- RCTUIColor *bc = RCTUIColorFromSharedColor(newProps.markdownStyle.mathBlock.borderColor);
216
- style.mathBlockBorderColor = (bc && CGColorGetAlpha(bc.CGColor) > 0) ? bc : nil;
217
- changed = YES;
218
- }
219
- if (newProps.markdownStyle.mathBlock.borderWidth != oldProps.markdownStyle.mathBlock.borderWidth) {
220
- style.mathBlockBorderWidth = newProps.markdownStyle.mathBlock.borderWidth;
221
- changed = YES;
222
- }
223
- if (newProps.markdownStyle.mathBlock.borderRadius != oldProps.markdownStyle.mathBlock.borderRadius) {
224
- style.mathBlockBorderRadius = newProps.markdownStyle.mathBlock.borderRadius;
225
- changed = YES;
226
- }
227
- if (newProps.markdownStyle.mathBlock.paddingHorizontal != oldProps.markdownStyle.mathBlock.paddingHorizontal) {
228
- style.mathBlockPaddingHorizontal = newProps.markdownStyle.mathBlock.paddingHorizontal;
229
- changed = YES;
230
- }
231
- if (newProps.markdownStyle.mathBlock.paddingVertical != oldProps.markdownStyle.mathBlock.paddingVertical) {
232
- style.mathBlockPaddingVertical = newProps.markdownStyle.mathBlock.paddingVertical;
233
- changed = YES;
234
- }
235
- if (newProps.markdownStyle.mathBlock.selectedBackgroundColor !=
236
- oldProps.markdownStyle.mathBlock.selectedBackgroundColor) {
237
- RCTUIColor *sbg = RCTUIColorFromSharedColor(newProps.markdownStyle.mathBlock.selectedBackgroundColor);
238
- style.mathBlockSelectedBackgroundColor = (sbg && CGColorGetAlpha(sbg.CGColor) > 0) ? sbg : nil;
239
- changed = YES;
240
- }
241
- if (newProps.markdownStyle.mathBlock.selectedBorderColor != oldProps.markdownStyle.mathBlock.selectedBorderColor) {
242
- RCTUIColor *sbc = RCTUIColorFromSharedColor(newProps.markdownStyle.mathBlock.selectedBorderColor);
243
- style.mathBlockSelectedBorderColor = (sbc && CGColorGetAlpha(sbc.CGColor) > 0) ? sbc : nil;
244
- changed = YES;
245
- }
246
- if (newProps.markdownStyle.mathBlock.fontWeight != oldProps.markdownStyle.mathBlock.fontWeight) {
247
- if (!newProps.markdownStyle.mathBlock.fontWeight.empty()) {
248
- style.mathBlockFontWeight =
249
- [[NSString alloc] initWithUTF8String:newProps.markdownStyle.mathBlock.fontWeight.c_str()];
250
- changed = YES;
251
- }
252
- }
253
- if (newProps.markdownStyle.mathBlock.marginTop != oldProps.markdownStyle.mathBlock.marginTop) {
254
- style.mathBlockMarginTop = newProps.markdownStyle.mathBlock.marginTop;
294
+ if (newProps.markdownStyle.math.marginTop != oldProps.markdownStyle.math.marginTop) {
295
+ style.mathMarginTop = newProps.markdownStyle.math.marginTop;
255
296
  changed = YES;
256
297
  }
257
- if (newProps.markdownStyle.mathBlock.marginBottom != oldProps.markdownStyle.mathBlock.marginBottom) {
258
- style.mathBlockMarginBottom = newProps.markdownStyle.mathBlock.marginBottom;
298
+ if (newProps.markdownStyle.math.marginBottom != oldProps.markdownStyle.math.marginBottom) {
299
+ style.mathMarginBottom = newProps.markdownStyle.math.marginBottom;
259
300
  changed = YES;
260
301
  }
261
- if (newProps.markdownStyle.mathBlock.alignment != oldProps.markdownStyle.mathBlock.alignment) {
262
- NSString *align = [NSString stringWithUTF8String:newProps.markdownStyle.mathBlock.alignment.c_str()];
302
+ if (newProps.markdownStyle.math.textAlign != oldProps.markdownStyle.math.textAlign) {
303
+ NSString *align = [NSString stringWithUTF8String:newProps.markdownStyle.math.textAlign.c_str()];
263
304
  if ([align isEqualToString:@"left"]) {
264
- style.mathBlockAlignment = NSTextAlignmentLeft;
305
+ style.mathTextAlign = NSTextAlignmentLeft;
265
306
  } else if ([align isEqualToString:@"right"]) {
266
- style.mathBlockAlignment = NSTextAlignmentRight;
307
+ style.mathTextAlign = NSTextAlignmentRight;
267
308
  } else {
268
- style.mathBlockAlignment = NSTextAlignmentCenter;
309
+ style.mathTextAlign = NSTextAlignmentCenter;
269
310
  }
270
311
  changed = YES;
271
312
  }
@@ -1,4 +1,5 @@
1
1
  #import "EnrichedMarkdownTextInputShadowNode.h"
2
+ #import "ENRMEditSession.h"
2
3
  #import "EnrichedMarkdownTextInput.h"
3
4
  #import <react/utils/ManagedObjectWrapper.h>
4
5
  #import <yoga/Yoga.h>
@@ -37,7 +38,7 @@ id EnrichedMarkdownTextInputShadowNode::setupMockInputView_(CGFloat width) const
37
38
  EnrichedMarkdownTextInput *mockView =
38
39
  [[EnrichedMarkdownTextInput alloc] initWithFrame:CGRectMake(20000, 20000, width, 1000)];
39
40
 
40
- mockView.blockEmitting = YES;
41
+ [mockView.editSession enterPhase:ENRMEditPhaseImporting];
41
42
 
42
43
  const auto props = this->getProps();
43
44
  [mockView updateProps:props oldProps:nullptr];
@@ -0,0 +1,46 @@
1
+ #pragma once
2
+
3
+ #import "ENRMBlockRange.h"
4
+ #import "ENRMInputFormatter.h"
5
+
6
+ NS_ASSUME_NONNULL_BEGIN
7
+
8
+ /// A block handler owns how its ENRMInputBlockType styles its paragraph and how
9
+ /// it serializes to a markdown line prefix. Mirrors ENRMStyleHandler for the
10
+ /// inline pipeline. Parser recognition is NOT handler-driven: it lives in
11
+ /// ENRMInputParser's kSupportedBlocks central map, exactly as kSupportedSpans
12
+ /// does for inline styles — a new block type adds one entry there plus one
13
+ /// handler here. These signatures are designed to cover headings AND list items.
14
+ @protocol ENRMBlockHandler <NSObject>
15
+
16
+ @property (nonatomic, readonly) ENRMInputBlockType blockType;
17
+
18
+ /// Contribute paragraph-level attributes for a block of this type. Called once
19
+ /// per block range during formatting. A heading raises the font size; a list
20
+ /// item sets head/tail indents and a marker. May be a no-op.
21
+ ///
22
+ /// @param paragraphStyle Mutable paragraph style to adjust (indents, spacing).
23
+ /// @param attributes Mutable character attributes to add (e.g. font) over
24
+ /// the block range; NSParagraphStyleAttributeName is
25
+ /// applied by the formatter from `paragraphStyle`.
26
+ /// @param blockRange The block being styled (carries type, range, level).
27
+ /// @param style Resolved formatter style (base font, colors).
28
+ - (void)applyAttributesToParagraphStyle:(NSMutableParagraphStyle *)paragraphStyle
29
+ attributes:(NSMutableDictionary<NSAttributedStringKey, id> *)attributes
30
+ blockRange:(ENRMBlockRange *)blockRange
31
+ style:(ENRMInputFormatterStyle *)style;
32
+
33
+ /// Markdown prefix prepended to each line of the block during serialization,
34
+ /// e.g. @"# " for an H1 or @"- " for a bullet. Returns @"" when the block needs
35
+ /// no prefix. Owning the marker here replaces a central serializer switch.
36
+ - (NSString *)markdownLinePrefixForBlockRange:(ENRMBlockRange *)blockRange;
37
+
38
+ @optional
39
+
40
+ /// Whether Return continues the block onto the next line (a list item) rather
41
+ /// than ending it (a heading). Defaults to NO when unimplemented.
42
+ @property (nonatomic, readonly) BOOL continuesOnNewline;
43
+
44
+ @end
45
+
46
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,15 @@
1
+ #pragma once
2
+
3
+ #import "ENRMBlockHandler.h"
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ /// Block handler for ATX headings (H1-H6). A single instance serves all six
8
+ /// levels: it dispatches on ENRMBlockRange.level for both styling (font size via
9
+ /// the formatter style's per-level config) and serialization (`#`*level prefix).
10
+ /// The formatter registers the same instance under all six heading block-type
11
+ /// keys.
12
+ @interface ENRMHeadingBlockHandler : NSObject <ENRMBlockHandler>
13
+ @end
14
+
15
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,38 @@
1
+ #import "ENRMHeadingBlockHandler.h"
2
+
3
+ @implementation ENRMHeadingBlockHandler
4
+
5
+ - (ENRMInputBlockType)blockType
6
+ {
7
+ return ENRMInputBlockTypeHeading1;
8
+ }
9
+
10
+ - (void)applyAttributesToParagraphStyle:(NSMutableParagraphStyle *)paragraphStyle
11
+ attributes:(NSMutableDictionary<NSAttributedStringKey, id> *)attributes
12
+ blockRange:(ENRMBlockRange *)blockRange
13
+ style:(ENRMInputFormatterStyle *)style
14
+ {
15
+ NSInteger level = blockRange.level;
16
+ if (level < 1 || level > 6) {
17
+ return;
18
+ }
19
+
20
+ attributes[NSFontAttributeName] = [style headingFontForLevel:level];
21
+
22
+ RCTUIColor *headingColor = [style headingColorForLevel:level];
23
+ if (headingColor) {
24
+ attributes[NSForegroundColorAttributeName] = headingColor;
25
+ }
26
+ }
27
+
28
+ - (NSString *)markdownLinePrefixForBlockRange:(ENRMBlockRange *)blockRange
29
+ {
30
+ NSInteger level = blockRange.level;
31
+ if (level < 1 || level > 6) {
32
+ return @"";
33
+ }
34
+ NSString *hashes = [@"" stringByPaddingToLength:level withString:@"#" startingAtIndex:0];
35
+ return [hashes stringByAppendingString:@" "];
36
+ }
37
+
38
+ @end
@@ -0,0 +1,14 @@
1
+ #pragma once
2
+
3
+ #import "ENRMBlockHandler.h"
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ /// Block handler for ordered list items. Reserves the same head-indent column as
8
+ /// the bullet handler (the layout manager draws the number into it) and
9
+ /// serializes to an `N. ` line prefix indented three spaces per nesting level.
10
+ /// Depth rides in ENRMBlockRange.level, the number in ENRMBlockRange.ordinal.
11
+ @interface ENRMOrderedListBlockHandler : NSObject <ENRMBlockHandler>
12
+ @end
13
+
14
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,48 @@
1
+ #import "ENRMOrderedListBlockHandler.h"
2
+ #import "ENRMInputBlockType.h"
3
+
4
+ @implementation ENRMOrderedListBlockHandler
5
+
6
+ - (ENRMInputBlockType)blockType
7
+ {
8
+ return ENRMInputBlockTypeOrderedListItem;
9
+ }
10
+
11
+ - (BOOL)continuesOnNewline
12
+ {
13
+ return YES;
14
+ }
15
+
16
+ - (void)applyAttributesToParagraphStyle:(NSMutableParagraphStyle *)paragraphStyle
17
+ attributes:(NSMutableDictionary<NSAttributedStringKey, id> *)attributes
18
+ blockRange:(ENRMBlockRange *)blockRange
19
+ style:(ENRMInputFormatterStyle *)style
20
+ {
21
+ NSInteger depth = blockRange.level;
22
+ if (depth < 0) {
23
+ depth = 0;
24
+ } else if (depth > kENRMMaxListDepth) {
25
+ depth = kENRMMaxListDepth;
26
+ }
27
+
28
+ // Same indent column as the bullet handler so mixed lists align; wrapped
29
+ // lines hang under the text, not under the number.
30
+ CGFloat indent = (depth + 1) * kENRMListIndentPerDepth;
31
+ paragraphStyle.firstLineHeadIndent = indent;
32
+ paragraphStyle.headIndent = indent;
33
+ paragraphStyle.paragraphSpacingBefore = style.listItemSpacing;
34
+ }
35
+
36
+ - (NSString *)markdownLinePrefixForBlockRange:(ENRMBlockRange *)blockRange
37
+ {
38
+ NSInteger depth = blockRange.level;
39
+ if (depth < 0) {
40
+ depth = 0;
41
+ } else if (depth > kENRMMaxListDepth) {
42
+ depth = kENRMMaxListDepth;
43
+ }
44
+ NSString *indent = [@"" stringByPaddingToLength:depth * 3 withString:@" " startingAtIndex:0];
45
+ return [indent stringByAppendingFormat:@"%ld. ", (long)blockRange.ordinal];
46
+ }
47
+
48
+ @end
@@ -0,0 +1,15 @@
1
+ #pragma once
2
+
3
+ #import "ENRMBlockHandler.h"
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ /// Block handler for unordered (bullet) list items. Reserves the head-indent
8
+ /// column for the marker via the paragraph style (the layout manager draws the
9
+ /// glyph into it) and serializes to a `- ` line prefix indented three spaces per
10
+ /// nesting level. Nesting depth is carried in ENRMBlockRange.level. Continues on
11
+ /// Return (a new item at the same depth) unlike single-line heading blocks.
12
+ @interface ENRMUnorderedListBlockHandler : NSObject <ENRMBlockHandler>
13
+ @end
14
+
15
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,51 @@
1
+ #import "ENRMUnorderedListBlockHandler.h"
2
+ #import "ENRMInputBlockType.h"
3
+
4
+ @implementation ENRMUnorderedListBlockHandler
5
+
6
+ - (ENRMInputBlockType)blockType
7
+ {
8
+ return ENRMInputBlockTypeUnorderedListItem;
9
+ }
10
+
11
+ - (BOOL)continuesOnNewline
12
+ {
13
+ return YES;
14
+ }
15
+
16
+ - (void)applyAttributesToParagraphStyle:(NSMutableParagraphStyle *)paragraphStyle
17
+ attributes:(NSMutableDictionary<NSAttributedStringKey, id> *)attributes
18
+ blockRange:(ENRMBlockRange *)blockRange
19
+ style:(ENRMInputFormatterStyle *)style
20
+ {
21
+ NSInteger depth = blockRange.level;
22
+ if (depth < 0) {
23
+ depth = 0;
24
+ } else if (depth > kENRMMaxListDepth) {
25
+ depth = kENRMMaxListDepth;
26
+ }
27
+
28
+ // Reserve a marker column per nesting level. Both the first (marker) line and
29
+ // wrapped continuation lines align to the same text inset so wrapped text
30
+ // hangs under the text, not under the bullet.
31
+ CGFloat indent = (depth + 1) * kENRMListIndentPerDepth;
32
+ paragraphStyle.firstLineHeadIndent = indent;
33
+ paragraphStyle.headIndent = indent;
34
+ paragraphStyle.paragraphSpacingBefore = style.listItemSpacing;
35
+ }
36
+
37
+ - (NSString *)markdownLinePrefixForBlockRange:(ENRMBlockRange *)blockRange
38
+ {
39
+ NSInteger depth = blockRange.level;
40
+ if (depth < 0) {
41
+ depth = 0;
42
+ } else if (depth > kENRMMaxListDepth) {
43
+ depth = kENRMMaxListDepth;
44
+ }
45
+ // Three spaces of indent per nesting level (wide enough that ordered markers
46
+ // nest under bullets and vice versa), then the bullet marker.
47
+ NSString *indent = [@"" stringByPaddingToLength:depth * 3 withString:@" " startingAtIndex:0];
48
+ return [indent stringByAppendingString:@"- "];
49
+ }
50
+
51
+ @end