@mathers101/react-native-render-rich-text 0.1.9 → 0.1.14

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 (327) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +140 -140
  3. package/ReactNativeRenderRichText.podspec +23 -23
  4. package/android/build.gradle +86 -86
  5. package/android/consumer-rules.pro +3 -3
  6. package/android/src/main/AndroidManifest.xml +2 -2
  7. package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextLayoutManager.kt +24 -24
  8. package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextPackage.kt +13 -13
  9. package/android/src/main/java/com/renderrichtext/MeasurementStore.kt +644 -644
  10. package/android/src/main/java/com/renderrichtext/accessibility/AccessibilityLabels.kt +17 -17
  11. package/android/src/main/java/com/renderrichtext/accessibility/AccessibleTiptapTextView.kt +112 -112
  12. package/android/src/main/java/com/renderrichtext/accessibility/TiptapAccessibilityHelper.kt +576 -576
  13. package/android/src/main/java/com/renderrichtext/events/CodeBlockPressEvent.kt +24 -24
  14. package/android/src/main/java/com/renderrichtext/events/ContextMenuItemPressEvent.kt +28 -28
  15. package/android/src/main/java/com/renderrichtext/events/CopyPressEvent.kt +24 -24
  16. package/android/src/main/java/com/renderrichtext/events/ImagePressEvent.kt +25 -25
  17. package/android/src/main/java/com/renderrichtext/events/LatexErrorEvent.kt +29 -29
  18. package/android/src/main/java/com/renderrichtext/events/LinkLongPressEvent.kt +23 -23
  19. package/android/src/main/java/com/renderrichtext/events/LinkPressEvent.kt +23 -23
  20. package/android/src/main/java/com/renderrichtext/events/MentionLongPressEvent.kt +25 -25
  21. package/android/src/main/java/com/renderrichtext/events/MentionPressEvent.kt +25 -25
  22. package/android/src/main/java/com/renderrichtext/events/TaskListItemPressEvent.kt +26 -26
  23. package/android/src/main/java/com/renderrichtext/math/LatexErrorReporter.kt +9 -9
  24. package/android/src/main/java/com/renderrichtext/parser/Parser.kt +59 -59
  25. package/android/src/main/java/com/renderrichtext/parser/TextLinkMatching.kt +35 -35
  26. package/android/src/main/java/com/renderrichtext/renderer/BaselineShiftRenderer.kt +45 -45
  27. package/android/src/main/java/com/renderrichtext/renderer/BlankLineRenderer.kt +39 -39
  28. package/android/src/main/java/com/renderrichtext/renderer/BlockquoteRenderer.kt +243 -243
  29. package/android/src/main/java/com/renderrichtext/renderer/BlockquoteTextRenderer.kt +56 -56
  30. package/android/src/main/java/com/renderrichtext/renderer/CodeBlockRenderer.kt +135 -135
  31. package/android/src/main/java/com/renderrichtext/renderer/CodeRenderer.kt +37 -37
  32. package/android/src/main/java/com/renderrichtext/renderer/EmphasisRenderer.kt +28 -28
  33. package/android/src/main/java/com/renderrichtext/renderer/HeadingRenderer.kt +81 -81
  34. package/android/src/main/java/com/renderrichtext/renderer/HighlightRenderer.kt +26 -26
  35. package/android/src/main/java/com/renderrichtext/renderer/LineBreakRenderer.kt +17 -17
  36. package/android/src/main/java/com/renderrichtext/renderer/LinkRenderer.kt +90 -90
  37. package/android/src/main/java/com/renderrichtext/renderer/ListContextManager.kt +109 -109
  38. package/android/src/main/java/com/renderrichtext/renderer/ListItemRenderer.kt +211 -211
  39. package/android/src/main/java/com/renderrichtext/renderer/ListRenderer.kt +133 -133
  40. package/android/src/main/java/com/renderrichtext/renderer/MentionRenderer.kt +85 -85
  41. package/android/src/main/java/com/renderrichtext/renderer/ParagraphRenderer.kt +91 -91
  42. package/android/src/main/java/com/renderrichtext/renderer/Renderer.kt +148 -148
  43. package/android/src/main/java/com/renderrichtext/renderer/SoftBreakRenderer.kt +17 -17
  44. package/android/src/main/java/com/renderrichtext/renderer/SpanStyleCache.kt +143 -143
  45. package/android/src/main/java/com/renderrichtext/renderer/StrikethroughRenderer.kt +28 -28
  46. package/android/src/main/java/com/renderrichtext/renderer/StrongRenderer.kt +28 -28
  47. package/android/src/main/java/com/renderrichtext/renderer/TextRenderer.kt +31 -31
  48. package/android/src/main/java/com/renderrichtext/renderer/ThematicBreakRenderer.kt +46 -46
  49. package/android/src/main/java/com/renderrichtext/renderer/UnderlineRenderer.kt +28 -28
  50. package/android/src/main/java/com/renderrichtext/spans/BaseListSpan.kt +164 -164
  51. package/android/src/main/java/com/renderrichtext/spans/BaselineShiftSpan.kt +27 -27
  52. package/android/src/main/java/com/renderrichtext/spans/BlockquoteSpan.kt +302 -302
  53. package/android/src/main/java/com/renderrichtext/spans/CodeBackgroundSpan.kt +205 -205
  54. package/android/src/main/java/com/renderrichtext/spans/CodeBlockSpan.kt +216 -216
  55. package/android/src/main/java/com/renderrichtext/spans/CodeSpan.kt +32 -32
  56. package/android/src/main/java/com/renderrichtext/spans/EmphasisSpan.kt +42 -42
  57. package/android/src/main/java/com/renderrichtext/spans/FadeInSpan.kt +29 -29
  58. package/android/src/main/java/com/renderrichtext/spans/HeadingSpan.kt +38 -38
  59. package/android/src/main/java/com/renderrichtext/spans/HighlightSpan.kt +80 -80
  60. package/android/src/main/java/com/renderrichtext/spans/ImageSpan.kt +481 -481
  61. package/android/src/main/java/com/renderrichtext/spans/InlineBackgroundGeometry.kt +42 -42
  62. package/android/src/main/java/com/renderrichtext/spans/LineHeightSpan.kt +39 -39
  63. package/android/src/main/java/com/renderrichtext/spans/LinkPillIconCache.kt +154 -154
  64. package/android/src/main/java/com/renderrichtext/spans/LinkPillSpan.kt +381 -381
  65. package/android/src/main/java/com/renderrichtext/spans/LinkSpan.kt +68 -68
  66. package/android/src/main/java/com/renderrichtext/spans/ListItemSpacingSpan.kt +33 -33
  67. package/android/src/main/java/com/renderrichtext/spans/ListMarkerAnchorSpan.kt +38 -38
  68. package/android/src/main/java/com/renderrichtext/spans/MarginBottomSpan.kt +76 -76
  69. package/android/src/main/java/com/renderrichtext/spans/MentionChipSpan.kt +132 -132
  70. package/android/src/main/java/com/renderrichtext/spans/MentionSpan.kt +46 -46
  71. package/android/src/main/java/com/renderrichtext/spans/OrderedListSpan.kt +127 -127
  72. package/android/src/main/java/com/renderrichtext/spans/SpoilerSpan.kt +33 -33
  73. package/android/src/main/java/com/renderrichtext/spans/StrikethroughSpan.kt +12 -12
  74. package/android/src/main/java/com/renderrichtext/spans/StrongSpan.kt +39 -39
  75. package/android/src/main/java/com/renderrichtext/spans/TaskListSpan.kt +143 -143
  76. package/android/src/main/java/com/renderrichtext/spans/TextSpan.kt +26 -26
  77. package/android/src/main/java/com/renderrichtext/spans/ThematicBreakSpan.kt +69 -69
  78. package/android/src/main/java/com/renderrichtext/spans/UnorderedListSpan.kt +96 -96
  79. package/android/src/main/java/com/renderrichtext/spoiler/SpoilerStubs.kt +46 -46
  80. package/android/src/main/java/com/renderrichtext/styles/BaseBlockStyle.kt +11 -11
  81. package/android/src/main/java/com/renderrichtext/styles/BlockquoteStyle.kt +83 -83
  82. package/android/src/main/java/com/renderrichtext/styles/CodeBlockStyle.kt +80 -80
  83. package/android/src/main/java/com/renderrichtext/styles/CodeStyle.kt +26 -26
  84. package/android/src/main/java/com/renderrichtext/styles/EmphasisStyle.kt +21 -21
  85. package/android/src/main/java/com/renderrichtext/styles/FactoidStyle.kt +21 -21
  86. package/android/src/main/java/com/renderrichtext/styles/HeadingStyle.kt +33 -33
  87. package/android/src/main/java/com/renderrichtext/styles/HighlightStyle.kt +19 -19
  88. package/android/src/main/java/com/renderrichtext/styles/ImageStyle.kt +29 -29
  89. package/android/src/main/java/com/renderrichtext/styles/InlineImageStyle.kt +17 -17
  90. package/android/src/main/java/com/renderrichtext/styles/InlineMathStyle.kt +17 -17
  91. package/android/src/main/java/com/renderrichtext/styles/LinkPillContent.kt +36 -36
  92. package/android/src/main/java/com/renderrichtext/styles/LinkPillStyle.kt +44 -44
  93. package/android/src/main/java/com/renderrichtext/styles/LinkStyle.kt +23 -23
  94. package/android/src/main/java/com/renderrichtext/styles/LinkVariantEntry.kt +34 -34
  95. package/android/src/main/java/com/renderrichtext/styles/ListStyle.kt +65 -65
  96. package/android/src/main/java/com/renderrichtext/styles/MathStyle.kt +29 -29
  97. package/android/src/main/java/com/renderrichtext/styles/MentionStyle.kt +19 -19
  98. package/android/src/main/java/com/renderrichtext/styles/ParagraphStyle.kt +33 -33
  99. package/android/src/main/java/com/renderrichtext/styles/SpoilerStyle.kt +27 -27
  100. package/android/src/main/java/com/renderrichtext/styles/StrikethroughStyle.kt +17 -17
  101. package/android/src/main/java/com/renderrichtext/styles/StrongStyle.kt +21 -21
  102. package/android/src/main/java/com/renderrichtext/styles/StyleConfig.kt +411 -411
  103. package/android/src/main/java/com/renderrichtext/styles/StyleParser.kt +92 -92
  104. package/android/src/main/java/com/renderrichtext/styles/SubscriptStyle.kt +16 -16
  105. package/android/src/main/java/com/renderrichtext/styles/SuperscriptStyle.kt +16 -16
  106. package/android/src/main/java/com/renderrichtext/styles/TableStyle.kt +75 -75
  107. package/android/src/main/java/com/renderrichtext/styles/TaskListStyle.kt +29 -29
  108. package/android/src/main/java/com/renderrichtext/styles/TextAlignment.kt +32 -32
  109. package/android/src/main/java/com/renderrichtext/styles/ThematicBreakStyle.kt +23 -23
  110. package/android/src/main/java/com/renderrichtext/styles/UnderlineStyle.kt +17 -17
  111. package/android/src/main/java/com/renderrichtext/styles/VideoStyle.kt +31 -31
  112. package/android/src/main/java/com/renderrichtext/utils/common/BorderStyleUtils.kt +86 -86
  113. package/android/src/main/java/com/renderrichtext/utils/common/BreakStrategyUtils.kt +32 -32
  114. package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockHighlighter.kt +36 -36
  115. package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockNode.kt +42 -42
  116. package/android/src/main/java/com/renderrichtext/utils/common/EllipsizeUtils.kt +27 -27
  117. package/android/src/main/java/com/renderrichtext/utils/common/EnrichedTiptapAncestorUtils.kt +10 -10
  118. package/android/src/main/java/com/renderrichtext/utils/common/FeatureFlags.kt +9 -9
  119. package/android/src/main/java/com/renderrichtext/utils/common/LinkRecognitionProps.kt +31 -31
  120. package/android/src/main/java/com/renderrichtext/utils/common/LinkRegexConfig.kt +56 -56
  121. package/android/src/main/java/com/renderrichtext/utils/common/MotionPreferences.kt +18 -18
  122. package/android/src/main/java/com/renderrichtext/utils/common/ReadableMapExtensions.kt +28 -28
  123. package/android/src/main/java/com/renderrichtext/utils/common/layout/RTLUtils.kt +6 -6
  124. package/android/src/main/java/com/renderrichtext/utils/common/serialization/TiptapASTSerializer.kt +368 -368
  125. package/android/src/main/java/com/renderrichtext/utils/text/ImageCache.kt +88 -88
  126. package/android/src/main/java/com/renderrichtext/utils/text/ImageDownloader.kt +203 -203
  127. package/android/src/main/java/com/renderrichtext/utils/text/LocalImageLoader.kt +167 -167
  128. package/android/src/main/java/com/renderrichtext/utils/text/TailFadeInAnimator.kt +84 -84
  129. package/android/src/main/java/com/renderrichtext/utils/text/conversion/HTMLGenerator.kt +1105 -1105
  130. package/android/src/main/java/com/renderrichtext/utils/text/conversion/TiptapExtractor.kt +423 -423
  131. package/android/src/main/java/com/renderrichtext/utils/text/extensions/ParagraphUtils.kt +9 -9
  132. package/android/src/main/java/com/renderrichtext/utils/text/extensions/SpannableExtensions.kt +9 -9
  133. package/android/src/main/java/com/renderrichtext/utils/text/extensions/TextPaintExtensions.kt +76 -76
  134. package/android/src/main/java/com/renderrichtext/utils/text/interaction/CheckboxTouchHelper.kt +61 -61
  135. package/android/src/main/java/com/renderrichtext/utils/text/interaction/TaskListTapUtils.kt +286 -286
  136. package/android/src/main/java/com/renderrichtext/utils/text/span/ApplyLineHeight.kt +39 -39
  137. package/android/src/main/java/com/renderrichtext/utils/text/span/BlockSpacing.kt +142 -142
  138. package/android/src/main/java/com/renderrichtext/utils/text/span/SpanFlags.kt +43 -43
  139. package/android/src/main/java/com/renderrichtext/utils/text/span/WidthAwareSpans.kt +30 -30
  140. package/android/src/main/java/com/renderrichtext/utils/text/view/CodeBlockPressHost.kt +15 -15
  141. package/android/src/main/java/com/renderrichtext/utils/text/view/ImagePressHost.kt +19 -19
  142. package/android/src/main/java/com/renderrichtext/utils/text/view/SelectionActionMode.kt +235 -235
  143. package/android/src/main/java/com/renderrichtext/utils/text/view/TextSelectionColors.kt +48 -48
  144. package/android/src/main/java/com/renderrichtext/utils/text/view/TextViewSetup.kt +119 -119
  145. package/android/src/main/java/com/renderrichtext/views/ContextMenuPopup.kt +217 -217
  146. package/android/src/main/java/com/renderrichtext/views/CopyGlyph.kt +101 -101
  147. package/android/src/main/java/com/renderrichtext/views/WrapGlyph.kt +40 -40
  148. package/android/src/main/jni/CMakeLists.txt +52 -52
  149. package/android/src/main/jni/react/renderer/components/RichTextSpec/ComponentDescriptors.h +30 -30
  150. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextComponentDescriptor.h +29 -29
  151. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.cpp +45 -45
  152. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.h +21 -21
  153. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.cpp +38 -38
  154. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.h +53 -53
  155. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.cpp +9 -9
  156. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.h +24 -24
  157. package/android/src/main/jni/react/renderer/components/RichTextSpec/conversions.h +40 -40
  158. package/cpp/parser/TiptapParser.hpp +13 -13
  159. package/cpp/vendor/nlohmann/json.hpp +24765 -24765
  160. package/ios/EnrichedTiptapText.h +27 -27
  161. package/ios/attachments/ENRMImageAttachment.h +51 -51
  162. package/ios/attachments/ENRMImageAttachment.m +398 -398
  163. package/ios/attachments/ENRMLinkPillAttachment.h +47 -47
  164. package/ios/attachments/ENRMLinkPillAttachment.m +324 -324
  165. package/ios/attachments/ENRMLinkPillIconCache.h +28 -28
  166. package/ios/attachments/ENRMLinkPillIconCache.m +181 -181
  167. package/ios/attachments/ENRMLinkPillText.h +27 -27
  168. package/ios/attachments/ENRMLinkPillText.m +118 -118
  169. package/ios/attachments/ENRMMathInlineAttachment.h +7 -7
  170. package/ios/attachments/ENRMMathInlineAttachment.m +4 -4
  171. package/ios/attachments/ThematicBreakAttachment.h +15 -15
  172. package/ios/attachments/ThematicBreakAttachment.m +33 -33
  173. package/ios/internals/ENRMViewFreeMeasurement.h +208 -208
  174. package/ios/internals/EnrichedTiptapTextComponentDescriptor.h +19 -19
  175. package/ios/internals/EnrichedTiptapTextShadowNode.h +43 -43
  176. package/ios/internals/EnrichedTiptapTextShadowNode.mm +69 -69
  177. package/ios/internals/EnrichedTiptapTextState.h +24 -24
  178. package/ios/internals/MeasurementCache.h +308 -308
  179. package/ios/internals/ShadowMeasurementUtils.h +145 -145
  180. package/ios/parser/ENRMTextLinkAttributes.h +7 -7
  181. package/ios/parser/ENRMTiptapParser.h +33 -33
  182. package/ios/parser/ENRMTiptapParser.mm +73 -73
  183. package/ios/parser/TiptapASTNode.m +52 -52
  184. package/ios/renderer/AttributedRenderer.h +23 -23
  185. package/ios/renderer/AttributedRenderer.m +229 -229
  186. package/ios/renderer/BaseRenderer.h +33 -33
  187. package/ios/renderer/BaseRenderer.m +46 -46
  188. package/ios/renderer/BaselineShiftTextAttributes.h +10 -10
  189. package/ios/renderer/BaselineShiftTextAttributes.m +26 -26
  190. package/ios/renderer/BlankLineRenderer.h +4 -4
  191. package/ios/renderer/BlankLineRenderer.m +51 -51
  192. package/ios/renderer/BlockquoteRenderer.h +6 -6
  193. package/ios/renderer/BlockquoteRenderer.m +258 -258
  194. package/ios/renderer/CodeBlockRenderer.h +9 -9
  195. package/ios/renderer/CodeBlockRenderer.m +99 -99
  196. package/ios/renderer/CodeRenderer.h +9 -9
  197. package/ios/renderer/CodeRenderer.m +69 -69
  198. package/ios/renderer/ENRMBlockquoteTextRenderer.h +25 -25
  199. package/ios/renderer/ENRMBlockquoteTextRenderer.m +48 -48
  200. package/ios/renderer/EmphasisRenderer.h +5 -5
  201. package/ios/renderer/EmphasisRenderer.m +99 -99
  202. package/ios/renderer/HeadingRenderer.h +6 -6
  203. package/ios/renderer/HeadingRenderer.m +102 -102
  204. package/ios/renderer/HighlightRenderer.h +7 -7
  205. package/ios/renderer/HighlightRenderer.m +33 -33
  206. package/ios/renderer/LinkRenderer.h +6 -6
  207. package/ios/renderer/LinkRenderer.m +157 -157
  208. package/ios/renderer/ListItemRenderer.h +24 -24
  209. package/ios/renderer/ListItemRenderer.m +283 -283
  210. package/ios/renderer/ListRenderer.h +13 -13
  211. package/ios/renderer/ListRenderer.m +126 -126
  212. package/ios/renderer/MentionRenderer.h +9 -9
  213. package/ios/renderer/MentionRenderer.m +96 -96
  214. package/ios/renderer/NodeRenderer.h +8 -8
  215. package/ios/renderer/ParagraphRenderer.h +6 -6
  216. package/ios/renderer/ParagraphRenderer.m +85 -85
  217. package/ios/renderer/RenderContext.h +145 -145
  218. package/ios/renderer/RenderContext.m +402 -402
  219. package/ios/renderer/RendererFactory.h +12 -12
  220. package/ios/renderer/StrikethroughRenderer.h +5 -5
  221. package/ios/renderer/StrikethroughRenderer.m +30 -30
  222. package/ios/renderer/StrongRenderer.h +5 -5
  223. package/ios/renderer/StrongRenderer.m +87 -87
  224. package/ios/renderer/TextRenderer.h +6 -6
  225. package/ios/renderer/TextRenderer.m +18 -18
  226. package/ios/renderer/ThematicBreakRenderer.h +4 -4
  227. package/ios/renderer/ThematicBreakRenderer.m +41 -41
  228. package/ios/renderer/UnderlineRenderer.h +4 -4
  229. package/ios/renderer/UnderlineRenderer.m +41 -41
  230. package/ios/styles/ENRMFontSlot.h +12 -12
  231. package/ios/styles/ENRMFontSlot.m +24 -24
  232. package/ios/styles/StyleConfig.h +488 -488
  233. package/ios/styles/StyleConfig.mm +2820 -2820
  234. package/ios/utils/AccessibilityInfo.h +35 -35
  235. package/ios/utils/AccessibilityInfo.m +24 -24
  236. package/ios/utils/BlockquoteBorder.h +26 -26
  237. package/ios/utils/BlockquoteBorder.m +294 -294
  238. package/ios/utils/CodeBackground.h +19 -19
  239. package/ios/utils/CodeBackground.m +196 -196
  240. package/ios/utils/CodeBlockBackground.h +17 -17
  241. package/ios/utils/CodeBlockBackground.m +102 -102
  242. package/ios/utils/ContextMenuUtils.h +76 -76
  243. package/ios/utils/ContextMenuUtils.mm +75 -75
  244. package/ios/utils/ENRMAccessibilityLabels.h +40 -40
  245. package/ios/utils/ENRMAccessibilityLabels.m +5 -5
  246. package/ios/utils/ENRMAsyncRenderCoordinator.h +24 -24
  247. package/ios/utils/ENRMAsyncRenderCoordinator.m +37 -37
  248. package/ios/utils/ENRMAtomicSize.h +65 -65
  249. package/ios/utils/ENRMCodeBlockContent.h +37 -37
  250. package/ios/utils/ENRMCodeBlockContent.mm +89 -89
  251. package/ios/utils/ENRMFeatureFlags.h +25 -25
  252. package/ios/utils/ENRMImageDownloader.h +30 -30
  253. package/ios/utils/ENRMImageDownloader.m +168 -168
  254. package/ios/utils/ENRMLatexErrorCoordinator.h +27 -27
  255. package/ios/utils/ENRMLatexErrorCoordinator.mm +75 -75
  256. package/ios/utils/ENRMLatexErrorReporting.h +13 -13
  257. package/ios/utils/ENRMLinkContextMenus.h +93 -93
  258. package/ios/utils/ENRMLinkContextMenus.m +178 -178
  259. package/ios/utils/ENRMLinkRegexConfig.h +30 -30
  260. package/ios/utils/ENRMLinkRegexConfig.mm +104 -104
  261. package/ios/utils/ENRMLinkRegexProps.h +23 -23
  262. package/ios/utils/ENRMLocalImageLoader.h +35 -35
  263. package/ios/utils/ENRMLocalImageLoader.m +111 -111
  264. package/ios/utils/ENRMMenuAction.h +27 -27
  265. package/ios/utils/ENRMMenuAction.m +33 -33
  266. package/ios/utils/ENRMSpoilerOverlayManager.h +15 -15
  267. package/ios/utils/ENRMSpoilerOverlayManager.m +19 -19
  268. package/ios/utils/ENRMSpoilerTapUtils.h +6 -6
  269. package/ios/utils/ENRMSpoilerTapUtils.m +11 -11
  270. package/ios/utils/ENRMTailFadeInAnimator.h +16 -16
  271. package/ios/utils/ENRMTailFadeInAnimator.m +161 -161
  272. package/ios/utils/ENRMTextHitTest.h +23 -23
  273. package/ios/utils/ENRMTextHitTest.m +20 -20
  274. package/ios/utils/ENRMTextInteractionUtils.h +20 -20
  275. package/ios/utils/ENRMTextInteractionUtils.m +15 -15
  276. package/ios/utils/ENRMTextRenderer.h +38 -38
  277. package/ios/utils/ENRMTextRenderer.m +54 -54
  278. package/ios/utils/ENRMTextViewSetup.h +132 -132
  279. package/ios/utils/ENRMUIKit.h +429 -429
  280. package/ios/utils/EditMenuUtils.h +105 -105
  281. package/ios/utils/EditMenuUtils.m +143 -143
  282. package/ios/utils/FontScaleObserver.h +10 -10
  283. package/ios/utils/FontScaleObserver.m +55 -55
  284. package/ios/utils/FontUtils.h +31 -31
  285. package/ios/utils/FontUtils.m +63 -63
  286. package/ios/utils/HTMLGenerator.h +25 -25
  287. package/ios/utils/HTMLGenerator.m +1041 -1041
  288. package/ios/utils/HeightUpdateUtils.h +25 -25
  289. package/ios/utils/ImageRequestHeaderUtils.h +35 -35
  290. package/ios/utils/LastElementUtils.h +97 -97
  291. package/ios/utils/LinkContextMenuUtils.h +55 -55
  292. package/ios/utils/LinkPillContentUtils.h +46 -46
  293. package/ios/utils/ListMarkerDrawer.h +15 -15
  294. package/ios/utils/ListMarkerDrawer.m +239 -239
  295. package/ios/utils/MentionBackground.h +26 -26
  296. package/ios/utils/MentionBackground.m +86 -86
  297. package/ios/utils/ParagraphStyleUtils.h +87 -87
  298. package/ios/utils/ParagraphStyleUtils.m +484 -484
  299. package/ios/utils/PasteboardUtils.h +48 -48
  300. package/ios/utils/PasteboardUtils.m +166 -166
  301. package/ios/utils/RTFExportUtils.h +24 -24
  302. package/ios/utils/RTFExportUtils.m +299 -299
  303. package/ios/utils/SelectionColorUtils.h +14 -14
  304. package/ios/utils/StylePropsUtils.h +1340 -1340
  305. package/ios/utils/TaskListTapUtils.h +6 -6
  306. package/ios/utils/TaskListTapUtils.m +14 -14
  307. package/ios/utils/TextViewLayoutManager.h +14 -14
  308. package/ios/utils/TiptapAccessibilityElementBuilder.h +43 -43
  309. package/ios/utils/TiptapAccessibilityElementBuilder.m +432 -432
  310. package/ios/utils/TiptapExtractor.h +17 -17
  311. package/ios/utils/TiptapExtractor.m +367 -367
  312. package/ios/views/ENRMTiptapTextView.h +25 -25
  313. package/ios/views/ENRMTiptapTextView.m +247 -247
  314. package/package.json +65 -70
  315. package/react-native.config.js +10 -10
  316. package/src/admonitionDefaults.ts +58 -58
  317. package/src/darkModeTextStyle.ts +99 -99
  318. package/src/headingDefaults.ts +21 -21
  319. package/src/index.tsx +4 -4
  320. package/src/linkVariantUtils.ts +120 -120
  321. package/src/normalizeTiptapStyle.ts +397 -397
  322. package/src/rn-globals.d.ts +1 -1
  323. package/src/styleUtils.ts +107 -107
  324. package/src/types/TiptapStyle.ts +532 -532
  325. package/src/types/TiptapStyleInternal.ts +299 -299
  326. package/src/types/linkPill.ts +9 -9
  327. package/src/utils/isDev.ts +4 -4
@@ -1,208 +1,208 @@
1
- #pragma once
2
-
3
- #import "ENRMFeatureFlags.h"
4
- #import "ENRMLinkRegexProps.h"
5
- #import "ENRMTiptapParser.h"
6
- #import "ENRMTextRenderer.h"
7
- #import "ENRMTextViewSetup.h"
8
- #import "ImageRequestHeaderUtils.h"
9
- #import "LinkPillContentUtils.h"
10
- #import "TiptapASTNode.h"
11
- #import "ParagraphStyleUtils.h"
12
- #import "StylePropsUtils.h"
13
- #include <type_traits>
14
-
15
- /**
16
- * View-free tiptap measurement (issue #550).
17
- *
18
- * The previous measurement path built throwaway component views on the main
19
- * thread via `dispatch_sync` — a deadlock when `measureContent` runs under
20
- * RN's locked commit fallback while a main-thread committer (Reanimated) is
21
- * blocked on the same mutex, and a serialization bottleneck (streaming jank)
22
- * even when it doesn't deadlock.
23
- *
24
- * These pipelines measure on the calling thread with no view and no
25
- * main-thread dependency, mirroring RN core's `RCTTextLayoutManager` (which
26
- * measures every `<Text>` this way in production) and this library's own
27
- * Android `MeasurementStore`:
28
- *
29
- * - `ENRMMeasureTiptapViewFree` (EnrichedTiptapText): parse (md4c) →
30
- * `ENRMRenderASTNodes` (the SAME renderer the visible view uses, so
31
- * measured layout ≡ rendered layout) → a fresh per-call
32
- * NSTextStorage/NSLayoutManager/NSTextContainer stack → shared finalize.
33
- * - `ENRMMeasureSegmentedTiptapViewFree` (EnrichedTiptap): the iOS
34
- * counterpart of Android's `MeasurementStore.measureAndCacheSplit` — split
35
- * the AST into segments via the same `ENRMRenderSegmentsFromAST` the view
36
- * uses, then walk them exactly like the view's
37
- * `computeSegmentLayoutForWidth:`: text via the TextKit stack, tables via
38
- * `+[TableContainerView measureHeightForTableNode:…]`, math via
39
- * `+[ENRMMathContainerView measureHeightForLatex:…]`, with the same
40
- * margin arithmetic.
41
- *
42
- * TextKit objects are thread-CONFINED, not main-thread-only: safe off main as
43
- * long as one thread owns a given stack (Apple-sanctioned; the
44
- * Texture/AsyncDisplayKit pattern). Allocating the stack per call — exactly
45
- * what `RCTTextLayoutManager` does — makes confinement trivially true.
46
- * `boundingRectWithSize:` (tables, math fallback) is documented thread-safe.
47
- *
48
- * Ambient-state rules for this path:
49
- * - Font scale comes in as a parameter (from `LayoutContext::fontSizeMultiplier`),
50
- * never from `RCTFontSizeMultiplier()` (UIKit read).
51
- * - Pixel rounding uses `LayoutContext::pointScaleFactor`, never
52
- * `RCTScreenScale()` (dispatch_syncs to main on first use).
53
- * - The resolved layout direction comes from `LayoutConstraints::layoutDirection`,
54
- * never from `RCTI18nUtil`.
55
- * - The geometry config must match the visible view's
56
- * (`ENRMConfigureTiptapTextView`): zero insets, `lineFragmentPadding = 0`,
57
- * `allowsNonContiguousLayout = NO`. The view's custom `TextViewLayoutManager`
58
- * subclass only draws backgrounds and does not affect geometry.
59
- * - Each entry point drains its own `@autoreleasepool`. The calling JS/layout
60
- * thread has no runloop draining pools, and a full measure autoreleases
61
- * thousands of objects (AST, attributed string, TextKit stack, fonts) — the
62
- * old main-thread path silently leaned on the main runloop's per-cycle
63
- * drain, and without a local pool sustained re-measurement accumulates
64
- * until jetsam kills the app.
65
- *
66
- * RaTeX concurrency (math segments and lazily-measured inline math
67
- * attachments now parse on the calling thread, possibly concurrently with the
68
- * render thread): verified safe against RaTeX sources. The Swift engine is
69
- * stateless per call, font registration is NSLock-guarded and idempotent
70
- * (RaTeXFontLoader), the FFI's last-error slot is thread_local, the Rust
71
- * core's only statics are immutable OnceLock/LazyLock tables, and renderer
72
- * font caches are per-call locals.
73
- */
74
-
75
- template <typename Md4cFlagsT> static inline ENRMMd4cFlags *ENRMMd4cFlagsFromProps(const Md4cFlagsT &props)
76
- {
77
- ENRMMd4cFlags *flags = [ENRMMd4cFlags defaultFlags];
78
- flags.underline = props.underline;
79
- flags.superscript = props.superscript;
80
- flags.subscript = props.subscript;
81
- flags.latexMath = props.latexMath;
82
- flags.highlight = props.highlight;
83
- flags.hardSoftBreaks = props.hardSoftBreaks;
84
- flags.preserveBlankLines = props.preserveBlankLines;
85
- flags.admonitions = props.admonitions;
86
- return flags;
87
- }
88
-
89
- /**
90
- * Builds a StyleConfig from props alone, replicating the mock-view recipe
91
- * field for field: a fresh config receives the props' style diffed against a
92
- * default-constructed style struct (the mock view's `updateProps
93
- * oldProps:nullptr` applied the same diff against default props), then the
94
- * font scale, max multiplier, and image request headers.
95
- */
96
- template <typename PropsT>
97
- static inline StyleConfig *ENRMStyleConfigFromProps(const PropsT &typedProps, CGFloat fontScale)
98
- {
99
- StyleConfig *config = [[StyleConfig alloc] init];
100
- using StyleT = std::remove_cv_t<std::remove_reference_t<decltype(typedProps.tiptapStyle)>>;
101
- static const StyleT kDefaultStyle{};
102
- applyTiptapStyleToConfig(config, typedProps.tiptapStyle, kDefaultStyle);
103
- [config setFontScaleMultiplier:fontScale];
104
- [config setMaxFontSizeMultiplier:typedProps.maxFontSizeMultiplier];
105
- [config setImageRequestHeaders:ENRMImageRequestHeadersFromProps(typedProps.imageRequestHeaders)];
106
- [config setLinkPillContent:ENRMLinkPillContentFromProps(typedProps.linkPillContent)];
107
- return config;
108
- }
109
-
110
- /**
111
- * Lays out an already-rendered attributed string in a fresh, call-confined
112
- * TextKit stack and finalizes with the shared algorithm
113
- * (`ENRMFinalizeMeasuredTextSize`). Returns CGSizeZero for empty text — the
114
- * same result the view path produces, and a guard against TextKit's
115
- * empty-string layout freeze (see RCTTextLayoutManager).
116
- *
117
- * Uses the same `usesFontLeading` as the views that draw the text; see
118
- * ENRMLayoutManagerUsesFontLeading.
119
- */
120
- static inline CGSize ENRMMeasureAttributedTextViewFree(NSAttributedString *text, CGFloat maxWidth, StyleConfig *config,
121
- BOOL allowTrailingMargin, CGFloat lastElementMarginBottom,
122
- CGFloat pointScaleFactor, NSInteger numberOfLines,
123
- NSLineBreakMode lineBreakMode, BOOL subtractExtraLineFragment)
124
- {
125
- if (text.length == 0) {
126
- return CGSizeZero;
127
- }
128
-
129
- NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(maxWidth, CGFLOAT_MAX)];
130
- textContainer.lineFragmentPadding = 0;
131
- if (numberOfLines > 0) {
132
- textContainer.maximumNumberOfLines = numberOfLines;
133
- textContainer.lineBreakMode = lineBreakMode;
134
- }
135
- NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
136
- layoutManager.allowsNonContiguousLayout = NO;
137
- layoutManager.usesFontLeading = ENRMLayoutManagerUsesFontLeading;
138
- [layoutManager addTextContainer:textContainer];
139
- NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:text];
140
- [textStorage addLayoutManager:layoutManager];
141
-
142
- [layoutManager ensureLayoutForTextContainer:textContainer];
143
- ENRMTextLayoutResult layout;
144
- layout.usedRect = [layoutManager usedRectForTextContainer:textContainer];
145
- layout.extraLineFragmentRect = layoutManager.extraLineFragmentRect;
146
-
147
- return ENRMFinalizeMeasuredTextSize(layout, layoutManager, maxWidth, config, allowTrailingMargin,
148
- lastElementMarginBottom, subtractExtraLineFragment, pointScaleFactor);
149
- }
150
-
151
- /**
152
- * Measures EnrichedTiptapText content from props alone, on the calling
153
- * thread. The line-break strategy and writing-direction mode are resolved
154
- * from the props exactly as `updateProps:` resolves them. Falls back to
155
- * (maxWidth × system-16 line height) for empty tiptap, parse failures, and
156
- * empty render output — the same fallback `measureSize:` produced.
157
- */
158
- template <typename PropsT>
159
- static inline CGSize ENRMMeasureTiptapViewFree(const PropsT &typedProps, CGFloat maxWidth, CGFloat fontScale,
160
- CGFloat pointScaleFactor, NSWritingDirection resolvedLayoutDirection)
161
- {
162
- @autoreleasepool {
163
- CGSize fallback = CGSizeMake(maxWidth, UIFontLineHeight([UIFont systemFontOfSize:16.0]));
164
- if (typedProps.document.empty()) {
165
- return fallback;
166
- }
167
-
168
- NSString *tiptap = [[NSString alloc] initWithUTF8String:typedProps.document.c_str()];
169
- StyleConfig *config = ENRMStyleConfigFromProps(typedProps, fontScale);
170
-
171
- ENRMMd4cFlags *flags = ENRMMd4cFlagsFromProps(typedProps.md4cFlags);
172
- ENRMTiptapParser *parser = [[ENRMTiptapParser alloc] init];
173
- TiptapASTNode *ast = [parser parseTiptap:tiptap
174
- flags:flags
175
- isGFM:typedProps.isGFM
176
- linkRegex:ENRMLinkRegexConfigFromProps(typedProps.linkRecognition.text)
177
- inlineCodeLinkRegex:ENRMLinkRegexConfigFromProps(typedProps.linkRecognition.inlineCode)];
178
- if (!ast) {
179
- return fallback;
180
- }
181
-
182
- NSLineBreakStrategy lineBreakStrategy =
183
- ENRMResolveLineBreakStrategy([[NSString alloc] initWithUTF8String:typedProps.lineBreakStrategyIOS.c_str()]);
184
- ENRMRenderResult *result =
185
- ENRMRenderASTNodes(ast.children, config, typedProps.allowTrailingMargin, typedProps.allowFontScaling,
186
- typedProps.maxFontSizeMultiplier, lineBreakStrategy);
187
- NSMutableAttributedString *text = result.attributedText;
188
- if (text.length == 0) {
189
- return fallback;
190
- }
191
-
192
- ENRMWritingDirectionMode writingDirectionMode =
193
- ENRMResolveWritingDirectionMode([[NSString alloc] initWithUTF8String:typedProps.writingDirection.c_str()]);
194
- ENRMApplyWritingDirectionMode(text, writingDirectionMode, resolvedLayoutDirection);
195
-
196
- NSInteger numberOfLines = (NSInteger)typedProps.numberOfLines;
197
- NSLineBreakMode lineBreakMode =
198
- ENRMResolveEllipsizeLineBreakMode([[NSString alloc] initWithUTF8String:typedProps.ellipsizeMode.c_str()]);
199
- CGSize size = ENRMMeasureAttributedTextViewFree(text, maxWidth, config, typedProps.allowTrailingMargin,
200
- result.lastElementMarginBottom, pointScaleFactor, numberOfLines,
201
- lineBreakMode, YES);
202
- if (size.height == 0) {
203
- return fallback;
204
- }
205
- return size;
206
- }
207
- }
208
-
1
+ #pragma once
2
+
3
+ #import "ENRMFeatureFlags.h"
4
+ #import "ENRMLinkRegexProps.h"
5
+ #import "ENRMTiptapParser.h"
6
+ #import "ENRMTextRenderer.h"
7
+ #import "ENRMTextViewSetup.h"
8
+ #import "ImageRequestHeaderUtils.h"
9
+ #import "LinkPillContentUtils.h"
10
+ #import "TiptapASTNode.h"
11
+ #import "ParagraphStyleUtils.h"
12
+ #import "StylePropsUtils.h"
13
+ #include <type_traits>
14
+
15
+ /**
16
+ * View-free tiptap measurement (issue #550).
17
+ *
18
+ * The previous measurement path built throwaway component views on the main
19
+ * thread via `dispatch_sync` — a deadlock when `measureContent` runs under
20
+ * RN's locked commit fallback while a main-thread committer (Reanimated) is
21
+ * blocked on the same mutex, and a serialization bottleneck (streaming jank)
22
+ * even when it doesn't deadlock.
23
+ *
24
+ * These pipelines measure on the calling thread with no view and no
25
+ * main-thread dependency, mirroring RN core's `RCTTextLayoutManager` (which
26
+ * measures every `<Text>` this way in production) and this library's own
27
+ * Android `MeasurementStore`:
28
+ *
29
+ * - `ENRMMeasureTiptapViewFree` (EnrichedTiptapText): parse (md4c) →
30
+ * `ENRMRenderASTNodes` (the SAME renderer the visible view uses, so
31
+ * measured layout ≡ rendered layout) → a fresh per-call
32
+ * NSTextStorage/NSLayoutManager/NSTextContainer stack → shared finalize.
33
+ * - `ENRMMeasureSegmentedTiptapViewFree` (EnrichedTiptap): the iOS
34
+ * counterpart of Android's `MeasurementStore.measureAndCacheSplit` — split
35
+ * the AST into segments via the same `ENRMRenderSegmentsFromAST` the view
36
+ * uses, then walk them exactly like the view's
37
+ * `computeSegmentLayoutForWidth:`: text via the TextKit stack, tables via
38
+ * `+[TableContainerView measureHeightForTableNode:…]`, math via
39
+ * `+[ENRMMathContainerView measureHeightForLatex:…]`, with the same
40
+ * margin arithmetic.
41
+ *
42
+ * TextKit objects are thread-CONFINED, not main-thread-only: safe off main as
43
+ * long as one thread owns a given stack (Apple-sanctioned; the
44
+ * Texture/AsyncDisplayKit pattern). Allocating the stack per call — exactly
45
+ * what `RCTTextLayoutManager` does — makes confinement trivially true.
46
+ * `boundingRectWithSize:` (tables, math fallback) is documented thread-safe.
47
+ *
48
+ * Ambient-state rules for this path:
49
+ * - Font scale comes in as a parameter (from `LayoutContext::fontSizeMultiplier`),
50
+ * never from `RCTFontSizeMultiplier()` (UIKit read).
51
+ * - Pixel rounding uses `LayoutContext::pointScaleFactor`, never
52
+ * `RCTScreenScale()` (dispatch_syncs to main on first use).
53
+ * - The resolved layout direction comes from `LayoutConstraints::layoutDirection`,
54
+ * never from `RCTI18nUtil`.
55
+ * - The geometry config must match the visible view's
56
+ * (`ENRMConfigureTiptapTextView`): zero insets, `lineFragmentPadding = 0`,
57
+ * `allowsNonContiguousLayout = NO`. The view's custom `TextViewLayoutManager`
58
+ * subclass only draws backgrounds and does not affect geometry.
59
+ * - Each entry point drains its own `@autoreleasepool`. The calling JS/layout
60
+ * thread has no runloop draining pools, and a full measure autoreleases
61
+ * thousands of objects (AST, attributed string, TextKit stack, fonts) — the
62
+ * old main-thread path silently leaned on the main runloop's per-cycle
63
+ * drain, and without a local pool sustained re-measurement accumulates
64
+ * until jetsam kills the app.
65
+ *
66
+ * RaTeX concurrency (math segments and lazily-measured inline math
67
+ * attachments now parse on the calling thread, possibly concurrently with the
68
+ * render thread): verified safe against RaTeX sources. The Swift engine is
69
+ * stateless per call, font registration is NSLock-guarded and idempotent
70
+ * (RaTeXFontLoader), the FFI's last-error slot is thread_local, the Rust
71
+ * core's only statics are immutable OnceLock/LazyLock tables, and renderer
72
+ * font caches are per-call locals.
73
+ */
74
+
75
+ template <typename Md4cFlagsT> static inline ENRMMd4cFlags *ENRMMd4cFlagsFromProps(const Md4cFlagsT &props)
76
+ {
77
+ ENRMMd4cFlags *flags = [ENRMMd4cFlags defaultFlags];
78
+ flags.underline = props.underline;
79
+ flags.superscript = props.superscript;
80
+ flags.subscript = props.subscript;
81
+ flags.latexMath = props.latexMath;
82
+ flags.highlight = props.highlight;
83
+ flags.hardSoftBreaks = props.hardSoftBreaks;
84
+ flags.preserveBlankLines = props.preserveBlankLines;
85
+ flags.admonitions = props.admonitions;
86
+ return flags;
87
+ }
88
+
89
+ /**
90
+ * Builds a StyleConfig from props alone, replicating the mock-view recipe
91
+ * field for field: a fresh config receives the props' style diffed against a
92
+ * default-constructed style struct (the mock view's `updateProps
93
+ * oldProps:nullptr` applied the same diff against default props), then the
94
+ * font scale, max multiplier, and image request headers.
95
+ */
96
+ template <typename PropsT>
97
+ static inline StyleConfig *ENRMStyleConfigFromProps(const PropsT &typedProps, CGFloat fontScale)
98
+ {
99
+ StyleConfig *config = [[StyleConfig alloc] init];
100
+ using StyleT = std::remove_cv_t<std::remove_reference_t<decltype(typedProps.tiptapStyle)>>;
101
+ static const StyleT kDefaultStyle{};
102
+ applyTiptapStyleToConfig(config, typedProps.tiptapStyle, kDefaultStyle);
103
+ [config setFontScaleMultiplier:fontScale];
104
+ [config setMaxFontSizeMultiplier:typedProps.maxFontSizeMultiplier];
105
+ [config setImageRequestHeaders:ENRMImageRequestHeadersFromProps(typedProps.imageRequestHeaders)];
106
+ [config setLinkPillContent:ENRMLinkPillContentFromProps(typedProps.linkPillContent)];
107
+ return config;
108
+ }
109
+
110
+ /**
111
+ * Lays out an already-rendered attributed string in a fresh, call-confined
112
+ * TextKit stack and finalizes with the shared algorithm
113
+ * (`ENRMFinalizeMeasuredTextSize`). Returns CGSizeZero for empty text — the
114
+ * same result the view path produces, and a guard against TextKit's
115
+ * empty-string layout freeze (see RCTTextLayoutManager).
116
+ *
117
+ * Uses the same `usesFontLeading` as the views that draw the text; see
118
+ * ENRMLayoutManagerUsesFontLeading.
119
+ */
120
+ static inline CGSize ENRMMeasureAttributedTextViewFree(NSAttributedString *text, CGFloat maxWidth, StyleConfig *config,
121
+ BOOL allowTrailingMargin, CGFloat lastElementMarginBottom,
122
+ CGFloat pointScaleFactor, NSInteger numberOfLines,
123
+ NSLineBreakMode lineBreakMode, BOOL subtractExtraLineFragment)
124
+ {
125
+ if (text.length == 0) {
126
+ return CGSizeZero;
127
+ }
128
+
129
+ NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(maxWidth, CGFLOAT_MAX)];
130
+ textContainer.lineFragmentPadding = 0;
131
+ if (numberOfLines > 0) {
132
+ textContainer.maximumNumberOfLines = numberOfLines;
133
+ textContainer.lineBreakMode = lineBreakMode;
134
+ }
135
+ NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
136
+ layoutManager.allowsNonContiguousLayout = NO;
137
+ layoutManager.usesFontLeading = ENRMLayoutManagerUsesFontLeading;
138
+ [layoutManager addTextContainer:textContainer];
139
+ NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:text];
140
+ [textStorage addLayoutManager:layoutManager];
141
+
142
+ [layoutManager ensureLayoutForTextContainer:textContainer];
143
+ ENRMTextLayoutResult layout;
144
+ layout.usedRect = [layoutManager usedRectForTextContainer:textContainer];
145
+ layout.extraLineFragmentRect = layoutManager.extraLineFragmentRect;
146
+
147
+ return ENRMFinalizeMeasuredTextSize(layout, layoutManager, maxWidth, config, allowTrailingMargin,
148
+ lastElementMarginBottom, subtractExtraLineFragment, pointScaleFactor);
149
+ }
150
+
151
+ /**
152
+ * Measures EnrichedTiptapText content from props alone, on the calling
153
+ * thread. The line-break strategy and writing-direction mode are resolved
154
+ * from the props exactly as `updateProps:` resolves them. Falls back to
155
+ * (maxWidth × system-16 line height) for empty tiptap, parse failures, and
156
+ * empty render output — the same fallback `measureSize:` produced.
157
+ */
158
+ template <typename PropsT>
159
+ static inline CGSize ENRMMeasureTiptapViewFree(const PropsT &typedProps, CGFloat maxWidth, CGFloat fontScale,
160
+ CGFloat pointScaleFactor, NSWritingDirection resolvedLayoutDirection)
161
+ {
162
+ @autoreleasepool {
163
+ CGSize fallback = CGSizeMake(maxWidth, UIFontLineHeight([UIFont systemFontOfSize:16.0]));
164
+ if (typedProps.document.empty()) {
165
+ return fallback;
166
+ }
167
+
168
+ NSString *tiptap = [[NSString alloc] initWithUTF8String:typedProps.document.c_str()];
169
+ StyleConfig *config = ENRMStyleConfigFromProps(typedProps, fontScale);
170
+
171
+ ENRMMd4cFlags *flags = ENRMMd4cFlagsFromProps(typedProps.md4cFlags);
172
+ ENRMTiptapParser *parser = [[ENRMTiptapParser alloc] init];
173
+ TiptapASTNode *ast = [parser parseTiptap:tiptap
174
+ flags:flags
175
+ isGFM:typedProps.isGFM
176
+ linkRegex:ENRMLinkRegexConfigFromProps(typedProps.linkRecognition.text)
177
+ inlineCodeLinkRegex:ENRMLinkRegexConfigFromProps(typedProps.linkRecognition.inlineCode)];
178
+ if (!ast) {
179
+ return fallback;
180
+ }
181
+
182
+ NSLineBreakStrategy lineBreakStrategy =
183
+ ENRMResolveLineBreakStrategy([[NSString alloc] initWithUTF8String:typedProps.lineBreakStrategyIOS.c_str()]);
184
+ ENRMRenderResult *result =
185
+ ENRMRenderASTNodes(ast.children, config, typedProps.allowTrailingMargin, typedProps.allowFontScaling,
186
+ typedProps.maxFontSizeMultiplier, lineBreakStrategy);
187
+ NSMutableAttributedString *text = result.attributedText;
188
+ if (text.length == 0) {
189
+ return fallback;
190
+ }
191
+
192
+ ENRMWritingDirectionMode writingDirectionMode =
193
+ ENRMResolveWritingDirectionMode([[NSString alloc] initWithUTF8String:typedProps.writingDirection.c_str()]);
194
+ ENRMApplyWritingDirectionMode(text, writingDirectionMode, resolvedLayoutDirection);
195
+
196
+ NSInteger numberOfLines = (NSInteger)typedProps.numberOfLines;
197
+ NSLineBreakMode lineBreakMode =
198
+ ENRMResolveEllipsizeLineBreakMode([[NSString alloc] initWithUTF8String:typedProps.ellipsizeMode.c_str()]);
199
+ CGSize size = ENRMMeasureAttributedTextViewFree(text, maxWidth, config, typedProps.allowTrailingMargin,
200
+ result.lastElementMarginBottom, pointScaleFactor, numberOfLines,
201
+ lineBreakMode, YES);
202
+ if (size.height == 0) {
203
+ return fallback;
204
+ }
205
+ return size;
206
+ }
207
+ }
208
+
@@ -1,19 +1,19 @@
1
- #pragma once
2
- #include "EnrichedTiptapTextShadowNode.h"
3
- #include <react/debug/react_native_assert.h>
4
- #include <react/renderer/core/ConcreteComponentDescriptor.h>
5
-
6
- namespace facebook::react {
7
-
8
- class EnrichedTiptapTextComponentDescriptor final
9
- : public ConcreteComponentDescriptor<EnrichedTiptapTextShadowNode> {
10
- public:
11
- using ConcreteComponentDescriptor::ConcreteComponentDescriptor;
12
-
13
- void adopt(ShadowNode &shadowNode) const override {
14
- react_native_assert(dynamic_cast<EnrichedTiptapTextShadowNode *>(&shadowNode));
15
- ConcreteComponentDescriptor::adopt(shadowNode);
16
- }
17
- };
18
-
19
- } // namespace facebook::react
1
+ #pragma once
2
+ #include "EnrichedTiptapTextShadowNode.h"
3
+ #include <react/debug/react_native_assert.h>
4
+ #include <react/renderer/core/ConcreteComponentDescriptor.h>
5
+
6
+ namespace facebook::react {
7
+
8
+ class EnrichedTiptapTextComponentDescriptor final
9
+ : public ConcreteComponentDescriptor<EnrichedTiptapTextShadowNode> {
10
+ public:
11
+ using ConcreteComponentDescriptor::ConcreteComponentDescriptor;
12
+
13
+ void adopt(ShadowNode &shadowNode) const override {
14
+ react_native_assert(dynamic_cast<EnrichedTiptapTextShadowNode *>(&shadowNode));
15
+ ConcreteComponentDescriptor::adopt(shadowNode);
16
+ }
17
+ };
18
+
19
+ } // namespace facebook::react
@@ -1,43 +1,43 @@
1
- #pragma once
2
- #include "MeasurementCache.h"
3
- #include <ReactNativeRenderRichText/EnrichedTiptapTextState.h>
4
- #include <ReactNativeRenderRichText/EventEmitters.h>
5
- #include <ReactNativeRenderRichText/Props.h>
6
- #include <react/renderer/components/view/ConcreteViewShadowNode.h>
7
- #include <react/renderer/core/LayoutConstraints.h>
8
-
9
- namespace facebook::react {
10
-
11
- JSI_EXPORT extern const char EnrichedTiptapTextComponentName[];
12
-
13
- /// ShadowNode implementing measureContent for automatic height calculation.
14
- class EnrichedTiptapTextShadowNode
15
- : public ConcreteViewShadowNode<EnrichedTiptapTextComponentName, EnrichedTiptapTextProps,
16
- EnrichedTiptapTextEventEmitter, EnrichedTiptapTextState> {
17
- public:
18
- using ConcreteViewShadowNode::ConcreteViewShadowNode;
19
-
20
- EnrichedTiptapTextShadowNode(const ShadowNodeFragment &fragment, const ShadowNodeFamily::Shared &family,
21
- ShadowNodeTraits traits);
22
-
23
- EnrichedTiptapTextShadowNode(const ShadowNode &sourceShadowNode, const ShadowNodeFragment &fragment);
24
-
25
- void dirtyLayoutIfNeeded();
26
-
27
- Size measureContent(const LayoutContext &layoutContext, const LayoutConstraints &layoutConstraints) const override;
28
-
29
- static ShadowNodeTraits BaseTraits()
30
- {
31
- auto traits = ConcreteViewShadowNode::BaseTraits();
32
- traits.set(ShadowNodeTraits::Trait::LeafYogaNode);
33
- traits.set(ShadowNodeTraits::Trait::MeasurableYogaNode);
34
- return traits;
35
- }
36
-
37
- private:
38
- int localHeightRecalculationCounter_{0};
39
- mutable int lastExactMeasurementCounter_{0};
40
- mutable CGSize lastExactMeasurementSize_{0, 0};
41
- };
42
-
43
- } // namespace facebook::react
1
+ #pragma once
2
+ #include "MeasurementCache.h"
3
+ #include <ReactNativeRenderRichText/EnrichedTiptapTextState.h>
4
+ #include <ReactNativeRenderRichText/EventEmitters.h>
5
+ #include <ReactNativeRenderRichText/Props.h>
6
+ #include <react/renderer/components/view/ConcreteViewShadowNode.h>
7
+ #include <react/renderer/core/LayoutConstraints.h>
8
+
9
+ namespace facebook::react {
10
+
11
+ JSI_EXPORT extern const char EnrichedTiptapTextComponentName[];
12
+
13
+ /// ShadowNode implementing measureContent for automatic height calculation.
14
+ class EnrichedTiptapTextShadowNode
15
+ : public ConcreteViewShadowNode<EnrichedTiptapTextComponentName, EnrichedTiptapTextProps,
16
+ EnrichedTiptapTextEventEmitter, EnrichedTiptapTextState> {
17
+ public:
18
+ using ConcreteViewShadowNode::ConcreteViewShadowNode;
19
+
20
+ EnrichedTiptapTextShadowNode(const ShadowNodeFragment &fragment, const ShadowNodeFamily::Shared &family,
21
+ ShadowNodeTraits traits);
22
+
23
+ EnrichedTiptapTextShadowNode(const ShadowNode &sourceShadowNode, const ShadowNodeFragment &fragment);
24
+
25
+ void dirtyLayoutIfNeeded();
26
+
27
+ Size measureContent(const LayoutContext &layoutContext, const LayoutConstraints &layoutConstraints) const override;
28
+
29
+ static ShadowNodeTraits BaseTraits()
30
+ {
31
+ auto traits = ConcreteViewShadowNode::BaseTraits();
32
+ traits.set(ShadowNodeTraits::Trait::LeafYogaNode);
33
+ traits.set(ShadowNodeTraits::Trait::MeasurableYogaNode);
34
+ return traits;
35
+ }
36
+
37
+ private:
38
+ int localHeightRecalculationCounter_{0};
39
+ mutable int lastExactMeasurementCounter_{0};
40
+ mutable CGSize lastExactMeasurementSize_{0, 0};
41
+ };
42
+
43
+ } // namespace facebook::react