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,59 @@
1
+ // Generated by vendor/gen-registry.mjs. Do not edit.
2
+
3
+ #include "HighlightGrammars.hpp"
4
+ #include "generated_queries.h"
5
+
6
+ #include <cstring>
7
+
8
+ extern "C" {
9
+ const TSLanguage *tree_sitter_json(void);
10
+ const TSLanguage *tree_sitter_html(void);
11
+ const TSLanguage *tree_sitter_css(void);
12
+ const TSLanguage *tree_sitter_markdown(void);
13
+ const TSLanguage *tree_sitter_yaml(void);
14
+ const TSLanguage *tree_sitter_go(void);
15
+ const TSLanguage *tree_sitter_java(void);
16
+ const TSLanguage *tree_sitter_javascript(void);
17
+ const TSLanguage *tree_sitter_python(void);
18
+ const TSLanguage *tree_sitter_c(void);
19
+ const TSLanguage *tree_sitter_rust(void);
20
+ const TSLanguage *tree_sitter_bash(void);
21
+ const TSLanguage *tree_sitter_typescript(void);
22
+ const TSLanguage *tree_sitter_tsx(void);
23
+ }
24
+
25
+ namespace Markdown {
26
+ namespace {
27
+
28
+ constexpr GrammarEntry kGrammars[] = {
29
+ {"json", tree_sitter_json, kHighlightsQuery_json},
30
+ {"html", tree_sitter_html, kHighlightsQuery_html},
31
+ {"css", tree_sitter_css, kHighlightsQuery_css},
32
+ {"markdown", tree_sitter_markdown, kHighlightsQuery_markdown},
33
+ {"yaml", tree_sitter_yaml, kHighlightsQuery_yaml},
34
+ {"go", tree_sitter_go, kHighlightsQuery_go},
35
+ {"java", tree_sitter_java, kHighlightsQuery_java},
36
+ {"javascript", tree_sitter_javascript, kHighlightsQuery_javascript},
37
+ {"python", tree_sitter_python, kHighlightsQuery_python},
38
+ {"c", tree_sitter_c, kHighlightsQuery_c},
39
+ {"rust", tree_sitter_rust, kHighlightsQuery_rust},
40
+ {"bash", tree_sitter_bash, kHighlightsQuery_bash},
41
+ {"typescript", tree_sitter_typescript, kHighlightsQuery_typescript},
42
+ {"tsx", tree_sitter_tsx, kHighlightsQuery_tsx},
43
+ };
44
+
45
+ } // namespace
46
+
47
+ const GrammarEntry *findGrammar(const char *canonicalId) {
48
+ if (canonicalId == nullptr) {
49
+ return nullptr;
50
+ }
51
+ for (const GrammarEntry &entry : kGrammars) {
52
+ if (std::strcmp(entry.canonicalId, canonicalId) == 0) {
53
+ return &entry;
54
+ }
55
+ }
56
+ return nullptr;
57
+ }
58
+
59
+ } // namespace Markdown
@@ -19,6 +19,7 @@ public:
19
19
  static const std::string ATTR_LANGUAGE;
20
20
  static const std::string ATTR_IS_TASK;
21
21
  static const std::string ATTR_TASK_CHECKED;
22
+ static const std::string ATTR_START;
22
23
 
23
24
  void reset(size_t estimatedDepth) {
24
25
  root = std::make_shared<MarkdownASTNode>(NodeType::Document);
@@ -114,7 +115,14 @@ public:
114
115
  }
115
116
 
116
117
  case MD_BLOCK_OL: {
117
- impl->pushNode(std::make_shared<MarkdownASTNode>(NodeType::OrderedList));
118
+ auto node = std::make_shared<MarkdownASTNode>(NodeType::OrderedList);
119
+ if (detail) {
120
+ auto *ol = static_cast<MD_BLOCK_OL_DETAIL *>(detail);
121
+ if (ol->start != 1) {
122
+ node->setAttribute(ATTR_START, std::to_string(ol->start));
123
+ }
124
+ }
125
+ impl->pushNode(node);
118
126
  break;
119
127
  }
120
128
 
@@ -346,10 +354,13 @@ public:
346
354
  return 0;
347
355
  auto *impl = static_cast<Impl *>(userdata);
348
356
 
349
- // Handle soft/hard line breaks
350
- if (type == MD_TEXT_SOFTBR || type == MD_TEXT_BR) {
351
- auto brNode = std::make_shared<MarkdownASTNode>(NodeType::LineBreak);
352
- impl->addInlineNode(brNode);
357
+ if (type == MD_TEXT_SOFTBR) {
358
+ impl->addInlineNode(std::make_shared<MarkdownASTNode>(NodeType::SoftBreak));
359
+ return 0;
360
+ }
361
+
362
+ if (type == MD_TEXT_BR) {
363
+ impl->addInlineNode(std::make_shared<MarkdownASTNode>(NodeType::LineBreak));
353
364
  return 0;
354
365
  }
355
366
 
@@ -364,63 +375,89 @@ public:
364
375
 
365
376
  namespace {
366
377
 
378
+ using NodeList = std::vector<std::shared_ptr<MarkdownASTNode>>;
379
+
367
380
  bool isDisplayMathNode(const MarkdownASTNode &node) {
368
381
  return node.type == NodeType::LatexMathDisplay;
369
382
  }
370
383
 
371
384
  bool isSeparatorNode(const MarkdownASTNode &node) {
372
- return node.type == NodeType::LineBreak ||
385
+ return node.type == NodeType::LineBreak || node.type == NodeType::SoftBreak ||
373
386
  (node.type == NodeType::Text && node.content.find_first_not_of(" \t\n\r") == std::string::npos);
374
387
  }
375
388
 
376
- // md4c treats $$...$$ as an inline span, so when display math appears on a line
377
- // directly after text (no blank line), md4c merges them into a single Paragraph.
378
- // This function finds the trailing run of LatexMathDisplay nodes (possibly
379
- // interspersed with LineBreak / whitespace separators) at the end of a paragraph's
380
- // children. Returns the index where the trailing run starts, or children.size()
381
- // if there is nothing to promote.
382
- size_t findTrailingDisplayMathRun(const std::vector<std::shared_ptr<MarkdownASTNode>> &children) {
383
- size_t trailingRunStart = children.size();
384
- bool hasDisplayMath = false;
385
-
386
- for (size_t j = children.size(); j > 0; --j) {
387
- auto &node = children[j - 1];
388
- if (isDisplayMathNode(*node)) {
389
- trailingRunStart = j - 1;
390
- hasDisplayMath = true;
391
- } else if (isSeparatorNode(*node) && hasDisplayMath) {
392
- trailingRunStart = j - 1;
393
- } else {
389
+ // A display-math node is "isolated" — i.e. block-level — when at least one of its
390
+ // neighbours is a boundary: the paragraph edge, or a separator (LineBreak / blank
391
+ // text). Display math flanked by real text on BOTH sides (e.g. `a $$x$$ b`) is
392
+ // genuinely inline and is left in place.
393
+ bool isIsolatedDisplayMath(const std::vector<std::shared_ptr<MarkdownASTNode>> &children, size_t i) {
394
+ if (!isDisplayMathNode(*children[i]))
395
+ return false;
396
+ bool leftBoundary = (i == 0) || isSeparatorNode(*children[i - 1]);
397
+ bool rightBoundary = (i + 1 >= children.size()) || isSeparatorNode(*children[i + 1]);
398
+ return leftBoundary || rightBoundary;
399
+ }
400
+
401
+ // md4c parses $$...$$ as an inline span, so display math always lands nested inside a
402
+ // Paragraph — even when it sits on its own line, and even in the middle of a paragraph
403
+ // (text on lines before and after it, with no blank separator).
404
+ //
405
+ // This rebuilds such a paragraph into a sequence of top-level siblings so the rendering
406
+ // layer sees isolated display math as a block: each run of inline content becomes its own
407
+ // Paragraph, and each isolated display-math node becomes a bare LatexMathDisplay sibling.
408
+ // Separators bordering a promoted node are dropped. Returns an empty vector when the
409
+ // paragraph has no promotable display math, signalling the caller to leave it untouched.
410
+ //
411
+ // This subsumes the earlier trailing-only behaviour: pure (`$$x$$`), trailing
412
+ // (`text\n$$x$$`) and leading (`$$x$$\ntext`) are all just special cases of the general
413
+ // interior split.
414
+ std::vector<std::shared_ptr<MarkdownASTNode>>
415
+ splitParagraphAroundDisplayMath(const std::vector<std::shared_ptr<MarkdownASTNode>> &children) {
416
+ bool anyPromotion = false;
417
+ for (size_t i = 0; i < children.size(); ++i) {
418
+ if (isIsolatedDisplayMath(children, i)) {
419
+ anyPromotion = true;
394
420
  break;
395
421
  }
396
422
  }
423
+ if (!anyPromotion)
424
+ return {};
397
425
 
398
- return hasDisplayMath ? trailingRunStart : children.size();
399
- }
400
-
401
- // Collect only the LatexMathDisplay nodes from a range, skipping separators.
402
- std::vector<std::shared_ptr<MarkdownASTNode>>
403
- collectDisplayMathNodes(const std::vector<std::shared_ptr<MarkdownASTNode>> &children, size_t from) {
404
426
  std::vector<std::shared_ptr<MarkdownASTNode>> result;
405
- for (size_t j = from; j < children.size(); ++j) {
406
- if (isDisplayMathNode(*children[j]))
407
- result.push_back(children[j]);
427
+ std::vector<std::shared_ptr<MarkdownASTNode>> inlineRun;
428
+
429
+ auto flushInlineRun = [&]() {
430
+ // Trim separators left dangling against the promoted math on either side.
431
+ size_t start = 0;
432
+ size_t end = inlineRun.size();
433
+ while (start < end && isSeparatorNode(*inlineRun[start]))
434
+ ++start;
435
+ while (end > start && isSeparatorNode(*inlineRun[end - 1]))
436
+ --end;
437
+ if (start < end) {
438
+ auto paragraph = std::make_shared<MarkdownASTNode>(NodeType::Paragraph);
439
+ paragraph->children.assign(inlineRun.begin() + static_cast<NodeList::difference_type>(start),
440
+ inlineRun.begin() + static_cast<NodeList::difference_type>(end));
441
+ result.push_back(std::move(paragraph));
442
+ }
443
+ inlineRun.clear();
444
+ };
445
+
446
+ for (size_t i = 0; i < children.size(); ++i) {
447
+ if (isIsolatedDisplayMath(children, i)) {
448
+ flushInlineRun();
449
+ result.push_back(children[i]);
450
+ } else {
451
+ inlineRun.push_back(children[i]);
452
+ }
408
453
  }
454
+ flushInlineRun();
455
+
409
456
  return result;
410
457
  }
411
458
 
412
- // md4c wraps $$...$$ (display math) as inline spans inside a Paragraph. When they
413
- // appear on consecutive lines without a blank separator, md4c merges them — along
414
- // with any preceding text — into a single Paragraph with LineBreak nodes between them.
415
- //
416
- // This post-processing step walks the document's top-level children and promotes
417
- // trailing LatexMathDisplay nodes out of their parent Paragraph so that the
418
- // rendering layer sees them as top-level block elements.
419
- //
420
- // Two cases:
421
- // (a) Pure: every child is display math or a separator → replace paragraph entirely.
422
- // (b) Mixed: leading text followed by display math → keep text in the paragraph,
423
- // splice the display math nodes as siblings after it.
459
+ // Walk the document's top-level children and promote isolated display math out of its
460
+ // parent Paragraph so the rendering layer sees it as a top-level block element.
424
461
  void promoteDisplayMathFromParagraphs(MarkdownASTNode &root) {
425
462
  auto &children = root.children;
426
463
 
@@ -431,31 +468,101 @@ void promoteDisplayMathFromParagraphs(MarkdownASTNode &root) {
431
468
  continue;
432
469
  }
433
470
 
434
- auto &paragraphChildren = paragraph->children;
435
- size_t trailingRunStart = findTrailingDisplayMathRun(paragraphChildren);
436
-
437
- if (trailingRunStart >= paragraphChildren.size()) {
471
+ auto replacement = splitParagraphAroundDisplayMath(paragraph->children);
472
+ if (replacement.empty()) {
438
473
  ++i;
439
474
  continue;
440
475
  }
441
476
 
442
- auto promoted = collectDisplayMathNodes(paragraphChildren, trailingRunStart);
477
+ auto position = children.erase(children.begin() + static_cast<NodeList::difference_type>(i));
478
+ children.insert(position, replacement.begin(), replacement.end());
479
+ i += replacement.size();
480
+ }
481
+ }
482
+
483
+ bool isBlockNode(const MarkdownASTNode &node) {
484
+ switch (node.type) {
485
+ case NodeType::Document:
486
+ case NodeType::Paragraph:
487
+ case NodeType::Heading:
488
+ case NodeType::Blockquote:
489
+ case NodeType::UnorderedList:
490
+ case NodeType::OrderedList:
491
+ case NodeType::ListItem:
492
+ case NodeType::CodeBlock:
493
+ case NodeType::ThematicBreak:
494
+ case NodeType::LatexMathDisplay:
495
+ case NodeType::Table:
496
+ case NodeType::TableHead:
497
+ case NodeType::TableBody:
498
+ case NodeType::TableRow:
499
+ case NodeType::TableHeaderCell:
500
+ case NodeType::TableCell:
501
+ return true;
502
+ default:
503
+ return false;
504
+ }
505
+ }
506
+
507
+ // md4c omits Paragraph wrappers around the inline content of tight list items.
508
+ // Wrap each run of consecutive inline children of a ListItem in a synthetic
509
+ // Paragraph (marked "tight") so renderers only ever see block children.
510
+ void wrapListItemInlineRuns(MarkdownASTNode &node) {
511
+ for (auto &child : node.children) {
512
+ wrapListItemInlineRuns(*child);
513
+ }
514
+
515
+ if (node.type != NodeType::ListItem)
516
+ return;
443
517
 
444
- if (trailingRunStart == 0) {
445
- auto position = children.erase(children.begin() + static_cast<ptrdiff_t>(i));
446
- children.insert(position, promoted.begin(), promoted.end());
447
- i += promoted.size();
518
+ bool hasInlineChild = false;
519
+ for (auto &child : node.children) {
520
+ if (!isBlockNode(*child)) {
521
+ hasInlineChild = true;
522
+ break;
523
+ }
524
+ }
525
+ if (!hasInlineChild)
526
+ return;
527
+
528
+ std::vector<std::shared_ptr<MarkdownASTNode>> newChildren;
529
+ newChildren.reserve(node.children.size());
530
+ std::vector<std::shared_ptr<MarkdownASTNode>> run;
531
+
532
+ auto flushRun = [&]() {
533
+ if (run.empty())
534
+ return;
535
+ bool hasContent = false;
536
+ for (auto &n : run) {
537
+ if (!isSeparatorNode(*n)) {
538
+ hasContent = true;
539
+ break;
540
+ }
541
+ }
542
+ if (hasContent) {
543
+ auto paragraph = std::make_shared<MarkdownASTNode>(NodeType::Paragraph);
544
+ paragraph->setAttribute("tight", "true");
545
+ paragraph->children = std::move(run);
546
+ newChildren.push_back(std::move(paragraph));
448
547
  } else {
449
- paragraphChildren.erase(paragraphChildren.begin() + static_cast<ptrdiff_t>(trailingRunStart),
450
- paragraphChildren.end());
451
- while (!paragraphChildren.empty() && isSeparatorNode(*paragraphChildren.back())) {
452
- paragraphChildren.pop_back();
548
+ // Whitespace-only run between blocks — keep as-is, a paragraph would add spacing.
549
+ for (auto &n : run) {
550
+ newChildren.push_back(std::move(n));
453
551
  }
454
- auto position = children.begin() + static_cast<ptrdiff_t>(i) + 1;
455
- children.insert(position, promoted.begin(), promoted.end());
456
- i += 1 + promoted.size();
552
+ }
553
+ run.clear();
554
+ };
555
+
556
+ for (auto &child : node.children) {
557
+ if (isBlockNode(*child)) {
558
+ flushRun();
559
+ newChildren.push_back(std::move(child));
560
+ } else {
561
+ run.push_back(std::move(child));
457
562
  }
458
563
  }
564
+ flushRun();
565
+ node.children = std::move(newChildren);
459
566
  }
460
567
 
461
568
  } // anonymous namespace
@@ -501,6 +608,9 @@ std::shared_ptr<MarkdownASTNode> MD4CParser::parse(const std::string &markdown,
501
608
  if (md4cFlags.highlight) {
502
609
  flags |= MD_FLAG_HIGHLIGHT;
503
610
  }
611
+ if (md4cFlags.hardSoftBreaks) {
612
+ flags |= MD_FLAG_HARD_SOFT_BREAKS;
613
+ }
504
614
 
505
615
  // Configure MD4C parser with callbacks
506
616
  MD_PARSER parser = {
@@ -522,6 +632,7 @@ std::shared_ptr<MarkdownASTNode> MD4CParser::parse(const std::string &markdown,
522
632
 
523
633
  if (impl_->root) {
524
634
  promoteDisplayMathFromParagraphs(*impl_->root);
635
+ wrapListItemInlineRuns(*impl_->root);
525
636
  }
526
637
 
527
638
  return impl_->root ? impl_->root : std::make_shared<MarkdownASTNode>(NodeType::Document);
@@ -535,5 +646,6 @@ const std::string MD4CParser::Impl::ATTR_FENCE_CHAR = "fenceChar";
535
646
  const std::string MD4CParser::Impl::ATTR_LANGUAGE = "language";
536
647
  const std::string MD4CParser::Impl::ATTR_IS_TASK = "isTask";
537
648
  const std::string MD4CParser::Impl::ATTR_TASK_CHECKED = "taskChecked";
649
+ const std::string MD4CParser::Impl::ATTR_START = "start";
538
650
 
539
651
  } // namespace Markdown
@@ -13,6 +13,7 @@ struct Md4cFlags {
13
13
  bool subscript = false;
14
14
  bool highlight = false;
15
15
  bool permissiveAutolinks = true;
16
+ bool hardSoftBreaks = false;
16
17
  };
17
18
 
18
19
  class MD4CParser {
@@ -37,7 +37,8 @@ enum class NodeType {
37
37
  Spoiler,
38
38
  Superscript,
39
39
  Subscript,
40
- Highlight
40
+ Highlight,
41
+ SoftBreak
41
42
  };
42
43
 
43
44
  struct MarkdownASTNode {
@@ -18,6 +18,8 @@ static const char *nodeTypeToString(NodeType type) {
18
18
  return "Heading";
19
19
  case NodeType::LineBreak:
20
20
  return "LineBreak";
21
+ case NodeType::SoftBreak:
22
+ return "SoftBreak";
21
23
  case NodeType::Strong:
22
24
  return "Strong";
23
25
  case NodeType::Emphasis:
package/cpp/wasm/build.sh CHANGED
@@ -51,6 +51,7 @@ emcc \
51
51
  -s INITIAL_MEMORY=16MB \
52
52
  -s MAXIMUM_MEMORY=512MB \
53
53
  -s ALLOW_MEMORY_GROWTH=1 \
54
+ -s GROWABLE_ARRAYBUFFERS=0 \
54
55
  -o "$OUT_DIR/md4c.js"
55
56
 
56
57
  rm "$OUT_DIR/md4c.o"
@@ -18,10 +18,11 @@ extern "C" {
18
18
  * @param superscript 1 → enable ^superscript^ spans; 0 → disable.
19
19
  * @param subscript 1 → enable ~subscript~ spans; 0 → disable.
20
20
  * @param highlight 1 → enable ==highlight== spans; 0 → disable.
21
+ * @param hardSoftBreaks 1 → treat soft breaks as hard breaks; 0 → collapse to space.
21
22
  * @return Null-terminated UTF-8 JSON string, valid until the next call.
22
23
  */
23
24
  const char *parseMarkdown(const char *markdown, int underline, int latexMath, int superscript, int subscript,
24
- int highlight) {
25
+ int highlight, int hardSoftBreaks) {
25
26
  if (!markdown) {
26
27
  g_resultBuffer = "{\"type\":\"Document\"}";
27
28
  return g_resultBuffer.c_str();
@@ -33,6 +34,7 @@ const char *parseMarkdown(const char *markdown, int underline, int latexMath, in
33
34
  flags.superscript = (superscript != 0);
34
35
  flags.subscript = (subscript != 0);
35
36
  flags.highlight = (highlight != 0);
37
+ flags.hardSoftBreaks = (hardSoftBreaks != 0);
36
38
 
37
39
  Markdown::MD4CParser parser;
38
40
  auto root = parser.parse(std::string(markdown), flags);
@@ -1,6 +1,6 @@
1
1
  # Accessibility
2
2
 
3
- `react-native-enriched-markdown` provides comprehensive accessibility support for screen readers on both iOS and Android platforms.
3
+ `react-native-enriched-markdown-scaffold` provides comprehensive accessibility support for screen readers on both iOS and Android platforms.
4
4
 
5
5
  ## Overview
6
6
 
@@ -15,7 +15,7 @@ Plain text paragraphs without inline links or images are announced as a single V
15
15
  All strings spoken by the screen reader (list announcements, blockquote suffix, table rows, math equation prefix, and iOS rotor names) can be overridden via the optional `accessibilityLabels` prop on `EnrichedMarkdownText`. The defaults are English; consumers wire in their own i18n pipeline.
16
16
 
17
17
  ```tsx
18
- import { EnrichedMarkdownText } from 'react-native-enriched-markdown';
18
+ import { EnrichedMarkdownText } from 'react-native-enriched-markdown-scaffold';
19
19
 
20
20
  <EnrichedMarkdownText
21
21
  markdown={markdown}
@@ -164,9 +164,21 @@ Tables expose one focusable element per row (header included), labeled with the
164
164
 
165
165
  Each math block exposes a single focusable element labeled `"Math: <latex>"`. The library does **not** convert LaTeX to natural language — the screen reader reads the raw LaTeX source. If you need spoken math, plug in a LaTeX→speech library on the consumer side and translate the labels accordingly.
166
166
 
167
+ ## Text input (`EnrichedMarkdownTextInput`)
168
+
169
+ The editor's accessibility model is intentionally simpler than the renderer's. The input is built on a custom TextKit stack, so its inner `UITextView` is not surfaced to VoiceOver directly — instead the component is presented as a **single accessibility element** that reads its whole content as one paragraph.
170
+
171
+ **iOS (VoiceOver):**
172
+ - The field is one element whose spoken value is the full plain text (delimiters stripped). When the field is empty, the placeholder is announced instead.
173
+ - `accessibilityLabel` / `accessibilityHint` set on the component are forwarded and announced.
174
+ - Double-tapping activates the field: it becomes first responder and the keyboard opens for editing.
175
+
176
+ **Android (TalkBack):** the input is a native `EditText`, announced and edited as a standard editable text field.
177
+
167
178
  ## Known Limitations
168
179
 
169
180
  - **Inline formatting** (bold / italic / underline / strikethrough / inline code / spoiler) is not split into separate accessibility elements — the entire paragraph is read as one element, exactly as the surrounding text. Screen readers don't apply visual emphasis to bold/italic by default.
170
181
  - **macOS** screen-reader support is still pending — `MarkdownAccessibilityElementBuilder.m` ships a no-op stub for macOS. Tracked as a TODO; iOS implementation can serve as a reference.
171
182
  - **Android** has no rotor concept — `accessibilityLabels.rotor.*` is silently ignored on that platform.
172
183
  - **iOS** blockquote backgrounds may break at link boundaries instead of spanning the full line. Visual only; doesn't affect accessibility.
184
+ - **Text input** (`EnrichedMarkdownTextInput`, iOS) is exposed as a single VoiceOver element reading its full plain text as one paragraph. It is **not** announced with the native "text field" role, has no in-field cursor navigation or per-character echo (editing happens via the keyboard after a double-tap activation), and its spoken value refreshes on re-focus rather than live. Exposing the inner `UITextView` for these would be unreliable under the custom TextKit stack (duplicate/flaky announcements). Inline formatting and headings are read as plain text.