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
@@ -25,8 +25,17 @@ endif()
25
25
 
26
26
  set(ANDROID_CPP_DIR "${LIB_ANDROID_DIR}/src/main/cpp")
27
27
 
28
+ # Optional tree-sitter code highlighting. build.gradle writes this config during
29
+ # configuration (enable flag, selected languages, generated registry dir); absent
30
+ # on a bare CMake invocation, in which case highlighting stays compiled out.
31
+ set(HIGHLIGHT_CONFIG "${LIB_ANDROID_DIR}/build/generated/highlight/highlight-config.cmake")
32
+ if(EXISTS "${HIGHLIGHT_CONFIG}")
33
+ include("${HIGHLIGHT_CONFIG}")
34
+ endif()
35
+
28
36
  file(GLOB MD4C_SOURCES "${CPP_ROOT}/md4c/*.c")
29
37
  file(GLOB PARSER_SOURCES "${CPP_ROOT}/parser/*.cpp")
38
+ file(GLOB HIGHLIGHT_SOURCES "${CPP_ROOT}/highlight/*.cpp")
30
39
 
31
40
  # md4c is C code, build as separate static library with C flags
32
41
  add_library(md4c_lib STATIC ${MD4C_SOURCES})
@@ -46,6 +55,7 @@ add_library(
46
55
  ${LIB_CODEGEN_SRCS}
47
56
  ${LIB_CUSTOM_JNI_SRCS}
48
57
  ${PARSER_SOURCES}
58
+ ${HIGHLIGHT_SOURCES}
49
59
  ${ANDROID_CPP_DIR}/jni-adapter.cpp
50
60
  )
51
61
 
@@ -58,6 +68,7 @@ target_include_directories(
58
68
  ${LIB_ANDROID_GENERATED_COMPONENTS_DIR}
59
69
  ${CPP_ROOT}/md4c
60
70
  ${CPP_ROOT}/parser
71
+ ${CPP_ROOT}/highlight
61
72
  )
62
73
 
63
74
  target_compile_definitions(${LIB_TARGET_NAME} PRIVATE MD4C_USE_UTF8=1)
@@ -82,3 +93,45 @@ target_include_directories(
82
93
  )
83
94
 
84
95
  target_compile_reactnative_options(${LIB_TARGET_NAME} PRIVATE)
96
+
97
+ # --- Code-block syntax highlighting (tree-sitter) ---
98
+ # CodeBlockHighlighter.cpp / CodeBlockLanguages.cpp are already in the target via
99
+ # HIGHLIGHT_SOURCES; without the define below CodeBlockHighlighter.cpp is the stub.
100
+ # When enabled we add the runtime, the generated registry, and one OBJECT lib per
101
+ # selected grammar (each isolated to its own dir so grammar parser.h files never
102
+ # collide), then define ENRICHED_MARKDOWN_CODE_HIGHLIGHT so the real seam compiles.
103
+ if(ENRICHED_MARKDOWN_CODE_HIGHLIGHT)
104
+ set(TS_VENDOR "${CPP_ROOT}/highlight/vendor")
105
+
106
+ add_library(tree_sitter_runtime STATIC "${TS_VENDOR}/tree-sitter/src/lib.c")
107
+ target_include_directories(tree_sitter_runtime
108
+ PRIVATE "${TS_VENDOR}/tree-sitter/src"
109
+ PUBLIC "${TS_VENDOR}/tree-sitter/include")
110
+ set_target_properties(tree_sitter_runtime PROPERTIES
111
+ C_STANDARD 11 C_STANDARD_REQUIRED ON POSITION_INDEPENDENT_CODE ON)
112
+ target_compile_options(tree_sitter_runtime PRIVATE -fvisibility=hidden)
113
+
114
+ set(GRAMMAR_OBJECTS "")
115
+ foreach(lang IN LISTS ENRICHED_MARKDOWN_HIGHLIGHT_LANGUAGES)
116
+ set(gdir "${TS_VENDOR}/grammars/${lang}")
117
+ set(gsrcs "${gdir}/parser.c")
118
+ if(EXISTS "${gdir}/scanner.c")
119
+ list(APPEND gsrcs "${gdir}/scanner.c")
120
+ endif()
121
+ add_library(ts_grammar_${lang} OBJECT ${gsrcs})
122
+ target_include_directories(ts_grammar_${lang} PRIVATE "${gdir}")
123
+ set_target_properties(ts_grammar_${lang} PROPERTIES
124
+ C_STANDARD 11 C_STANDARD_REQUIRED ON POSITION_INDEPENDENT_CODE ON)
125
+ target_compile_options(ts_grammar_${lang} PRIVATE -fvisibility=hidden)
126
+ list(APPEND GRAMMAR_OBJECTS $<TARGET_OBJECTS:ts_grammar_${lang}>)
127
+ endforeach()
128
+
129
+ target_sources(${LIB_TARGET_NAME} PRIVATE
130
+ "${ENRICHED_MARKDOWN_HIGHLIGHT_GENERATED_DIR}/generated_registry.cpp"
131
+ ${GRAMMAR_OBJECTS})
132
+ target_include_directories(${LIB_TARGET_NAME} PRIVATE
133
+ "${TS_VENDOR}/tree-sitter/include"
134
+ "${ENRICHED_MARKDOWN_HIGHLIGHT_GENERATED_DIR}")
135
+ target_compile_definitions(${LIB_TARGET_NAME} PRIVATE ENRICHED_MARKDOWN_CODE_HIGHLIGHT=1)
136
+ target_link_libraries(${LIB_TARGET_NAME} tree_sitter_runtime)
137
+ endif()
@@ -12,6 +12,16 @@ void MarkdownContainerShadowNode::setMeasurementsManager(
12
12
  measurementsManager_ = measurementsManager;
13
13
  }
14
14
 
15
+ void MarkdownContainerShadowNode::dirtyLayoutIfNeeded() {
16
+ const auto state = this->getStateData();
17
+ const auto counter = state.getForceHeightRecalculationCounter();
18
+
19
+ if (forceHeightRecalculationCounter_ != counter) {
20
+ forceHeightRecalculationCounter_ = counter;
21
+ dirtyLayout();
22
+ }
23
+ }
24
+
15
25
  Size MarkdownContainerShadowNode::measureContent(const LayoutContext &layoutContext,
16
26
  const LayoutConstraints &layoutConstraints) const {
17
27
  return measurementsManager_->measure(getSurfaceId(), getTag(), getConcreteProps(), layoutConstraints);
@@ -1,6 +1,7 @@
1
1
  #pragma once
2
2
 
3
3
  #include "MarkdownContainerMeasurementManager.h"
4
+ #include "MarkdownTextState.h"
4
5
 
5
6
  #include <react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h>
6
7
  #include <react/renderer/components/EnrichedMarkdownTextSpec/Props.h>
@@ -11,11 +12,16 @@ namespace facebook::react {
11
12
  JSI_EXPORT extern const char MarkdownContainerComponentName[];
12
13
 
13
14
  class MarkdownContainerShadowNode final
14
- : public ConcreteViewShadowNode<MarkdownContainerComponentName, EnrichedMarkdownProps,
15
- EnrichedMarkdownEventEmitter> {
15
+ : public ConcreteViewShadowNode<MarkdownContainerComponentName, EnrichedMarkdownProps, EnrichedMarkdownEventEmitter,
16
+ MarkdownTextState> {
16
17
  public:
17
18
  using ConcreteViewShadowNode::ConcreteViewShadowNode;
18
19
 
20
+ MarkdownContainerShadowNode(ShadowNode const &sourceShadowNode, ShadowNodeFragment const &fragment)
21
+ : ConcreteViewShadowNode(sourceShadowNode, fragment) {
22
+ dirtyLayoutIfNeeded();
23
+ }
24
+
19
25
  static ShadowNodeTraits BaseTraits() {
20
26
  auto traits = ConcreteViewShadowNode::BaseTraits();
21
27
  traits.set(ShadowNodeTraits::Trait::LeafYogaNode);
@@ -25,9 +31,12 @@ public:
25
31
 
26
32
  void setMeasurementsManager(const std::shared_ptr<MarkdownContainerMeasurementManager> &measurementsManager);
27
33
 
34
+ void dirtyLayoutIfNeeded();
35
+
28
36
  Size measureContent(const LayoutContext &layoutContext, const LayoutConstraints &layoutConstraints) const override;
29
37
 
30
38
  private:
39
+ int forceHeightRecalculationCounter_{0};
31
40
  std::shared_ptr<MarkdownContainerMeasurementManager> measurementsManager_;
32
41
  };
33
42
 
@@ -12,6 +12,16 @@ void MarkdownTextShadowNode::setMeasurementsManager(
12
12
  measurementsManager_ = measurementsManager;
13
13
  }
14
14
 
15
+ void MarkdownTextShadowNode::dirtyLayoutIfNeeded() {
16
+ const auto state = this->getStateData();
17
+ const auto counter = state.getForceHeightRecalculationCounter();
18
+
19
+ if (forceHeightRecalculationCounter_ != counter) {
20
+ forceHeightRecalculationCounter_ = counter;
21
+ dirtyLayout();
22
+ }
23
+ }
24
+
15
25
  Size MarkdownTextShadowNode::measureContent(const LayoutContext &layoutContext,
16
26
  const LayoutConstraints &layoutConstraints) const {
17
27
  return measurementsManager_->measure(getSurfaceId(), getTag(), getConcreteProps(), layoutConstraints);
@@ -1,6 +1,7 @@
1
1
  #pragma once
2
2
 
3
3
  #include "MarkdownTextMeasurementManager.h"
4
+ #include "MarkdownTextState.h"
4
5
 
5
6
  #include <react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h>
6
7
  #include <react/renderer/components/EnrichedMarkdownTextSpec/Props.h>
@@ -13,11 +14,17 @@ JSI_EXPORT extern const char MarkdownTextComponentName[];
13
14
  /*
14
15
  * `ShadowNode` for <EnrichedMarkdownText> component.
15
16
  */
16
- class MarkdownTextShadowNode final : public ConcreteViewShadowNode<MarkdownTextComponentName, EnrichedMarkdownTextProps,
17
- EnrichedMarkdownTextEventEmitter> {
17
+ class MarkdownTextShadowNode final
18
+ : public ConcreteViewShadowNode<MarkdownTextComponentName, EnrichedMarkdownTextProps,
19
+ EnrichedMarkdownTextEventEmitter, MarkdownTextState> {
18
20
  public:
19
21
  using ConcreteViewShadowNode::ConcreteViewShadowNode;
20
22
 
23
+ MarkdownTextShadowNode(ShadowNode const &sourceShadowNode, ShadowNodeFragment const &fragment)
24
+ : ConcreteViewShadowNode(sourceShadowNode, fragment) {
25
+ dirtyLayoutIfNeeded();
26
+ }
27
+
21
28
  static ShadowNodeTraits BaseTraits() {
22
29
  auto traits = ConcreteViewShadowNode::BaseTraits();
23
30
  traits.set(ShadowNodeTraits::Trait::LeafYogaNode);
@@ -28,9 +35,12 @@ public:
28
35
  // Associates a shared `MarkdownTextMeasurementManager` with the node.
29
36
  void setMeasurementsManager(const std::shared_ptr<MarkdownTextMeasurementManager> &measurementsManager);
30
37
 
38
+ void dirtyLayoutIfNeeded();
39
+
31
40
  Size measureContent(const LayoutContext &layoutContext, const LayoutConstraints &layoutConstraints) const override;
32
41
 
33
42
  private:
43
+ int forceHeightRecalculationCounter_{0};
34
44
  std::shared_ptr<MarkdownTextMeasurementManager> measurementsManager_;
35
45
  };
36
46
 
@@ -0,0 +1,9 @@
1
+ #include "MarkdownTextState.h"
2
+
3
+ namespace facebook::react {
4
+
5
+ int MarkdownTextState::getForceHeightRecalculationCounter() const {
6
+ return forceHeightRecalculationCounter_;
7
+ }
8
+
9
+ } // namespace facebook::react
@@ -0,0 +1,24 @@
1
+ #pragma once
2
+
3
+ #include <folly/dynamic.h>
4
+
5
+ namespace facebook::react {
6
+
7
+ class MarkdownTextState {
8
+ public:
9
+ MarkdownTextState() : forceHeightRecalculationCounter_(0) {}
10
+
11
+ MarkdownTextState(MarkdownTextState const &previousState, folly::dynamic data)
12
+ : forceHeightRecalculationCounter_((int)data["forceHeightRecalculationCounter"].getInt()) {}
13
+
14
+ folly::dynamic getDynamic() const {
15
+ return {};
16
+ }
17
+
18
+ int getForceHeightRecalculationCounter() const;
19
+
20
+ private:
21
+ const int forceHeightRecalculationCounter_{};
22
+ };
23
+
24
+ } // namespace facebook::react
@@ -12,9 +12,17 @@ inline folly::dynamic toDynamic(const EnrichedMarkdownTextProps &props) {
12
12
  serializedProps["markdown"] = props.markdown;
13
13
  serializedProps["markdownStyle"] = toDynamic(props.markdownStyle);
14
14
  serializedProps["md4cFlags"] = toDynamic(props.md4cFlags);
15
+ serializedProps["allowFontScaling"] = props.allowFontScaling;
16
+ serializedProps["maxFontSizeMultiplier"] = props.maxFontSizeMultiplier;
15
17
  serializedProps["allowTrailingMargin"] = props.allowTrailingMargin;
16
18
  serializedProps["streamingAnimation"] = props.streamingAnimation;
17
19
 
20
+ folly::dynamic imageRequestHeaders = folly::dynamic::array();
21
+ for (const auto &header : props.imageRequestHeaders) {
22
+ imageRequestHeaders.push_back(toDynamic(header));
23
+ }
24
+ serializedProps["imageRequestHeaders"] = std::move(imageRequestHeaders);
25
+
18
26
  return serializedProps;
19
27
  }
20
28
 
@@ -23,9 +31,17 @@ inline folly::dynamic toDynamic(const EnrichedMarkdownProps &props) {
23
31
  serializedProps["markdown"] = props.markdown;
24
32
  serializedProps["markdownStyle"] = toDynamic(props.markdownStyle);
25
33
  serializedProps["md4cFlags"] = toDynamic(props.md4cFlags);
34
+ serializedProps["allowFontScaling"] = props.allowFontScaling;
35
+ serializedProps["maxFontSizeMultiplier"] = props.maxFontSizeMultiplier;
26
36
  serializedProps["allowTrailingMargin"] = props.allowTrailingMargin;
27
37
  serializedProps["streamingAnimation"] = props.streamingAnimation;
28
38
 
39
+ folly::dynamic imageRequestHeaders = folly::dynamic::array();
40
+ for (const auto &header : props.imageRequestHeaders) {
41
+ imageRequestHeaders.push_back(toDynamic(header));
42
+ }
43
+ serializedProps["imageRequestHeaders"] = std::move(imageRequestHeaders);
44
+
29
45
  return serializedProps;
30
46
  }
31
47
 
@@ -195,11 +195,28 @@ class MathChipControllerImpl(
195
195
  ) {
196
196
  if (!displayMode) return
197
197
  val blockStyle = style as? MathBlockStyle ?: return
198
- if (blockStyle.alignment == Layout.Alignment.ALIGN_NORMAL) return
198
+ if (blockStyle.textAlign == Layout.Alignment.ALIGN_NORMAL) return
199
+
200
+ // An AlignmentSpan is paragraph-scoped, and SpannableStringBuilder *throws* unless a
201
+ // SPAN_PARAGRAPH span starts at a paragraph boundary and ends just past one — its end
202
+ // check is `charAt(end - 1) == '\n' || end == length`. A bare (position, position + 1)
203
+ // span therefore crashes for every chip that is not the buffer's last character, so
204
+ // the span has to cover the chip's whole paragraph, trailing newline included.
205
+ var start = position
206
+ while (start > 0 && editable[start - 1] != '\n') start--
207
+ var end = position + 1
208
+ while (end < editable.length && editable[end - 1] != '\n') end++
209
+
210
+ // Align only a paragraph the chip owns. Display math can also arrive from the middle
211
+ // of a paragraph ("text $$x$$ more", upstream #537); aligning that whole paragraph
212
+ // because of one formula would move the surrounding prose too.
213
+ val glyphCount = (start until end).count { editable[it] != '\n' }
214
+ if (glyphCount != 1) return
215
+
199
216
  editable.setSpan(
200
- AlignmentSpan.Standard(blockStyle.alignment),
201
- position,
202
- position + 1,
217
+ AlignmentSpan.Standard(blockStyle.textAlign),
218
+ start,
219
+ end,
203
220
  Spanned.SPAN_PARAGRAPH,
204
221
  )
205
222
  }
@@ -37,13 +37,19 @@ class MathInlineRenderer(
37
37
  textColor = config.style.inlineMathStyle.color,
38
38
  paddingVertical = config.style.inlineMathStyle.paddingVertical,
39
39
  fontWeight = config.style.inlineMathStyle.fontWeight,
40
+ glyphOverflow = config.style.inlineMathStyle.glyphOverflow,
40
41
  )
41
42
 
42
43
  builder.setSpan(span, start, end, SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE)
43
44
  }
44
45
 
45
46
  private fun extractLatex(node: MarkdownASTNode): String {
46
- if (!node.content.isNullOrEmpty()) return node.content!!
47
- return node.children.mapNotNull { it.content }.joinToString("")
47
+ if (node.content.isNotEmpty()) return node.content
48
+ return node.children.joinToString("") { child ->
49
+ when (child.type) {
50
+ MarkdownASTNode.NodeType.SoftBreak, MarkdownASTNode.NodeType.LineBreak -> " "
51
+ else -> child.content
52
+ }
53
+ }
48
54
  }
49
55
  }
@@ -185,7 +185,7 @@ class MathChipSpan(
185
185
  if (blockStyle != null && totalWidth > intrinsicWidth) {
186
186
  val slack = totalWidth - formulaWidth - style.paddingHorizontal * 2f
187
187
  val offset =
188
- when (blockStyle.alignment) {
188
+ when (blockStyle.textAlign) {
189
189
  Layout.Alignment.ALIGN_CENTER -> slack / 2f
190
190
  Layout.Alignment.ALIGN_OPPOSITE -> slack
191
191
  else -> 0f
@@ -16,6 +16,7 @@ class MathInlineSpan(
16
16
  private val textColor: Int,
17
17
  private val paddingVertical: Float,
18
18
  private val fontWeight: String = "normal",
19
+ private val glyphOverflow: Float = 0f,
19
20
  ) : ReplacementSpan() {
20
21
  private var cachedBitmap: Bitmap? = null
21
22
  private var cachedWidth = 0
@@ -31,18 +32,24 @@ class MathInlineSpan(
31
32
  val displayList = RaTeXEngine.parseBlocking(latex, displayMode = false, color = textColor)
32
33
  val renderer = RaTeXRenderer(displayList, fontSize, ratexTypefaceLoader(fontWeight))
33
34
 
34
- cachedWidth = renderer.widthPx.toInt().coerceAtLeast(1)
35
+ cachedWidth = ceil(renderer.widthPx).toInt().coerceAtLeast(1)
35
36
  mathAscent = renderer.heightPx
36
37
  mathDescent = renderer.depthPx
37
38
 
39
+ // RaTeX reports TeX metric boxes, which digit and capital outlines (and the
40
+ // fake-bold stroke) overshoot; the bitmap keeps glyphOverflow px of headroom
41
+ // on both sides so that ink is not cut off.
42
+ val overflowPx = glyphOverflow.toInt()
38
43
  val bitmap =
39
44
  Bitmap.createBitmap(
40
45
  cachedWidth,
41
- ceil(renderer.totalHeightPx).toInt().coerceAtLeast(1),
46
+ ceil(renderer.totalHeightPx).toInt().coerceAtLeast(1) + overflowPx * 2,
42
47
  Bitmap.Config.ARGB_8888,
43
48
  )
44
49
 
45
- renderer.draw(Canvas(bitmap))
50
+ val canvas = Canvas(bitmap)
51
+ canvas.translate(0f, overflowPx.toFloat())
52
+ renderer.draw(canvas)
46
53
  cachedBitmap = bitmap
47
54
  } catch (_: Exception) {
48
55
  renderFailed = true
@@ -66,9 +73,9 @@ class MathInlineSpan(
66
73
  // Must stay identical to MathInlinePlaceholderSpan.getSize: that span measures
67
74
  // this one off the main thread, and a box that disagrees by even a pixel either
68
75
  // clips the formula or eats the padding this field is here to add.
69
- ascent = -ceil(mathAscent + paddingVertical).toInt()
76
+ ascent = -ceil(mathAscent + (paddingVertical + glyphOverflow)).toInt()
70
77
  top = ascent
71
- descent = ceil(mathDescent + paddingVertical).toInt()
78
+ descent = ceil(mathDescent + (paddingVertical + glyphOverflow)).toInt()
72
79
  bottom = descent
73
80
  }
74
81
 
@@ -88,7 +95,7 @@ class MathInlineSpan(
88
95
  ) {
89
96
  prepareResources()
90
97
  cachedBitmap?.let {
91
- val bitmapY = y - ceil(mathAscent)
98
+ val bitmapY = y - ceil(mathAscent) - glyphOverflow
92
99
  canvas.drawBitmap(it, x, bitmapY, paint)
93
100
  }
94
101
  }
@@ -5,6 +5,7 @@ import android.util.Log
5
5
  import io.ratex.RaTeXEngine
6
6
  import io.ratex.RaTeXFontLoader
7
7
  import io.ratex.RaTeXRenderer
8
+ import kotlin.math.ceil
8
9
 
9
10
  object MathMeasureHelper {
10
11
  @JvmStatic
@@ -37,7 +38,7 @@ object MathMeasureHelper {
37
38
  }
38
39
 
39
40
  return MathMetrics(
40
- renderer.widthPx.toInt(),
41
+ ceil(renderer.widthPx).toInt().coerceAtLeast(1),
41
42
  renderer.heightPx,
42
43
  renderer.depthPx,
43
44
  )
@@ -41,6 +41,12 @@ class MathContainerView(
41
41
  // Set reflectively by EnrichedMarkdown (math is an optional module).
42
42
  var copyLabel: String = ""
43
43
  var copyAsMarkdownLabel: String = ""
44
+ var contextMenuHidden: Boolean = false
45
+ var menuOptions: BlockMenuOptions = BlockMenuOptions()
46
+
47
+ // Called instead of the menu on long press while contextMenuHidden is on, so
48
+ // the owner can report the block (onSelectionChange) and show its own UI.
49
+ var onMenuSuppressed: ((markdown: String, text: String) -> Unit)? = null
44
50
 
45
51
  override val segmentMarginTop: Int get() = mathStyle.marginTop.toInt()
46
52
  override val segmentMarginBottom: Int get() = mathStyle.marginBottom.toInt()
@@ -52,7 +58,7 @@ class MathContainerView(
52
58
  else -> Gravity.CENTER_HORIZONTAL
53
59
  }
54
60
 
55
- private val mathView = RaTeXCanvasView(context)
61
+ private val mathView = RaTeXCanvasView(context, mathStyle.glyphOverflow)
56
62
 
57
63
  init {
58
64
  setBackgroundColor(mathStyle.backgroundColor)
@@ -117,19 +123,27 @@ class MathContainerView(
117
123
  }
118
124
 
119
125
  private fun showContextMenu(anchor: View) {
126
+ if (contextMenuHidden) {
127
+ onMenuSuppressed?.invoke("$$\n$cachedLatex\n$$", cachedLatex)
128
+ return
129
+ }
120
130
  val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
121
131
  ContextMenuPopup.show(anchor, this) {
122
- item(ContextMenuPopup.Icon.COPY, copyLabel) {
132
+ blockCopyItems(menuOptions, copyLabel, copyAsMarkdownLabel, markdown = {
133
+ "$$\n$cachedLatex\n$$"
134
+ }, rawText = { cachedLatex }, copyRaw = {
123
135
  clipboard.setPrimaryClip(ClipData.newPlainText("Math", cachedLatex))
124
- }
125
- item(ContextMenuPopup.Icon.DOCUMENT, copyAsMarkdownLabel) {
136
+ }, copyMarkdown = {
126
137
  clipboard.setPrimaryClip(ClipData.newPlainText("Math", "$$\n$cachedLatex\n$$"))
127
- }
138
+ })
128
139
  }
129
140
  }
130
141
 
142
+ // glyphOverflow px of headroom above and below the RaTeX box: digit and capital
143
+ // outlines (and the fake-bold stroke) overshoot it, and this view clips to its size.
131
144
  private class RaTeXCanvasView(
132
145
  context: Context,
146
+ private val glyphOverflow: Float,
133
147
  ) : View(context) {
134
148
  var renderer: RaTeXRenderer? = null
135
149
 
@@ -142,12 +156,16 @@ class MathContainerView(
142
156
  ?: return setMeasuredDimension(0, 0)
143
157
  setMeasuredDimension(
144
158
  ceil(currentRenderer.widthPx).toInt().coerceAtLeast(1),
145
- ceil(currentRenderer.totalHeightPx).toInt().coerceAtLeast(1),
159
+ ceil(currentRenderer.totalHeightPx).toInt().coerceAtLeast(1) + (glyphOverflow * 2).toInt(),
146
160
  )
147
161
  }
148
162
 
149
163
  override fun onDraw(canvas: Canvas) {
150
- renderer?.draw(canvas)
164
+ val currentRenderer = renderer ?: return
165
+ canvas.save()
166
+ canvas.translate(0f, glyphOverflow)
167
+ currentRenderer.draw(canvas)
168
+ canvas.restore()
151
169
  }
152
170
  }
153
171
 
@@ -164,7 +182,7 @@ class MathContainerView(
164
182
  mode = MathRenderMode.Display,
165
183
  )
166
184
  val metrics = MathMeasureHelper.measure(context, listOf(request)).first()
167
- return ceil(metrics.ascent + metrics.descent).toInt() + (mathStyle.padding * 2)
185
+ return ceil(metrics.ascent + metrics.descent).toInt() + (mathStyle.padding * 2) + (mathStyle.glyphOverflow * 2)
168
186
  }
169
187
 
170
188
  private const val TAG = "MathContainerView"