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

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 (505) hide show
  1. package/README.md +54 -8
  2. package/ReactNativeEnrichedMarkdown.podspec +82 -73
  3. package/android/build.gradle +188 -1
  4. package/android/consumer-rules.pro +1 -1
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerDelegate.java +27 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerInterface.java +7 -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 +27 -0
  10. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +7 -0
  11. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +223 -0
  12. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +183 -0
  13. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +65 -0
  14. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +1086 -61
  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 +351 -13
  18. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownInternalText.kt +62 -0
  19. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownManager.kt +85 -0
  20. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +160 -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 +76 -0
  23. package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +126 -10
  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/events/CopyRequestEvent.kt +28 -0
  26. package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkLayoutEvent.kt +36 -0
  27. package/android/src/main/java/com/swmansion/enriched/markdown/events/SelectionChangeEvent.kt +43 -0
  28. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager.kt +54 -4
  29. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +923 -462
  30. package/android/src/main/java/com/swmansion/enriched/markdown/input/MarkdownClipboard.kt +42 -0
  31. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/BlockEditCoordinator.kt +196 -0
  32. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/ClipboardCoordinator.kt +73 -0
  33. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditContext.kt +19 -0
  34. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditPipeline.kt +248 -0
  35. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditSession.kt +52 -0
  36. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/InputConnectionWrapper.kt +108 -7
  37. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/LinkCoordinator.kt +69 -0
  38. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownTextWatcher.kt +3 -3
  39. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MentionCoordinator.kt +118 -0
  40. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnChangeStateEvent.kt +26 -0
  41. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnContextMenuItemPressEvent.kt +26 -0
  42. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnInputKeyPressEvent.kt +24 -0
  43. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnPasteEvent.kt +24 -0
  44. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/BlockStore.kt +254 -0
  45. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/FormattingStore.kt +80 -87
  46. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputFormatter.kt +109 -1
  47. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputParser.kt +116 -22
  48. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/MarkdownSerializer.kt +167 -38
  49. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/RangeEditAdjustment.kt +149 -0
  50. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt +66 -5
  51. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputMeasurementStore.kt +4 -2
  52. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockRange.kt +27 -0
  53. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockType.kt +48 -0
  54. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/FormattingRange.kt +9 -4
  55. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/InputFormatterStyle.kt +39 -2
  56. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathAtom.kt +20 -0
  57. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathChipStyle.kt +1 -1
  58. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MutableRangeBounds.kt +11 -0
  59. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputBulletSpan.kt +82 -0
  60. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputHeadingSpan.kt +58 -0
  61. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputListItemSpacingSpan.kt +37 -0
  62. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputOrderedListMarkerSpan.kt +63 -0
  63. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/BlockHandler.kt +54 -0
  64. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/HeadingBlockHandler.kt +27 -0
  65. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/OrderedListBlockHandler.kt +38 -0
  66. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/UnorderedListBlockHandler.kt +37 -0
  67. package/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt +8 -26
  68. package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +1 -0
  69. package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +1 -0
  70. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +9 -2
  71. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +100 -12
  72. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +16 -1
  73. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +4 -0
  74. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LinkRenderer.kt +37 -7
  75. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +2 -1
  76. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +74 -18
  77. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +43 -4
  78. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +9 -1
  79. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SoftBreakRenderer.kt +16 -0
  80. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +35 -28
  81. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +24 -0
  82. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +174 -24
  83. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +20 -82
  84. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +13 -16
  85. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +1 -1
  86. package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +1 -1
  87. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +182 -46
  88. package/android/src/main/java/com/swmansion/enriched/markdown/spans/InlineChipPainter.kt +140 -0
  89. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkChipSpans.kt +177 -0
  90. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkSpan.kt +1 -6
  91. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListItemSpacingSpan.kt +33 -0
  92. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListMarkerAnchorSpan.kt +38 -0
  93. package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +2 -0
  94. package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +1 -1
  95. package/android/src/main/java/com/swmansion/enriched/markdown/spans/TaskListSpan.kt +3 -2
  96. package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +3 -2
  97. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +6 -0
  98. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +26 -0
  99. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +7 -1
  100. package/android/src/main/java/com/swmansion/enriched/markdown/styles/InlineMathStyle.kt +16 -1
  101. package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkStyle.kt +36 -1
  102. package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkVariantEntry.kt +7 -3
  103. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +4 -1
  104. package/android/src/main/java/com/swmansion/enriched/markdown/styles/MathStyle.kt +3 -0
  105. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +13 -4
  106. package/android/src/main/java/com/swmansion/enriched/markdown/styles/TableStyle.kt +6 -0
  107. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockHighlighter.kt +90 -0
  108. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockNode.kt +57 -0
  109. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/FeatureFlags.kt +1 -0
  110. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownSegment.kt +9 -0
  111. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownViewManagerUtils.kt +84 -7
  112. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/ReadableMapExtensions.kt +3 -0
  113. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/RenderedSegment.kt +10 -0
  114. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/SegmentSignature.kt +1 -0
  115. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/StreamingMarkdownFilter.kt +83 -5
  116. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/serialization/MarkdownASTSerializer.kt +4 -0
  117. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/MarkdownStyleParser.kt +74 -44
  118. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/PasteTextUtils.kt +52 -0
  119. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageCache.kt +26 -3
  120. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageDownloader.kt +22 -9
  121. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/LocalImageLoader.kt +161 -0
  122. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/conversion/HTMLGenerator.kt +2 -1
  123. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/conversion/MarkdownExtractor.kt +6 -0
  124. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/extensions/TextPaintExtensions.kt +23 -0
  125. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/CheckboxTouchHelper.kt +7 -0
  126. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/TaskListTapUtils.kt +41 -21
  127. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/span/BlockSpacing.kt +15 -8
  128. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/HeadlessActionMode.kt +88 -0
  129. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLayoutCollector.kt +100 -0
  130. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLongPressMovementMethod.kt +58 -27
  131. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionActionMode.kt +72 -16
  132. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionChangeReporter.kt +232 -0
  133. package/android/src/main/java/com/swmansion/enriched/markdown/views/BlockMenuOptions.kt +64 -0
  134. package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +414 -0
  135. package/android/src/main/java/com/swmansion/enriched/markdown/views/ContextMenuPopup.kt +9 -6
  136. package/android/src/main/java/com/swmansion/enriched/markdown/views/CopyGlyph.kt +101 -0
  137. package/android/src/main/java/com/swmansion/enriched/markdown/views/TableContainerView.kt +61 -11
  138. package/android/src/main/jni/CMakeLists.txt +53 -0
  139. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp +10 -0
  140. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h +11 -2
  141. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +10 -0
  142. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +12 -2
  143. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.cpp +9 -0
  144. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.h +24 -0
  145. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +16 -0
  146. package/android/src/math/java/com/swmansion/enriched/markdown/input/math/MathChipControllerImpl.kt +21 -4
  147. package/android/src/math/java/com/swmansion/enriched/markdown/renderer/MathInlineRenderer.kt +8 -2
  148. package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathChipSpan.kt +1 -1
  149. package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathInlineSpan.kt +13 -6
  150. package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathMeasureHelper.kt +2 -1
  151. package/android/src/math/java/com/swmansion/enriched/markdown/views/MathContainerView.kt +26 -8
  152. package/cpp/highlight/CodeBlockHighlighter.cpp +284 -0
  153. package/cpp/highlight/CodeBlockHighlighter.hpp +66 -0
  154. package/cpp/highlight/CodeBlockLanguages.cpp +138 -0
  155. package/cpp/highlight/CodeBlockLanguages.hpp +25 -0
  156. package/cpp/highlight/HighlightGrammars.hpp +28 -0
  157. package/cpp/highlight/code_highlight_podspec.rb +211 -0
  158. package/cpp/highlight/gen-registry.mjs +155 -0
  159. package/cpp/highlight/grammar-versions.json +159 -0
  160. package/cpp/highlight/vendor/generated/generated_queries.h +1665 -0
  161. package/cpp/highlight/vendor/generated/generated_registry.cpp +59 -0
  162. package/cpp/parser/MD4CParser.cpp +173 -61
  163. package/cpp/parser/MD4CParser.hpp +1 -0
  164. package/cpp/parser/MarkdownASTNode.hpp +2 -1
  165. package/cpp/wasm/ASTSerializer.cpp +2 -0
  166. package/cpp/wasm/build.sh +1 -0
  167. package/cpp/wasm/md4c_wasm.cpp +3 -1
  168. package/docs/ACCESSIBILITY.md +14 -2
  169. package/docs/API_REFERENCE.md +405 -12
  170. package/docs/BREAKING_CHANGES.md +129 -0
  171. package/docs/CODE_HIGHLIGHT.md +133 -0
  172. package/docs/COPY_OPTIONS.md +61 -3
  173. package/docs/ELEMENTS_STRUCTURE.md +52 -4
  174. package/docs/IMAGE_CACHING.md +30 -0
  175. package/docs/INPUT.md +110 -11
  176. package/docs/LATEX_MATH.md +87 -45
  177. package/docs/MACOS.md +1 -1
  178. package/docs/MARKDOWN_STREAMING.md +27 -1
  179. package/docs/MENTIONS.md +8 -1
  180. package/docs/NATIVE_ASSETS.md +127 -0
  181. package/docs/RTL.md +1 -1
  182. package/docs/STYLES.md +73 -6
  183. package/docs/TESTING.md +112 -0
  184. package/docs/TEXT.md +18 -6
  185. package/docs/WEB.md +4 -1
  186. package/ios/EnrichedMarkdown.h +7 -0
  187. package/ios/EnrichedMarkdown.mm +583 -76
  188. package/ios/EnrichedMarkdownText.h +7 -0
  189. package/ios/EnrichedMarkdownText.mm +299 -73
  190. package/ios/attachments/ENRMImageAttachment.h +9 -0
  191. package/ios/attachments/ENRMImageAttachment.m +143 -40
  192. package/ios/attachments/ENRMMathInlineAttachment+macOS.m +2 -1
  193. package/ios/attachments/ENRMMathInlineAttachment.h +5 -0
  194. package/ios/attachments/ENRMMathInlineAttachment.m +50 -82
  195. package/ios/attachments/ENRMMathInlineAttachmentShared.h +2 -0
  196. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.cpp +223 -0
  197. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.h +183 -0
  198. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.cpp +65 -0
  199. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +1086 -61
  200. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +181 -2
  201. package/ios/input/ENRMAutoLinkDetector.h +2 -1
  202. package/ios/input/ENRMAutoLinkDetector.mm +79 -41
  203. package/ios/input/ENRMBlockEditCoordinator.h +71 -0
  204. package/ios/input/ENRMBlockEditCoordinator.mm +195 -0
  205. package/ios/input/ENRMBlockRange.h +28 -0
  206. package/ios/input/ENRMBlockRange.mm +30 -0
  207. package/ios/input/ENRMBlockStore.h +56 -0
  208. package/ios/input/ENRMBlockStore.mm +275 -0
  209. package/ios/input/ENRMClipboardCoordinator.h +45 -0
  210. package/ios/input/ENRMClipboardCoordinator.mm +120 -0
  211. package/ios/input/ENRMDetectorPipeline.h +2 -1
  212. package/ios/input/ENRMEditPipeline.h +76 -0
  213. package/ios/input/ENRMEditPipeline.mm +228 -0
  214. package/ios/input/ENRMEditSession.h +36 -0
  215. package/ios/input/ENRMEditSession.mm +63 -0
  216. package/ios/input/ENRMFormattingStore.h +17 -0
  217. package/ios/input/ENRMFormattingStore.mm +95 -105
  218. package/ios/input/ENRMInputBlockType.h +91 -0
  219. package/ios/input/ENRMInputBlockType.mm +5 -0
  220. package/ios/input/ENRMInputDecorationDrawer.h +18 -0
  221. package/ios/input/ENRMInputEventEmitter.h +56 -0
  222. package/ios/input/ENRMInputEventEmitter.mm +308 -0
  223. package/ios/input/ENRMInputFormatter.h +29 -69
  224. package/ios/input/ENRMInputFormatter.mm +216 -124
  225. package/ios/input/ENRMInputFormatterStyle.h +99 -0
  226. package/ios/input/ENRMInputFormatterStyle.mm +188 -0
  227. package/ios/input/ENRMInputLayoutManager.h +9 -0
  228. package/ios/input/ENRMInputLayoutManager.mm +30 -0
  229. package/ios/input/ENRMInputListMarkerDrawer.h +32 -0
  230. package/ios/input/ENRMInputListMarkerDrawer.mm +426 -0
  231. package/ios/input/ENRMInputParser.h +5 -6
  232. package/ios/input/ENRMInputParser.mm +461 -178
  233. package/ios/input/ENRMInputRemend.mm +2 -2
  234. package/ios/input/ENRMInputStyleStateBuilder.h +40 -0
  235. package/ios/input/ENRMInputStyleStateBuilder.mm +60 -0
  236. package/ios/input/ENRMInputTextView.mm +103 -8
  237. package/ios/input/ENRMInputTypingAttributesController.h +42 -0
  238. package/ios/input/ENRMInputTypingAttributesController.mm +203 -0
  239. package/ios/input/ENRMLinkCoordinator.h +41 -0
  240. package/ios/input/ENRMLinkCoordinator.mm +89 -0
  241. package/ios/input/ENRMMarkdownSerializer.h +29 -5
  242. package/ios/input/ENRMMarkdownSerializer.mm +170 -48
  243. package/ios/input/ENRMMathAtom.h +26 -0
  244. package/ios/input/ENRMMathAtom.mm +12 -0
  245. package/ios/input/ENRMMentionCoordinator.h +45 -0
  246. package/ios/input/ENRMMentionCoordinator.mm +167 -0
  247. package/ios/input/ENRMRangeEditAdjustment.h +38 -0
  248. package/ios/input/ENRMRangeEditAdjustment.mm +91 -0
  249. package/ios/input/ENRMRangeStoreUtils.h +39 -0
  250. package/ios/input/EnrichedMarkdownTextInput+ContextMenu.mm +6 -6
  251. package/ios/input/EnrichedMarkdownTextInput+Internal.h +11 -3
  252. package/ios/input/EnrichedMarkdownTextInput.h +7 -1
  253. package/ios/input/EnrichedMarkdownTextInput.mm +1089 -1023
  254. package/ios/input/InputStylePropsUtils.h +109 -68
  255. package/ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm +2 -1
  256. package/ios/input/styles/ENRMBlockHandler.h +46 -0
  257. package/ios/input/styles/ENRMHeadingBlockHandler.h +15 -0
  258. package/ios/input/styles/ENRMHeadingBlockHandler.mm +38 -0
  259. package/ios/input/styles/ENRMOrderedListBlockHandler.h +14 -0
  260. package/ios/input/styles/ENRMOrderedListBlockHandler.mm +48 -0
  261. package/ios/input/styles/ENRMUnorderedListBlockHandler.h +15 -0
  262. package/ios/input/styles/ENRMUnorderedListBlockHandler.mm +51 -0
  263. package/ios/internals/ENRMViewFreeMeasurement.h +331 -0
  264. package/ios/internals/EnrichedMarkdownShadowNode.h +1 -3
  265. package/ios/internals/EnrichedMarkdownShadowNode.mm +16 -20
  266. package/ios/internals/EnrichedMarkdownTextShadowNode.h +1 -3
  267. package/ios/internals/EnrichedMarkdownTextShadowNode.mm +15 -20
  268. package/ios/internals/MeasurementCache.h +41 -9
  269. package/ios/internals/ShadowMeasurementUtils.h +63 -58
  270. package/ios/math/ENRMMathChipController.h +74 -0
  271. package/ios/math/ENRMMathChipController.mm +476 -0
  272. package/ios/math/ENRMRaTeXBridge.swift +27 -6
  273. package/ios/parser/ENRMMarkdownParser.h +1 -8
  274. package/ios/parser/ENRMMarkdownParser.mm +2 -11
  275. package/ios/parser/MarkdownASTNode.h +2 -1
  276. package/ios/parser/MarkdownParserBridge.mm +4 -0
  277. package/ios/renderer/AttributedRenderer.m +20 -2
  278. package/ios/renderer/BaseRenderer.h +17 -2
  279. package/ios/renderer/BaseRenderer.m +30 -0
  280. package/ios/renderer/BlockquoteRenderer.h +1 -1
  281. package/ios/renderer/BlockquoteRenderer.m +144 -35
  282. package/ios/renderer/CodeBlockRenderer.h +1 -1
  283. package/ios/renderer/CodeBlockRenderer.m +27 -23
  284. package/ios/renderer/CodeRenderer.h +1 -1
  285. package/ios/renderer/CodeRenderer.m +3 -1
  286. package/ios/renderer/ENRMImageRenderer.h +1 -1
  287. package/ios/renderer/ENRMImageRenderer.m +5 -1
  288. package/ios/renderer/ENRMMathInlineRenderer.h +1 -1
  289. package/ios/renderer/ENRMMathInlineRenderer.m +6 -1
  290. package/ios/renderer/ENRMSpoilerRenderer.h +1 -1
  291. package/ios/renderer/ENRMSpoilerRenderer.m +3 -1
  292. package/ios/renderer/EmphasisRenderer.h +1 -1
  293. package/ios/renderer/EmphasisRenderer.m +3 -1
  294. package/ios/renderer/HeadingRenderer.h +1 -1
  295. package/ios/renderer/HeadingRenderer.m +13 -6
  296. package/ios/renderer/HighlightRenderer.h +1 -1
  297. package/ios/renderer/HighlightRenderer.m +3 -1
  298. package/ios/renderer/LinkRenderer.h +1 -1
  299. package/ios/renderer/LinkRenderer.m +50 -16
  300. package/ios/renderer/ListItemRenderer.h +13 -1
  301. package/ios/renderer/ListItemRenderer.m +102 -44
  302. package/ios/renderer/ListRenderer.h +2 -2
  303. package/ios/renderer/ListRenderer.m +63 -25
  304. package/ios/renderer/ParagraphRenderer.h +1 -1
  305. package/ios/renderer/ParagraphRenderer.m +16 -8
  306. package/ios/renderer/RenderContext.h +10 -0
  307. package/ios/renderer/RenderContext.m +44 -0
  308. package/ios/renderer/RendererFactory.m +14 -0
  309. package/ios/renderer/StrikethroughRenderer.h +1 -1
  310. package/ios/renderer/StrikethroughRenderer.m +3 -1
  311. package/ios/renderer/StrongRenderer.h +1 -1
  312. package/ios/renderer/StrongRenderer.m +3 -1
  313. package/ios/renderer/SubscriptRenderer.h +1 -1
  314. package/ios/renderer/SubscriptRenderer.m +3 -1
  315. package/ios/renderer/SuperscriptRenderer.h +1 -1
  316. package/ios/renderer/SuperscriptRenderer.m +3 -1
  317. package/ios/renderer/TextRenderer.h +2 -2
  318. package/ios/renderer/TextRenderer.m +3 -1
  319. package/ios/renderer/ThematicBreakRenderer.h +1 -1
  320. package/ios/renderer/ThematicBreakRenderer.m +3 -1
  321. package/ios/renderer/UnderlineRenderer.h +1 -1
  322. package/ios/renderer/UnderlineRenderer.m +3 -1
  323. package/ios/styles/StyleConfig.h +42 -0
  324. package/ios/styles/StyleConfig.mm +216 -0
  325. package/ios/utils/BlockquoteBorder.h +6 -0
  326. package/ios/utils/BlockquoteBorder.m +249 -52
  327. package/ios/utils/CodeBackground.m +3 -65
  328. package/ios/utils/CodeBlockBackground.m +16 -2
  329. package/ios/utils/ENRMAtomicSize.h +65 -0
  330. package/ios/utils/ENRMBlockMenu.h +66 -0
  331. package/ios/utils/ENRMChipDrawing.h +24 -0
  332. package/ios/utils/ENRMChipDrawing.m +83 -0
  333. package/ios/utils/ENRMCodeBlockContent.h +37 -0
  334. package/ios/utils/ENRMCodeBlockContent.mm +79 -0
  335. package/ios/utils/ENRMCodeBlockHighlighter.h +37 -0
  336. package/ios/utils/ENRMCodeBlockHighlighter.mm +51 -0
  337. package/ios/utils/ENRMFeatureFlags.h +7 -0
  338. package/ios/utils/ENRMImageDownloader.h +11 -1
  339. package/ios/utils/ENRMImageDownloader.m +60 -16
  340. package/ios/utils/ENRMLinkChip.h +70 -0
  341. package/ios/utils/ENRMLinkChip.m +213 -0
  342. package/ios/utils/ENRMLinkLayout.h +50 -0
  343. package/ios/utils/ENRMLinkLayout.m +45 -0
  344. package/ios/utils/ENRMLocalImageLoader.h +31 -0
  345. package/ios/utils/ENRMLocalImageLoader.m +68 -0
  346. package/ios/utils/ENRMMathFallback.h +26 -0
  347. package/ios/utils/ENRMMathFallback.m +18 -0
  348. package/ios/utils/ENRMSelectionChange.h +120 -0
  349. package/ios/utils/ENRMSelectionChange.m +282 -0
  350. package/ios/utils/ENRMTextViewSetup.h +35 -17
  351. package/ios/utils/EditMenuUtils+macOS.m +4 -1
  352. package/ios/utils/EditMenuUtils.h +35 -6
  353. package/ios/utils/EditMenuUtils.m +188 -11
  354. package/ios/utils/HTMLGenerator.m +2 -1
  355. package/ios/utils/ImageRequestHeaderUtils.h +35 -0
  356. package/ios/utils/LastElementUtils.h +1 -0
  357. package/ios/utils/ListMarkerDrawer.m +29 -42
  358. package/ios/utils/MarkdownASTSerializer.m +4 -0
  359. package/ios/utils/MarkdownAccessibilityElementBuilder.m +3 -1
  360. package/ios/utils/MarkdownExtractor.m +2 -1
  361. package/ios/utils/ParagraphStyleUtils.h +5 -0
  362. package/ios/utils/ParagraphStyleUtils.m +77 -17
  363. package/ios/utils/RTFExportUtils.m +2 -0
  364. package/ios/utils/RenderedMarkdownSegment.h +13 -1
  365. package/ios/utils/RenderedMarkdownSegment.m +20 -0
  366. package/ios/utils/SegmentRenderer.m +17 -4
  367. package/ios/utils/StreamingMarkdownFilter.h +11 -1
  368. package/ios/utils/StreamingMarkdownFilter.m +98 -2
  369. package/ios/utils/StylePropsUtils.h +110 -1
  370. package/ios/utils/TaskListTapUtils.m +24 -0
  371. package/ios/utils/TextViewLayoutManager.mm +3 -0
  372. package/ios/views/ENRMCodeBlockContainerView.h +60 -0
  373. package/ios/views/ENRMCodeBlockContainerView.m +569 -0
  374. package/ios/views/ENRMMathContainerView.h +23 -0
  375. package/ios/views/ENRMMathContainerView.m +87 -20
  376. package/ios/views/TableContainerView.h +32 -0
  377. package/ios/views/TableContainerView.m +291 -175
  378. package/jest.d.ts +1 -0
  379. package/jest.js +5 -0
  380. package/lib/module/EnrichedMarkdownNativeComponent.ts +203 -1
  381. package/lib/module/EnrichedMarkdownTextInput.js +84 -5
  382. package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
  383. package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  384. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +204 -1
  385. package/lib/module/headingDefaults.js +34 -0
  386. package/lib/module/headingDefaults.js.map +1 -0
  387. package/lib/module/index.js.map +1 -1
  388. package/lib/module/jest/index.js +205 -0
  389. package/lib/module/jest/index.js.map +1 -0
  390. package/lib/module/native/EnrichedMarkdownText.js +199 -15
  391. package/lib/module/native/EnrichedMarkdownText.js.map +1 -1
  392. package/lib/module/normalizeMarkdownStyle.js +98 -23
  393. package/lib/module/normalizeMarkdownStyle.js.map +1 -1
  394. package/lib/module/normalizeMarkdownStyle.web.js +73 -22
  395. package/lib/module/normalizeMarkdownStyle.web.js.map +1 -1
  396. package/lib/module/normalizeMarkdownTextInputStyle.js +62 -15
  397. package/lib/module/normalizeMarkdownTextInputStyle.js.map +1 -1
  398. package/lib/module/normalizeMenuItem.js +1 -1
  399. package/lib/module/utils/textInputState.js +26 -0
  400. package/lib/module/utils/textInputState.js.map +1 -0
  401. package/lib/module/web/EnrichedMarkdownText.js +15 -8
  402. package/lib/module/web/EnrichedMarkdownText.js.map +1 -1
  403. package/lib/module/web/parseMarkdown.js +4 -3
  404. package/lib/module/web/parseMarkdown.js.map +1 -1
  405. package/lib/module/web/renderers/InlineRenderers.js +102 -3
  406. package/lib/module/web/renderers/InlineRenderers.js.map +1 -1
  407. package/lib/module/web/renderers/ListRenderers.js +7 -2
  408. package/lib/module/web/renderers/ListRenderers.js.map +1 -1
  409. package/lib/module/web/renderers/index.js +7 -4
  410. package/lib/module/web/renderers/index.js.map +1 -1
  411. package/lib/module/web/styles.js +101 -6
  412. package/lib/module/web/styles.js.map +1 -1
  413. package/lib/module/web/utils.js +14 -0
  414. package/lib/module/web/utils.js.map +1 -1
  415. package/lib/module/web/wasm/md4c.js +0 -0
  416. package/lib/module/web/wasm/md4c.js.map +1 -1
  417. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts +185 -2
  418. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
  419. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +94 -9
  420. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
  421. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +69 -5
  422. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
  423. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +185 -2
  424. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
  425. package/lib/typescript/src/headingDefaults.d.ts +9 -0
  426. package/lib/typescript/src/headingDefaults.d.ts.map +1 -0
  427. package/lib/typescript/src/index.d.ts +3 -3
  428. package/lib/typescript/src/index.d.ts.map +1 -1
  429. package/lib/typescript/src/index.web.d.ts +2 -2
  430. package/lib/typescript/src/index.web.d.ts.map +1 -1
  431. package/lib/typescript/src/jest/index.d.ts +6 -0
  432. package/lib/typescript/src/jest/index.d.ts.map +1 -0
  433. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts +5 -5
  434. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts.map +1 -1
  435. package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -1
  436. package/lib/typescript/src/normalizeMarkdownStyle.web.d.ts.map +1 -1
  437. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts +19 -5
  438. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts.map +1 -1
  439. package/lib/typescript/src/types/MarkdownStyle.d.ts +122 -5
  440. package/lib/typescript/src/types/MarkdownStyle.d.ts.map +1 -1
  441. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts +39 -0
  442. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts.map +1 -1
  443. package/lib/typescript/src/types/MarkdownTextProps.d.ts +207 -10
  444. package/lib/typescript/src/types/MarkdownTextProps.d.ts.map +1 -1
  445. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts +60 -1
  446. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts.map +1 -1
  447. package/lib/typescript/src/types/events.d.ts +85 -0
  448. package/lib/typescript/src/types/events.d.ts.map +1 -1
  449. package/lib/typescript/src/utils/textInputState.d.ts +24 -0
  450. package/lib/typescript/src/utils/textInputState.d.ts.map +1 -0
  451. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts +1 -1
  452. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts.map +1 -1
  453. package/lib/typescript/src/web/parseMarkdown.d.ts +1 -1
  454. package/lib/typescript/src/web/parseMarkdown.d.ts.map +1 -1
  455. package/lib/typescript/src/web/renderers/InlineRenderers.d.ts.map +1 -1
  456. package/lib/typescript/src/web/renderers/ListRenderers.d.ts.map +1 -1
  457. package/lib/typescript/src/web/renderers/index.d.ts +2 -1
  458. package/lib/typescript/src/web/renderers/index.d.ts.map +1 -1
  459. package/lib/typescript/src/web/styles.d.ts +2 -1
  460. package/lib/typescript/src/web/styles.d.ts.map +1 -1
  461. package/lib/typescript/src/web/types.d.ts +10 -2
  462. package/lib/typescript/src/web/types.d.ts.map +1 -1
  463. package/lib/typescript/src/web/utils.d.ts +4 -0
  464. package/lib/typescript/src/web/utils.d.ts.map +1 -1
  465. package/package.json +36 -9
  466. package/postinstall.mjs +131 -0
  467. package/ratex-version.json +21 -0
  468. package/src/EnrichedMarkdownNativeComponent.ts +203 -1
  469. package/src/EnrichedMarkdownTextInput.tsx +159 -8
  470. package/src/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  471. package/src/EnrichedMarkdownTextNativeComponent.ts +204 -1
  472. package/src/headingDefaults.ts +21 -0
  473. package/src/index.tsx +15 -0
  474. package/src/index.web.tsx +6 -1
  475. package/src/jest/index.tsx +236 -0
  476. package/src/native/EnrichedMarkdownText.tsx +260 -11
  477. package/src/normalizeMarkdownStyle.ts +117 -16
  478. package/src/normalizeMarkdownStyle.web.ts +76 -15
  479. package/src/normalizeMarkdownTextInputStyle.ts +110 -35
  480. package/src/normalizeMenuItem.ts +1 -1
  481. package/src/types/MarkdownStyle.ts +125 -5
  482. package/src/types/MarkdownStyleInternal.ts +51 -0
  483. package/src/types/MarkdownTextProps.ts +215 -10
  484. package/src/types/MarkdownTextProps.web.ts +62 -1
  485. package/src/types/events.ts +90 -0
  486. package/src/utils/textInputState.ts +35 -0
  487. package/src/web/EnrichedMarkdownText.tsx +26 -5
  488. package/src/web/parseMarkdown.ts +6 -2
  489. package/src/web/renderers/InlineRenderers.tsx +116 -3
  490. package/src/web/renderers/ListRenderers.tsx +14 -2
  491. package/src/web/renderers/index.tsx +6 -2
  492. package/src/web/styles.ts +114 -5
  493. package/src/web/types.ts +10 -1
  494. package/src/web/utils.ts +9 -0
  495. package/src/web/wasm/md4c.js +0 -0
  496. package/vendor-grammars.mjs +511 -0
  497. package/vendor-ratex.mjs +173 -0
  498. package/app.plugin.js +0 -2
  499. package/plugin/build/withAndroidMath.js +0 -19
  500. package/plugin/build/withIosMath.js +0 -28
  501. package/plugin/build/withReactNativeEnrichedMarkdown.js +0 -11
  502. package/plugin/src/withAndroidMath.ts +0 -24
  503. package/plugin/src/withIosMath.ts +0 -35
  504. package/plugin/src/withReactNativeEnrichedMarkdown.ts +0 -17
  505. package/plugin/tsconfig.build.json +0 -16
@@ -7,7 +7,12 @@
7
7
 
8
8
  NS_ASSUME_NONNULL_BEGIN
9
9
 
10
- typedef NS_ENUM(NSInteger, ENRMSegmentKind) { ENRMSegmentKindText, ENRMSegmentKindTable, ENRMSegmentKindMath };
10
+ typedef NS_ENUM(NSInteger, ENRMSegmentKind) {
11
+ ENRMSegmentKindText,
12
+ ENRMSegmentKindTable,
13
+ ENRMSegmentKindMath,
14
+ ENRMSegmentKindCodeBlock
15
+ };
11
16
 
12
17
  @interface ENRMTextSegment : NSObject
13
18
  @property (nonatomic, strong) NSArray<MarkdownASTNode *> *nodes;
@@ -24,15 +29,22 @@ typedef NS_ENUM(NSInteger, ENRMSegmentKind) { ENRMSegmentKindText, ENRMSegmentKi
24
29
  + (instancetype)segmentWithLatex:(NSString *)latex;
25
30
  @end
26
31
 
32
+ @interface ENRMCodeBlockSegment : NSObject
33
+ @property (nonatomic, strong) MarkdownASTNode *codeBlockNode;
34
+ + (instancetype)segmentWithCodeBlockNode:(MarkdownASTNode *)node;
35
+ @end
36
+
27
37
  @interface ENRMRenderedSegment : NSObject
28
38
  @property (nonatomic, assign) ENRMSegmentKind kind;
29
39
  @property (nonatomic, assign) uint64_t signature;
30
40
  @property (nonatomic, strong, nullable) ENRMRenderResult *textResult;
31
41
  @property (nonatomic, strong, nullable) ENRMTableSegment *tableSegment;
32
42
  @property (nonatomic, strong, nullable) ENRMMathSegment *mathSegment;
43
+ @property (nonatomic, strong, nullable) ENRMCodeBlockSegment *codeBlockSegment;
33
44
  + (instancetype)textSegmentWithResult:(ENRMRenderResult *)result signature:(uint64_t)signature;
34
45
  + (instancetype)tableSegmentWithSegment:(ENRMTableSegment *)segment signature:(uint64_t)signature;
35
46
  + (instancetype)mathSegmentWithSegment:(ENRMMathSegment *)segment signature:(uint64_t)signature;
47
+ + (instancetype)codeBlockSegmentWithSegment:(ENRMCodeBlockSegment *)segment signature:(uint64_t)signature;
36
48
  @end
37
49
 
38
50
  #ifdef __cplusplus
@@ -31,6 +31,16 @@
31
31
  }
32
32
  @end
33
33
 
34
+ @implementation ENRMCodeBlockSegment
35
+ + (instancetype)segmentWithCodeBlockNode:(MarkdownASTNode *)node
36
+ {
37
+ NSParameterAssert(node != nil);
38
+ ENRMCodeBlockSegment *segment = [[ENRMCodeBlockSegment alloc] init];
39
+ segment.codeBlockNode = node;
40
+ return segment;
41
+ }
42
+ @end
43
+
34
44
  @implementation ENRMRenderedSegment
35
45
  + (instancetype)textSegmentWithResult:(ENRMRenderResult *)result signature:(uint64_t)signature
36
46
  {
@@ -61,6 +71,16 @@
61
71
  segment.signature = signature;
62
72
  return segment;
63
73
  }
74
+
75
+ + (instancetype)codeBlockSegmentWithSegment:(ENRMCodeBlockSegment *)codeBlockSegment signature:(uint64_t)signature
76
+ {
77
+ NSParameterAssert(codeBlockSegment != nil);
78
+ ENRMRenderedSegment *segment = [[ENRMRenderedSegment alloc] init];
79
+ segment.kind = ENRMSegmentKindCodeBlock;
80
+ segment.codeBlockSegment = codeBlockSegment;
81
+ segment.signature = signature;
82
+ return segment;
83
+ }
64
84
  @end
65
85
 
66
86
  // FNV-1a 64-bit hash for segment signatures. Collisions are theoretically
@@ -33,7 +33,13 @@ static NSArray *ENRMSplitASTIntoSegments(MarkdownASTNode *root)
33
33
  #endif
34
34
  }
35
35
  #endif
36
- else {
36
+ else if (child.type == MarkdownNodeTypeCodeBlock) {
37
+ if (currentTextNodes.count > 0) {
38
+ [segments addObject:[ENRMTextSegment segmentWithNodes:[currentTextNodes copy]]];
39
+ [currentTextNodes removeAllObjects];
40
+ }
41
+ [segments addObject:[ENRMCodeBlockSegment segmentWithCodeBlockNode:child]];
42
+ } else {
37
43
  [currentTextNodes addObject:child];
38
44
  }
39
45
  }
@@ -53,9 +59,10 @@ NSArray<ENRMRenderedSegment *> *ENRMRenderSegmentsFromAST(MarkdownASTNode *ast,
53
59
  NSArray *segments = ENRMSplitASTIntoSegments(ast);
54
60
  NSMutableArray<ENRMRenderedSegment *> *renderedSegments = [NSMutableArray array];
55
61
 
56
- static const uint64_t kTextKindSalt = 0x7465787400000000ULL; // "text"
57
- static const uint64_t kTableKindSalt = 0x7461626C00000000ULL; // "tabl"
58
- static const uint64_t kMathKindSalt = 0x6D61746800000000ULL; // "math"
62
+ static const uint64_t kTextKindSalt = 0x7465787400000000ULL; // "text"
63
+ static const uint64_t kTableKindSalt = 0x7461626C00000000ULL; // "tabl"
64
+ static const uint64_t kMathKindSalt = 0x6D61746800000000ULL; // "math"
65
+ static const uint64_t kCodeBlockKindSalt = 0x63626C6B00000000ULL; // "cblk"
59
66
 
60
67
  for (id segment in segments) {
61
68
  if ([segment isKindOfClass:[ENRMTextSegment class]]) {
@@ -82,6 +89,12 @@ NSArray<ENRMRenderedSegment *> *ENRMRenderSegmentsFromAST(MarkdownASTNode *ast,
82
89
  [renderedSegments addObject:[ENRMRenderedSegment mathSegmentWithSegment:mathSegment signature:signature]];
83
90
  }
84
91
  #endif
92
+ else if ([segment isKindOfClass:[ENRMCodeBlockSegment class]]) {
93
+ ENRMCodeBlockSegment *codeBlockSegment = (ENRMCodeBlockSegment *)segment;
94
+ uint64_t signature = ENRMSignatureForNode(codeBlockSegment.codeBlockNode) ^ kCodeBlockKindSalt;
95
+ [renderedSegments addObject:[ENRMRenderedSegment codeBlockSegmentWithSegment:codeBlockSegment
96
+ signature:signature]];
97
+ }
85
98
  }
86
99
 
87
100
  return renderedSegments;
@@ -9,11 +9,21 @@ typedef NS_ENUM(NSInteger, ENRMTableStreamingMode) {
9
9
  ENRMTableStreamingModeProgressive,
10
10
  };
11
11
 
12
+ typedef NS_ENUM(NSInteger, ENRMCodeBlockStreamingMode) {
13
+ ENRMCodeBlockStreamingModeHidden = 0,
14
+ ENRMCodeBlockStreamingModeProgressive,
15
+ };
16
+
12
17
  #ifdef __cplusplus
13
18
  extern "C" {
14
19
  #endif
15
20
 
16
- NSString *ENRMRenderableMarkdownForStreaming(NSString *markdown, ENRMTableStreamingMode tableMode);
21
+ // Filtered markdown for the current streaming tick. When non-NULL,
22
+ // outEndsInsideOpenCodeFence reports whether the result ends inside a still-open
23
+ // fenced code block (the trailing block whose chrome the renderer defers).
24
+ NSString *ENRMRenderableMarkdownForStreaming(NSString *markdown, ENRMTableStreamingMode tableMode,
25
+ ENRMCodeBlockStreamingMode codeBlockMode,
26
+ BOOL *_Nullable outEndsInsideOpenCodeFence);
17
27
 
18
28
  #ifdef __cplusplus
19
29
  }
@@ -155,11 +155,107 @@ static NSString *ENRMRemovePendingStreamingTableBlock(NSString *markdown, NSArra
155
155
  return result;
156
156
  }
157
157
 
158
- NSString *ENRMRenderableMarkdownForStreaming(NSString *markdown, ENRMTableStreamingMode tableMode)
158
+ static NSString *ENRMRemovePendingTablesAndMath(NSString *markdown, ENRMTableStreamingMode tableMode,
159
+ NSArray<NSString *> *lines)
159
160
  {
160
- NSArray<NSString *> *lines = [markdown componentsSeparatedByString:@"\n"];
161
+ if (!lines) {
162
+ lines = [markdown componentsSeparatedByString:@"\n"];
163
+ }
161
164
  NSString *afterMath = ENRMRemovePendingStreamingMathBlock(markdown, lines);
162
165
  NSArray<NSString *> *linesForTable =
163
166
  (afterMath.length == markdown.length) ? lines : [afterMath componentsSeparatedByString:@"\n"];
164
167
  return ENRMRemovePendingStreamingTableBlock(afterMath, linesForTable, tableMode);
165
168
  }
169
+
170
+ // Parses a fence marker into char/length/info; NO if the line isn't one.
171
+ static BOOL ENRMParseFenceMarker(NSString *line, unichar *outChar, NSUInteger *outLength, NSString **outInfo)
172
+ {
173
+ NSUInteger i = 0;
174
+ while (i < line.length && [line characterAtIndex:i] == ' ' && i < 3) {
175
+ i++;
176
+ }
177
+ if (i >= line.length) {
178
+ return NO;
179
+ }
180
+ unichar ch = [line characterAtIndex:i];
181
+ if (ch != '`' && ch != '~') {
182
+ return NO;
183
+ }
184
+ NSUInteger runLength = 0;
185
+ while (i < line.length && [line characterAtIndex:i] == ch) {
186
+ i++;
187
+ runLength++;
188
+ }
189
+ if (runLength < 3) {
190
+ return NO;
191
+ }
192
+ NSString *info = [line substringFromIndex:i];
193
+ if (ch == '`' && [info rangeOfString:@"`"].location != NSNotFound) {
194
+ return NO;
195
+ }
196
+ if (outChar) {
197
+ *outChar = ch;
198
+ }
199
+ if (outLength) {
200
+ *outLength = runLength;
201
+ }
202
+ if (outInfo) {
203
+ *outInfo = info;
204
+ }
205
+ return YES;
206
+ }
207
+
208
+ static NSInteger ENRMFindOpenCodeFenceLineIndex(NSArray<NSString *> *lines)
209
+ {
210
+ NSInteger openIndex = -1;
211
+ unichar openChar = 0;
212
+ NSUInteger openLength = 0;
213
+ for (NSUInteger i = 0; i < lines.count; i++) {
214
+ unichar ch = 0;
215
+ NSUInteger length = 0;
216
+ NSString *info = nil;
217
+ BOOL isMarker = ENRMParseFenceMarker(lines[i], &ch, &length, &info);
218
+ if (openIndex == -1) {
219
+ if (isMarker) {
220
+ openIndex = (NSInteger)i;
221
+ openChar = ch;
222
+ openLength = length;
223
+ }
224
+ } else if (isMarker && ch == openChar && length >= openLength &&
225
+ [info stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]].length == 0) {
226
+ openIndex = -1;
227
+ }
228
+ }
229
+ return openIndex;
230
+ }
231
+
232
+ NSString *ENRMRenderableMarkdownForStreaming(NSString *markdown, ENRMTableStreamingMode tableMode,
233
+ ENRMCodeBlockStreamingMode codeBlockMode, BOOL *outEndsInsideOpenCodeFence)
234
+ {
235
+ NSArray<NSString *> *lines = [markdown componentsSeparatedByString:@"\n"];
236
+ NSInteger openFenceIndex = ENRMFindOpenCodeFenceLineIndex(lines);
237
+
238
+ if (openFenceIndex == -1) {
239
+ if (outEndsInsideOpenCodeFence) {
240
+ *outEndsInsideOpenCodeFence = NO;
241
+ }
242
+ return ENRMRemovePendingTablesAndMath(markdown, tableMode, lines);
243
+ }
244
+
245
+ NSUInteger *offsets = ENRMBuildLineOffsets(lines, lines.count);
246
+ NSUInteger fenceOffset = offsets[(NSUInteger)openFenceIndex];
247
+ free(offsets);
248
+
249
+ NSString *head = [markdown substringToIndex:fenceOffset];
250
+ if (codeBlockMode == ENRMCodeBlockStreamingModeHidden) {
251
+ if (outEndsInsideOpenCodeFence) {
252
+ *outEndsInsideOpenCodeFence = NO;
253
+ }
254
+ return ENRMRemovePendingTablesAndMath(head, tableMode, nil);
255
+ }
256
+ if (outEndsInsideOpenCodeFence) {
257
+ *outEndsInsideOpenCodeFence = YES;
258
+ }
259
+ NSString *tail = [markdown substringFromIndex:fenceOffset];
260
+ return [ENRMRemovePendingTablesAndMath(head, tableMode, nil) stringByAppendingString:tail];
261
+ }
@@ -10,6 +10,7 @@
10
10
  * mapping once and instantiate it for each type.
11
11
  */
12
12
 
13
+ #import "CodeBlockHighlighter.hpp"
13
14
  #import "ParagraphStyleUtils.h"
14
15
  #import "StyleConfig.h"
15
16
  #import <React/RCTConversions.h>
@@ -480,6 +481,16 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
480
481
  changed = YES;
481
482
  }
482
483
 
484
+ if (newStyle.blockquote.borderRadius != oldStyle.blockquote.borderRadius) {
485
+ [config setBlockquoteBorderRadius:newStyle.blockquote.borderRadius];
486
+ changed = YES;
487
+ }
488
+
489
+ if (newStyle.blockquote.padding != oldStyle.blockquote.padding) {
490
+ [config setBlockquotePadding:newStyle.blockquote.padding];
491
+ changed = YES;
492
+ }
493
+
483
494
  // ── Link ───────────────────────────────────────────────────────────────────
484
495
 
485
496
  if (newStyle.link.fontFamily != oldStyle.link.fontFamily) {
@@ -512,6 +523,32 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
512
523
  changed = YES;
513
524
  }
514
525
 
526
+ if (newStyle.link.borderRadius != oldStyle.link.borderRadius) {
527
+ [config setLinkBorderRadius:newStyle.link.borderRadius];
528
+ changed = YES;
529
+ }
530
+
531
+ if (newStyle.link.paddingHorizontal != oldStyle.link.paddingHorizontal) {
532
+ [config setLinkPaddingHorizontal:newStyle.link.paddingHorizontal];
533
+ changed = YES;
534
+ }
535
+
536
+ if (newStyle.link.paddingVertical != oldStyle.link.paddingVertical) {
537
+ [config setLinkPaddingVertical:newStyle.link.paddingVertical];
538
+ changed = YES;
539
+ }
540
+
541
+ if (newStyle.link.borderColor != oldStyle.link.borderColor) {
542
+ RCTUIColor *color = RCTUIColorFromSharedColor(newStyle.link.borderColor);
543
+ [config setLinkBorderColor:CGColorGetAlpha(color.CGColor) > 0 ? color : nil];
544
+ changed = YES;
545
+ }
546
+
547
+ if (newStyle.link.borderWidth != oldStyle.link.borderWidth) {
548
+ [config setLinkBorderWidth:newStyle.link.borderWidth];
549
+ changed = YES;
550
+ }
551
+
515
552
  {
516
553
  BOOL linkVariantsChanged = newStyle.linkVariants.size() != oldStyle.linkVariants.size();
517
554
  if (!linkVariantsChanged) {
@@ -519,7 +556,11 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
519
556
  const auto &newVariant = newStyle.linkVariants[i];
520
557
  const auto &oldVariant = oldStyle.linkVariants[i];
521
558
  if (newVariant.pattern != oldVariant.pattern || newVariant.color != oldVariant.color ||
522
- newVariant.underline != oldVariant.underline || newVariant.backgroundColor != oldVariant.backgroundColor) {
559
+ newVariant.underline != oldVariant.underline || newVariant.backgroundColor != oldVariant.backgroundColor ||
560
+ newVariant.borderRadius != oldVariant.borderRadius ||
561
+ newVariant.paddingHorizontal != oldVariant.paddingHorizontal ||
562
+ newVariant.paddingVertical != oldVariant.paddingVertical ||
563
+ newVariant.borderColor != oldVariant.borderColor || newVariant.borderWidth != oldVariant.borderWidth) {
523
564
  linkVariantsChanged = YES;
524
565
  break;
525
566
  }
@@ -534,6 +575,12 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
534
575
  variant.underline = entry.underline;
535
576
  RCTUIColor *backgroundColor = RCTUIColorFromSharedColor(entry.backgroundColor);
536
577
  variant.backgroundColor = CGColorGetAlpha(backgroundColor.CGColor) > 0 ? backgroundColor : nil;
578
+ variant.borderRadius = entry.borderRadius;
579
+ variant.paddingHorizontal = entry.paddingHorizontal;
580
+ variant.paddingVertical = entry.paddingVertical;
581
+ RCTUIColor *borderColor = RCTUIColorFromSharedColor(entry.borderColor);
582
+ variant.borderColor = CGColorGetAlpha(borderColor.CGColor) > 0 ? borderColor : nil;
583
+ variant.borderWidth = entry.borderWidth;
537
584
  [variants addObject:variant];
538
585
  }
539
586
  [config setLinkVariants:variants];
@@ -689,6 +736,21 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
689
736
  changed = YES;
690
737
  }
691
738
 
739
+ if (newStyle.image.maxHeight != oldStyle.image.maxHeight) {
740
+ [config setImageMaxHeight:newStyle.image.maxHeight];
741
+ changed = YES;
742
+ }
743
+
744
+ if (newStyle.image.aspectRatio != oldStyle.image.aspectRatio) {
745
+ [config setImageAspectRatio:newStyle.image.aspectRatio];
746
+ changed = YES;
747
+ }
748
+
749
+ if (newStyle.image.resizeMode != oldStyle.image.resizeMode) {
750
+ [config setImageResizeMode:@(newStyle.image.resizeMode.c_str())];
751
+ changed = YES;
752
+ }
753
+
692
754
  if (newStyle.image.borderRadius != oldStyle.image.borderRadius) {
693
755
  [config setImageBorderRadius:newStyle.image.borderRadius];
694
756
  changed = YES;
@@ -789,6 +851,11 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
789
851
  changed = YES;
790
852
  }
791
853
 
854
+ if (newStyle.list.itemSpacing != oldStyle.list.itemSpacing) {
855
+ [config setListStyleItemSpacing:newStyle.list.itemSpacing];
856
+ changed = YES;
857
+ }
858
+
792
859
  // ── Code Block ─────────────────────────────────────────────────────────────
793
860
 
794
861
  if (newStyle.codeBlock.fontSize != oldStyle.codeBlock.fontSize) {
@@ -856,6 +923,28 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
856
923
  changed = YES;
857
924
  }
858
925
 
926
+ #define ENRM_SET_SYNTAX_COLOR(field, token) \
927
+ if (newStyle.codeBlock.syntaxColors.field != oldStyle.codeBlock.syntaxColors.field) { \
928
+ [config setCodeBlockSyntaxColor:RCTUIColorFromSharedColor(newStyle.codeBlock.syntaxColors.field) \
929
+ forToken:(NSInteger)Markdown::HighlightTokenType::token]; \
930
+ changed = YES; \
931
+ }
932
+ ENRM_SET_SYNTAX_COLOR(keyword, Keyword)
933
+ ENRM_SET_SYNTAX_COLOR(operatorColor, Operator)
934
+ ENRM_SET_SYNTAX_COLOR(punctuation, Punctuation)
935
+ ENRM_SET_SYNTAX_COLOR(string, String)
936
+ ENRM_SET_SYNTAX_COLOR(number, Number)
937
+ ENRM_SET_SYNTAX_COLOR(constant, Constant)
938
+ ENRM_SET_SYNTAX_COLOR(comment, Comment)
939
+ ENRM_SET_SYNTAX_COLOR(function, Function)
940
+ ENRM_SET_SYNTAX_COLOR(type, Type)
941
+ ENRM_SET_SYNTAX_COLOR(variable, Variable)
942
+ ENRM_SET_SYNTAX_COLOR(property, Property)
943
+ ENRM_SET_SYNTAX_COLOR(tag, Tag)
944
+ ENRM_SET_SYNTAX_COLOR(attribute, Attribute)
945
+ ENRM_SET_SYNTAX_COLOR(embedded, Embedded)
946
+ #undef ENRM_SET_SYNTAX_COLOR
947
+
859
948
  // ── Thematic Break ─────────────────────────────────────────────────────────
860
949
 
861
950
  if (newStyle.thematicBreak.color != oldStyle.thematicBreak.color) {
@@ -991,6 +1080,16 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
991
1080
  changed = YES;
992
1081
  }
993
1082
 
1083
+ if (newStyle.table.horizontalOverflow != oldStyle.table.horizontalOverflow) {
1084
+ [config setTableHorizontalOverflow:newStyle.table.horizontalOverflow];
1085
+ changed = YES;
1086
+ }
1087
+
1088
+ if (newStyle.table.align != oldStyle.table.align) {
1089
+ [config setTableAlign:@(newStyle.table.align.c_str())];
1090
+ changed = YES;
1091
+ }
1092
+
994
1093
  // ── Task List ───────────────────────────────────────────────────────────────
995
1094
 
996
1095
  if (newStyle.taskList.checkedColor != oldStyle.taskList.checkedColor) {
@@ -1068,6 +1167,11 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
1068
1167
  changed = YES;
1069
1168
  }
1070
1169
 
1170
+ if (newStyle.math.glyphOverflow != oldStyle.math.glyphOverflow) {
1171
+ [config setMathGlyphOverflow:newStyle.math.glyphOverflow];
1172
+ changed = YES;
1173
+ }
1174
+
1071
1175
  if (newStyle.math.marginTop != oldStyle.math.marginTop) {
1072
1176
  [config setMathMarginTop:newStyle.math.marginTop];
1073
1177
  changed = YES;
@@ -1116,6 +1220,11 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
1116
1220
  changed = YES;
1117
1221
  }
1118
1222
 
1223
+ if (newStyle.inlineMath.glyphOverflow != oldStyle.inlineMath.glyphOverflow) {
1224
+ [config setInlineMathGlyphOverflow:newStyle.inlineMath.glyphOverflow];
1225
+ changed = YES;
1226
+ }
1227
+
1119
1228
  // ── Spoiler ─────────────────────────────────────────────────────────────
1120
1229
 
1121
1230
  if (newStyle.spoiler.color != oldStyle.spoiler.color) {
@@ -1,5 +1,6 @@
1
1
  #import "TaskListTapUtils.h"
2
2
  #import "ENRMUIKit.h"
3
+ #import "LastElementUtils.h"
3
4
  #import "ListItemRenderer.h"
4
5
  #import "ParagraphStyleUtils.h"
5
6
  #import "StyleConfig.h"
@@ -171,6 +172,13 @@ BOOL updateTaskListItemCheckedState(ENRMPlatformTextView *textView, NSInteger ta
171
172
  if (depth && [depth integerValue] > nestingLevel)
172
173
  return;
173
174
 
175
+ // Skip code block ranges — preserve CodeBlockRenderer styles.
176
+ NSNumber *isCodeBlock = [mutableText attribute:CodeBlockAttributeName
177
+ atIndex:segmentRange.location
178
+ effectiveRange:nil];
179
+ if ([isCodeBlock boolValue])
180
+ return;
181
+
174
182
  [mutableText addAttribute:TaskCheckedAttribute value:@(newChecked) range:segmentRange];
175
183
 
176
184
  if (newChecked) {
@@ -195,6 +203,22 @@ BOOL updateTaskListItemCheckedState(ENRMPlatformTextView *textView, NSInteger ta
195
203
  }
196
204
  }];
197
205
 
206
+ // The checkbox glyph is drawn from the marker descriptor, not from
207
+ // TaskCheckedAttribute — keep it in sync. Enumerated over the full text:
208
+ // for code-block-first items the anchor sits outside the metadata ranges.
209
+ [mutableText enumerateAttribute:ListItemMarkerStartAttribute
210
+ inRange:NSMakeRange(0, mutableText.length)
211
+ options:0
212
+ usingBlock:^(NSArray *markers, NSRange range, BOOL *stop) {
213
+ if (![markers isKindOfClass:[NSArray class]])
214
+ return;
215
+ for (ENRMListMarkerDescriptor *marker in markers) {
216
+ if (marker.isTask && marker.taskIndex == targetIndex) {
217
+ marker.isChecked = newChecked;
218
+ }
219
+ }
220
+ }];
221
+
198
222
  ENRMSetAttributedText(textView, mutableText);
199
223
  NSLayoutManager *layoutManager = textView.layoutManager;
200
224
  if (layoutManager) {
@@ -2,6 +2,7 @@
2
2
  #import "BlockquoteBorder.h"
3
3
  #import "CodeBackground.h"
4
4
  #import "CodeBlockBackground.h"
5
+ #import "ENRMLinkChip.h"
5
6
  #import "ListMarkerDrawer.h"
6
7
  #import "RuntimeKeys.h"
7
8
  #import "StyleConfig.h"
@@ -31,6 +32,8 @@
31
32
  // We fetch the objects into local variables FIRST to ensure they don't
32
33
  // disappear mid-method if setConfig: is called on another thread.
33
34
 
35
+ ENRMDrawLinkChipsForGlyphRange(self, textContainer, glyphsToShow, origin);
36
+
34
37
  CodeBackground *codeBg = [self getCodeBackgroundWithConfig:config];
35
38
  [codeBg drawBackgroundsForGlyphRange:glyphsToShow layoutManager:self textContainer:textContainer atPoint:origin];
36
39
 
@@ -0,0 +1,60 @@
1
+ #pragma once
2
+ #import "ENRMBlockMenu.h"
3
+ #import "ENRMUIKit.h"
4
+ #import "StyleConfig.h"
5
+
6
+ @class MarkdownASTNode;
7
+
8
+ NS_ASSUME_NONNULL_BEGIN
9
+
10
+ typedef void (^ENRMCodeBlockCopyBlock)(NSString *code, NSString *language);
11
+
12
+ @interface ENRMCodeBlockContainerView : RCTUIView
13
+
14
+ - (instancetype)initWithConfig:(StyleConfig *)config;
15
+
16
+ - (void)applyCodeBlockNode:(MarkdownASTNode *)node;
17
+
18
+ - (CGFloat)measureHeight:(CGFloat)maxWidth;
19
+
20
+ // View-free height for the shadow-node measurement pass: the same height an
21
+ // instance's measureHeight: reports for the node, without building a view.
22
+ + (CGFloat)measureHeightForCodeBlockNode:(MarkdownASTNode *)node config:(StyleConfig *)config;
23
+
24
+ @property (nonatomic, strong) StyleConfig *config;
25
+
26
+ // True until the closing fence arrives: highlighting is deferred and copying is
27
+ // disabled, while the header stays visible.
28
+ @property (nonatomic, assign) BOOL pending;
29
+
30
+ // Renamed getters avoid the Cocoa `copy` method family (which signals +1
31
+ // retained returns). Property names are unchanged so call sites stay the same.
32
+ @property (nonatomic, copy, nullable, getter=menuCopyLabel) NSString *copyLabel;
33
+ @property (nonatomic, copy, nullable, getter=menuCopyAsMarkdownLabel) NSString *copyAsMarkdownLabel;
34
+
35
+ /// Suppresses the long-press copy menu on this block. Mirrors the
36
+ /// `contextMenuHidden` prop; the header copy button is a visible control, not a
37
+ /// context menu, and stays (hide it with `menuOptions.copyButtonHidden`).
38
+ @property (nonatomic, assign) BOOL contextMenuHidden;
39
+
40
+ /// Copy / Copy as Markdown visibility, Copy format and the header copy button
41
+ /// from `selectionMenuConfig`. `copyHidden` also drops the VoiceOver copy action;
42
+ /// the header button and VoiceOver action always copy the raw code.
43
+ @property (nonatomic, assign) ENRMBlockMenuOptions menuOptions;
44
+
45
+ /// Set by the host; receives the Copy item's content when
46
+ /// `menuOptions.interceptCopy` is set.
47
+ @property (nonatomic, copy, nullable) ENRMBlockCopyRequestBlock onCopyRequest;
48
+ /// Called instead of the menu on long press while `contextMenuHidden` is on, so
49
+ /// the owner can report the block (`onSelectionChange`) and show its own UI.
50
+ @property (nonatomic, copy, nullable) ENRMBlockCopyRequestBlock onMenuSuppressed;
51
+
52
+ // Fired when the code is copied (header button, context-menu Copy, or the
53
+ // VoiceOver copy action); set by the host to bridge up to the JS onCopyPress
54
+ // event. Not fired for "Copy as Markdown", nor for the context-menu Copy when
55
+ // `menuOptions.copyWritesMarkdown` is set.
56
+ @property (nonatomic, copy, nullable) ENRMCodeBlockCopyBlock onCopyPress;
57
+
58
+ @end
59
+
60
+ NS_ASSUME_NONNULL_END