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
@@ -1,6 +1,7 @@
1
1
  #import "TableContainerView.h"
2
2
  #import "AttributedRenderer.h"
3
3
  #import "ENRMAccessibilityLabels.h"
4
+ #import "ENRMLinkChip.h"
4
5
  #import "HTMLGenerator.h"
5
6
  #import "LinkTapUtils.h"
6
7
  #import "MarkdownASTNode.h"
@@ -28,6 +29,186 @@
28
29
  @implementation TableCellData
29
30
  @end
30
31
 
32
+ // Cell rendering and layout are view-free statics so the instance path
33
+ // (applyTableNode:/computeLayout) and the shadow-measurement class method
34
+ // (+measureHeightForTableNode:...) share one implementation and cannot drift
35
+ // (issue #550).
36
+
37
+ static NSTextAlignment ENRMTableTextAlignmentFromString(NSString *align)
38
+ {
39
+ if ([align isEqualToString:@"center"])
40
+ return NSTextAlignmentCenter;
41
+ if ([align isEqualToString:@"right"])
42
+ return NSTextAlignmentRight;
43
+ return NSTextAlignmentLeft;
44
+ }
45
+
46
+ static NSString *ENRMTablePlainTextFromNode(MarkdownASTNode *node)
47
+ {
48
+ if (!node)
49
+ return @"";
50
+ NSMutableString *buffer = [node.content mutableCopy] ?: [NSMutableString string];
51
+ for (MarkdownASTNode *child in node.children) {
52
+ [buffer appendString:ENRMTablePlainTextFromNode(child)];
53
+ }
54
+ return [buffer copy];
55
+ }
56
+
57
+ static StyleConfig *ENRMTableCellConfig(StyleConfig *config, BOOL isHeader)
58
+ {
59
+ StyleConfig *cellConfig = [config copy];
60
+
61
+ [cellConfig setParagraphFontSize:config.tableFontSize];
62
+ NSString *headerFamily =
63
+ config.tableHeaderFontFamily.length > 0 ? config.tableHeaderFontFamily : config.tableFontFamily;
64
+ [cellConfig setParagraphFontFamily:isHeader ? headerFamily : config.tableFontFamily];
65
+ [cellConfig setParagraphFontWeight:isHeader ? @"bold" : config.tableFontWeight];
66
+ [cellConfig setParagraphColor:isHeader ? config.tableHeaderTextColor : config.tableColor];
67
+ [cellConfig setParagraphLineHeight:config.tableLineHeight];
68
+
69
+ [cellConfig setParagraphMarginTop:0];
70
+ [cellConfig setParagraphMarginBottom:0];
71
+
72
+ return cellConfig;
73
+ }
74
+
75
+ static NSMutableAttributedString *ENRMTableRenderCellNode(MarkdownASTNode *cellNode, StyleConfig *cellConfig,
76
+ NSTextAlignment alignment, BOOL allowFontScaling,
77
+ CGFloat maxFontSizeMultiplier,
78
+ ENRMWritingDirectionMode writingDirectionMode,
79
+ NSWritingDirection resolvedLayoutDirection)
80
+ {
81
+ MarkdownASTNode *temporaryRoot = [[MarkdownASTNode alloc] initWithType:MarkdownNodeTypeDocument];
82
+ for (MarkdownASTNode *child in cellNode.children) {
83
+ [temporaryRoot addChild:child];
84
+ }
85
+
86
+ AttributedRenderer *renderer = [[AttributedRenderer alloc] initWithConfig:cellConfig];
87
+ RenderContext *context = [RenderContext new];
88
+ context.allowFontScaling = allowFontScaling;
89
+ context.maxFontSizeMultiplier = maxFontSizeMultiplier;
90
+
91
+ NSMutableAttributedString *attributedText = [renderer renderRoot:temporaryRoot context:context];
92
+
93
+ [context applyLinkAttributesToString:attributedText];
94
+ // Cells draw with -drawWithRect:, which bypasses the layout manager that paints link chips.
95
+ ENRMApplyLinkChipBackgroundsAsTextBackground(attributedText);
96
+
97
+ ENRMApplyWritingDirectionMode(attributedText, writingDirectionMode, resolvedLayoutDirection);
98
+
99
+ if (alignment != NSTextAlignmentLeft && attributedText.length > 0) {
100
+ NSRange fullRange = NSMakeRange(0, attributedText.length);
101
+ [attributedText
102
+ enumerateAttribute:NSParagraphStyleAttributeName
103
+ inRange:fullRange
104
+ options:0
105
+ usingBlock:^(NSParagraphStyle *paragraphStyle, NSRange range, BOOL *stop) {
106
+ NSMutableParagraphStyle *mutableStyle =
107
+ paragraphStyle ? [paragraphStyle mutableCopy] : [[NSMutableParagraphStyle alloc] init];
108
+ mutableStyle.alignment = alignment;
109
+ [attributedText addAttribute:NSParagraphStyleAttributeName value:mutableStyle range:range];
110
+ }];
111
+ }
112
+
113
+ return attributedText;
114
+ }
115
+
116
+ static NSArray<NSArray<TableCellData *> *> *ENRMTableBuildRows(MarkdownASTNode *tableNode, StyleConfig *config,
117
+ BOOL allowFontScaling, CGFloat maxFontSizeMultiplier,
118
+ ENRMWritingDirectionMode writingDirectionMode,
119
+ NSWritingDirection resolvedLayoutDirection,
120
+ NSUInteger *outColCount)
121
+ {
122
+ StyleConfig *headerCellConfig = ENRMTableCellConfig(config, YES);
123
+ StyleConfig *bodyCellConfig = ENRMTableCellConfig(config, NO);
124
+
125
+ NSMutableArray *allRows = [NSMutableArray array];
126
+ NSUInteger colCount = 0;
127
+
128
+ for (MarkdownASTNode *section in tableNode.children) {
129
+ BOOL isSectionHead = (section.type == MarkdownNodeTypeTableHead);
130
+
131
+ for (MarkdownASTNode *rowNode in section.children) {
132
+ if (rowNode.type != MarkdownNodeTypeTableRow)
133
+ continue;
134
+
135
+ NSMutableArray<TableCellData *> *rowCells = [NSMutableArray array];
136
+ for (MarkdownASTNode *cellNode in rowNode.children) {
137
+ TableCellData *cell = [[TableCellData alloc] init];
138
+ cell.isHeader = isSectionHead || (cellNode.type == MarkdownNodeTypeTableHeaderCell);
139
+ cell.alignment = ENRMTableTextAlignmentFromString(cellNode.attributes[@"align"]);
140
+ cell.plainText = ENRMTablePlainTextFromNode(cellNode);
141
+ cell.markdownText = markdownFromASTNodeChildren(cellNode);
142
+
143
+ StyleConfig *cellConfig = cell.isHeader ? headerCellConfig : bodyCellConfig;
144
+ cell.attributedText =
145
+ ENRMTableRenderCellNode(cellNode, cellConfig, cell.alignment, allowFontScaling, maxFontSizeMultiplier,
146
+ writingDirectionMode, resolvedLayoutDirection);
147
+ [rowCells addObject:cell];
148
+ }
149
+ colCount = MAX(colCount, rowCells.count);
150
+ [allRows addObject:rowCells];
151
+ }
152
+ }
153
+
154
+ if (outColCount != NULL) {
155
+ *outColCount = colCount;
156
+ }
157
+ return [allRows copy];
158
+ }
159
+
160
+ static void ENRMTableComputeLayout(NSArray<NSArray<TableCellData *> *> *rows, NSUInteger colCount, StyleConfig *config,
161
+ CGFloat borderWidth, NSMutableArray<NSNumber *> *_Nullable *_Nullable outColWidths,
162
+ NSMutableArray<NSNumber *> *_Nullable *_Nullable outRowHeights,
163
+ CGFloat *_Nullable outTotalWidth, CGFloat *_Nullable outTotalHeight)
164
+ {
165
+ // TODO: Consider making minColumnWidth / maxColumnWidth configurable via style props
166
+ const CGFloat minimumColumnWidth = 60.0;
167
+ const CGFloat maximumColumnWidth = 300.0;
168
+ const CGFloat horizontalPadding = config.tableCellPaddingHorizontal * 2;
169
+ const CGFloat verticalPadding = config.tableCellPaddingVertical * 2;
170
+
171
+ NSMutableArray<NSNumber *> *colWidths = [NSMutableArray arrayWithCapacity:colCount];
172
+ for (NSUInteger i = 0; i < colCount; i++)
173
+ [colWidths addObject:@0];
174
+
175
+ for (NSArray<TableCellData *> *row in rows) {
176
+ for (NSUInteger column = 0; column < row.count; column++) {
177
+ CGRect boundingRect = [row[column].attributedText
178
+ boundingRectWithSize:CGSizeMake(maximumColumnWidth, CGFLOAT_MAX)
179
+ options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
180
+ context:nil];
181
+ CGFloat width = MIN(MAX(ceil(boundingRect.size.width) + horizontalPadding, minimumColumnWidth),
182
+ maximumColumnWidth + horizontalPadding);
183
+ if (width > [colWidths[column] doubleValue])
184
+ colWidths[column] = @(width);
185
+ }
186
+ }
187
+
188
+ NSMutableArray<NSNumber *> *rowHeights = [NSMutableArray arrayWithCapacity:rows.count];
189
+ for (NSArray<TableCellData *> *row in rows) {
190
+ CGFloat maxHeight = 0;
191
+ for (NSUInteger column = 0; column < row.count; column++) {
192
+ CGFloat availableWidth = [colWidths[column] doubleValue] - horizontalPadding;
193
+ CGRect boundingRect = [row[column].attributedText
194
+ boundingRectWithSize:CGSizeMake(availableWidth, CGFLOAT_MAX)
195
+ options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
196
+ context:nil];
197
+ maxHeight = MAX(maxHeight, ceil(boundingRect.size.height) + verticalPadding);
198
+ }
199
+ [rowHeights addObject:@(maxHeight)];
200
+ }
201
+
202
+ if (outColWidths != NULL)
203
+ *outColWidths = colWidths;
204
+ if (outRowHeights != NULL)
205
+ *outRowHeights = rowHeights;
206
+ if (outTotalWidth != NULL)
207
+ *outTotalWidth = [[colWidths valueForKeyPath:@"@sum.self"] doubleValue] + borderWidth;
208
+ if (outTotalHeight != NULL)
209
+ *outTotalHeight = [[rowHeights valueForKeyPath:@"@sum.self"] doubleValue] + borderWidth;
210
+ }
211
+
31
212
  #if !TARGET_OS_OSX
32
213
  @interface TableContainerView () <UIContextMenuInteractionDelegate>
33
214
  @end
@@ -46,7 +227,6 @@
46
227
  NSMutableArray<NSNumber *> *_rowHeights;
47
228
  CGFloat _totalTableWidth;
48
229
  CGFloat _totalTableHeight;
49
- CGFloat _borderWidth;
50
230
 
51
231
  NSString *_cachedMarkdown;
52
232
 
@@ -58,7 +238,6 @@
58
238
  self = [super initWithFrame:CGRectZero];
59
239
  if (self) {
60
240
  _config = config;
61
- _borderWidth = config.tableBorderWidth;
62
241
  _allowFontScaling = YES;
63
242
  _maxFontSizeMultiplier = 0;
64
243
  _enableLinkPreview = YES;
@@ -88,11 +267,12 @@
88
267
  // a single drawRect: pass (no subview / layer compositing issues).
89
268
  ENRMTableGridView *gridView = [[ENRMTableGridView alloc] initWithFrame:CGRectZero];
90
269
  __weak TableContainerView *weakSelf = self;
91
- gridView.menuProvider = ^NSMenu *
92
- {
270
+ gridView.menuProvider = ^NSMenu * {
93
271
  TableContainerView *strongSelf = weakSelf;
94
272
  if (!strongSelf)
95
273
  return nil;
274
+ if (strongSelf.contextMenuHidden)
275
+ return nil;
96
276
  NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
97
277
  [menu addItem:ENRMCreateMenuItem(strongSelf.copyLabel, ^{ [strongSelf copyTableToPasteboard]; })];
98
278
  [menu addItem:ENRMCreateMenuItem(strongSelf.copyAsMarkdownLabel, ^{ [strongSelf copyMarkdownToPasteboard]; })];
@@ -120,77 +300,27 @@
120
300
  #endif
121
301
  }
122
302
 
123
- - (StyleConfig *)cellConfigForHeader:(BOOL)isHeader
124
- {
125
- StyleConfig *cellConfig = [self.config copy];
126
-
127
- [cellConfig setParagraphFontSize:self.config.tableFontSize];
128
- NSString *headerFamily =
129
- self.config.tableHeaderFontFamily.length > 0 ? self.config.tableHeaderFontFamily : self.config.tableFontFamily;
130
- [cellConfig setParagraphFontFamily:isHeader ? headerFamily : self.config.tableFontFamily];
131
- [cellConfig setParagraphFontWeight:isHeader ? @"bold" : self.config.tableFontWeight];
132
- [cellConfig setParagraphColor:isHeader ? self.config.tableHeaderTextColor : self.config.tableColor];
133
- [cellConfig setParagraphLineHeight:self.config.tableLineHeight];
134
-
135
- [cellConfig setParagraphMarginTop:0];
136
- [cellConfig setParagraphMarginBottom:0];
137
-
138
- return cellConfig;
139
- }
140
-
141
- - (NSMutableAttributedString *)renderCellNode:(MarkdownASTNode *)cellNode
142
- isHeader:(BOOL)isHeader
143
- cellConfig:(StyleConfig *)cellConfig
144
- alignment:(NSTextAlignment)alignment
303
+ - (NSUInteger)rowCount
145
304
  {
146
-
147
- MarkdownASTNode *temporaryRoot = [[MarkdownASTNode alloc] initWithType:MarkdownNodeTypeDocument];
148
- for (MarkdownASTNode *child in cellNode.children) {
149
- [temporaryRoot addChild:child];
150
- }
151
-
152
- AttributedRenderer *renderer = [[AttributedRenderer alloc] initWithConfig:cellConfig];
153
- RenderContext *context = [RenderContext new];
154
- context.allowFontScaling = self.allowFontScaling;
155
- context.maxFontSizeMultiplier = self.maxFontSizeMultiplier;
156
-
157
- NSMutableAttributedString *attributedText = [renderer renderRoot:temporaryRoot context:context];
158
-
159
- [context applyLinkAttributesToString:attributedText];
160
-
161
- ENRMApplyWritingDirectionMode(attributedText, _writingDirectionMode, _resolvedLayoutDirection);
162
-
163
- if (alignment != NSTextAlignmentLeft && attributedText.length > 0) {
164
- NSRange fullRange = NSMakeRange(0, attributedText.length);
165
- [attributedText
166
- enumerateAttribute:NSParagraphStyleAttributeName
167
- inRange:fullRange
168
- options:0
169
- usingBlock:^(NSParagraphStyle *paragraphStyle, NSRange range, BOOL *stop) {
170
- NSMutableParagraphStyle *mutableStyle =
171
- paragraphStyle ? [paragraphStyle mutableCopy] : [[NSMutableParagraphStyle alloc] init];
172
- mutableStyle.alignment = alignment;
173
- [attributedText addAttribute:NSParagraphStyleAttributeName value:mutableStyle range:range];
174
- }];
175
- }
176
-
177
- return attributedText;
305
+ return _rows.count;
178
306
  }
179
307
 
180
- - (NSString *)extractPlainTextFromNode:(MarkdownASTNode *)node
308
+ - (NSInteger)linkCount
181
309
  {
182
- if (!node)
183
- return @"";
184
- NSMutableString *buffer = [node.content mutableCopy] ?: [NSMutableString string];
185
- for (MarkdownASTNode *child in node.children) {
186
- [buffer appendString:[self extractPlainTextFromNode:child]];
310
+ __block NSInteger count = 0;
311
+ for (NSArray<TableCellData *> *row in _rows) {
312
+ for (TableCellData *cell in row) {
313
+ // LinkRenderer attaches one ENRMLinkChip instance per link.
314
+ [cell.attributedText enumerateAttribute:ENRMLinkChipAttributeName
315
+ inRange:NSMakeRange(0, cell.attributedText.length)
316
+ options:0
317
+ usingBlock:^(id chip, NSRange range, BOOL *stop) {
318
+ if (chip)
319
+ count++;
320
+ }];
321
+ }
187
322
  }
188
- return [buffer copy];
189
- }
190
-
191
- - (NSUInteger)rowCount
192
- {
193
- return _rows.count;
323
+ return count;
194
324
  }
195
325
 
196
326
  #if !TARGET_OS_OSX
@@ -212,96 +342,47 @@
212
342
  {
213
343
  [[_gridContainer subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
214
344
 
215
- StyleConfig *headerCellConfig = [self cellConfigForHeader:YES];
216
- StyleConfig *bodyCellConfig = [self cellConfigForHeader:NO];
217
-
218
- NSMutableArray *allRows = [NSMutableArray array];
219
- _colCount = 0;
220
-
221
- for (MarkdownASTNode *section in tableNode.children) {
222
- BOOL isSectionHead = (section.type == MarkdownNodeTypeTableHead);
223
-
224
- for (MarkdownASTNode *rowNode in section.children) {
225
- if (rowNode.type != MarkdownNodeTypeTableRow)
226
- continue;
227
-
228
- NSMutableArray<TableCellData *> *rowCells = [NSMutableArray array];
229
- for (MarkdownASTNode *cellNode in rowNode.children) {
230
- TableCellData *cell = [[TableCellData alloc] init];
231
- cell.isHeader = isSectionHead || (cellNode.type == MarkdownNodeTypeTableHeaderCell);
232
- cell.alignment = [self textAlignmentFromString:cellNode.attributes[@"align"]];
233
- cell.plainText = [self extractPlainTextFromNode:cellNode];
234
- cell.markdownText = markdownFromASTNodeChildren(cellNode);
235
-
236
- StyleConfig *cellConfig = cell.isHeader ? headerCellConfig : bodyCellConfig;
237
- cell.attributedText = [self renderCellNode:cellNode
238
- isHeader:cell.isHeader
239
- cellConfig:cellConfig
240
- alignment:cell.alignment];
241
- [rowCells addObject:cell];
242
- }
243
- _colCount = MAX(_colCount, rowCells.count);
244
- [allRows addObject:rowCells];
245
- }
246
- }
247
-
248
- _rows = [allRows copy];
345
+ NSUInteger colCount = 0;
346
+ _rows = ENRMTableBuildRows(tableNode, self.config, self.allowFontScaling, self.maxFontSizeMultiplier,
347
+ _writingDirectionMode, _resolvedLayoutDirection, &colCount);
348
+ _colCount = colCount;
249
349
  _cachedMarkdown = [self buildMarkdownFromRows];
250
350
  _cachedAccessibilityElements = nil;
251
351
  [self computeLayout];
252
352
  [self renderGrid];
253
353
  }
254
354
 
255
- - (NSTextAlignment)textAlignmentFromString:(NSString *)align
355
+ - (void)computeLayout
256
356
  {
257
- if ([align isEqualToString:@"center"])
258
- return NSTextAlignmentCenter;
259
- if ([align isEqualToString:@"right"])
260
- return NSTextAlignmentRight;
261
- return NSTextAlignmentLeft;
357
+ NSMutableArray<NSNumber *> *colWidths = nil;
358
+ NSMutableArray<NSNumber *> *rowHeights = nil;
359
+ CGFloat totalWidth = 0;
360
+ CGFloat totalHeight = 0;
361
+ ENRMTableComputeLayout(_rows, _colCount, self.config, self.config.tableBorderWidth, &colWidths, &rowHeights,
362
+ &totalWidth, &totalHeight);
363
+ _colWidths = colWidths;
364
+ _rowHeights = rowHeights;
365
+ _totalTableWidth = totalWidth;
366
+ _totalTableHeight = totalHeight;
262
367
  }
263
368
 
264
- - (void)computeLayout
369
+ + (CGFloat)measureHeightForTableNode:(MarkdownASTNode *)tableNode
370
+ config:(StyleConfig *)config
371
+ allowFontScaling:(BOOL)allowFontScaling
372
+ maxFontSizeMultiplier:(CGFloat)maxFontSizeMultiplier
373
+ writingDirectionMode:(ENRMWritingDirectionMode)writingDirectionMode
374
+ resolvedLayoutDirection:(NSWritingDirection)resolvedLayoutDirection
265
375
  {
266
- // TODO: Consider making minColumnWidth / maxColumnWidth configurable via style props
267
- const CGFloat minimumColumnWidth = 60.0;
268
- const CGFloat maximumColumnWidth = 300.0;
269
- const CGFloat horizontalPadding = self.config.tableCellPaddingHorizontal * 2;
270
- const CGFloat verticalPadding = self.config.tableCellPaddingVertical * 2;
271
-
272
- _colWidths = [NSMutableArray arrayWithCapacity:_colCount];
273
- for (NSUInteger i = 0; i < _colCount; i++)
274
- [_colWidths addObject:@0];
275
-
276
- for (NSArray<TableCellData *> *row in _rows) {
277
- for (NSUInteger column = 0; column < row.count; column++) {
278
- CGRect boundingRect = [row[column].attributedText
279
- boundingRectWithSize:CGSizeMake(maximumColumnWidth, CGFLOAT_MAX)
280
- options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
281
- context:nil];
282
- CGFloat width = MIN(MAX(ceil(boundingRect.size.width) + horizontalPadding, minimumColumnWidth),
283
- maximumColumnWidth + horizontalPadding);
284
- if (width > [_colWidths[column] doubleValue])
285
- _colWidths[column] = @(width);
286
- }
287
- }
288
-
289
- _rowHeights = [NSMutableArray arrayWithCapacity:_rows.count];
290
- for (NSArray<TableCellData *> *row in _rows) {
291
- CGFloat maxHeight = 0;
292
- for (NSUInteger column = 0; column < row.count; column++) {
293
- CGFloat availableWidth = [_colWidths[column] doubleValue] - horizontalPadding;
294
- CGRect boundingRect = [row[column].attributedText
295
- boundingRectWithSize:CGSizeMake(availableWidth, CGFLOAT_MAX)
296
- options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
297
- context:nil];
298
- maxHeight = MAX(maxHeight, ceil(boundingRect.size.height) + verticalPadding);
299
- }
300
- [_rowHeights addObject:@(maxHeight)];
301
- }
376
+ NSUInteger colCount = 0;
377
+ NSArray<NSArray<TableCellData *> *> *rows =
378
+ ENRMTableBuildRows(tableNode, config, allowFontScaling, maxFontSizeMultiplier, writingDirectionMode,
379
+ resolvedLayoutDirection, &colCount);
380
+ if (rows.count == 0)
381
+ return 0;
302
382
 
303
- _totalTableWidth = [[_colWidths valueForKeyPath:@"@sum.self"] doubleValue] + _borderWidth;
304
- _totalTableHeight = [[_rowHeights valueForKeyPath:@"@sum.self"] doubleValue] + _borderWidth;
383
+ CGFloat totalHeight = 0;
384
+ ENRMTableComputeLayout(rows, colCount, config, config.tableBorderWidth, NULL, NULL, NULL, &totalHeight);
385
+ return totalHeight;
305
386
  }
306
387
 
307
388
  - (void)renderGrid
@@ -357,7 +438,7 @@
357
438
  columnWidths:_colWidths
358
439
  rowHeights:_rowHeights
359
440
  borderColor:self.config.tableBorderColor
360
- borderWidth:_borderWidth
441
+ borderWidth:self.config.tableBorderWidth
361
442
  horizontalCellPadding:self.config.tableCellPaddingHorizontal
362
443
  verticalCellPadding:self.config.tableCellPaddingVertical
363
444
  cornerRadius:self.config.tableBorderRadius];
@@ -392,7 +473,7 @@
392
473
  columnWidths:_colWidths
393
474
  rowHeights:_rowHeights
394
475
  borderColor:self.config.tableBorderColor
395
- borderWidth:_borderWidth
476
+ borderWidth:self.config.tableBorderWidth
396
477
  horizontalCellPadding:self.config.tableCellPaddingHorizontal
397
478
  verticalCellPadding:self.config.tableCellPaddingVertical
398
479
  cornerRadius:self.config.tableBorderRadius];
@@ -403,24 +484,24 @@
403
484
  - (UIContextMenuConfiguration *)contextMenuInteraction:(UIContextMenuInteraction *)interaction
404
485
  configurationForMenuAtLocation:(CGPoint)location
405
486
  {
406
- return [UIContextMenuConfiguration
407
- configurationWithIdentifier:nil
408
- previewProvider:nil
409
- actionProvider:^UIMenu *(NSArray<UIMenuElement *> *suggestedActions) {
410
- UIAction *copyMarkdown =
411
- [UIAction actionWithTitle:self.copyAsMarkdownLabel
412
- image:[RCTUIImage systemImageNamed:@"doc.text"]
413
- identifier:nil
414
- handler:^(__kindof UIAction *action) { [self copyMarkdownToPasteboard]; }];
415
-
416
- UIAction *copyPlainText =
417
- [UIAction actionWithTitle:self.copyLabel
418
- image:[RCTUIImage systemImageNamed:@"doc.on.doc"]
419
- identifier:nil
420
- handler:^(__kindof UIAction *action) { [self copyTableToPasteboard]; }];
421
-
422
- return [UIMenu menuWithTitle:@"" children:@[ copyPlainText, copyMarkdown ]];
423
- }];
487
+ // Returning nil is the UIKit-sanctioned way to suppress a context menu.
488
+ if (self.contextMenuHidden) {
489
+ if (self.onMenuSuppressed) {
490
+ self.onMenuSuppressed(_cachedMarkdown ?: @"", [self buildPlainTextFromRows] ?: @"");
491
+ }
492
+ return nil;
493
+ }
494
+ __weak __typeof(self) weakSelf = self;
495
+ return ENRMBlockContextMenuConfiguration(
496
+ self.menuOptions, self.copyLabel, self.copyAsMarkdownLabel, ^{ [weakSelf copyTableToPasteboard]; },
497
+ ^{ [weakSelf copyMarkdownToPasteboard]; }, ^{ [weakSelf requestCopy]; });
498
+ }
499
+
500
+ - (void)requestCopy
501
+ {
502
+ if (self.onCopyRequest) {
503
+ self.onCopyRequest(_cachedMarkdown ?: @"", [self buildPlainTextFromRows] ?: @"");
504
+ }
424
505
  }
425
506
  #endif // !TARGET_OS_OSX
426
507
 
@@ -550,19 +631,54 @@
550
631
  return _totalTableHeight;
551
632
  }
552
633
 
634
+ - (CGFloat)alignOffsetForFreeSpace:(CGFloat)freeSpace
635
+ {
636
+ if (freeSpace <= 0)
637
+ return 0;
638
+ NSString *align = self.config.tableAlign;
639
+ if ([align isEqualToString:@"center"])
640
+ return freeSpace / 2;
641
+ if ([align isEqualToString:@"right"])
642
+ return freeSpace;
643
+ return 0;
644
+ }
645
+
553
646
  - (void)layoutSubviews
554
647
  {
555
648
  [super layoutSubviews];
556
649
  _scrollView.frame = self.bounds;
557
650
  #if !TARGET_OS_OSX
558
- _scrollView.contentSize = CGSizeMake(MAX(_totalTableWidth, self.bounds.size.width), _totalTableHeight);
559
- _scrollView.scrollEnabled = (_totalTableWidth > self.bounds.size.width);
560
- _gridContainer.frame = CGRectMake(0, 0, _totalTableWidth, _totalTableHeight);
651
+ CGFloat overhang = MAX(self.config.tableHorizontalOverflow, 0);
652
+ CGFloat containerWidth = self.bounds.size.width;
653
+ BOOL tableOverflows = (overhang > 0 && _totalTableWidth > containerWidth);
654
+
655
+ if (tableOverflows) {
656
+ UIEdgeInsets inset = UIEdgeInsetsMake(0, overhang, 0, overhang);
657
+ if (!UIEdgeInsetsEqualToEdgeInsets(_scrollView.contentInset, inset)) {
658
+ _scrollView.contentInset = inset;
659
+ _scrollView.contentOffset = CGPointMake(-overhang, 0);
660
+ }
661
+ _scrollView.contentSize = CGSizeMake(_totalTableWidth, _totalTableHeight);
662
+ _scrollView.scrollEnabled = YES;
663
+ _gridContainer.frame = CGRectMake(0, 0, _totalTableWidth, _totalTableHeight);
664
+ } else {
665
+ CGFloat alignOffset = [self alignOffsetForFreeSpace:containerWidth - overhang * 2 - _totalTableWidth];
666
+ _scrollView.contentInset = UIEdgeInsetsZero;
667
+ _scrollView.contentOffset = CGPointZero;
668
+ _scrollView.contentSize = CGSizeMake(MAX(_totalTableWidth, containerWidth), _totalTableHeight);
669
+ _scrollView.scrollEnabled = (_totalTableWidth > containerWidth);
670
+ _gridContainer.frame = CGRectMake(overhang + alignOffset, 0, _totalTableWidth, _totalTableHeight);
671
+ }
561
672
  #else
562
- // For NSScrollView+documentView, the scrollable content area is determined by
563
- // the documentView's frame. No contentSize property to set.
564
- if (_totalTableWidth > 0 && _totalTableHeight > 0) {
673
+ CGFloat overhang = MAX(self.config.tableHorizontalOverflow, 0);
674
+ CGFloat containerWidth = self.bounds.size.width;
675
+ BOOL tableOverflows = (overhang > 0 && _totalTableWidth > containerWidth);
676
+
677
+ if (tableOverflows) {
565
678
  _gridContainer.frame = CGRectMake(0, 0, _totalTableWidth, _totalTableHeight);
679
+ } else if (_totalTableWidth > 0 && _totalTableHeight > 0) {
680
+ CGFloat alignOffset = [self alignOffsetForFreeSpace:containerWidth - overhang * 2 - _totalTableWidth];
681
+ _gridContainer.frame = CGRectMake(overhang + alignOffset, 0, _totalTableWidth, _totalTableHeight);
566
682
  }
567
683
  #endif
568
684
  }
package/jest.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './src/jest';
package/jest.js ADDED
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ // Subpath entry for `require('react-native-enriched-markdown-scaffold/jest')`.
4
+ // Re-exports the compiled mock (built from `src/jest` by react-native-builder-bob).
5
+ module.exports = require('./lib/module/jest');