@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,143 @@
1
+ package com.renderrichtext.renderer
2
+
3
+ import android.content.res.AssetManager
4
+ import android.graphics.Typeface
5
+ import com.facebook.react.common.ReactConstants
6
+ import com.facebook.react.views.text.ReactTypefaceUtils.applyStyles
7
+ import com.renderrichtext.styles.LinkVariantEntry
8
+ import com.renderrichtext.styles.StyleConfig
9
+
10
+ /** Shared style cache for spans to avoid redundant calculations. */
11
+ class SpanStyleCache(
12
+ style: StyleConfig,
13
+ ) {
14
+ private val assetManager: AssetManager = style.assetManager
15
+
16
+ // Colors to preserve when applying inline styles (links, code, strong, emphasis)
17
+ val colorsToPreserve: IntArray = buildColorsToPreserve(style)
18
+
19
+ val strongFontFamily: String = style.strongStyle.fontFamily
20
+ val strongFontWeight: String = style.strongStyle.fontWeight
21
+ val strongColor: Int? = style.strongStyle.color
22
+ val emphasisFontFamily: String = style.emphasisStyle.fontFamily
23
+ val emphasisFontStyle: String = style.emphasisStyle.fontStyle
24
+ val emphasisColor: Int? = style.emphasisStyle.color
25
+ val strikethroughColor: Int = style.strikethroughStyle.color
26
+ val linkFontFamily: String = style.linkStyle.fontFamily
27
+ val linkColor: Int = style.linkStyle.color
28
+ val linkUnderline: Boolean = style.linkStyle.underline
29
+ val linkBackgroundColor: Int = style.linkStyle.backgroundColor
30
+ val linkVariants: List<LinkVariantEntry> = style.linkVariants
31
+
32
+ private val compiledVariantPatterns: List<Pair<Regex, LinkVariantEntry>> =
33
+ linkVariants.mapNotNull { entry ->
34
+ try {
35
+ Regex(entry.pattern) to entry
36
+ } catch (_: Exception) {
37
+ null
38
+ }
39
+ }
40
+
41
+ val codeFontFamily: String = style.codeStyle.fontFamily
42
+ val codeFontSize: Float = style.codeStyle.fontSize
43
+ val codeColor: Int = style.codeStyle.color
44
+ val factoidColor: Int = style.factoidStyle.color
45
+ val factoidBackgroundColor: Int = style.factoidStyle.backgroundColor
46
+ val factoidBorderColor: Int = style.factoidStyle.borderColor
47
+ val spoilerColor: Int = style.spoilerStyle.color
48
+ val spoilerParticleDensity: Float = style.spoilerStyle.particleDensity
49
+ val spoilerParticleSpeed: Float = style.spoilerStyle.particleSpeed
50
+ val spoilerSolidBorderRadius: Float = style.spoilerStyle.solidBorderRadius
51
+ val superscriptFontScale: Float = style.superscriptStyle.fontScale
52
+ val superscriptBaselineOffsetScale: Float = style.superscriptStyle.baselineOffsetScale
53
+ val subscriptFontScale: Float = style.subscriptStyle.fontScale
54
+ val subscriptBaselineOffsetScale: Float = style.subscriptStyle.baselineOffsetScale
55
+ val highlightColor: Int = style.highlightStyle.color
56
+ val highlightBackgroundColor: Int = style.highlightStyle.backgroundColor
57
+ private val paragraphColor: Int = style.paragraphStyle.color
58
+
59
+ private fun buildColorsToPreserve(style: StyleConfig): IntArray {
60
+ val paragraphColor = style.paragraphStyle.color
61
+ return buildList {
62
+ style.strongStyle.color
63
+ ?.takeIf { it != 0 && it != paragraphColor }
64
+ ?.let { add(it) }
65
+ style.emphasisStyle.color
66
+ ?.takeIf { it != 0 && it != paragraphColor }
67
+ ?.let { add(it) }
68
+ style.linkStyle.color
69
+ .takeIf { it != 0 && it != paragraphColor }
70
+ ?.let { add(it) }
71
+ style.linkVariants.forEach { variant ->
72
+ variant.color
73
+ .takeIf { it != 0 && it != paragraphColor }
74
+ ?.let { add(it) }
75
+ }
76
+ style
77
+ .codeStyle
78
+ .color
79
+ .takeIf { it != 0 && it != paragraphColor }
80
+ ?.let { add(it) }
81
+ style.factoidStyle.color
82
+ .takeIf { it != 0 && it != paragraphColor }
83
+ ?.let { add(it) }
84
+ style.taskListStyle.checkedTextColor
85
+ .takeIf { it != 0 && it != paragraphColor }
86
+ ?.let { add(it) }
87
+ }.toIntArray()
88
+ }
89
+
90
+ fun getStrongColorFor(blockColor: Int): Int = strongColor ?: blockColor
91
+
92
+ fun getHighlightColorFor(blockColor: Int): Int = if (highlightColor == paragraphColor) blockColor else highlightColor
93
+
94
+ fun getEmphasisColorFor(
95
+ blockColor: Int,
96
+ currentColor: Int,
97
+ ): Int =
98
+ if (currentColor == blockColor) {
99
+ emphasisColor ?: blockColor
100
+ } else {
101
+ currentColor
102
+ }
103
+
104
+ fun resolvedVariantForUrl(url: String): LinkVariantEntry? {
105
+ if (compiledVariantPatterns.isEmpty()) return null
106
+ return compiledVariantPatterns.firstOrNull { (regex, _) -> regex.containsMatchIn(url) }?.second
107
+ }
108
+
109
+ /**
110
+ * Cached typeface for font family + style (BOLD, ITALIC, BOLD_ITALIC).
111
+ *
112
+ * Loads the base custom font at its NORMAL weight (via applyStyles/ReactFontManager)
113
+ * so the bundled assets/fonts file resolves, then synthesizes bold/italic on that real
114
+ * typeface. Requesting bold/italic directly makes ReactFontManager look for `_bold`/
115
+ * `_italic` asset variants that single-file custom fonts don't have — and it then falls
116
+ * back to a default system face, dropping the custom font entirely.
117
+ */
118
+ fun getTypeface(
119
+ fontFamily: String,
120
+ style: Int,
121
+ ): Typeface =
122
+ typefaceCache.getOrPut("family|$fontFamily|$style") {
123
+ val base =
124
+ applyStyles(
125
+ null,
126
+ ReactConstants.UNSET,
127
+ ReactConstants.UNSET,
128
+ fontFamily.takeIf { it.isNotEmpty() },
129
+ assetManager,
130
+ )
131
+ if (style == Typeface.NORMAL) base else Typeface.create(base, style)
132
+ }
133
+
134
+ companion object {
135
+ private val typefaceCache = mutableMapOf<String, Typeface>()
136
+
137
+ /** Cached monospace typeface preserving bold/italic */
138
+ fun getMonospaceTypeface(currentStyle: Int): Typeface =
139
+ typefaceCache.getOrPut("monospace|$currentStyle") {
140
+ Typeface.create(Typeface.MONOSPACE, currentStyle)
141
+ }
142
+ }
143
+ }
@@ -0,0 +1,28 @@
1
+ package com.renderrichtext.renderer
2
+
3
+ import android.text.SpannableStringBuilder
4
+ import com.renderrichtext.parser.TiptapASTNode
5
+ import com.renderrichtext.spans.StrikethroughSpan
6
+ import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
7
+
8
+ class StrikethroughRenderer(
9
+ private val config: RendererConfig,
10
+ ) : NodeRenderer {
11
+ override fun render(
12
+ node: TiptapASTNode,
13
+ builder: SpannableStringBuilder,
14
+ onLinkPress: ((String) -> Unit)?,
15
+ onLinkLongPress: ((String) -> Unit)?,
16
+ onFactoidPress: ((String) -> Unit)?,
17
+ factory: RendererFactory,
18
+ ) {
19
+ factory.renderWithSpan(builder, { factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress) }) { start, end, blockStyle ->
20
+ builder.setSpan(
21
+ StrikethroughSpan(factory.styleCache.strikethroughColor),
22
+ start,
23
+ end,
24
+ SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
25
+ )
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,28 @@
1
+ package com.renderrichtext.renderer
2
+
3
+ import android.text.SpannableStringBuilder
4
+ import com.renderrichtext.parser.TiptapASTNode
5
+ import com.renderrichtext.spans.StrongSpan
6
+ import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
7
+
8
+ class StrongRenderer(
9
+ private val config: RendererConfig,
10
+ ) : NodeRenderer {
11
+ override fun render(
12
+ node: TiptapASTNode,
13
+ builder: SpannableStringBuilder,
14
+ onLinkPress: ((String) -> Unit)?,
15
+ onLinkLongPress: ((String) -> Unit)?,
16
+ onFactoidPress: ((String) -> Unit)?,
17
+ factory: RendererFactory,
18
+ ) {
19
+ factory.renderWithSpan(builder, { factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress) }) { start, end, blockStyle ->
20
+ builder.setSpan(
21
+ StrongSpan(factory.styleCache, blockStyle),
22
+ start,
23
+ end,
24
+ SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
25
+ )
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,31 @@
1
+ package com.renderrichtext.renderer
2
+
3
+ import android.text.SpannableStringBuilder
4
+ import com.renderrichtext.parser.TiptapASTNode
5
+ import com.renderrichtext.spans.TextSpan
6
+ import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
7
+
8
+ class TextRenderer : NodeRenderer {
9
+ override fun render(
10
+ node: TiptapASTNode,
11
+ builder: SpannableStringBuilder,
12
+ onLinkPress: ((String) -> Unit)?,
13
+ onLinkLongPress: ((String) -> Unit)?,
14
+ onFactoidPress: ((String) -> Unit)?,
15
+ factory: RendererFactory,
16
+ ) {
17
+ val content = node.content
18
+ if (content.isEmpty()) return
19
+
20
+ val blockType = factory.blockStyleContext.currentBlockType
21
+
22
+ factory.renderWithSpan(builder, { builder.append(content) }) { start, end, blockStyle ->
23
+ builder.setSpan(
24
+ TextSpan(blockStyle, factory.context),
25
+ start,
26
+ end,
27
+ SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
28
+ )
29
+ }
30
+ }
31
+ }
@@ -0,0 +1,46 @@
1
+ package com.renderrichtext.renderer
2
+
3
+ import android.text.SpannableStringBuilder
4
+ import com.renderrichtext.parser.TiptapASTNode
5
+ import com.renderrichtext.spans.ThematicBreakSpan
6
+ import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
7
+
8
+ class ThematicBreakRenderer(
9
+ private val config: RendererConfig,
10
+ ) : NodeRenderer {
11
+ override fun render(
12
+ node: TiptapASTNode,
13
+ builder: SpannableStringBuilder,
14
+ onLinkPress: ((String) -> Unit)?,
15
+ onLinkLongPress: ((String) -> Unit)?,
16
+ onFactoidPress: ((String) -> Unit)?,
17
+ factory: RendererFactory,
18
+ ) {
19
+ builder.ensureNewline()
20
+
21
+ val start = builder.length
22
+
23
+ builder.append(" \n")
24
+ val end = builder.length
25
+
26
+ val style = config.style.thematicBreakStyle
27
+
28
+ builder.setSpan(
29
+ ThematicBreakSpan(
30
+ style.color,
31
+ style.height,
32
+ style.marginTop,
33
+ style.marginBottom,
34
+ ),
35
+ start,
36
+ end,
37
+ SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
38
+ )
39
+ }
40
+
41
+ private fun SpannableStringBuilder.ensureNewline() {
42
+ if (isNotEmpty() && this[length - 1] != '\n') {
43
+ append('\n')
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,28 @@
1
+ package com.renderrichtext.renderer
2
+
3
+ import android.text.SpannableStringBuilder
4
+ import android.text.style.UnderlineSpan
5
+ import com.renderrichtext.parser.TiptapASTNode
6
+ import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
7
+
8
+ class UnderlineRenderer(
9
+ private val config: RendererConfig,
10
+ ) : NodeRenderer {
11
+ override fun render(
12
+ node: TiptapASTNode,
13
+ builder: SpannableStringBuilder,
14
+ onLinkPress: ((String) -> Unit)?,
15
+ onLinkLongPress: ((String) -> Unit)?,
16
+ onFactoidPress: ((String) -> Unit)?,
17
+ factory: RendererFactory,
18
+ ) {
19
+ factory.renderWithSpan(builder, { factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress) }) { start, end, _ ->
20
+ builder.setSpan(
21
+ UnderlineSpan(),
22
+ start,
23
+ end,
24
+ SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
25
+ )
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,164 @@
1
+ package com.renderrichtext.spans
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.content.Context
5
+ import android.graphics.Canvas
6
+ import android.graphics.Paint
7
+ import android.graphics.Typeface
8
+ import android.text.Layout
9
+ import android.text.Spanned
10
+ import android.text.TextPaint
11
+ import android.text.style.LeadingMarginSpan
12
+ import android.text.style.MetricAffectingSpan
13
+ import com.renderrichtext.renderer.BlockStyle
14
+ import com.renderrichtext.renderer.SpanStyleCache
15
+ import com.renderrichtext.utils.text.extensions.applyBlockStyleFont
16
+ import com.renderrichtext.utils.text.extensions.applyColorPreserving
17
+
18
+ abstract class BaseListSpan(
19
+ val depth: Int,
20
+ protected val context: Context,
21
+ protected val styleCache: SpanStyleCache,
22
+ protected val blockStyle: BlockStyle,
23
+ protected val marginLeft: Float,
24
+ protected val gapWidth: Float,
25
+ internal val drawsMarker: Boolean = true,
26
+ internal val ancestorMarkerOffset: Float = 0f,
27
+ internal val parentMarkerWidth: Float? = null,
28
+ ) : MetricAffectingSpan(),
29
+ LeadingMarginSpan {
30
+ private var cachedText: CharSequence? = null
31
+ private var cachedHasDeeperSpanByPosition = mutableMapOf<Int, Boolean>()
32
+
33
+ val markerFontMetrics: Paint.FontMetrics by lazy {
34
+ TextPaint()
35
+ .apply {
36
+ applyBlockStyleFont(blockStyle, context)
37
+ textSize = blockStyle.fontSize
38
+ }.fontMetrics
39
+ }
40
+
41
+ protected abstract fun getMarkerWidth(): Float
42
+
43
+ /** How far an ordered list widened this item's column past the one short lists reserve. */
44
+ internal open val markerExtraWidth: Float = 0f
45
+
46
+ /** This item's marker column without [markerExtraWidth]; a nested item measures its indent against it. */
47
+ internal open val baselineMarkerWidth: Float get() = getMarkerWidth()
48
+
49
+ override fun updateMeasureState(textPaint: TextPaint) = applyTextStyle(textPaint)
50
+
51
+ override fun updateDrawState(textPaint: TextPaint) = applyTextStyle(textPaint)
52
+
53
+ override fun getLeadingMargin(first: Boolean): Int {
54
+ val effectiveGap = gapWidth.coerceAtLeast(DEFAULT_MIN_GAP)
55
+ if (depth == 0) return (getMarkerWidth() + effectiveGap).toInt()
56
+
57
+ // Subtract truncated absolute indents, each measured from its own item's column, so neither mixed
58
+ // columns nor fractional margins accumulate rounding. The widenings are whole pixels and add unchanged.
59
+ val markerWidth = baselineMarkerWidth
60
+ val parentWidth = parentMarkerWidth ?: markerWidth
61
+ val indent = (depth * marginLeft + markerWidth + effectiveGap).toInt()
62
+ val parentIndent = ((depth - 1) * marginLeft + parentWidth + effectiveGap).toInt()
63
+ return indent - parentIndent + markerExtraWidth.toInt()
64
+ }
65
+
66
+ override fun drawLeadingMargin(
67
+ canvas: Canvas,
68
+ paint: Paint,
69
+ x: Int,
70
+ dir: Int,
71
+ top: Int,
72
+ baseline: Int,
73
+ bottom: Int,
74
+ text: CharSequence?,
75
+ start: Int,
76
+ end: Int,
77
+ first: Boolean,
78
+ layout: Layout?,
79
+ ) {
80
+ if (!drawsMarker) return
81
+ if (!first || shouldSkipDrawing(text, start) || !hasContent(text, start, end)) return
82
+
83
+ // Only draw the marker on the true first line of this span.
84
+ // \n inside list item content creates inner paragraphs, each with first=true,
85
+ // but only the line at the span start should get a bullet/number.
86
+ if (text is Spanned && text.getSpanStart(this) != start) return
87
+
88
+ drawMarkerAt(canvas, paint, x, dir, top, baseline, bottom, layout, start)
89
+ }
90
+
91
+ fun drawMarkerAt(
92
+ canvas: Canvas,
93
+ paint: Paint,
94
+ x: Int,
95
+ dir: Int,
96
+ top: Int,
97
+ baseline: Int,
98
+ bottom: Int,
99
+ layout: Layout?,
100
+ start: Int,
101
+ ) {
102
+ val originalStyle = paint.style
103
+ val originalColor = paint.color
104
+ drawMarker(canvas, paint, x, dir, top, baseline, bottom, layout, start)
105
+ paint.style = originalStyle
106
+ paint.color = originalColor
107
+ }
108
+
109
+ protected abstract fun drawMarker(
110
+ canvas: Canvas,
111
+ paint: Paint,
112
+ x: Int,
113
+ dir: Int,
114
+ top: Int,
115
+ baseline: Int,
116
+ bottom: Int,
117
+ layout: Layout?,
118
+ start: Int,
119
+ )
120
+
121
+ @SuppressLint("WrongConstant")
122
+ private fun applyTextStyle(textPaint: TextPaint) {
123
+ textPaint.textSize = blockStyle.fontSize
124
+
125
+ val preservedStyle = (textPaint.typeface?.style ?: 0) and BOLD_ITALIC_MASK
126
+ textPaint.applyBlockStyleFont(blockStyle, context)
127
+ if (preservedStyle != 0) {
128
+ textPaint.typeface?.let { base -> textPaint.typeface = Typeface.create(base, preservedStyle) }
129
+ }
130
+
131
+ textPaint.applyColorPreserving(blockStyle.color, *styleCache.colorsToPreserve)
132
+ }
133
+
134
+ companion object {
135
+ private const val BOLD_ITALIC_MASK = Typeface.BOLD or Typeface.ITALIC
136
+ private const val DEFAULT_MIN_GAP = 4f
137
+ }
138
+
139
+ private fun hasContent(
140
+ text: CharSequence?,
141
+ start: Int,
142
+ end: Int,
143
+ ): Boolean {
144
+ if (text == null || end <= start) return false
145
+ return (start until end).any { !text[it].isWhitespace() }
146
+ }
147
+
148
+ private fun shouldSkipDrawing(
149
+ text: CharSequence?,
150
+ start: Int,
151
+ ): Boolean {
152
+ if (text !is Spanned) return false
153
+
154
+ if (cachedText !== text) {
155
+ cachedText = text
156
+ cachedHasDeeperSpanByPosition.clear()
157
+ }
158
+
159
+ return cachedHasDeeperSpanByPosition.getOrPut(start) {
160
+ val spans = text.getSpans(start, start + 1, BaseListSpan::class.java)
161
+ spans.any { it.depth > depth }
162
+ }
163
+ }
164
+ }
@@ -0,0 +1,27 @@
1
+ package com.renderrichtext.spans
2
+
3
+ import android.text.TextPaint
4
+ import android.text.style.MetricAffectingSpan
5
+ import kotlin.math.roundToInt
6
+
7
+ class BaselineShiftSpan(
8
+ private val fontScale: Float,
9
+ private val baselineOffsetScale: Float,
10
+ val spanType: SpanType,
11
+ ) : MetricAffectingSpan() {
12
+ enum class SpanType { SUPERSCRIPT, SUBSCRIPT }
13
+
14
+ override fun updateDrawState(tp: TextPaint) {
15
+ applyShift(tp)
16
+ }
17
+
18
+ override fun updateMeasureState(tp: TextPaint) {
19
+ applyShift(tp)
20
+ }
21
+
22
+ private fun applyShift(tp: TextPaint) {
23
+ val originalTextSize = tp.textSize
24
+ tp.textSize = originalTextSize * fontScale
25
+ tp.baselineShift -= (originalTextSize * baselineOffsetScale).roundToInt()
26
+ }
27
+ }