@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,368 +1,368 @@
1
- package com.renderrichtext.utils.common.serialization
2
-
3
- import com.renderrichtext.parser.TiptapASTNode
4
- import com.renderrichtext.parser.TiptapASTNode.NodeType
5
- import com.renderrichtext.parser.isTopLevelBlock
6
- import com.renderrichtext.utils.common.CodeBlockNode
7
-
8
- object TiptapASTSerializer {
9
- fun serializeNode(node: TiptapASTNode): String {
10
- val buffer = StringBuilder()
11
- appendNode(node, buffer)
12
- return buffer.toString()
13
- }
14
-
15
- fun serializeChildren(node: TiptapASTNode): String {
16
- val buffer = StringBuilder()
17
- for (child in node.children) {
18
- appendNode(child, buffer)
19
- }
20
- return buffer.toString()
21
- }
22
-
23
- /**
24
- * Serializes a Blockquote or Admonition node back to tiptap, including
25
- * the `> ` prefix on every line and `> [!TYPE]` header for admonitions.
26
- */
27
- fun serializeBlockquote(node: TiptapASTNode): String {
28
- val sb = StringBuilder()
29
- val isAdmonition = node.type == NodeType.Admonition
30
- if (isAdmonition) {
31
- val type = node.getAttribute("admonitionType")?.takeIf { it.isNotEmpty() } ?: "note"
32
- sb.append("> [!${type.uppercase(java.util.Locale.ROOT)}]\n")
33
- }
34
- val body = serializeBlockChildren(node)
35
- for (line in body.trimEnd('\n').split("\n")) {
36
- sb.append("> ")
37
- sb.append(line)
38
- sb.append("\n")
39
- }
40
- return sb.toString()
41
- }
42
-
43
- /**
44
- * Extracts the plain text content of an AST node recursively.
45
- * Inserts newlines between block-level children and handles soft/hard breaks.
46
- */
47
- fun plainText(node: TiptapASTNode): String {
48
- val buffer = StringBuilder()
49
- appendPlainText(node, buffer)
50
- return buffer.toString().trim()
51
- }
52
-
53
- private fun appendPlainText(
54
- node: TiptapASTNode,
55
- buffer: StringBuilder,
56
- ) {
57
- when (node.type) {
58
- NodeType.SoftBreak -> {
59
- buffer.append("\n")
60
- }
61
-
62
- NodeType.LineBreak -> {
63
- buffer.append("\n")
64
- }
65
-
66
- NodeType.Mention -> {
67
- val name = node.getAttribute("label").orEmpty().ifBlank { node.getAttribute("id").orEmpty() }
68
- buffer.append('@')
69
- buffer.append(name)
70
- }
71
-
72
- NodeType.BlankLine -> {
73
- val count = node.getAttribute("count")?.toIntOrNull() ?: 0
74
- repeat(count) { buffer.append("\n") }
75
- }
76
-
77
- NodeType.Paragraph -> {
78
- for (child in node.children) {
79
- appendPlainText(child, buffer)
80
- }
81
- buffer.append("\n")
82
- }
83
-
84
- NodeType.Heading -> {
85
- for (child in node.children) {
86
- appendPlainText(child, buffer)
87
- }
88
- buffer.append("\n")
89
- }
90
-
91
- else -> {
92
- buffer.append(node.content)
93
- for (child in node.children) {
94
- appendPlainText(child, buffer)
95
- }
96
- }
97
- }
98
- }
99
-
100
- // -- Block-level serialization --------------------------------------------------
101
-
102
- private fun serializeBlockChildren(node: TiptapASTNode): String {
103
- val buffer = StringBuilder()
104
- val children = node.children
105
- for ((index, child) in children.withIndex()) {
106
- appendBlockNode(child, buffer)
107
- if (index < children.size - 1 && child.type.isTopLevelBlock()) {
108
- buffer.append("\n")
109
- }
110
- }
111
- return buffer.toString()
112
- }
113
-
114
- private fun appendBlockNode(
115
- node: TiptapASTNode,
116
- buffer: StringBuilder,
117
- ) {
118
- when (node.type) {
119
- NodeType.Paragraph -> {
120
- appendChildren(node, buffer)
121
- buffer.append("\n")
122
- }
123
-
124
- NodeType.Heading -> {
125
- val level = (node.getAttribute("level") ?: "1").toIntOrNull() ?: 1
126
- buffer.append("#".repeat(level))
127
- buffer.append(" ")
128
- appendChildren(node, buffer)
129
- buffer.append("\n")
130
- }
131
-
132
- NodeType.CodeBlock -> {
133
- val code = CodeBlockNode.extractCode(node)
134
- val language = CodeBlockNode.language(node)
135
- val fenceChar = CodeBlockNode.fenceChar(node)
136
- buffer.append(CodeBlockNode.fencedTiptap(code, language, fenceChar))
137
- buffer.append("\n")
138
- }
139
-
140
- NodeType.Blockquote, NodeType.Admonition -> {
141
- buffer.append(serializeBlockquote(node))
142
- }
143
-
144
- NodeType.ThematicBreak -> {
145
- buffer.append("---\n")
146
- }
147
-
148
- NodeType.BlankLine -> {
149
- val count = node.getAttribute("count")?.toIntOrNull() ?: 0
150
- repeat(count) { buffer.append("\n") }
151
- }
152
-
153
- NodeType.Table -> {
154
- appendTableTiptap(node, buffer)
155
- }
156
-
157
- NodeType.UnorderedList -> {
158
- appendListTiptap(node, buffer, ordered = false)
159
- }
160
-
161
- NodeType.OrderedList -> {
162
- appendListTiptap(node, buffer, ordered = true)
163
- }
164
-
165
- NodeType.LatexMathDisplay -> {
166
- buffer.append("$$\n")
167
- appendChildren(node, buffer)
168
- buffer.append("\n$$\n")
169
- }
170
-
171
- else -> {
172
- appendChildren(node, buffer)
173
- }
174
- }
175
- }
176
-
177
- // Table tiptap reconstruction from raw AST nodes. This parallels
178
- // TableContainerView.buildTiptapFromRows() which works from processed
179
- // TableCellData; both must produce the same pipe-table format.
180
- private fun appendTableTiptap(
181
- node: TiptapASTNode,
182
- buffer: StringBuilder,
183
- ) {
184
- var headerDone = false
185
- for (section in node.children) {
186
- for (row in section.children) {
187
- if (row.type != NodeType.TableRow) continue
188
- val cells = row.children.map { serializeChildren(it) }
189
- buffer.append("| ")
190
- buffer.append(cells.joinToString(" | "))
191
- buffer.append(" |\n")
192
- if (!headerDone && row.children.any { it.type == NodeType.TableHeaderCell }) {
193
- val sep =
194
- row.children.map { cell ->
195
- when (cell.getAttribute("align")) {
196
- "center" -> ":---:"
197
- "right" -> "---:"
198
- else -> "---"
199
- }
200
- }
201
- buffer.append("| ")
202
- buffer.append(sep.joinToString(" | "))
203
- buffer.append(" |\n")
204
- headerDone = true
205
- }
206
- }
207
- }
208
- }
209
-
210
- private fun appendListTiptap(
211
- node: TiptapASTNode,
212
- buffer: StringBuilder,
213
- ordered: Boolean,
214
- ) {
215
- var number =
216
- if (ordered) {
217
- node.getAttribute("start")?.toIntOrNull()?.coerceAtLeast(0) ?: 1
218
- } else {
219
- 1
220
- }
221
- for (item in node.children) {
222
- if (item.type != NodeType.ListItem) continue
223
- val prefix = if (ordered) "$number. " else "- "
224
- val content = serializeBlockChildren(item).trimEnd('\n')
225
- val lines = content.split("\n")
226
- lines.forEachIndexed { lineIdx, line ->
227
- if (lineIdx == 0) {
228
- buffer.append(prefix)
229
- } else {
230
- buffer.append(" ".repeat(prefix.length))
231
- }
232
- buffer.append(line)
233
- buffer.append("\n")
234
- }
235
- if (ordered) number++
236
- }
237
- }
238
-
239
- // -- Inline serialization -------------------------------------------------------
240
-
241
- private fun appendNode(
242
- node: TiptapASTNode,
243
- buffer: StringBuilder,
244
- ) {
245
- when (node.type) {
246
- NodeType.Text -> {
247
- buffer.append(node.content)
248
- }
249
-
250
- NodeType.LineBreak -> {
251
- buffer.append("\\\n")
252
- }
253
-
254
- NodeType.SoftBreak -> {
255
- buffer.append("\n")
256
- }
257
-
258
- NodeType.Strong -> {
259
- buffer.append("**")
260
- appendChildren(node, buffer)
261
- buffer.append("**")
262
- }
263
-
264
- NodeType.Emphasis -> {
265
- buffer.append("*")
266
- appendChildren(node, buffer)
267
- buffer.append("*")
268
- }
269
-
270
- NodeType.Strikethrough -> {
271
- buffer.append("~~")
272
- appendChildren(node, buffer)
273
- buffer.append("~~")
274
- }
275
-
276
- NodeType.Underline -> {
277
- buffer.append("__")
278
- appendChildren(node, buffer)
279
- buffer.append("__")
280
- }
281
-
282
- NodeType.Superscript -> {
283
- buffer.append("^")
284
- appendChildren(node, buffer)
285
- buffer.append("^")
286
- }
287
-
288
- NodeType.Subscript -> {
289
- buffer.append("~")
290
- appendChildren(node, buffer)
291
- buffer.append("~")
292
- }
293
-
294
- NodeType.Highlight -> {
295
- buffer.append("==")
296
- appendChildren(node, buffer)
297
- buffer.append("==")
298
- }
299
-
300
- NodeType.LatexMathInline -> {
301
- buffer.append("\$")
302
- appendChildren(node, buffer)
303
- buffer.append("\$")
304
- }
305
-
306
- NodeType.Code -> {
307
- buffer.append("`")
308
- appendChildren(node, buffer)
309
- buffer.append("`")
310
- }
311
-
312
- NodeType.Link -> {
313
- if (node.getAttribute("recognizedLink") == "true") {
314
- appendChildren(node, buffer)
315
- return
316
- }
317
- val url = node.getAttribute("url") ?: ""
318
- buffer.append("[")
319
- appendChildren(node, buffer)
320
- buffer.append("](")
321
- buffer.append(url)
322
- buffer.append(")")
323
- }
324
-
325
- NodeType.Image -> {
326
- val alt = node.getAttribute("alt") ?: ""
327
- val url = node.getAttribute("url") ?: ""
328
- buffer.append("![")
329
- buffer.append(alt)
330
- buffer.append("](")
331
- buffer.append(url)
332
- buffer.append(")")
333
- }
334
-
335
- NodeType.Mention -> {
336
- val name = node.getAttribute("label").orEmpty().ifBlank { node.getAttribute("id").orEmpty() }
337
- buffer.append('@')
338
- buffer.append(name)
339
- }
340
-
341
- NodeType.Video -> {
342
- val url = node.getAttribute("url") ?: ""
343
- if (url.contains('"')) {
344
- buffer.append("<video src='")
345
- buffer.append(url)
346
- buffer.append("' />")
347
- } else {
348
- buffer.append("<video src=\"")
349
- buffer.append(url)
350
- buffer.append("\" />")
351
- }
352
- }
353
-
354
- else -> {
355
- appendChildren(node, buffer)
356
- }
357
- }
358
- }
359
-
360
- private fun appendChildren(
361
- node: TiptapASTNode,
362
- buffer: StringBuilder,
363
- ) {
364
- for (child in node.children) {
365
- appendNode(child, buffer)
366
- }
367
- }
368
- }
1
+ package com.renderrichtext.utils.common.serialization
2
+
3
+ import com.renderrichtext.parser.TiptapASTNode
4
+ import com.renderrichtext.parser.TiptapASTNode.NodeType
5
+ import com.renderrichtext.parser.isTopLevelBlock
6
+ import com.renderrichtext.utils.common.CodeBlockNode
7
+
8
+ object TiptapASTSerializer {
9
+ fun serializeNode(node: TiptapASTNode): String {
10
+ val buffer = StringBuilder()
11
+ appendNode(node, buffer)
12
+ return buffer.toString()
13
+ }
14
+
15
+ fun serializeChildren(node: TiptapASTNode): String {
16
+ val buffer = StringBuilder()
17
+ for (child in node.children) {
18
+ appendNode(child, buffer)
19
+ }
20
+ return buffer.toString()
21
+ }
22
+
23
+ /**
24
+ * Serializes a Blockquote or Admonition node back to tiptap, including
25
+ * the `> ` prefix on every line and `> [!TYPE]` header for admonitions.
26
+ */
27
+ fun serializeBlockquote(node: TiptapASTNode): String {
28
+ val sb = StringBuilder()
29
+ val isAdmonition = node.type == NodeType.Admonition
30
+ if (isAdmonition) {
31
+ val type = node.getAttribute("admonitionType")?.takeIf { it.isNotEmpty() } ?: "note"
32
+ sb.append("> [!${type.uppercase(java.util.Locale.ROOT)}]\n")
33
+ }
34
+ val body = serializeBlockChildren(node)
35
+ for (line in body.trimEnd('\n').split("\n")) {
36
+ sb.append("> ")
37
+ sb.append(line)
38
+ sb.append("\n")
39
+ }
40
+ return sb.toString()
41
+ }
42
+
43
+ /**
44
+ * Extracts the plain text content of an AST node recursively.
45
+ * Inserts newlines between block-level children and handles soft/hard breaks.
46
+ */
47
+ fun plainText(node: TiptapASTNode): String {
48
+ val buffer = StringBuilder()
49
+ appendPlainText(node, buffer)
50
+ return buffer.toString().trim()
51
+ }
52
+
53
+ private fun appendPlainText(
54
+ node: TiptapASTNode,
55
+ buffer: StringBuilder,
56
+ ) {
57
+ when (node.type) {
58
+ NodeType.SoftBreak -> {
59
+ buffer.append("\n")
60
+ }
61
+
62
+ NodeType.LineBreak -> {
63
+ buffer.append("\n")
64
+ }
65
+
66
+ NodeType.Mention -> {
67
+ val name = node.getAttribute("label").orEmpty().ifBlank { node.getAttribute("id").orEmpty() }
68
+ buffer.append('@')
69
+ buffer.append(name)
70
+ }
71
+
72
+ NodeType.BlankLine -> {
73
+ val count = node.getAttribute("count")?.toIntOrNull() ?: 0
74
+ repeat(count) { buffer.append("\n") }
75
+ }
76
+
77
+ NodeType.Paragraph -> {
78
+ for (child in node.children) {
79
+ appendPlainText(child, buffer)
80
+ }
81
+ buffer.append("\n")
82
+ }
83
+
84
+ NodeType.Heading -> {
85
+ for (child in node.children) {
86
+ appendPlainText(child, buffer)
87
+ }
88
+ buffer.append("\n")
89
+ }
90
+
91
+ else -> {
92
+ buffer.append(node.content)
93
+ for (child in node.children) {
94
+ appendPlainText(child, buffer)
95
+ }
96
+ }
97
+ }
98
+ }
99
+
100
+ // -- Block-level serialization --------------------------------------------------
101
+
102
+ private fun serializeBlockChildren(node: TiptapASTNode): String {
103
+ val buffer = StringBuilder()
104
+ val children = node.children
105
+ for ((index, child) in children.withIndex()) {
106
+ appendBlockNode(child, buffer)
107
+ if (index < children.size - 1 && child.type.isTopLevelBlock()) {
108
+ buffer.append("\n")
109
+ }
110
+ }
111
+ return buffer.toString()
112
+ }
113
+
114
+ private fun appendBlockNode(
115
+ node: TiptapASTNode,
116
+ buffer: StringBuilder,
117
+ ) {
118
+ when (node.type) {
119
+ NodeType.Paragraph -> {
120
+ appendChildren(node, buffer)
121
+ buffer.append("\n")
122
+ }
123
+
124
+ NodeType.Heading -> {
125
+ val level = (node.getAttribute("level") ?: "1").toIntOrNull() ?: 1
126
+ buffer.append("#".repeat(level))
127
+ buffer.append(" ")
128
+ appendChildren(node, buffer)
129
+ buffer.append("\n")
130
+ }
131
+
132
+ NodeType.CodeBlock -> {
133
+ val code = CodeBlockNode.extractCode(node)
134
+ val language = CodeBlockNode.language(node)
135
+ val fenceChar = CodeBlockNode.fenceChar(node)
136
+ buffer.append(CodeBlockNode.fencedTiptap(code, language, fenceChar))
137
+ buffer.append("\n")
138
+ }
139
+
140
+ NodeType.Blockquote, NodeType.Admonition -> {
141
+ buffer.append(serializeBlockquote(node))
142
+ }
143
+
144
+ NodeType.ThematicBreak -> {
145
+ buffer.append("---\n")
146
+ }
147
+
148
+ NodeType.BlankLine -> {
149
+ val count = node.getAttribute("count")?.toIntOrNull() ?: 0
150
+ repeat(count) { buffer.append("\n") }
151
+ }
152
+
153
+ NodeType.Table -> {
154
+ appendTableTiptap(node, buffer)
155
+ }
156
+
157
+ NodeType.UnorderedList -> {
158
+ appendListTiptap(node, buffer, ordered = false)
159
+ }
160
+
161
+ NodeType.OrderedList -> {
162
+ appendListTiptap(node, buffer, ordered = true)
163
+ }
164
+
165
+ NodeType.LatexMathDisplay -> {
166
+ buffer.append("$$\n")
167
+ appendChildren(node, buffer)
168
+ buffer.append("\n$$\n")
169
+ }
170
+
171
+ else -> {
172
+ appendChildren(node, buffer)
173
+ }
174
+ }
175
+ }
176
+
177
+ // Table tiptap reconstruction from raw AST nodes. This parallels
178
+ // TableContainerView.buildTiptapFromRows() which works from processed
179
+ // TableCellData; both must produce the same pipe-table format.
180
+ private fun appendTableTiptap(
181
+ node: TiptapASTNode,
182
+ buffer: StringBuilder,
183
+ ) {
184
+ var headerDone = false
185
+ for (section in node.children) {
186
+ for (row in section.children) {
187
+ if (row.type != NodeType.TableRow) continue
188
+ val cells = row.children.map { serializeChildren(it) }
189
+ buffer.append("| ")
190
+ buffer.append(cells.joinToString(" | "))
191
+ buffer.append(" |\n")
192
+ if (!headerDone && row.children.any { it.type == NodeType.TableHeaderCell }) {
193
+ val sep =
194
+ row.children.map { cell ->
195
+ when (cell.getAttribute("align")) {
196
+ "center" -> ":---:"
197
+ "right" -> "---:"
198
+ else -> "---"
199
+ }
200
+ }
201
+ buffer.append("| ")
202
+ buffer.append(sep.joinToString(" | "))
203
+ buffer.append(" |\n")
204
+ headerDone = true
205
+ }
206
+ }
207
+ }
208
+ }
209
+
210
+ private fun appendListTiptap(
211
+ node: TiptapASTNode,
212
+ buffer: StringBuilder,
213
+ ordered: Boolean,
214
+ ) {
215
+ var number =
216
+ if (ordered) {
217
+ node.getAttribute("start")?.toIntOrNull()?.coerceAtLeast(0) ?: 1
218
+ } else {
219
+ 1
220
+ }
221
+ for (item in node.children) {
222
+ if (item.type != NodeType.ListItem) continue
223
+ val prefix = if (ordered) "$number. " else "- "
224
+ val content = serializeBlockChildren(item).trimEnd('\n')
225
+ val lines = content.split("\n")
226
+ lines.forEachIndexed { lineIdx, line ->
227
+ if (lineIdx == 0) {
228
+ buffer.append(prefix)
229
+ } else {
230
+ buffer.append(" ".repeat(prefix.length))
231
+ }
232
+ buffer.append(line)
233
+ buffer.append("\n")
234
+ }
235
+ if (ordered) number++
236
+ }
237
+ }
238
+
239
+ // -- Inline serialization -------------------------------------------------------
240
+
241
+ private fun appendNode(
242
+ node: TiptapASTNode,
243
+ buffer: StringBuilder,
244
+ ) {
245
+ when (node.type) {
246
+ NodeType.Text -> {
247
+ buffer.append(node.content)
248
+ }
249
+
250
+ NodeType.LineBreak -> {
251
+ buffer.append("\\\n")
252
+ }
253
+
254
+ NodeType.SoftBreak -> {
255
+ buffer.append("\n")
256
+ }
257
+
258
+ NodeType.Strong -> {
259
+ buffer.append("**")
260
+ appendChildren(node, buffer)
261
+ buffer.append("**")
262
+ }
263
+
264
+ NodeType.Emphasis -> {
265
+ buffer.append("*")
266
+ appendChildren(node, buffer)
267
+ buffer.append("*")
268
+ }
269
+
270
+ NodeType.Strikethrough -> {
271
+ buffer.append("~~")
272
+ appendChildren(node, buffer)
273
+ buffer.append("~~")
274
+ }
275
+
276
+ NodeType.Underline -> {
277
+ buffer.append("__")
278
+ appendChildren(node, buffer)
279
+ buffer.append("__")
280
+ }
281
+
282
+ NodeType.Superscript -> {
283
+ buffer.append("^")
284
+ appendChildren(node, buffer)
285
+ buffer.append("^")
286
+ }
287
+
288
+ NodeType.Subscript -> {
289
+ buffer.append("~")
290
+ appendChildren(node, buffer)
291
+ buffer.append("~")
292
+ }
293
+
294
+ NodeType.Highlight -> {
295
+ buffer.append("==")
296
+ appendChildren(node, buffer)
297
+ buffer.append("==")
298
+ }
299
+
300
+ NodeType.LatexMathInline -> {
301
+ buffer.append("\$")
302
+ appendChildren(node, buffer)
303
+ buffer.append("\$")
304
+ }
305
+
306
+ NodeType.Code -> {
307
+ buffer.append("`")
308
+ appendChildren(node, buffer)
309
+ buffer.append("`")
310
+ }
311
+
312
+ NodeType.Link -> {
313
+ if (node.getAttribute("recognizedLink") == "true") {
314
+ appendChildren(node, buffer)
315
+ return
316
+ }
317
+ val url = node.getAttribute("url") ?: ""
318
+ buffer.append("[")
319
+ appendChildren(node, buffer)
320
+ buffer.append("](")
321
+ buffer.append(url)
322
+ buffer.append(")")
323
+ }
324
+
325
+ NodeType.Image -> {
326
+ val alt = node.getAttribute("alt") ?: ""
327
+ val url = node.getAttribute("url") ?: ""
328
+ buffer.append("![")
329
+ buffer.append(alt)
330
+ buffer.append("](")
331
+ buffer.append(url)
332
+ buffer.append(")")
333
+ }
334
+
335
+ NodeType.Mention -> {
336
+ val name = node.getAttribute("label").orEmpty().ifBlank { node.getAttribute("id").orEmpty() }
337
+ buffer.append('@')
338
+ buffer.append(name)
339
+ }
340
+
341
+ NodeType.Video -> {
342
+ val url = node.getAttribute("url") ?: ""
343
+ if (url.contains('"')) {
344
+ buffer.append("<video src='")
345
+ buffer.append(url)
346
+ buffer.append("' />")
347
+ } else {
348
+ buffer.append("<video src=\"")
349
+ buffer.append(url)
350
+ buffer.append("\" />")
351
+ }
352
+ }
353
+
354
+ else -> {
355
+ appendChildren(node, buffer)
356
+ }
357
+ }
358
+ }
359
+
360
+ private fun appendChildren(
361
+ node: TiptapASTNode,
362
+ buffer: StringBuilder,
363
+ ) {
364
+ for (child in node.children) {
365
+ appendNode(child, buffer)
366
+ }
367
+ }
368
+ }