@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,148 +1,148 @@
1
- package com.renderrichtext.renderer
2
-
3
- import android.content.Context
4
- import android.text.SpannableStringBuilder
5
- import com.renderrichtext.math.LatexErrorReporter
6
- import com.renderrichtext.parser.TiptapASTNode
7
- import com.renderrichtext.spans.ImageSpan
8
- import com.renderrichtext.spans.MarginBottomSpan
9
- import com.renderrichtext.styles.StyleConfig
10
-
11
- class Renderer {
12
- private var cachedFactory: RendererFactory? = null
13
- private var cachedStyle: StyleConfig? = null
14
- private var cachedContext: Context? = null
15
- private var cachedOnLatexError: LatexErrorReporter? = null
16
-
17
- private val collectedImageSpans = mutableListOf<ImageSpan>()
18
- private var lastElementMarginBottom: Float = 0f
19
-
20
- fun configure(
21
- style: StyleConfig,
22
- context: Context,
23
- onLatexError: LatexErrorReporter? = null,
24
- ) {
25
- if (cachedStyle === style && cachedContext === context && cachedOnLatexError === onLatexError) return
26
-
27
- cachedStyle = style
28
- cachedContext = context
29
- cachedOnLatexError = onLatexError
30
- cachedFactory =
31
- RendererFactory(
32
- RendererConfig(style, onLatexError),
33
- context,
34
- ) { span -> reportImageSpan(span) }
35
- }
36
-
37
- fun renderDocument(
38
- document: TiptapASTNode,
39
- onLinkPress: ((String) -> Unit)? = null,
40
- onLinkLongPress: ((String) -> Unit)? = null,
41
- onFactoidPress: ((String) -> Unit)? = null,
42
- onMentionPress: ((String, String) -> Unit)? = null,
43
- onMentionLongPress: ((String, String) -> Unit)? = null,
44
- ): SpannableStringBuilder =
45
- renderContent(
46
- document.children,
47
- onLinkPress,
48
- onLinkLongPress,
49
- onFactoidPress,
50
- onMentionPress,
51
- onMentionLongPress,
52
- )
53
-
54
- /**
55
- * Renders a flat list of sibling nodes into a fresh buffer and hands over
56
- * ownership of it. This is the generic envelope shared by the document and
57
- * block-segment paths: reset the factory, build the spannable, trim the trailing
58
- * margin, and flush deferred spans (e.g. BaselineShiftSpan) after all block-level
59
- * spans are set - see BaselineShiftRenderer for the proper long-term fix.
60
- *
61
- * An optional [block] decorates the pass - it enters a block style before the
62
- * nodes render and post-processes the finished builder - letting a caller render
63
- * content as e.g. blockquote text without this class knowing anything
64
- * block-specific. See [BlockquoteTextRenderer].
65
- *
66
- * The builder is returned as-is rather than frozen into a `SpannableString`:
67
- * the tiptap text view adopts it verbatim (see `NoCopySpannableFactory`),
68
- * and converting it would cost a quadratic span copy for no benefit. Each call
69
- * builds its own buffer, so callers must not mutate one they have passed on.
70
- */
71
- fun renderContent(
72
- nodes: List<TiptapASTNode>,
73
- onLinkPress: ((String) -> Unit)? = null,
74
- onLinkLongPress: ((String) -> Unit)? = null,
75
- onFactoidPress: ((String) -> Unit)? = null,
76
- onMentionPress: ((String, String) -> Unit)? = null,
77
- onMentionLongPress: ((String, String) -> Unit)? = null,
78
- block: BlockquoteTextRenderer? = null,
79
- ): SpannableStringBuilder {
80
- val factory =
81
- requireNotNull(cachedFactory) {
82
- "Renderer must be configured with a style before rendering."
83
- }
84
-
85
- factory.resetForNewRender()
86
- factory.onMentionPress = onMentionPress
87
- factory.onMentionLongPress = onMentionLongPress
88
- collectedImageSpans.clear()
89
- lastElementMarginBottom = 0f
90
-
91
- val builder = SpannableStringBuilder()
92
-
93
- block?.push(factory.blockStyleContext)
94
- try {
95
- factory.renderNodes(nodes, builder, onLinkPress, onLinkLongPress, onFactoidPress)
96
- } finally {
97
- block?.pop(factory.blockStyleContext)
98
- }
99
-
100
- removeTrailingMargin(builder)
101
- block?.postProcess(builder)
102
- factory.flushDeferredSpans(builder)
103
-
104
- return builder
105
- }
106
-
107
- /** Removes trailing newlines and captures the margin of the final element. */
108
- private fun removeTrailingMargin(builder: SpannableStringBuilder) {
109
- if (builder.isEmpty()) return
110
-
111
- // Identify the last margin span and store its value
112
- val lastSpan =
113
- builder
114
- .getSpans(0, builder.length, MarginBottomSpan::class.java)
115
- .maxByOrNull { builder.getSpanEnd(it) }
116
-
117
- lastElementMarginBottom = lastSpan?.marginBottom ?: 0f
118
-
119
- // Trim trailing newlines
120
- while (builder.endsWith('\n')) {
121
- builder.delete(builder.length - 1, builder.length)
122
- }
123
-
124
- // Clean up the span if it no longer covers any text
125
- if (lastSpan != null && builder.getSpanEnd(lastSpan) >= builder.length) {
126
- builder.removeSpan(lastSpan)
127
- }
128
- }
129
-
130
- /**
131
- * Returns the marginBottom value of the last element in the document.
132
- * This is dynamically determined from the actual last element (paragraph, image, heading, etc.)
133
- * and can be used in MeasurementStore to adjust the measured height.
134
- */
135
- fun getLastElementMarginBottom(): Float = lastElementMarginBottom
136
-
137
- /**
138
- * Internal helper used by the Factory's lambda to collect spans.
139
- */
140
- private fun reportImageSpan(span: ImageSpan) {
141
- collectedImageSpans.add(span)
142
- }
143
-
144
- /**
145
- * Provides the EnrichedTiptapText with the exact list of spans that need registration.
146
- */
147
- fun getCollectedImageSpans(): List<ImageSpan> = collectedImageSpans
148
- }
1
+ package com.renderrichtext.renderer
2
+
3
+ import android.content.Context
4
+ import android.text.SpannableStringBuilder
5
+ import com.renderrichtext.math.LatexErrorReporter
6
+ import com.renderrichtext.parser.TiptapASTNode
7
+ import com.renderrichtext.spans.ImageSpan
8
+ import com.renderrichtext.spans.MarginBottomSpan
9
+ import com.renderrichtext.styles.StyleConfig
10
+
11
+ class Renderer {
12
+ private var cachedFactory: RendererFactory? = null
13
+ private var cachedStyle: StyleConfig? = null
14
+ private var cachedContext: Context? = null
15
+ private var cachedOnLatexError: LatexErrorReporter? = null
16
+
17
+ private val collectedImageSpans = mutableListOf<ImageSpan>()
18
+ private var lastElementMarginBottom: Float = 0f
19
+
20
+ fun configure(
21
+ style: StyleConfig,
22
+ context: Context,
23
+ onLatexError: LatexErrorReporter? = null,
24
+ ) {
25
+ if (cachedStyle === style && cachedContext === context && cachedOnLatexError === onLatexError) return
26
+
27
+ cachedStyle = style
28
+ cachedContext = context
29
+ cachedOnLatexError = onLatexError
30
+ cachedFactory =
31
+ RendererFactory(
32
+ RendererConfig(style, onLatexError),
33
+ context,
34
+ ) { span -> reportImageSpan(span) }
35
+ }
36
+
37
+ fun renderDocument(
38
+ document: TiptapASTNode,
39
+ onLinkPress: ((String) -> Unit)? = null,
40
+ onLinkLongPress: ((String) -> Unit)? = null,
41
+ onFactoidPress: ((String) -> Unit)? = null,
42
+ onMentionPress: ((String, String) -> Unit)? = null,
43
+ onMentionLongPress: ((String, String) -> Unit)? = null,
44
+ ): SpannableStringBuilder =
45
+ renderContent(
46
+ document.children,
47
+ onLinkPress,
48
+ onLinkLongPress,
49
+ onFactoidPress,
50
+ onMentionPress,
51
+ onMentionLongPress,
52
+ )
53
+
54
+ /**
55
+ * Renders a flat list of sibling nodes into a fresh buffer and hands over
56
+ * ownership of it. This is the generic envelope shared by the document and
57
+ * block-segment paths: reset the factory, build the spannable, trim the trailing
58
+ * margin, and flush deferred spans (e.g. BaselineShiftSpan) after all block-level
59
+ * spans are set - see BaselineShiftRenderer for the proper long-term fix.
60
+ *
61
+ * An optional [block] decorates the pass - it enters a block style before the
62
+ * nodes render and post-processes the finished builder - letting a caller render
63
+ * content as e.g. blockquote text without this class knowing anything
64
+ * block-specific. See [BlockquoteTextRenderer].
65
+ *
66
+ * The builder is returned as-is rather than frozen into a `SpannableString`:
67
+ * the tiptap text view adopts it verbatim (see `NoCopySpannableFactory`),
68
+ * and converting it would cost a quadratic span copy for no benefit. Each call
69
+ * builds its own buffer, so callers must not mutate one they have passed on.
70
+ */
71
+ fun renderContent(
72
+ nodes: List<TiptapASTNode>,
73
+ onLinkPress: ((String) -> Unit)? = null,
74
+ onLinkLongPress: ((String) -> Unit)? = null,
75
+ onFactoidPress: ((String) -> Unit)? = null,
76
+ onMentionPress: ((String, String) -> Unit)? = null,
77
+ onMentionLongPress: ((String, String) -> Unit)? = null,
78
+ block: BlockquoteTextRenderer? = null,
79
+ ): SpannableStringBuilder {
80
+ val factory =
81
+ requireNotNull(cachedFactory) {
82
+ "Renderer must be configured with a style before rendering."
83
+ }
84
+
85
+ factory.resetForNewRender()
86
+ factory.onMentionPress = onMentionPress
87
+ factory.onMentionLongPress = onMentionLongPress
88
+ collectedImageSpans.clear()
89
+ lastElementMarginBottom = 0f
90
+
91
+ val builder = SpannableStringBuilder()
92
+
93
+ block?.push(factory.blockStyleContext)
94
+ try {
95
+ factory.renderNodes(nodes, builder, onLinkPress, onLinkLongPress, onFactoidPress)
96
+ } finally {
97
+ block?.pop(factory.blockStyleContext)
98
+ }
99
+
100
+ removeTrailingMargin(builder)
101
+ block?.postProcess(builder)
102
+ factory.flushDeferredSpans(builder)
103
+
104
+ return builder
105
+ }
106
+
107
+ /** Removes trailing newlines and captures the margin of the final element. */
108
+ private fun removeTrailingMargin(builder: SpannableStringBuilder) {
109
+ if (builder.isEmpty()) return
110
+
111
+ // Identify the last margin span and store its value
112
+ val lastSpan =
113
+ builder
114
+ .getSpans(0, builder.length, MarginBottomSpan::class.java)
115
+ .maxByOrNull { builder.getSpanEnd(it) }
116
+
117
+ lastElementMarginBottom = lastSpan?.marginBottom ?: 0f
118
+
119
+ // Trim trailing newlines
120
+ while (builder.endsWith('\n')) {
121
+ builder.delete(builder.length - 1, builder.length)
122
+ }
123
+
124
+ // Clean up the span if it no longer covers any text
125
+ if (lastSpan != null && builder.getSpanEnd(lastSpan) >= builder.length) {
126
+ builder.removeSpan(lastSpan)
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Returns the marginBottom value of the last element in the document.
132
+ * This is dynamically determined from the actual last element (paragraph, image, heading, etc.)
133
+ * and can be used in MeasurementStore to adjust the measured height.
134
+ */
135
+ fun getLastElementMarginBottom(): Float = lastElementMarginBottom
136
+
137
+ /**
138
+ * Internal helper used by the Factory's lambda to collect spans.
139
+ */
140
+ private fun reportImageSpan(span: ImageSpan) {
141
+ collectedImageSpans.add(span)
142
+ }
143
+
144
+ /**
145
+ * Provides the EnrichedTiptapText with the exact list of spans that need registration.
146
+ */
147
+ fun getCollectedImageSpans(): List<ImageSpan> = collectedImageSpans
148
+ }
@@ -1,17 +1,17 @@
1
- package com.renderrichtext.renderer
2
-
3
- import android.text.SpannableStringBuilder
4
- import com.renderrichtext.parser.TiptapASTNode
5
-
6
- class SoftBreakRenderer : NodeRenderer {
7
- override fun render(
8
- node: TiptapASTNode,
9
- builder: SpannableStringBuilder,
10
- onLinkPress: ((String) -> Unit)?,
11
- onLinkLongPress: ((String) -> Unit)?,
12
- onFactoidPress: ((String) -> Unit)?,
13
- factory: RendererFactory,
14
- ) {
15
- builder.append(" ")
16
- }
17
- }
1
+ package com.renderrichtext.renderer
2
+
3
+ import android.text.SpannableStringBuilder
4
+ import com.renderrichtext.parser.TiptapASTNode
5
+
6
+ class SoftBreakRenderer : NodeRenderer {
7
+ override fun render(
8
+ node: TiptapASTNode,
9
+ builder: SpannableStringBuilder,
10
+ onLinkPress: ((String) -> Unit)?,
11
+ onLinkLongPress: ((String) -> Unit)?,
12
+ onFactoidPress: ((String) -> Unit)?,
13
+ factory: RendererFactory,
14
+ ) {
15
+ builder.append(" ")
16
+ }
17
+ }
@@ -1,143 +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
- }
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
+ }