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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,28 @@
1
+ package com.renderrichtext.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class ContextMenuItemPressEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val itemText: String,
11
+ private val selectedText: String,
12
+ private val selectionStart: Int,
13
+ private val selectionEnd: Int,
14
+ ) : Event<ContextMenuItemPressEvent>(surfaceId, viewId) {
15
+ override fun getEventName(): String = EVENT_NAME
16
+
17
+ override fun getEventData(): WritableMap =
18
+ Arguments.createMap().apply {
19
+ putString("itemText", itemText)
20
+ putString("selectedText", selectedText)
21
+ putInt("selectionStart", selectionStart)
22
+ putInt("selectionEnd", selectionEnd)
23
+ }
24
+
25
+ companion object {
26
+ const val EVENT_NAME = "onContextMenuItemPress"
27
+ }
28
+ }
@@ -0,0 +1,24 @@
1
+ package com.renderrichtext.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class CopyPressEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val code: String,
11
+ private val language: String,
12
+ ) : Event<CopyPressEvent>(surfaceId, viewId) {
13
+ override fun getEventName(): String = EVENT_NAME
14
+
15
+ override fun getEventData(): WritableMap =
16
+ Arguments.createMap().apply {
17
+ putString("code", code)
18
+ putString("language", language)
19
+ }
20
+
21
+ companion object {
22
+ const val EVENT_NAME: String = "onCopyPress"
23
+ }
24
+ }
@@ -0,0 +1,23 @@
1
+ package com.renderrichtext.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class FactoidPressEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val factoidId: String,
11
+ ) : Event<FactoidPressEvent>(surfaceId, viewId) {
12
+ override fun getEventName(): String = EVENT_NAME
13
+
14
+ override fun getEventData(): WritableMap {
15
+ val eventData: WritableMap = Arguments.createMap()
16
+ eventData.putString("factoidId", factoidId)
17
+ return eventData
18
+ }
19
+
20
+ companion object {
21
+ const val EVENT_NAME: String = "onFactoidPress"
22
+ }
23
+ }
@@ -0,0 +1,25 @@
1
+ package com.renderrichtext.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class ImagePressEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val url: String,
11
+ private val altText: String,
12
+ ) : Event<ImagePressEvent>(surfaceId, viewId) {
13
+ override fun getEventName(): String = EVENT_NAME
14
+
15
+ override fun getEventData(): WritableMap {
16
+ val eventData: WritableMap = Arguments.createMap()
17
+ eventData.putString("url", url)
18
+ eventData.putString("altText", altText)
19
+ return eventData
20
+ }
21
+
22
+ companion object {
23
+ const val EVENT_NAME: String = "onImagePress"
24
+ }
25
+ }
@@ -0,0 +1,29 @@
1
+ package com.renderrichtext.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class LatexErrorEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val source: String,
11
+ private val message: String?,
12
+ private val displayMode: Boolean,
13
+ ) : Event<LatexErrorEvent>(surfaceId, viewId) {
14
+ override fun getEventName(): String = EVENT_NAME
15
+
16
+ override fun canCoalesce(): Boolean = false
17
+
18
+ override fun getEventData(): WritableMap {
19
+ val eventData: WritableMap = Arguments.createMap()
20
+ eventData.putString("source", source)
21
+ eventData.putString("message", message)
22
+ eventData.putBoolean("displayMode", displayMode)
23
+ return eventData
24
+ }
25
+
26
+ companion object {
27
+ const val EVENT_NAME: String = "onLatexError"
28
+ }
29
+ }
@@ -0,0 +1,23 @@
1
+ package com.renderrichtext.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class LinkLongPressEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val url: String,
11
+ ) : Event<LinkLongPressEvent>(surfaceId, viewId) {
12
+ override fun getEventName(): String = EVENT_NAME
13
+
14
+ override fun getEventData(): WritableMap {
15
+ val eventData: WritableMap = Arguments.createMap()
16
+ eventData.putString("url", url)
17
+ return eventData
18
+ }
19
+
20
+ companion object {
21
+ const val EVENT_NAME: String = "onLinkLongPress"
22
+ }
23
+ }
@@ -0,0 +1,23 @@
1
+ package com.renderrichtext.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class LinkPressEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val url: String,
11
+ ) : Event<LinkPressEvent>(surfaceId, viewId) {
12
+ override fun getEventName(): String = EVENT_NAME
13
+
14
+ override fun getEventData(): WritableMap {
15
+ val eventData: WritableMap = Arguments.createMap()
16
+ eventData.putString("url", url)
17
+ return eventData
18
+ }
19
+
20
+ companion object {
21
+ const val EVENT_NAME: String = "onLinkPress"
22
+ }
23
+ }
@@ -0,0 +1,25 @@
1
+ package com.renderrichtext.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class MentionLongPressEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val mentionId: String,
11
+ private val label: String,
12
+ ) : Event<MentionLongPressEvent>(surfaceId, viewId) {
13
+ override fun getEventName(): String = EVENT_NAME
14
+
15
+ override fun getEventData(): WritableMap {
16
+ val eventData: WritableMap = Arguments.createMap()
17
+ eventData.putString("mentionId", mentionId)
18
+ eventData.putString("label", label)
19
+ return eventData
20
+ }
21
+
22
+ companion object {
23
+ const val EVENT_NAME: String = "onMentionLongPress"
24
+ }
25
+ }
@@ -0,0 +1,25 @@
1
+ package com.renderrichtext.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class MentionPressEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val mentionId: String,
11
+ private val label: String,
12
+ ) : Event<MentionPressEvent>(surfaceId, viewId) {
13
+ override fun getEventName(): String = EVENT_NAME
14
+
15
+ override fun getEventData(): WritableMap {
16
+ val eventData: WritableMap = Arguments.createMap()
17
+ eventData.putString("mentionId", mentionId)
18
+ eventData.putString("label", label)
19
+ return eventData
20
+ }
21
+
22
+ companion object {
23
+ const val EVENT_NAME: String = "onMentionPress"
24
+ }
25
+ }
@@ -0,0 +1,26 @@
1
+ package com.renderrichtext.events
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+
7
+ class TaskListItemPressEvent(
8
+ surfaceId: Int,
9
+ viewId: Int,
10
+ private val taskIndex: Int,
11
+ private val checked: Boolean,
12
+ private val itemText: String,
13
+ ) : Event<TaskListItemPressEvent>(surfaceId, viewId) {
14
+ override fun getEventName(): String = EVENT_NAME
15
+
16
+ override fun getEventData(): WritableMap =
17
+ Arguments.createMap().apply {
18
+ putInt("index", taskIndex)
19
+ putBoolean("checked", checked)
20
+ putString("text", itemText)
21
+ }
22
+
23
+ companion object {
24
+ const val EVENT_NAME: String = "onTaskListItemPress"
25
+ }
26
+ }
@@ -0,0 +1,9 @@
1
+ package com.renderrichtext.math
2
+
3
+ fun interface LatexErrorReporter {
4
+ fun report(
5
+ source: String,
6
+ message: String,
7
+ displayMode: Boolean,
8
+ )
9
+ }
@@ -0,0 +1,59 @@
1
+ package com.renderrichtext.parser
2
+
3
+ import android.util.Log
4
+ import com.renderrichtext.utils.common.LinkRegexConfig
5
+
6
+ data class Md4cFlags(
7
+ val underline: Boolean = false,
8
+ val latexMath: Boolean = false,
9
+ val superscript: Boolean = false,
10
+ val subscript: Boolean = false,
11
+ val highlight: Boolean = false,
12
+ val permissiveAutolinks: Boolean = true,
13
+ val hardSoftBreaks: Boolean = false,
14
+ val preserveBlankLines: Boolean = false,
15
+ val admonitions: Boolean = false,
16
+ ) {
17
+ companion object {
18
+ val DEFAULT = Md4cFlags()
19
+ }
20
+ }
21
+
22
+ class Parser {
23
+ companion object {
24
+ init {
25
+ try {
26
+ System.loadLibrary("react_codegen_RichTextSpec")
27
+ } catch (e: UnsatisfiedLinkError) {
28
+ Log.e("TiptapParser", "Failed to load native library", e)
29
+ }
30
+ }
31
+
32
+ @JvmStatic
33
+ private external fun nativeParseDocument(document: String): TiptapASTNode?
34
+
35
+ val shared: Parser = Parser()
36
+ }
37
+
38
+ /**
39
+ * Parses a Tiptap document JSON string. Flag and regex arguments are kept so
40
+ * copied call sites compile; the Tiptap parser ignores them.
41
+ */
42
+ fun parseTiptap(
43
+ tiptap: String,
44
+ flags: Md4cFlags = Md4cFlags.DEFAULT,
45
+ isGFM: Boolean = true,
46
+ linkRegex: LinkRegexConfig? = null,
47
+ inlineCodeLinkRegex: LinkRegexConfig? = null,
48
+ ): TiptapASTNode? {
49
+ if (tiptap.isBlank()) {
50
+ return null
51
+ }
52
+ try {
53
+ return nativeParseDocument(tiptap)
54
+ } catch (e: Exception) {
55
+ Log.e("TiptapParser", "Tiptap parsing failed: ${e.message}", e)
56
+ return null
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,35 @@
1
+ package com.renderrichtext.parser
2
+
3
+ import com.renderrichtext.utils.common.LinkRegexConfig
4
+
5
+ /** Host matchers the native parser calls back into; offsets are UTF-16 code units, as the core expects. */
6
+ internal object TextLinkMatching {
7
+ /** Flat (run index, start, end) triples for every nonempty match, in order. */
8
+ @JvmStatic
9
+ fun matchText(
10
+ runs: Array<String>,
11
+ config: LinkRegexConfig,
12
+ ): IntArray {
13
+ val pattern = config.compiled ?: return IntArray(0)
14
+ val result = ArrayList<Int>()
15
+ runs.forEachIndexed { index, run ->
16
+ val matcher = pattern.matcher(run)
17
+ while (matcher.find()) {
18
+ if (matcher.end() == matcher.start()) continue
19
+ result.add(index)
20
+ result.add(matcher.start())
21
+ result.add(matcher.end())
22
+ }
23
+ }
24
+ return result.toIntArray()
25
+ }
26
+
27
+ @JvmStatic
28
+ fun matchWholeCode(
29
+ spans: Array<String>,
30
+ config: LinkRegexConfig,
31
+ ): BooleanArray {
32
+ val pattern = config.compiledWholeSpan ?: return BooleanArray(spans.size)
33
+ return BooleanArray(spans.size) { index -> pattern.matcher(spans[index]).find() }
34
+ }
35
+ }
@@ -0,0 +1,69 @@
1
+ package com.renderrichtext.parser
2
+
3
+ data class TiptapASTNode(
4
+ val type: NodeType,
5
+ val content: String = "",
6
+ val attributes: Map<String, String> = emptyMap(),
7
+ val children: List<TiptapASTNode> = emptyList(),
8
+ ) {
9
+ enum class NodeType {
10
+ Document,
11
+ Paragraph,
12
+ Text,
13
+ Link,
14
+ Heading,
15
+ LineBreak,
16
+ Strong,
17
+ Emphasis,
18
+ Strikethrough,
19
+ Underline,
20
+ Code,
21
+ Image,
22
+ Blockquote,
23
+ UnorderedList,
24
+ OrderedList,
25
+ ListItem,
26
+ CodeBlock,
27
+ ThematicBreak,
28
+ Table,
29
+ TableHead,
30
+ TableBody,
31
+ TableRow,
32
+ TableHeaderCell,
33
+ TableCell,
34
+ LatexMathInline,
35
+ LatexMathDisplay,
36
+ Spoiler,
37
+ Superscript,
38
+ Subscript,
39
+ Highlight,
40
+ SoftBreak,
41
+ BlankLine,
42
+ Admonition,
43
+ Video,
44
+ Factoid,
45
+ Mention,
46
+ }
47
+
48
+ fun getAttribute(key: String): String? = attributes[key]
49
+ }
50
+
51
+ // A node type that md4c emits as a standalone block stacked vertically, as opposed to an inline span.
52
+ internal fun TiptapASTNode.NodeType.isTopLevelBlock(): Boolean =
53
+ when (this) {
54
+ TiptapASTNode.NodeType.Paragraph,
55
+ TiptapASTNode.NodeType.Heading,
56
+ TiptapASTNode.NodeType.Blockquote,
57
+ TiptapASTNode.NodeType.Admonition,
58
+ TiptapASTNode.NodeType.UnorderedList,
59
+ TiptapASTNode.NodeType.OrderedList,
60
+ TiptapASTNode.NodeType.CodeBlock,
61
+ TiptapASTNode.NodeType.ThematicBreak,
62
+ TiptapASTNode.NodeType.BlankLine,
63
+ TiptapASTNode.NodeType.Table,
64
+ TiptapASTNode.NodeType.LatexMathDisplay,
65
+ TiptapASTNode.NodeType.Video,
66
+ -> true
67
+
68
+ else -> false
69
+ }
@@ -0,0 +1,45 @@
1
+ package com.renderrichtext.renderer
2
+
3
+ import android.text.SpannableStringBuilder
4
+ import com.renderrichtext.parser.TiptapASTNode
5
+ import com.renderrichtext.spans.BaselineShiftSpan
6
+
7
+ abstract class BaselineShiftRenderer : NodeRenderer {
8
+ abstract fun fontScale(factory: RendererFactory): Float
9
+
10
+ abstract fun baselineOffsetScale(factory: RendererFactory): Float
11
+
12
+ abstract fun spanType(): BaselineShiftSpan.SpanType
13
+
14
+ override fun render(
15
+ node: TiptapASTNode,
16
+ builder: SpannableStringBuilder,
17
+ onLinkPress: ((String) -> Unit)?,
18
+ onLinkLongPress: ((String) -> Unit)?,
19
+ onFactoidPress: ((String) -> Unit)?,
20
+ factory: RendererFactory,
21
+ ) {
22
+ val start = builder.length
23
+ factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress)
24
+ val end = builder.length
25
+
26
+ if (end > start) {
27
+ // Block renderers (ListItemRenderer, BlockquoteRenderer, …) add their
28
+ // MetricAffectingSpan AFTER rendering children because they need the full range.
29
+ // Android applies spans in insertion order, so block spans that set tp.textSize
30
+ // absolutely always run last and override fontScale. Deferring this span ensures
31
+ // it is inserted after all block spans and wins.
32
+ //
33
+ // TODO: consider pre-registering each block span with an empty range before
34
+ // renderChildren(), then update the range in-place with a second setSpan() call.
35
+ // SpannableStringBuilder updates the range without moving the span in the array,
36
+ // so block spans stay first and inline spans naturally follow. Once done, remove
37
+ // the deferredSpans mechanism.
38
+ factory.registerDeferredSpan(
39
+ BaselineShiftSpan(fontScale(factory), baselineOffsetScale(factory), spanType()),
40
+ start,
41
+ end,
42
+ )
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,39 @@
1
+ package com.renderrichtext.renderer
2
+
3
+ import android.text.SpannableStringBuilder
4
+ import com.renderrichtext.parser.TiptapASTNode
5
+ import com.renderrichtext.utils.text.span.applyLineHeightSkippingImages
6
+
7
+ // Renders a run of consecutive blank lines emitted when preserveBlankLines is
8
+ // enabled. Each blank line in the source is drawn as one empty line, using the
9
+ // paragraph line height so its vertical rhythm matches the surrounding
10
+ // paragraphs. Any extra block spacing comes from the paragraph style and is left
11
+ // to the caller to configure.
12
+ class BlankLineRenderer(
13
+ private val config: RendererConfig,
14
+ ) : NodeRenderer {
15
+ override fun render(
16
+ node: TiptapASTNode,
17
+ builder: SpannableStringBuilder,
18
+ onLinkPress: ((String) -> Unit)?,
19
+ onLinkLongPress: ((String) -> Unit)?,
20
+ onFactoidPress: ((String) -> Unit)?,
21
+ factory: RendererFactory,
22
+ ) {
23
+ val count = node.getAttribute("count")?.toIntOrNull() ?: 0
24
+ if (count <= 0) {
25
+ return
26
+ }
27
+
28
+ builder.ensureNewline()
29
+ val start = builder.length
30
+ builder.append("\n".repeat(count))
31
+ applyLineHeightSkippingImages(builder, start, builder.length, config.style.paragraphStyle.lineHeight)
32
+ }
33
+
34
+ private fun SpannableStringBuilder.ensureNewline() {
35
+ if (isNotEmpty() && this[length - 1] != '\n') {
36
+ append('\n')
37
+ }
38
+ }
39
+ }