@mathers101/react-native-render-rich-text 0.1.10 → 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,286 +1,286 @@
1
- package com.renderrichtext.utils.text.interaction
2
-
3
- import android.text.Spannable
4
- import android.text.SpannableStringBuilder
5
- import android.text.Spanned
6
- import android.text.style.ForegroundColorSpan
7
- import android.text.style.StrikethroughSpan
8
- import android.widget.TextView
9
- import com.renderrichtext.renderer.SpanStyleCache
10
- import com.renderrichtext.spans.BaseListSpan
11
- import com.renderrichtext.spans.CodeBlockSpan
12
- import com.renderrichtext.spans.ListMarkerAnchorSpan
13
- import com.renderrichtext.spans.TaskListSpan
14
- import com.renderrichtext.styles.StyleConfig
15
- import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
16
-
17
- data class TaskListHitTestResult(
18
- val taskIndex: Int,
19
- val checked: Boolean,
20
- val itemText: String,
21
- )
22
-
23
- object TaskListToggleUtils {
24
- private val TASK_PATTERN = Regex("""^([ \t]*[-*+][ \t]+)\[[ xX]]""", RegexOption.MULTILINE)
25
-
26
- fun toggleAtIndex(
27
- tiptap: String,
28
- index: Int,
29
- checked: Boolean,
30
- ): String {
31
- val matches = TASK_PATTERN.findAll(tiptap).toList()
32
- if (index < 0 || index >= matches.size) return tiptap
33
-
34
- val match = matches[index]
35
- val prefix = match.groupValues[1]
36
-
37
- val replacement = "$prefix[${if (checked) "x" else " "}]"
38
-
39
- return tiptap.replaceRange(match.range, replacement)
40
- }
41
- }
42
-
43
- object TaskListTapUtils {
44
- fun hitTest(
45
- textView: TextView,
46
- rawX: Float,
47
- rawY: Float,
48
- ): TaskListHitTestResult? =
49
- with(textView) {
50
- val layout = layout ?: return null
51
- val spannable = text as? Spanned ?: return null
52
-
53
- val x = rawX.toInt() - totalPaddingLeft + scrollX
54
- val y = rawY.toInt() - totalPaddingTop + scrollY
55
-
56
- val line = layout.getLineForVertical(y)
57
-
58
- val taskSpan =
59
- spannable
60
- .getSpans(
61
- layout.getLineStart(line),
62
- layout.getLineEnd(line),
63
- TaskListSpan::class.java,
64
- ).maxByOrNull { it.depth } ?: return null
65
-
66
- val isRtl = layout.getParagraphDirection(line) == android.text.Layout.DIR_RIGHT_TO_LEFT
67
- if (isRtl) {
68
- val lineRight = layout.getLineRight(line).toInt()
69
- val indentWidth = lineRight - layout.getParagraphRight(line).toInt()
70
- if (x <= layout.width - indentWidth) return null
71
- } else {
72
- val lineLeft = layout.getLineLeft(line).toInt()
73
- val indentWidth = layout.getParagraphLeft(line).toInt() - lineLeft
74
- if (x >= indentWidth) return null
75
- }
76
-
77
- val spanStart = spannable.getSpanStart(taskSpan)
78
- val spanEnd = spannable.getSpanEnd(taskSpan)
79
-
80
- val itemText =
81
- spannable
82
- .subSequence(spanStart, spanEnd)
83
- .toString()
84
- .substringBefore('\n')
85
- .trim()
86
-
87
- return TaskListHitTestResult(
88
- taskIndex = taskSpan.taskIndex,
89
- checked = taskSpan.isChecked,
90
- itemText = itemText,
91
- )
92
- }
93
-
94
- fun updateTaskListItemCheckedState(
95
- textView: TextView,
96
- targetIndex: Int,
97
- newChecked: Boolean,
98
- styleConfig: StyleConfig,
99
- ): Boolean {
100
- val text = textView.text
101
- if (text !is Spannable) {
102
- return false
103
- }
104
-
105
- val spannable = SpannableStringBuilder(text)
106
- val targetSpans =
107
- spannable
108
- .getSpans(0, spannable.length, TaskListSpan::class.java)
109
- .filter { it.taskIndex == targetIndex }
110
- if (targetSpans.isEmpty()) {
111
- return false
112
- }
113
-
114
- if (targetSpans.all { it.isChecked == newChecked }) {
115
- return true
116
- }
117
-
118
- val itemDepth = targetSpans.first().depth
119
- val spanStart = targetSpans.minOf { spannable.getSpanStart(it) }
120
- val spanEnd = targetSpans.maxOf { spannable.getSpanEnd(it) }
121
-
122
- val styleCache = SpanStyleCache(styleConfig)
123
-
124
- fun toggledCopy(old: TaskListSpan): TaskListSpan =
125
- TaskListSpan(
126
- taskStyle = styleConfig.taskListStyle,
127
- listStyle = styleConfig.listStyle,
128
- depth = old.depth,
129
- context = textView.context,
130
- styleCache = styleCache,
131
- taskIndex = targetIndex,
132
- isChecked = newChecked,
133
- drawsMarker = old.drawsMarker,
134
- ancestorMarkerOffset = old.ancestorMarkerOffset,
135
- markerExtraWidth = old.markerExtraWidth,
136
- parentMarkerWidth = old.parentMarkerWidth,
137
- )
138
-
139
- // Layout draws leading margins in insertion order, and a re-added span moves to the end of it.
140
- // Re-add the task's spans and everything attached after them (its ancestors) in their original
141
- // order; the task's own nested items were attached first and stay where they are.
142
- data class ListSpanState(
143
- val span: BaseListSpan,
144
- val start: Int,
145
- val end: Int,
146
- val flags: Int,
147
- )
148
-
149
- val coveringSpans = spannable.getSpans(spanStart, spanEnd, BaseListSpan::class.java)
150
- val firstTarget = coveringSpans.indexOfFirst { it is TaskListSpan && it.taskIndex == targetIndex }
151
- val listSpans =
152
- coveringSpans.drop(firstTarget).map {
153
- ListSpanState(it, spannable.getSpanStart(it), spannable.getSpanEnd(it), spannable.getSpanFlags(it))
154
- }
155
- listSpans.forEach { spannable.removeSpan(it.span) }
156
- for ((old, start, end, flags) in listSpans) {
157
- val replacement = if (old is TaskListSpan && old.taskIndex == targetIndex) toggledCopy(old) else old
158
- spannable.setSpan(replacement, start, end, flags)
159
- }
160
-
161
- // The marker may be drawn by an anchor span wrapping an unattached copy
162
- spannable
163
- .getSpans(0, spannable.length, ListMarkerAnchorSpan::class.java)
164
- .filter { (it.marker as? TaskListSpan)?.taskIndex == targetIndex }
165
- .forEach { old ->
166
- val start = spannable.getSpanStart(old)
167
- val end = spannable.getSpanEnd(old)
168
- spannable.removeSpan(old)
169
- spannable.setSpan(
170
- ListMarkerAnchorSpan(toggledCopy(old.marker as TaskListSpan)),
171
- start,
172
- end,
173
- SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
174
- )
175
- }
176
-
177
- val taskStyle = styleConfig.taskListStyle
178
- val checkedTextColor = taskStyle.checkedTextColor
179
- val strikethrough = taskStyle.checkedStrikethrough
180
-
181
- val excludedRanges =
182
- (
183
- spannable.getSpans(spanStart, spanEnd, BaseListSpan::class.java).filter { it.depth > itemDepth } +
184
- spannable.getSpans(spanStart, spanEnd, CodeBlockSpan::class.java).toList()
185
- ).map { spannable.getSpanStart(it) to spannable.getSpanEnd(it) }
186
- .sortedBy { it.first }
187
-
188
- applyDecorationsToRanges(
189
- spannable = spannable,
190
- spanStart = spanStart,
191
- spanEnd = spanEnd,
192
- excludedRanges = excludedRanges,
193
- isChecked = newChecked,
194
- checkedTextColor = checkedTextColor,
195
- strikethrough = strikethrough,
196
- styleConfig = styleConfig,
197
- )
198
-
199
- val imageSpans = text.getSpans(0, text.length, com.renderrichtext.spans.ImageSpan::class.java).toList()
200
- val originalSpanStarts = imageSpans.associateWith { text.getSpanStart(it) }
201
-
202
- textView.text = spannable
203
-
204
- val newImageSpans = spannable.getSpans(0, spannable.length, com.renderrichtext.spans.ImageSpan::class.java)
205
- imageSpans.forEach { originalSpan ->
206
- val matchingSpan =
207
- newImageSpans.firstOrNull {
208
- it.imageUrl == originalSpan.imageUrl &&
209
- spannable.getSpanStart(it) == originalSpanStarts[originalSpan]
210
- }
211
- (matchingSpan ?: originalSpan).registerTextView(textView)
212
- }
213
-
214
- textView.invalidate()
215
-
216
- return true
217
- }
218
-
219
- private fun applyDecorationsToRanges(
220
- spannable: Spannable,
221
- spanStart: Int,
222
- spanEnd: Int,
223
- excludedRanges: List<Pair<Int, Int>>,
224
- isChecked: Boolean,
225
- checkedTextColor: Int,
226
- strikethrough: Boolean,
227
- styleConfig: StyleConfig,
228
- ) {
229
- var currentPos = spanStart
230
- for ((start, end) in excludedRanges) {
231
- if (start > currentPos) {
232
- if (isChecked) {
233
- applyCheckedSpans(spannable, currentPos, start, checkedTextColor, strikethrough)
234
- } else {
235
- removeCheckedSpans(spannable, currentPos, start, styleConfig)
236
- }
237
- }
238
- currentPos = maxOf(currentPos, end)
239
- }
240
- if (currentPos < spanEnd) {
241
- if (isChecked) {
242
- applyCheckedSpans(spannable, currentPos, spanEnd, checkedTextColor, strikethrough)
243
- } else {
244
- removeCheckedSpans(spannable, currentPos, spanEnd, styleConfig)
245
- }
246
- }
247
- }
248
-
249
- private fun applyCheckedSpans(
250
- spannable: Spannable,
251
- start: Int,
252
- end: Int,
253
- color: Int,
254
- strikethrough: Boolean,
255
- ) {
256
- if (color != 0) {
257
- spannable.setSpan(ForegroundColorSpan(color), start, end, SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE)
258
- }
259
- if (strikethrough) {
260
- spannable.setSpan(StrikethroughSpan(), start, end, SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE)
261
- }
262
- }
263
-
264
- private fun removeCheckedSpans(
265
- spannable: Spannable,
266
- start: Int,
267
- end: Int,
268
- styleConfig: StyleConfig,
269
- ) {
270
- val strikethroughSpans = spannable.getSpans(start, end, StrikethroughSpan::class.java)
271
- strikethroughSpans.forEach { spannable.removeSpan(it) }
272
-
273
- val colorSpans = spannable.getSpans(start, end, ForegroundColorSpan::class.java)
274
- colorSpans.forEach { spannable.removeSpan(it) }
275
-
276
- val listStyleColor = styleConfig.listStyle.color
277
- if (listStyleColor != 0) {
278
- spannable.setSpan(
279
- ForegroundColorSpan(listStyleColor),
280
- start,
281
- end,
282
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE,
283
- )
284
- }
285
- }
286
- }
1
+ package com.renderrichtext.utils.text.interaction
2
+
3
+ import android.text.Spannable
4
+ import android.text.SpannableStringBuilder
5
+ import android.text.Spanned
6
+ import android.text.style.ForegroundColorSpan
7
+ import android.text.style.StrikethroughSpan
8
+ import android.widget.TextView
9
+ import com.renderrichtext.renderer.SpanStyleCache
10
+ import com.renderrichtext.spans.BaseListSpan
11
+ import com.renderrichtext.spans.CodeBlockSpan
12
+ import com.renderrichtext.spans.ListMarkerAnchorSpan
13
+ import com.renderrichtext.spans.TaskListSpan
14
+ import com.renderrichtext.styles.StyleConfig
15
+ import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
16
+
17
+ data class TaskListHitTestResult(
18
+ val taskIndex: Int,
19
+ val checked: Boolean,
20
+ val itemText: String,
21
+ )
22
+
23
+ object TaskListToggleUtils {
24
+ private val TASK_PATTERN = Regex("""^([ \t]*[-*+][ \t]+)\[[ xX]]""", RegexOption.MULTILINE)
25
+
26
+ fun toggleAtIndex(
27
+ tiptap: String,
28
+ index: Int,
29
+ checked: Boolean,
30
+ ): String {
31
+ val matches = TASK_PATTERN.findAll(tiptap).toList()
32
+ if (index < 0 || index >= matches.size) return tiptap
33
+
34
+ val match = matches[index]
35
+ val prefix = match.groupValues[1]
36
+
37
+ val replacement = "$prefix[${if (checked) "x" else " "}]"
38
+
39
+ return tiptap.replaceRange(match.range, replacement)
40
+ }
41
+ }
42
+
43
+ object TaskListTapUtils {
44
+ fun hitTest(
45
+ textView: TextView,
46
+ rawX: Float,
47
+ rawY: Float,
48
+ ): TaskListHitTestResult? =
49
+ with(textView) {
50
+ val layout = layout ?: return null
51
+ val spannable = text as? Spanned ?: return null
52
+
53
+ val x = rawX.toInt() - totalPaddingLeft + scrollX
54
+ val y = rawY.toInt() - totalPaddingTop + scrollY
55
+
56
+ val line = layout.getLineForVertical(y)
57
+
58
+ val taskSpan =
59
+ spannable
60
+ .getSpans(
61
+ layout.getLineStart(line),
62
+ layout.getLineEnd(line),
63
+ TaskListSpan::class.java,
64
+ ).maxByOrNull { it.depth } ?: return null
65
+
66
+ val isRtl = layout.getParagraphDirection(line) == android.text.Layout.DIR_RIGHT_TO_LEFT
67
+ if (isRtl) {
68
+ val lineRight = layout.getLineRight(line).toInt()
69
+ val indentWidth = lineRight - layout.getParagraphRight(line).toInt()
70
+ if (x <= layout.width - indentWidth) return null
71
+ } else {
72
+ val lineLeft = layout.getLineLeft(line).toInt()
73
+ val indentWidth = layout.getParagraphLeft(line).toInt() - lineLeft
74
+ if (x >= indentWidth) return null
75
+ }
76
+
77
+ val spanStart = spannable.getSpanStart(taskSpan)
78
+ val spanEnd = spannable.getSpanEnd(taskSpan)
79
+
80
+ val itemText =
81
+ spannable
82
+ .subSequence(spanStart, spanEnd)
83
+ .toString()
84
+ .substringBefore('\n')
85
+ .trim()
86
+
87
+ return TaskListHitTestResult(
88
+ taskIndex = taskSpan.taskIndex,
89
+ checked = taskSpan.isChecked,
90
+ itemText = itemText,
91
+ )
92
+ }
93
+
94
+ fun updateTaskListItemCheckedState(
95
+ textView: TextView,
96
+ targetIndex: Int,
97
+ newChecked: Boolean,
98
+ styleConfig: StyleConfig,
99
+ ): Boolean {
100
+ val text = textView.text
101
+ if (text !is Spannable) {
102
+ return false
103
+ }
104
+
105
+ val spannable = SpannableStringBuilder(text)
106
+ val targetSpans =
107
+ spannable
108
+ .getSpans(0, spannable.length, TaskListSpan::class.java)
109
+ .filter { it.taskIndex == targetIndex }
110
+ if (targetSpans.isEmpty()) {
111
+ return false
112
+ }
113
+
114
+ if (targetSpans.all { it.isChecked == newChecked }) {
115
+ return true
116
+ }
117
+
118
+ val itemDepth = targetSpans.first().depth
119
+ val spanStart = targetSpans.minOf { spannable.getSpanStart(it) }
120
+ val spanEnd = targetSpans.maxOf { spannable.getSpanEnd(it) }
121
+
122
+ val styleCache = SpanStyleCache(styleConfig)
123
+
124
+ fun toggledCopy(old: TaskListSpan): TaskListSpan =
125
+ TaskListSpan(
126
+ taskStyle = styleConfig.taskListStyle,
127
+ listStyle = styleConfig.listStyle,
128
+ depth = old.depth,
129
+ context = textView.context,
130
+ styleCache = styleCache,
131
+ taskIndex = targetIndex,
132
+ isChecked = newChecked,
133
+ drawsMarker = old.drawsMarker,
134
+ ancestorMarkerOffset = old.ancestorMarkerOffset,
135
+ markerExtraWidth = old.markerExtraWidth,
136
+ parentMarkerWidth = old.parentMarkerWidth,
137
+ )
138
+
139
+ // Layout draws leading margins in insertion order, and a re-added span moves to the end of it.
140
+ // Re-add the task's spans and everything attached after them (its ancestors) in their original
141
+ // order; the task's own nested items were attached first and stay where they are.
142
+ data class ListSpanState(
143
+ val span: BaseListSpan,
144
+ val start: Int,
145
+ val end: Int,
146
+ val flags: Int,
147
+ )
148
+
149
+ val coveringSpans = spannable.getSpans(spanStart, spanEnd, BaseListSpan::class.java)
150
+ val firstTarget = coveringSpans.indexOfFirst { it is TaskListSpan && it.taskIndex == targetIndex }
151
+ val listSpans =
152
+ coveringSpans.drop(firstTarget).map {
153
+ ListSpanState(it, spannable.getSpanStart(it), spannable.getSpanEnd(it), spannable.getSpanFlags(it))
154
+ }
155
+ listSpans.forEach { spannable.removeSpan(it.span) }
156
+ for ((old, start, end, flags) in listSpans) {
157
+ val replacement = if (old is TaskListSpan && old.taskIndex == targetIndex) toggledCopy(old) else old
158
+ spannable.setSpan(replacement, start, end, flags)
159
+ }
160
+
161
+ // The marker may be drawn by an anchor span wrapping an unattached copy
162
+ spannable
163
+ .getSpans(0, spannable.length, ListMarkerAnchorSpan::class.java)
164
+ .filter { (it.marker as? TaskListSpan)?.taskIndex == targetIndex }
165
+ .forEach { old ->
166
+ val start = spannable.getSpanStart(old)
167
+ val end = spannable.getSpanEnd(old)
168
+ spannable.removeSpan(old)
169
+ spannable.setSpan(
170
+ ListMarkerAnchorSpan(toggledCopy(old.marker as TaskListSpan)),
171
+ start,
172
+ end,
173
+ SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
174
+ )
175
+ }
176
+
177
+ val taskStyle = styleConfig.taskListStyle
178
+ val checkedTextColor = taskStyle.checkedTextColor
179
+ val strikethrough = taskStyle.checkedStrikethrough
180
+
181
+ val excludedRanges =
182
+ (
183
+ spannable.getSpans(spanStart, spanEnd, BaseListSpan::class.java).filter { it.depth > itemDepth } +
184
+ spannable.getSpans(spanStart, spanEnd, CodeBlockSpan::class.java).toList()
185
+ ).map { spannable.getSpanStart(it) to spannable.getSpanEnd(it) }
186
+ .sortedBy { it.first }
187
+
188
+ applyDecorationsToRanges(
189
+ spannable = spannable,
190
+ spanStart = spanStart,
191
+ spanEnd = spanEnd,
192
+ excludedRanges = excludedRanges,
193
+ isChecked = newChecked,
194
+ checkedTextColor = checkedTextColor,
195
+ strikethrough = strikethrough,
196
+ styleConfig = styleConfig,
197
+ )
198
+
199
+ val imageSpans = text.getSpans(0, text.length, com.renderrichtext.spans.ImageSpan::class.java).toList()
200
+ val originalSpanStarts = imageSpans.associateWith { text.getSpanStart(it) }
201
+
202
+ textView.text = spannable
203
+
204
+ val newImageSpans = spannable.getSpans(0, spannable.length, com.renderrichtext.spans.ImageSpan::class.java)
205
+ imageSpans.forEach { originalSpan ->
206
+ val matchingSpan =
207
+ newImageSpans.firstOrNull {
208
+ it.imageUrl == originalSpan.imageUrl &&
209
+ spannable.getSpanStart(it) == originalSpanStarts[originalSpan]
210
+ }
211
+ (matchingSpan ?: originalSpan).registerTextView(textView)
212
+ }
213
+
214
+ textView.invalidate()
215
+
216
+ return true
217
+ }
218
+
219
+ private fun applyDecorationsToRanges(
220
+ spannable: Spannable,
221
+ spanStart: Int,
222
+ spanEnd: Int,
223
+ excludedRanges: List<Pair<Int, Int>>,
224
+ isChecked: Boolean,
225
+ checkedTextColor: Int,
226
+ strikethrough: Boolean,
227
+ styleConfig: StyleConfig,
228
+ ) {
229
+ var currentPos = spanStart
230
+ for ((start, end) in excludedRanges) {
231
+ if (start > currentPos) {
232
+ if (isChecked) {
233
+ applyCheckedSpans(spannable, currentPos, start, checkedTextColor, strikethrough)
234
+ } else {
235
+ removeCheckedSpans(spannable, currentPos, start, styleConfig)
236
+ }
237
+ }
238
+ currentPos = maxOf(currentPos, end)
239
+ }
240
+ if (currentPos < spanEnd) {
241
+ if (isChecked) {
242
+ applyCheckedSpans(spannable, currentPos, spanEnd, checkedTextColor, strikethrough)
243
+ } else {
244
+ removeCheckedSpans(spannable, currentPos, spanEnd, styleConfig)
245
+ }
246
+ }
247
+ }
248
+
249
+ private fun applyCheckedSpans(
250
+ spannable: Spannable,
251
+ start: Int,
252
+ end: Int,
253
+ color: Int,
254
+ strikethrough: Boolean,
255
+ ) {
256
+ if (color != 0) {
257
+ spannable.setSpan(ForegroundColorSpan(color), start, end, SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE)
258
+ }
259
+ if (strikethrough) {
260
+ spannable.setSpan(StrikethroughSpan(), start, end, SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE)
261
+ }
262
+ }
263
+
264
+ private fun removeCheckedSpans(
265
+ spannable: Spannable,
266
+ start: Int,
267
+ end: Int,
268
+ styleConfig: StyleConfig,
269
+ ) {
270
+ val strikethroughSpans = spannable.getSpans(start, end, StrikethroughSpan::class.java)
271
+ strikethroughSpans.forEach { spannable.removeSpan(it) }
272
+
273
+ val colorSpans = spannable.getSpans(start, end, ForegroundColorSpan::class.java)
274
+ colorSpans.forEach { spannable.removeSpan(it) }
275
+
276
+ val listStyleColor = styleConfig.listStyle.color
277
+ if (listStyleColor != 0) {
278
+ spannable.setSpan(
279
+ ForegroundColorSpan(listStyleColor),
280
+ start,
281
+ end,
282
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE,
283
+ )
284
+ }
285
+ }
286
+ }
@@ -1,39 +1,39 @@
1
- package com.renderrichtext.utils.text.span
2
-
3
- import android.graphics.Paint.FontMetricsInt
4
- import kotlin.math.ceil
5
- import kotlin.math.floor
6
-
7
- /**
8
- * Splits extra leading above and below the line, copied from RN
9
- * CustomLineHeightSpan so we do not depend on React Native internal span types.
10
- *
11
- * Mirrors CustomLineHeightSpan.chooseHeight:
12
- * https://github.com/react/react-native/blob/v0.86.2/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/CustomLineHeightSpan.kt#L44-L57
13
- *
14
- * Unlike RN, [lineHeight] is a floor, not a clamp: taller content grows the
15
- * line instead of being clipped (for example, inline code taller than the paragraph).
16
- */
17
- internal fun applyLineHeight(
18
- fm: FontMetricsInt,
19
- lineHeight: Int,
20
- start: Int,
21
- end: Int,
22
- textLength: Int,
23
- ) {
24
- val leading = lineHeight - ((-fm.ascent) + fm.descent)
25
-
26
- // Use lineHeight as a floor: if the default line-height is greater, don't
27
- // override it
28
- if (leading > 0) {
29
- fm.ascent -= ceil(leading / 2.0f).toInt()
30
- fm.descent += floor(leading / 2.0f).toInt()
31
- }
32
-
33
- if (start == 0) {
34
- fm.top = fm.ascent
35
- }
36
- if (end == textLength) {
37
- fm.bottom = fm.descent
38
- }
39
- }
1
+ package com.renderrichtext.utils.text.span
2
+
3
+ import android.graphics.Paint.FontMetricsInt
4
+ import kotlin.math.ceil
5
+ import kotlin.math.floor
6
+
7
+ /**
8
+ * Splits extra leading above and below the line, copied from RN
9
+ * CustomLineHeightSpan so we do not depend on React Native internal span types.
10
+ *
11
+ * Mirrors CustomLineHeightSpan.chooseHeight:
12
+ * https://github.com/react/react-native/blob/v0.86.2/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/CustomLineHeightSpan.kt#L44-L57
13
+ *
14
+ * Unlike RN, [lineHeight] is a floor, not a clamp: taller content grows the
15
+ * line instead of being clipped (for example, inline code taller than the paragraph).
16
+ */
17
+ internal fun applyLineHeight(
18
+ fm: FontMetricsInt,
19
+ lineHeight: Int,
20
+ start: Int,
21
+ end: Int,
22
+ textLength: Int,
23
+ ) {
24
+ val leading = lineHeight - ((-fm.ascent) + fm.descent)
25
+
26
+ // Use lineHeight as a floor: if the default line-height is greater, don't
27
+ // override it
28
+ if (leading > 0) {
29
+ fm.ascent -= ceil(leading / 2.0f).toInt()
30
+ fm.descent += floor(leading / 2.0f).toInt()
31
+ }
32
+
33
+ if (start == 0) {
34
+ fm.top = fm.ascent
35
+ }
36
+ if (end == textLength) {
37
+ fm.bottom = fm.descent
38
+ }
39
+ }