@mathers101/react-native-render-rich-text 0.0.0-stage → 0.1.9

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 (358) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +140 -3
  3. package/ReactNativeRenderRichText.podspec +23 -0
  4. package/android/build.gradle +86 -0
  5. package/android/consumer-rules.pro +3 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/cpp/jni-adapter.cpp +191 -0
  8. package/android/src/main/java/com/renderrichtext/EnrichedTiptapText.kt +673 -0
  9. package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextLayoutManager.kt +24 -0
  10. package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextManager.kt +405 -0
  11. package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextPackage.kt +13 -0
  12. package/android/src/main/java/com/renderrichtext/MeasurementStore.kt +644 -0
  13. package/android/src/main/java/com/renderrichtext/accessibility/AccessibilityLabels.kt +17 -0
  14. package/android/src/main/java/com/renderrichtext/accessibility/AccessibleTiptapTextView.kt +112 -0
  15. package/android/src/main/java/com/renderrichtext/accessibility/TiptapAccessibilityHelper.kt +576 -0
  16. package/android/src/main/java/com/renderrichtext/events/CodeBlockPressEvent.kt +24 -0
  17. package/android/src/main/java/com/renderrichtext/events/ContextMenuItemPressEvent.kt +28 -0
  18. package/android/src/main/java/com/renderrichtext/events/CopyPressEvent.kt +24 -0
  19. package/android/src/main/java/com/renderrichtext/events/FactoidPressEvent.kt +23 -0
  20. package/android/src/main/java/com/renderrichtext/events/ImagePressEvent.kt +25 -0
  21. package/android/src/main/java/com/renderrichtext/events/LatexErrorEvent.kt +29 -0
  22. package/android/src/main/java/com/renderrichtext/events/LinkLongPressEvent.kt +23 -0
  23. package/android/src/main/java/com/renderrichtext/events/LinkPressEvent.kt +23 -0
  24. package/android/src/main/java/com/renderrichtext/events/MentionLongPressEvent.kt +25 -0
  25. package/android/src/main/java/com/renderrichtext/events/MentionPressEvent.kt +25 -0
  26. package/android/src/main/java/com/renderrichtext/events/TaskListItemPressEvent.kt +26 -0
  27. package/android/src/main/java/com/renderrichtext/math/LatexErrorReporter.kt +9 -0
  28. package/android/src/main/java/com/renderrichtext/parser/Parser.kt +59 -0
  29. package/android/src/main/java/com/renderrichtext/parser/TextLinkMatching.kt +35 -0
  30. package/android/src/main/java/com/renderrichtext/parser/TiptapASTNode.kt +69 -0
  31. package/android/src/main/java/com/renderrichtext/renderer/BaselineShiftRenderer.kt +45 -0
  32. package/android/src/main/java/com/renderrichtext/renderer/BlankLineRenderer.kt +39 -0
  33. package/android/src/main/java/com/renderrichtext/renderer/BlockStyleContext.kt +181 -0
  34. package/android/src/main/java/com/renderrichtext/renderer/BlockquoteRenderer.kt +243 -0
  35. package/android/src/main/java/com/renderrichtext/renderer/BlockquoteTextRenderer.kt +56 -0
  36. package/android/src/main/java/com/renderrichtext/renderer/CodeBlockRenderer.kt +135 -0
  37. package/android/src/main/java/com/renderrichtext/renderer/CodeRenderer.kt +37 -0
  38. package/android/src/main/java/com/renderrichtext/renderer/EmphasisRenderer.kt +28 -0
  39. package/android/src/main/java/com/renderrichtext/renderer/FactoidRenderer.kt +97 -0
  40. package/android/src/main/java/com/renderrichtext/renderer/HeadingRenderer.kt +81 -0
  41. package/android/src/main/java/com/renderrichtext/renderer/HighlightRenderer.kt +26 -0
  42. package/android/src/main/java/com/renderrichtext/renderer/LineBreakRenderer.kt +17 -0
  43. package/android/src/main/java/com/renderrichtext/renderer/LinkRenderer.kt +90 -0
  44. package/android/src/main/java/com/renderrichtext/renderer/ListContextManager.kt +109 -0
  45. package/android/src/main/java/com/renderrichtext/renderer/ListItemRenderer.kt +211 -0
  46. package/android/src/main/java/com/renderrichtext/renderer/ListRenderer.kt +133 -0
  47. package/android/src/main/java/com/renderrichtext/renderer/MentionRenderer.kt +85 -0
  48. package/android/src/main/java/com/renderrichtext/renderer/NodeRenderer.kt +207 -0
  49. package/android/src/main/java/com/renderrichtext/renderer/ParagraphRenderer.kt +91 -0
  50. package/android/src/main/java/com/renderrichtext/renderer/Renderer.kt +148 -0
  51. package/android/src/main/java/com/renderrichtext/renderer/SoftBreakRenderer.kt +17 -0
  52. package/android/src/main/java/com/renderrichtext/renderer/SpanStyleCache.kt +143 -0
  53. package/android/src/main/java/com/renderrichtext/renderer/StrikethroughRenderer.kt +28 -0
  54. package/android/src/main/java/com/renderrichtext/renderer/StrongRenderer.kt +28 -0
  55. package/android/src/main/java/com/renderrichtext/renderer/TextRenderer.kt +31 -0
  56. package/android/src/main/java/com/renderrichtext/renderer/ThematicBreakRenderer.kt +46 -0
  57. package/android/src/main/java/com/renderrichtext/renderer/UnderlineRenderer.kt +28 -0
  58. package/android/src/main/java/com/renderrichtext/spans/BaseListSpan.kt +164 -0
  59. package/android/src/main/java/com/renderrichtext/spans/BaselineShiftSpan.kt +27 -0
  60. package/android/src/main/java/com/renderrichtext/spans/BlockquoteSpan.kt +302 -0
  61. package/android/src/main/java/com/renderrichtext/spans/CodeBackgroundSpan.kt +205 -0
  62. package/android/src/main/java/com/renderrichtext/spans/CodeBlockSpan.kt +216 -0
  63. package/android/src/main/java/com/renderrichtext/spans/CodeSpan.kt +32 -0
  64. package/android/src/main/java/com/renderrichtext/spans/EmphasisSpan.kt +42 -0
  65. package/android/src/main/java/com/renderrichtext/spans/FactoidBackgroundSpan.kt +265 -0
  66. package/android/src/main/java/com/renderrichtext/spans/FactoidPaddingSpan.kt +258 -0
  67. package/android/src/main/java/com/renderrichtext/spans/FactoidSpan.kt +32 -0
  68. package/android/src/main/java/com/renderrichtext/spans/FadeInSpan.kt +29 -0
  69. package/android/src/main/java/com/renderrichtext/spans/HeadingSpan.kt +38 -0
  70. package/android/src/main/java/com/renderrichtext/spans/HighlightSpan.kt +80 -0
  71. package/android/src/main/java/com/renderrichtext/spans/ImageSpan.kt +481 -0
  72. package/android/src/main/java/com/renderrichtext/spans/InlineBackgroundGeometry.kt +42 -0
  73. package/android/src/main/java/com/renderrichtext/spans/LineHeightSpan.kt +39 -0
  74. package/android/src/main/java/com/renderrichtext/spans/LinkPillIconCache.kt +154 -0
  75. package/android/src/main/java/com/renderrichtext/spans/LinkPillSpan.kt +381 -0
  76. package/android/src/main/java/com/renderrichtext/spans/LinkSpan.kt +68 -0
  77. package/android/src/main/java/com/renderrichtext/spans/ListItemSpacingSpan.kt +33 -0
  78. package/android/src/main/java/com/renderrichtext/spans/ListMarkerAnchorSpan.kt +38 -0
  79. package/android/src/main/java/com/renderrichtext/spans/MarginBottomSpan.kt +76 -0
  80. package/android/src/main/java/com/renderrichtext/spans/MentionChipSpan.kt +132 -0
  81. package/android/src/main/java/com/renderrichtext/spans/MentionSpan.kt +46 -0
  82. package/android/src/main/java/com/renderrichtext/spans/OrderedListSpan.kt +127 -0
  83. package/android/src/main/java/com/renderrichtext/spans/SpoilerSpan.kt +33 -0
  84. package/android/src/main/java/com/renderrichtext/spans/StrikethroughSpan.kt +12 -0
  85. package/android/src/main/java/com/renderrichtext/spans/StrongSpan.kt +39 -0
  86. package/android/src/main/java/com/renderrichtext/spans/TaskListSpan.kt +143 -0
  87. package/android/src/main/java/com/renderrichtext/spans/TextSpan.kt +26 -0
  88. package/android/src/main/java/com/renderrichtext/spans/ThematicBreakSpan.kt +69 -0
  89. package/android/src/main/java/com/renderrichtext/spans/UnorderedListSpan.kt +96 -0
  90. package/android/src/main/java/com/renderrichtext/spoiler/SpoilerStubs.kt +46 -0
  91. package/android/src/main/java/com/renderrichtext/styles/BaseBlockStyle.kt +11 -0
  92. package/android/src/main/java/com/renderrichtext/styles/BlockquoteStyle.kt +83 -0
  93. package/android/src/main/java/com/renderrichtext/styles/CodeBlockStyle.kt +80 -0
  94. package/android/src/main/java/com/renderrichtext/styles/CodeStyle.kt +26 -0
  95. package/android/src/main/java/com/renderrichtext/styles/EmphasisStyle.kt +21 -0
  96. package/android/src/main/java/com/renderrichtext/styles/FactoidStyle.kt +21 -0
  97. package/android/src/main/java/com/renderrichtext/styles/HeadingStyle.kt +33 -0
  98. package/android/src/main/java/com/renderrichtext/styles/HighlightStyle.kt +19 -0
  99. package/android/src/main/java/com/renderrichtext/styles/ImageStyle.kt +29 -0
  100. package/android/src/main/java/com/renderrichtext/styles/InlineImageStyle.kt +17 -0
  101. package/android/src/main/java/com/renderrichtext/styles/InlineMathStyle.kt +17 -0
  102. package/android/src/main/java/com/renderrichtext/styles/LinkPillContent.kt +36 -0
  103. package/android/src/main/java/com/renderrichtext/styles/LinkPillStyle.kt +44 -0
  104. package/android/src/main/java/com/renderrichtext/styles/LinkStyle.kt +23 -0
  105. package/android/src/main/java/com/renderrichtext/styles/LinkVariantEntry.kt +34 -0
  106. package/android/src/main/java/com/renderrichtext/styles/ListStyle.kt +65 -0
  107. package/android/src/main/java/com/renderrichtext/styles/MathStyle.kt +29 -0
  108. package/android/src/main/java/com/renderrichtext/styles/MentionStyle.kt +19 -0
  109. package/android/src/main/java/com/renderrichtext/styles/ParagraphStyle.kt +33 -0
  110. package/android/src/main/java/com/renderrichtext/styles/SpoilerStyle.kt +27 -0
  111. package/android/src/main/java/com/renderrichtext/styles/StrikethroughStyle.kt +17 -0
  112. package/android/src/main/java/com/renderrichtext/styles/StrongStyle.kt +21 -0
  113. package/android/src/main/java/com/renderrichtext/styles/StyleConfig.kt +411 -0
  114. package/android/src/main/java/com/renderrichtext/styles/StyleParser.kt +92 -0
  115. package/android/src/main/java/com/renderrichtext/styles/SubscriptStyle.kt +16 -0
  116. package/android/src/main/java/com/renderrichtext/styles/SuperscriptStyle.kt +16 -0
  117. package/android/src/main/java/com/renderrichtext/styles/TableStyle.kt +75 -0
  118. package/android/src/main/java/com/renderrichtext/styles/TaskListStyle.kt +29 -0
  119. package/android/src/main/java/com/renderrichtext/styles/TextAlignment.kt +32 -0
  120. package/android/src/main/java/com/renderrichtext/styles/ThematicBreakStyle.kt +23 -0
  121. package/android/src/main/java/com/renderrichtext/styles/UnderlineStyle.kt +17 -0
  122. package/android/src/main/java/com/renderrichtext/styles/VideoStyle.kt +31 -0
  123. package/android/src/main/java/com/renderrichtext/utils/common/BorderStyleUtils.kt +86 -0
  124. package/android/src/main/java/com/renderrichtext/utils/common/BreakStrategyUtils.kt +32 -0
  125. package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockHighlighter.kt +36 -0
  126. package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockNode.kt +42 -0
  127. package/android/src/main/java/com/renderrichtext/utils/common/EllipsizeUtils.kt +27 -0
  128. package/android/src/main/java/com/renderrichtext/utils/common/EnrichedTiptapAncestorUtils.kt +10 -0
  129. package/android/src/main/java/com/renderrichtext/utils/common/FeatureFlags.kt +9 -0
  130. package/android/src/main/java/com/renderrichtext/utils/common/LinkRecognitionProps.kt +31 -0
  131. package/android/src/main/java/com/renderrichtext/utils/common/LinkRegexConfig.kt +56 -0
  132. package/android/src/main/java/com/renderrichtext/utils/common/MotionPreferences.kt +18 -0
  133. package/android/src/main/java/com/renderrichtext/utils/common/ReadableMapExtensions.kt +28 -0
  134. package/android/src/main/java/com/renderrichtext/utils/common/TiptapViewManagerUtils.kt +242 -0
  135. package/android/src/main/java/com/renderrichtext/utils/common/layout/RTLUtils.kt +6 -0
  136. package/android/src/main/java/com/renderrichtext/utils/common/serialization/TiptapASTSerializer.kt +368 -0
  137. package/android/src/main/java/com/renderrichtext/utils/text/ImageCache.kt +88 -0
  138. package/android/src/main/java/com/renderrichtext/utils/text/ImageDownloader.kt +203 -0
  139. package/android/src/main/java/com/renderrichtext/utils/text/LocalImageLoader.kt +167 -0
  140. package/android/src/main/java/com/renderrichtext/utils/text/TailFadeInAnimator.kt +84 -0
  141. package/android/src/main/java/com/renderrichtext/utils/text/conversion/HTMLGenerator.kt +1105 -0
  142. package/android/src/main/java/com/renderrichtext/utils/text/conversion/TiptapExtractor.kt +423 -0
  143. package/android/src/main/java/com/renderrichtext/utils/text/extensions/ParagraphUtils.kt +9 -0
  144. package/android/src/main/java/com/renderrichtext/utils/text/extensions/SpannableExtensions.kt +9 -0
  145. package/android/src/main/java/com/renderrichtext/utils/text/extensions/TextPaintExtensions.kt +76 -0
  146. package/android/src/main/java/com/renderrichtext/utils/text/interaction/CheckboxTouchHelper.kt +61 -0
  147. package/android/src/main/java/com/renderrichtext/utils/text/interaction/TaskListTapUtils.kt +286 -0
  148. package/android/src/main/java/com/renderrichtext/utils/text/span/ApplyLineHeight.kt +39 -0
  149. package/android/src/main/java/com/renderrichtext/utils/text/span/BlockSpacing.kt +142 -0
  150. package/android/src/main/java/com/renderrichtext/utils/text/span/SpanFlags.kt +43 -0
  151. package/android/src/main/java/com/renderrichtext/utils/text/span/WidthAwareSpans.kt +30 -0
  152. package/android/src/main/java/com/renderrichtext/utils/text/view/CodeBlockPressHost.kt +15 -0
  153. package/android/src/main/java/com/renderrichtext/utils/text/view/ImagePressHost.kt +19 -0
  154. package/android/src/main/java/com/renderrichtext/utils/text/view/LinkEvents.kt +88 -0
  155. package/android/src/main/java/com/renderrichtext/utils/text/view/LinkLongPressMovementMethod.kt +449 -0
  156. package/android/src/main/java/com/renderrichtext/utils/text/view/SelectionActionMode.kt +235 -0
  157. package/android/src/main/java/com/renderrichtext/utils/text/view/TextSelectionColors.kt +48 -0
  158. package/android/src/main/java/com/renderrichtext/utils/text/view/TextViewSetup.kt +119 -0
  159. package/android/src/main/java/com/renderrichtext/views/ContextMenuPopup.kt +217 -0
  160. package/android/src/main/java/com/renderrichtext/views/CopyGlyph.kt +101 -0
  161. package/android/src/main/java/com/renderrichtext/views/WrapGlyph.kt +40 -0
  162. package/android/src/main/jni/CMakeLists.txt +52 -0
  163. package/android/src/main/jni/react/renderer/components/RichTextSpec/ComponentDescriptors.h +30 -0
  164. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextComponentDescriptor.h +29 -0
  165. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.cpp +45 -0
  166. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.h +21 -0
  167. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.cpp +38 -0
  168. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.h +53 -0
  169. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.cpp +9 -0
  170. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.h +24 -0
  171. package/android/src/main/jni/react/renderer/components/RichTextSpec/conversions.h +40 -0
  172. package/cpp/parser/TiptapASTNode.hpp +68 -0
  173. package/cpp/parser/TiptapParser.cpp +233 -0
  174. package/cpp/parser/TiptapParser.hpp +13 -0
  175. package/cpp/vendor/nlohmann/json.hpp +24765 -0
  176. package/ios/EnrichedTiptapText.h +27 -0
  177. package/ios/EnrichedTiptapText.mm +1222 -0
  178. package/ios/attachments/ENRMImageAttachment.h +51 -0
  179. package/ios/attachments/ENRMImageAttachment.m +398 -0
  180. package/ios/attachments/ENRMLinkPillAttachment.h +47 -0
  181. package/ios/attachments/ENRMLinkPillAttachment.m +324 -0
  182. package/ios/attachments/ENRMLinkPillIconCache.h +28 -0
  183. package/ios/attachments/ENRMLinkPillIconCache.m +181 -0
  184. package/ios/attachments/ENRMLinkPillText.h +27 -0
  185. package/ios/attachments/ENRMLinkPillText.m +118 -0
  186. package/ios/attachments/ENRMMathInlineAttachment.h +7 -0
  187. package/ios/attachments/ENRMMathInlineAttachment.m +4 -0
  188. package/ios/attachments/ThematicBreakAttachment.h +15 -0
  189. package/ios/attachments/ThematicBreakAttachment.m +33 -0
  190. package/ios/internals/ENRMViewFreeMeasurement.h +208 -0
  191. package/ios/internals/EnrichedTiptapTextComponentDescriptor.h +19 -0
  192. package/ios/internals/EnrichedTiptapTextShadowNode.h +43 -0
  193. package/ios/internals/EnrichedTiptapTextShadowNode.mm +69 -0
  194. package/ios/internals/EnrichedTiptapTextState.h +24 -0
  195. package/ios/internals/MeasurementCache.h +308 -0
  196. package/ios/internals/ShadowMeasurementUtils.h +145 -0
  197. package/ios/parser/ENRMTextLinkAttributes.h +7 -0
  198. package/ios/parser/ENRMTiptapParser.h +33 -0
  199. package/ios/parser/ENRMTiptapParser.mm +73 -0
  200. package/ios/parser/TiptapASTNode.h +57 -0
  201. package/ios/parser/TiptapASTNode.m +52 -0
  202. package/ios/parser/TiptapParserBridge.mm +179 -0
  203. package/ios/renderer/AttributedRenderer.h +23 -0
  204. package/ios/renderer/AttributedRenderer.m +229 -0
  205. package/ios/renderer/BaseRenderer.h +33 -0
  206. package/ios/renderer/BaseRenderer.m +46 -0
  207. package/ios/renderer/BaselineShiftTextAttributes.h +10 -0
  208. package/ios/renderer/BaselineShiftTextAttributes.m +26 -0
  209. package/ios/renderer/BlankLineRenderer.h +4 -0
  210. package/ios/renderer/BlankLineRenderer.m +51 -0
  211. package/ios/renderer/BlockquoteRenderer.h +6 -0
  212. package/ios/renderer/BlockquoteRenderer.m +258 -0
  213. package/ios/renderer/CodeBlockRenderer.h +9 -0
  214. package/ios/renderer/CodeBlockRenderer.m +99 -0
  215. package/ios/renderer/CodeRenderer.h +9 -0
  216. package/ios/renderer/CodeRenderer.m +69 -0
  217. package/ios/renderer/ENRMBlockquoteTextRenderer.h +25 -0
  218. package/ios/renderer/ENRMBlockquoteTextRenderer.m +48 -0
  219. package/ios/renderer/EmphasisRenderer.h +5 -0
  220. package/ios/renderer/EmphasisRenderer.m +100 -0
  221. package/ios/renderer/FactoidRenderer.h +9 -0
  222. package/ios/renderer/FactoidRenderer.m +130 -0
  223. package/ios/renderer/HeadingRenderer.h +6 -0
  224. package/ios/renderer/HeadingRenderer.m +103 -0
  225. package/ios/renderer/HighlightRenderer.h +7 -0
  226. package/ios/renderer/HighlightRenderer.m +33 -0
  227. package/ios/renderer/LinkRenderer.h +6 -0
  228. package/ios/renderer/LinkRenderer.m +158 -0
  229. package/ios/renderer/ListItemRenderer.h +24 -0
  230. package/ios/renderer/ListItemRenderer.m +283 -0
  231. package/ios/renderer/ListRenderer.h +13 -0
  232. package/ios/renderer/ListRenderer.m +126 -0
  233. package/ios/renderer/MentionRenderer.h +9 -0
  234. package/ios/renderer/MentionRenderer.m +96 -0
  235. package/ios/renderer/NodeRenderer.h +8 -0
  236. package/ios/renderer/ParagraphRenderer.h +6 -0
  237. package/ios/renderer/ParagraphRenderer.m +85 -0
  238. package/ios/renderer/RenderContext.h +145 -0
  239. package/ios/renderer/RenderContext.m +403 -0
  240. package/ios/renderer/RendererFactory.h +12 -0
  241. package/ios/renderer/RendererFactory.m +158 -0
  242. package/ios/renderer/StrikethroughRenderer.h +5 -0
  243. package/ios/renderer/StrikethroughRenderer.m +30 -0
  244. package/ios/renderer/StrongRenderer.h +5 -0
  245. package/ios/renderer/StrongRenderer.m +88 -0
  246. package/ios/renderer/TextRenderer.h +6 -0
  247. package/ios/renderer/TextRenderer.m +18 -0
  248. package/ios/renderer/ThematicBreakRenderer.h +4 -0
  249. package/ios/renderer/ThematicBreakRenderer.m +42 -0
  250. package/ios/renderer/UnderlineRenderer.h +4 -0
  251. package/ios/renderer/UnderlineRenderer.m +41 -0
  252. package/ios/styles/ENRMFontSlot.h +12 -0
  253. package/ios/styles/ENRMFontSlot.m +24 -0
  254. package/ios/styles/StyleConfig.h +488 -0
  255. package/ios/styles/StyleConfig.mm +2820 -0
  256. package/ios/utils/AccessibilityInfo.h +35 -0
  257. package/ios/utils/AccessibilityInfo.m +24 -0
  258. package/ios/utils/BlockquoteBorder.h +26 -0
  259. package/ios/utils/BlockquoteBorder.m +294 -0
  260. package/ios/utils/CodeBackground.h +19 -0
  261. package/ios/utils/CodeBackground.m +197 -0
  262. package/ios/utils/CodeBlockBackground.h +17 -0
  263. package/ios/utils/CodeBlockBackground.m +103 -0
  264. package/ios/utils/ContextMenuUtils.h +76 -0
  265. package/ios/utils/ContextMenuUtils.mm +75 -0
  266. package/ios/utils/ENRMAccessibilityLabels.h +40 -0
  267. package/ios/utils/ENRMAccessibilityLabels.m +5 -0
  268. package/ios/utils/ENRMAsyncRenderCoordinator.h +24 -0
  269. package/ios/utils/ENRMAsyncRenderCoordinator.m +37 -0
  270. package/ios/utils/ENRMAtomicSize.h +65 -0
  271. package/ios/utils/ENRMCodeBlockContent.h +37 -0
  272. package/ios/utils/ENRMCodeBlockContent.mm +89 -0
  273. package/ios/utils/ENRMFeatureFlags.h +25 -0
  274. package/ios/utils/ENRMImageDownloader.h +30 -0
  275. package/ios/utils/ENRMImageDownloader.m +168 -0
  276. package/ios/utils/ENRMLatexErrorCoordinator.h +27 -0
  277. package/ios/utils/ENRMLatexErrorCoordinator.mm +75 -0
  278. package/ios/utils/ENRMLatexErrorReporting.h +13 -0
  279. package/ios/utils/ENRMLinkContextMenus.h +93 -0
  280. package/ios/utils/ENRMLinkContextMenus.m +178 -0
  281. package/ios/utils/ENRMLinkRegexConfig.h +30 -0
  282. package/ios/utils/ENRMLinkRegexConfig.mm +104 -0
  283. package/ios/utils/ENRMLinkRegexProps.h +23 -0
  284. package/ios/utils/ENRMLocalImageLoader.h +35 -0
  285. package/ios/utils/ENRMLocalImageLoader.m +111 -0
  286. package/ios/utils/ENRMMenuAction.h +27 -0
  287. package/ios/utils/ENRMMenuAction.m +33 -0
  288. package/ios/utils/ENRMSpoilerOverlayManager.h +15 -0
  289. package/ios/utils/ENRMSpoilerOverlayManager.m +19 -0
  290. package/ios/utils/ENRMSpoilerTapUtils.h +6 -0
  291. package/ios/utils/ENRMSpoilerTapUtils.m +11 -0
  292. package/ios/utils/ENRMTailFadeInAnimator.h +16 -0
  293. package/ios/utils/ENRMTailFadeInAnimator.m +161 -0
  294. package/ios/utils/ENRMTextHitTest.h +23 -0
  295. package/ios/utils/ENRMTextHitTest.m +20 -0
  296. package/ios/utils/ENRMTextInteractionUtils.h +20 -0
  297. package/ios/utils/ENRMTextInteractionUtils.m +15 -0
  298. package/ios/utils/ENRMTextRenderer.h +38 -0
  299. package/ios/utils/ENRMTextRenderer.m +54 -0
  300. package/ios/utils/ENRMTextViewSetup.h +132 -0
  301. package/ios/utils/ENRMUIKit.h +429 -0
  302. package/ios/utils/EditMenuUtils.h +105 -0
  303. package/ios/utils/EditMenuUtils.m +143 -0
  304. package/ios/utils/FactoidBackground.h +20 -0
  305. package/ios/utils/FactoidBackground.m +161 -0
  306. package/ios/utils/FontScaleObserver.h +10 -0
  307. package/ios/utils/FontScaleObserver.m +55 -0
  308. package/ios/utils/FontUtils.h +31 -0
  309. package/ios/utils/FontUtils.m +63 -0
  310. package/ios/utils/HTMLGenerator.h +25 -0
  311. package/ios/utils/HTMLGenerator.m +1041 -0
  312. package/ios/utils/HeightUpdateUtils.h +25 -0
  313. package/ios/utils/ImageRequestHeaderUtils.h +35 -0
  314. package/ios/utils/LastElementUtils.h +97 -0
  315. package/ios/utils/LinkContextMenuUtils.h +55 -0
  316. package/ios/utils/LinkPillContentUtils.h +46 -0
  317. package/ios/utils/LinkTapUtils.h +56 -0
  318. package/ios/utils/LinkTapUtils.m +139 -0
  319. package/ios/utils/ListMarkerDrawer.h +15 -0
  320. package/ios/utils/ListMarkerDrawer.m +239 -0
  321. package/ios/utils/MentionBackground.h +26 -0
  322. package/ios/utils/MentionBackground.m +86 -0
  323. package/ios/utils/ParagraphStyleUtils.h +87 -0
  324. package/ios/utils/ParagraphStyleUtils.m +484 -0
  325. package/ios/utils/PasteboardUtils.h +48 -0
  326. package/ios/utils/PasteboardUtils.m +166 -0
  327. package/ios/utils/RTFExportUtils.h +24 -0
  328. package/ios/utils/RTFExportUtils.m +299 -0
  329. package/ios/utils/RuntimeKeys.h +44 -0
  330. package/ios/utils/RuntimeKeys.m +13 -0
  331. package/ios/utils/SelectionColorUtils.h +14 -0
  332. package/ios/utils/StylePropsUtils.h +1340 -0
  333. package/ios/utils/TaskListTapUtils.h +6 -0
  334. package/ios/utils/TaskListTapUtils.m +14 -0
  335. package/ios/utils/TextViewLayoutManager.h +14 -0
  336. package/ios/utils/TextViewLayoutManager.mm +198 -0
  337. package/ios/utils/TiptapAccessibilityElementBuilder.h +43 -0
  338. package/ios/utils/TiptapAccessibilityElementBuilder.m +432 -0
  339. package/ios/utils/TiptapExtractor.h +17 -0
  340. package/ios/utils/TiptapExtractor.m +367 -0
  341. package/ios/views/ENRMTiptapTextView.h +25 -0
  342. package/ios/views/ENRMTiptapTextView.m +247 -0
  343. package/package.json +70 -6
  344. package/react-native.config.js +10 -0
  345. package/src/EnrichedTiptapTextNativeComponent.ts +739 -0
  346. package/src/RichText.tsx +164 -0
  347. package/src/admonitionDefaults.ts +58 -0
  348. package/src/darkModeTextStyle.ts +99 -0
  349. package/src/headingDefaults.ts +21 -0
  350. package/src/index.tsx +4 -0
  351. package/src/linkVariantUtils.ts +120 -0
  352. package/src/normalizeTiptapStyle.ts +397 -0
  353. package/src/rn-globals.d.ts +1 -0
  354. package/src/styleUtils.ts +107 -0
  355. package/src/types/TiptapStyle.ts +532 -0
  356. package/src/types/TiptapStyleInternal.ts +299 -0
  357. package/src/types/linkPill.ts +9 -0
  358. package/src/utils/isDev.ts +4 -0
@@ -0,0 +1,4 @@
1
+ #import "ENRMMathInlineAttachment.h"
2
+
3
+ @implementation ENRMMathInlineAttachment
4
+ @end
@@ -0,0 +1,15 @@
1
+ #pragma once
2
+ #import "ENRMUIKit.h"
3
+
4
+ NS_ASSUME_NONNULL_BEGIN
5
+
6
+ @interface ThematicBreakAttachment : NSTextAttachment
7
+
8
+ @property (nonatomic, strong) RCTUIColor *lineColor;
9
+ @property (nonatomic, assign) CGFloat lineHeight;
10
+ @property (nonatomic, assign) CGFloat marginTop;
11
+ @property (nonatomic, assign) CGFloat marginBottom;
12
+
13
+ @end
14
+
15
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,33 @@
1
+ #import "ThematicBreakAttachment.h"
2
+
3
+ @implementation ThematicBreakAttachment
4
+
5
+ - (CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer
6
+ proposedLineFragment:(CGRect)lineFrag
7
+ glyphPosition:(CGPoint)position
8
+ characterIndex:(NSUInteger)charIndex
9
+ {
10
+ CGFloat totalHeight = self.marginTop + self.lineHeight + self.marginBottom;
11
+ return CGRectMake(0, 0, CGRectGetWidth(lineFrag), totalHeight);
12
+ }
13
+
14
+ - (RCTUIImage *)imageForBounds:(CGRect)imageBounds
15
+ textContainer:(NSTextContainer *)textContainer
16
+ characterIndex:(NSUInteger)charIndex
17
+ {
18
+ RCTUIGraphicsImageRenderer *renderer = [[RCTUIGraphicsImageRenderer alloc] initWithSize:imageBounds.size];
19
+
20
+ return [renderer imageWithActions:^(RCTUIGraphicsImageRendererContext *_Nonnull rendererContext) {
21
+ CGContextRef ctx = rendererContext.CGContext;
22
+
23
+ CGFloat lineY = self.marginTop + (self.lineHeight / 2.0);
24
+
25
+ [self.lineColor setStroke];
26
+ CGContextSetLineWidth(ctx, self.lineHeight);
27
+ CGContextMoveToPoint(ctx, 0, lineY);
28
+ CGContextAddLineToPoint(ctx, imageBounds.size.width, lineY);
29
+ CGContextStrokePath(ctx);
30
+ }];
31
+ }
32
+
33
+ @end
@@ -0,0 +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
+
@@ -0,0 +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
@@ -0,0 +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
@@ -0,0 +1,69 @@
1
+ #import "EnrichedTiptapTextShadowNode.h"
2
+ #import "ENRMViewFreeMeasurement.h"
3
+ #import "EnrichedTiptapText.h"
4
+ #import "ShadowMeasurementUtils.h"
5
+ #import <yoga/Yoga.h>
6
+
7
+ namespace facebook::react {
8
+
9
+ extern const char EnrichedTiptapTextComponentName[] = "EnrichedTiptapText";
10
+
11
+ EnrichedTiptapTextShadowNode::EnrichedTiptapTextShadowNode(const ShadowNodeFragment &fragment,
12
+ const ShadowNodeFamily::Shared &family,
13
+ ShadowNodeTraits traits)
14
+ : ConcreteViewShadowNode(fragment, family, traits)
15
+ {
16
+ }
17
+
18
+ EnrichedTiptapTextShadowNode::EnrichedTiptapTextShadowNode(const ShadowNode &sourceShadowNode,
19
+ const ShadowNodeFragment &fragment)
20
+ : ConcreteViewShadowNode(sourceShadowNode, fragment),
21
+ localHeightRecalculationCounter_(
22
+ static_cast<const EnrichedTiptapTextShadowNode &>(sourceShadowNode).localHeightRecalculationCounter_),
23
+ lastExactMeasurementCounter_(
24
+ static_cast<const EnrichedTiptapTextShadowNode &>(sourceShadowNode).lastExactMeasurementCounter_),
25
+ lastExactMeasurementSize_(
26
+ static_cast<const EnrichedTiptapTextShadowNode &>(sourceShadowNode).lastExactMeasurementSize_)
27
+ {
28
+ const auto &oldProps = *std::static_pointer_cast<const EnrichedTiptapTextProps>(sourceShadowNode.getProps());
29
+ const auto &newProps = *std::static_pointer_cast<const EnrichedTiptapTextProps>(this->getProps());
30
+
31
+ if (newProps.streamingAnimation && ENRMPropsNeedExactStreamingMeasurement(oldProps, newProps)) {
32
+ lastExactMeasurementCounter_ = -1;
33
+ }
34
+
35
+ dirtyLayoutIfNeeded();
36
+ }
37
+
38
+ void EnrichedTiptapTextShadowNode::dirtyLayoutIfNeeded()
39
+ {
40
+ const auto state = this->getStateData();
41
+ const int receivedCounter = state.getHeightRecalculationCounter();
42
+
43
+ if (receivedCounter > localHeightRecalculationCounter_) {
44
+ localHeightRecalculationCounter_ = receivedCounter;
45
+ YGNodeMarkDirty(&yogaNode_);
46
+ }
47
+ }
48
+
49
+ Size EnrichedTiptapTextShadowNode::measureContent(const LayoutContext &layoutContext,
50
+ const LayoutConstraints &layoutConstraints) const
51
+ {
52
+ const auto propsHandle = std::static_pointer_cast<const EnrichedTiptapTextProps>(this->getProps());
53
+ const auto &typedProps = *propsHandle;
54
+ const int receivedCounter = getStateData().getHeightRecalculationCounter();
55
+ const EnrichedTiptapTextProps *props = propsHandle.get();
56
+ CGFloat pointScaleFactor = layoutContext.pointScaleFactor;
57
+ NSWritingDirection resolvedLayoutDirection = layoutConstraints.layoutDirection == LayoutDirection::RightToLeft
58
+ ? NSWritingDirectionRightToLeft
59
+ : NSWritingDirectionLeftToRight;
60
+
61
+ return ENRMMeasureTiptapContent<EnrichedTiptapTextProps, EnrichedTiptapText>(
62
+ typedProps, getStateData().getComponentViewRef(), receivedCounter, lastExactMeasurementCounter_,
63
+ lastExactMeasurementSize_, TiptapFlavor::CommonMark, layoutContext, layoutConstraints,
64
+ ^(EnrichedTiptapText *view, CGFloat maxWidth, CGFloat fontScale) {
65
+ return ENRMMeasureTiptapViewFree(*props, maxWidth, fontScale, pointScaleFactor, resolvedLayoutDirection);
66
+ });
67
+ }
68
+
69
+ } // namespace facebook::react
@@ -0,0 +1,24 @@
1
+ #pragma once
2
+ #include <memory>
3
+
4
+ namespace facebook::react {
5
+
6
+ /// Counter triggers layout recalculation, viewRef allows shadow node to access view for measurement.
7
+ class EnrichedTiptapTextState {
8
+ public:
9
+ EnrichedTiptapTextState() = default;
10
+ EnrichedTiptapTextState(int counter, std::shared_ptr<void> ref) : counter_(counter), viewRef_(ref) {}
11
+
12
+ int getHeightRecalculationCounter() const {
13
+ return counter_;
14
+ }
15
+ std::shared_ptr<void> getComponentViewRef() const {
16
+ return viewRef_;
17
+ }
18
+
19
+ private:
20
+ int counter_{0};
21
+ std::shared_ptr<void> viewRef_{nullptr};
22
+ };
23
+
24
+ } // namespace facebook::react