@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,105 +1,105 @@
1
- #pragma once
2
- #import "ENRMUIKit.h"
3
- #import <Foundation/Foundation.h>
4
-
5
- @class StyleConfig;
6
-
7
- NS_ASSUME_NONNULL_BEGIN
8
-
9
- typedef struct {
10
- BOOL copyAsTiptap;
11
- BOOL copyImageURL;
12
- // The owner must keep these strings alive for the duration of the call (the
13
- // view holds them in strong ivars).
14
- __unsafe_unretained NSString *_Nullable copyLabel;
15
- __unsafe_unretained NSString *_Nullable copyAsTiptapLabel;
16
- __unsafe_unretained NSString *_Nullable copyImageUrlLabel;
17
- __unsafe_unretained NSString *_Nullable copyImageUrlsLabel;
18
- __unsafe_unretained NSArray<NSString *> *_Nullable copyImageUrlPluralTemplates;
19
- } ENRMSelectionMenuConfig;
20
-
21
- /// Resolves the "Copy Image URL(s)" menu title for a given image count.
22
- /// Uses the precomputed plural templates (indexed by count, 0..100) when present;
23
- /// counts > 100 use the "other" form (copyImageUrlsLabel). Otherwise the
24
- /// singular/`{count}` templates. All labels are resolved JS-side.
25
- static inline NSString *ENRMResolveImageURLsTitle(ENRMSelectionMenuConfig config, NSUInteger count)
26
- {
27
- NSArray<NSString *> *templates = config.copyImageUrlPluralTemplates;
28
- NSString *titleTemplate;
29
- if (count < templates.count) {
30
- titleTemplate = templates[count];
31
- } else if (count == 1) {
32
- titleTemplate = config.copyImageUrlLabel;
33
- } else {
34
- titleTemplate = config.copyImageUrlsLabel;
35
- }
36
- return [titleTemplate stringByReplacingOccurrencesOfString:@"{count}" withString:[@(count) stringValue]];
37
- }
38
-
39
- #ifdef __cplusplus
40
-
41
- /// Strong owners for the label strings in ENRMSelectionMenuConfig.
42
- struct ENRMSelectionMenuLabels {
43
- NSString *copyLabel = nil;
44
- NSString *copyAsTiptapLabel = nil;
45
- NSString *copyImageUrlLabel = nil;
46
- NSString *copyImageUrlsLabel = nil;
47
- NSArray<NSString *> *copyImageUrlPluralTemplates = nil;
48
- };
49
-
50
- /// Converts a codegen SelectionMenuConfig struct into strong NSString labels.
51
- template <typename T> static inline ENRMSelectionMenuLabels ENRMParseSelectionMenuLabels(const T &src)
52
- {
53
- NSMutableArray<NSString *> *templates = [NSMutableArray array];
54
- for (const auto &s : src.copyImageUrlPluralTemplates) {
55
- [templates addObject:[[NSString alloc] initWithUTF8String:s.c_str()]];
56
- }
57
- return {
58
- [[NSString alloc] initWithUTF8String:src.copyLabel.c_str()],
59
- [[NSString alloc] initWithUTF8String:src.copyAsTiptapLabel.c_str()],
60
- [[NSString alloc] initWithUTF8String:src.copyImageUrlLabel.c_str()],
61
- [[NSString alloc] initWithUTF8String:src.copyImageUrlsLabel.c_str()],
62
- templates,
63
- };
64
- }
65
-
66
- /// Builds an ENRMSelectionMenuConfig from pre-parsed labels and boolean flags.
67
- static inline ENRMSelectionMenuConfig ENRMBuildSelectionMenuConfig(const ENRMSelectionMenuLabels &labels,
68
- bool copyAsTiptap, bool copyImageUrl)
69
- {
70
- return (ENRMSelectionMenuConfig){
71
- .copyAsTiptap = copyAsTiptap,
72
- .copyImageURL = copyImageUrl,
73
- .copyLabel = labels.copyLabel,
74
- .copyAsTiptapLabel = labels.copyAsTiptapLabel,
75
- .copyImageUrlLabel = labels.copyImageUrlLabel,
76
- .copyImageUrlsLabel = labels.copyImageUrlsLabel,
77
- .copyImageUrlPluralTemplates = labels.copyImageUrlPluralTemplates,
78
- };
79
- }
80
-
81
- extern "C" {
82
- #endif
83
-
84
- #if !TARGET_OS_OSX
85
- // TODO: Remove API_AVAILABLE(ios(16.0)) guard when the minimum iOS deployment target in RN is bumped to 16.
86
- // TODO: selectionMenuConfig labels do NOT reach the system "Save to Camera Roll /
87
- // Copy" sheet shown when long-pressing an NSTextAttachment image — UIKit owns
88
- // that sheet end-to-end. Hooking UIContextMenuInteraction on image regions and
89
- // returning a custom UIContextMenuConfiguration would let us relabel those items.
90
- UIMenu *buildEditMenuForSelection(NSAttributedString *attributedText, NSRange range, NSString *_Nullable cachedTiptap,
91
- StyleConfig *styleConfig, NSArray<UIMenuElement *> *suggestedActions,
92
- NSArray<UIAction *> *_Nullable customActions,
93
- ENRMSelectionMenuConfig selectionMenuConfig) API_AVAILABLE(ios(16.0));
94
- #else
95
- NSMenu *_Nullable buildEditMenuForSelection(NSAttributedString *attributedText, NSRange range,
96
- NSString *_Nullable cachedTiptap, StyleConfig *styleConfig,
97
- NSArray *suggestedActions, NSArray<NSMenuItem *> *_Nullable customItems,
98
- ENRMSelectionMenuConfig selectionMenuConfig);
99
- #endif
100
-
101
- #ifdef __cplusplus
102
- }
103
- #endif
104
-
105
- NS_ASSUME_NONNULL_END
1
+ #pragma once
2
+ #import "ENRMUIKit.h"
3
+ #import <Foundation/Foundation.h>
4
+
5
+ @class StyleConfig;
6
+
7
+ NS_ASSUME_NONNULL_BEGIN
8
+
9
+ typedef struct {
10
+ BOOL copyAsTiptap;
11
+ BOOL copyImageURL;
12
+ // The owner must keep these strings alive for the duration of the call (the
13
+ // view holds them in strong ivars).
14
+ __unsafe_unretained NSString *_Nullable copyLabel;
15
+ __unsafe_unretained NSString *_Nullable copyAsTiptapLabel;
16
+ __unsafe_unretained NSString *_Nullable copyImageUrlLabel;
17
+ __unsafe_unretained NSString *_Nullable copyImageUrlsLabel;
18
+ __unsafe_unretained NSArray<NSString *> *_Nullable copyImageUrlPluralTemplates;
19
+ } ENRMSelectionMenuConfig;
20
+
21
+ /// Resolves the "Copy Image URL(s)" menu title for a given image count.
22
+ /// Uses the precomputed plural templates (indexed by count, 0..100) when present;
23
+ /// counts > 100 use the "other" form (copyImageUrlsLabel). Otherwise the
24
+ /// singular/`{count}` templates. All labels are resolved JS-side.
25
+ static inline NSString *ENRMResolveImageURLsTitle(ENRMSelectionMenuConfig config, NSUInteger count)
26
+ {
27
+ NSArray<NSString *> *templates = config.copyImageUrlPluralTemplates;
28
+ NSString *titleTemplate;
29
+ if (count < templates.count) {
30
+ titleTemplate = templates[count];
31
+ } else if (count == 1) {
32
+ titleTemplate = config.copyImageUrlLabel;
33
+ } else {
34
+ titleTemplate = config.copyImageUrlsLabel;
35
+ }
36
+ return [titleTemplate stringByReplacingOccurrencesOfString:@"{count}" withString:[@(count) stringValue]];
37
+ }
38
+
39
+ #ifdef __cplusplus
40
+
41
+ /// Strong owners for the label strings in ENRMSelectionMenuConfig.
42
+ struct ENRMSelectionMenuLabels {
43
+ NSString *copyLabel = nil;
44
+ NSString *copyAsTiptapLabel = nil;
45
+ NSString *copyImageUrlLabel = nil;
46
+ NSString *copyImageUrlsLabel = nil;
47
+ NSArray<NSString *> *copyImageUrlPluralTemplates = nil;
48
+ };
49
+
50
+ /// Converts a codegen SelectionMenuConfig struct into strong NSString labels.
51
+ template <typename T> static inline ENRMSelectionMenuLabels ENRMParseSelectionMenuLabels(const T &src)
52
+ {
53
+ NSMutableArray<NSString *> *templates = [NSMutableArray array];
54
+ for (const auto &s : src.copyImageUrlPluralTemplates) {
55
+ [templates addObject:[[NSString alloc] initWithUTF8String:s.c_str()]];
56
+ }
57
+ return {
58
+ [[NSString alloc] initWithUTF8String:src.copyLabel.c_str()],
59
+ [[NSString alloc] initWithUTF8String:src.copyAsTiptapLabel.c_str()],
60
+ [[NSString alloc] initWithUTF8String:src.copyImageUrlLabel.c_str()],
61
+ [[NSString alloc] initWithUTF8String:src.copyImageUrlsLabel.c_str()],
62
+ templates,
63
+ };
64
+ }
65
+
66
+ /// Builds an ENRMSelectionMenuConfig from pre-parsed labels and boolean flags.
67
+ static inline ENRMSelectionMenuConfig ENRMBuildSelectionMenuConfig(const ENRMSelectionMenuLabels &labels,
68
+ bool copyAsTiptap, bool copyImageUrl)
69
+ {
70
+ return (ENRMSelectionMenuConfig){
71
+ .copyAsTiptap = copyAsTiptap,
72
+ .copyImageURL = copyImageUrl,
73
+ .copyLabel = labels.copyLabel,
74
+ .copyAsTiptapLabel = labels.copyAsTiptapLabel,
75
+ .copyImageUrlLabel = labels.copyImageUrlLabel,
76
+ .copyImageUrlsLabel = labels.copyImageUrlsLabel,
77
+ .copyImageUrlPluralTemplates = labels.copyImageUrlPluralTemplates,
78
+ };
79
+ }
80
+
81
+ extern "C" {
82
+ #endif
83
+
84
+ #if !TARGET_OS_OSX
85
+ // TODO: Remove API_AVAILABLE(ios(16.0)) guard when the minimum iOS deployment target in RN is bumped to 16.
86
+ // TODO: selectionMenuConfig labels do NOT reach the system "Save to Camera Roll /
87
+ // Copy" sheet shown when long-pressing an NSTextAttachment image — UIKit owns
88
+ // that sheet end-to-end. Hooking UIContextMenuInteraction on image regions and
89
+ // returning a custom UIContextMenuConfiguration would let us relabel those items.
90
+ UIMenu *buildEditMenuForSelection(NSAttributedString *attributedText, NSRange range, NSString *_Nullable cachedTiptap,
91
+ StyleConfig *styleConfig, NSArray<UIMenuElement *> *suggestedActions,
92
+ NSArray<UIAction *> *_Nullable customActions,
93
+ ENRMSelectionMenuConfig selectionMenuConfig) API_AVAILABLE(ios(16.0));
94
+ #else
95
+ NSMenu *_Nullable buildEditMenuForSelection(NSAttributedString *attributedText, NSRange range,
96
+ NSString *_Nullable cachedTiptap, StyleConfig *styleConfig,
97
+ NSArray *suggestedActions, NSArray<NSMenuItem *> *_Nullable customItems,
98
+ ENRMSelectionMenuConfig selectionMenuConfig);
99
+ #endif
100
+
101
+ #ifdef __cplusplus
102
+ }
103
+ #endif
104
+
105
+ NS_ASSUME_NONNULL_END
@@ -1,143 +1,143 @@
1
- #import "EditMenuUtils.h"
2
- #import "PasteboardUtils.h"
3
- #import "StyleConfig.h"
4
- #include <TargetConditionals.h>
5
-
6
- #if !TARGET_OS_OSX
7
-
8
- static NSString *const kMenuIdentifierStandardEdit = @"com.apple.menu.standard-edit";
9
- static NSString *const kActionIdentifierCopy = @"com.swmansion.enriched.tiptap.copy";
10
- static NSString *const kActionIdentifierCopyTiptap = @"com.swmansion.enriched.tiptap.copyTiptap";
11
- static NSString *const kActionIdentifierCopyImageURL = @"com.swmansion.enriched.tiptap.copyImageURL";
12
-
13
- static UIAction *createCopyAction(NSAttributedString *selectedText, NSString *tiptap, StyleConfig *styleConfig,
14
- NSString *copyLabel)
15
- {
16
- return [UIAction actionWithTitle:copyLabel
17
- image:[RCTUIImage systemImageNamed:@"doc.on.doc"]
18
- identifier:kActionIdentifierCopy
19
- handler:^(__kindof UIAction *action) {
20
- copyAttributedStringToPasteboard(selectedText, tiptap, styleConfig);
21
- }];
22
- }
23
-
24
- static UIAction *_Nullable createCopyTiptapAction(NSString *tiptap, NSString *copyAsTiptapLabel)
25
- {
26
- if (tiptap.length == 0)
27
- return nil;
28
-
29
- return [UIAction actionWithTitle:copyAsTiptapLabel
30
- image:[RCTUIImage systemImageNamed:@"doc.text"]
31
- identifier:kActionIdentifierCopyTiptap
32
- handler:^(__kindof UIAction *action) { copyStringToPasteboard(tiptap); }];
33
- }
34
-
35
- static UIAction *_Nullable createCopyImageURLAction(NSArray<NSString *> *imageURLs,
36
- ENRMSelectionMenuConfig selectionMenuConfig)
37
- {
38
- if (imageURLs.count == 0)
39
- return nil;
40
-
41
- NSString *urlsToCopy = [imageURLs componentsJoinedByString:@"\n"];
42
- NSString *title = ENRMResolveImageURLsTitle(selectionMenuConfig, imageURLs.count);
43
-
44
- return [UIAction actionWithTitle:title
45
- image:[RCTUIImage systemImageNamed:@"link"]
46
- identifier:kActionIdentifierCopyImageURL
47
- handler:^(__kindof UIAction *action) { copyStringToPasteboard(urlsToCopy); }];
48
- }
49
-
50
- /// Rebuilds the standard-edit menu with the system Copy swapped for the enhanced
51
- /// copy action. All other system items are kept — dropping them would remove
52
- /// Select All, which on iOS 16+ is the only way to start a selection from the
53
- /// long-press menu of a non-editable text view.
54
- static UIMenu *createEnhancedStandardEditMenu(UIMenu *originalMenu, UIAction *copyAction)
55
- {
56
- NSMutableArray<UIMenuElement *> *children = [NSMutableArray arrayWithCapacity:originalMenu.children.count];
57
- BOOL replacedCopy = NO;
58
-
59
- for (UIMenuElement *element in originalMenu.children) {
60
- if (!replacedCopy && [element isKindOfClass:[UICommand class]] &&
61
- ((UICommand *)element).action == @selector(copy:)) {
62
- [children addObject:copyAction];
63
- replacedCopy = YES;
64
- continue;
65
- }
66
- [children addObject:element];
67
- }
68
-
69
- if (!replacedCopy) {
70
- [children insertObject:copyAction atIndex:0];
71
- }
72
-
73
- return [UIMenu menuWithTitle:originalMenu.title
74
- image:originalMenu.image
75
- identifier:originalMenu.identifier
76
- options:originalMenu.options
77
- children:children];
78
- }
79
-
80
- static void addOptionalAction(NSMutableArray<UIMenuElement *> *array, UIAction *_Nullable action)
81
- {
82
- if (action) {
83
- [array addObject:action];
84
- }
85
- }
86
-
87
- static void insertOptionalAction(NSMutableArray<UIMenuElement *> *array, UIAction *_Nullable action, NSUInteger index)
88
- {
89
- if (action) {
90
- [array insertObject:action atIndex:index];
91
- }
92
- }
93
-
94
- // TODO: Remove API_AVAILABLE(ios(16.0)) guard when the minimum iOS deployment target in RN is bumped to 16.
95
- UIMenu *buildEditMenuForSelection(NSAttributedString *attributedText, NSRange range, NSString *_Nullable cachedTiptap,
96
- StyleConfig *styleConfig, NSArray<UIMenuElement *> *suggestedActions,
97
- NSArray<UIAction *> *_Nullable customActions,
98
- ENRMSelectionMenuConfig selectionMenuConfig) API_AVAILABLE(ios(16.0))
99
- {
100
- NSAttributedString *selectedText = [attributedText attributedSubstringFromRange:range];
101
- NSString *tiptap = tiptapForRange(attributedText, range, cachedTiptap);
102
- NSArray<NSString *> *imageURLs = imageURLsInRange(attributedText, range);
103
-
104
- UIAction *copyAction = createCopyAction(selectedText, tiptap, styleConfig, selectionMenuConfig.copyLabel);
105
- UIAction *copyTiptapAction = selectionMenuConfig.copyAsTiptap
106
- ? createCopyTiptapAction(tiptap, selectionMenuConfig.copyAsTiptapLabel)
107
- : nil;
108
- UIAction *copyImageURLAction =
109
- selectionMenuConfig.copyImageURL ? createCopyImageURLAction(imageURLs, selectionMenuConfig) : nil;
110
-
111
- NSMutableArray<UIMenuElement *> *result = [NSMutableArray array];
112
- BOOL foundStandardEditMenu = NO;
113
-
114
- for (UIMenuElement *element in suggestedActions) {
115
- if ([element isKindOfClass:[UIMenu class]]) {
116
- UIMenu *menu = (UIMenu *)element;
117
-
118
- if ([menu.identifier isEqualToString:kMenuIdentifierStandardEdit]) {
119
- // Replace standard Copy with our enhanced version
120
- [result addObject:createEnhancedStandardEditMenu(menu, copyAction)];
121
- addOptionalAction(result, copyTiptapAction);
122
- addOptionalAction(result, copyImageURLAction);
123
- foundStandardEditMenu = YES;
124
- continue;
125
- }
126
- }
127
- [result addObject:element];
128
- }
129
-
130
- if (!foundStandardEditMenu) {
131
- [result insertObject:copyAction atIndex:0];
132
- insertOptionalAction(result, copyTiptapAction, 1);
133
- addOptionalAction(result, copyImageURLAction);
134
- }
135
-
136
- if (customActions.count > 0) {
137
- return [UIMenu menuWithChildren:[customActions arrayByAddingObjectsFromArray:result]];
138
- }
139
-
140
- return [UIMenu menuWithChildren:result];
141
- }
142
-
143
- #endif
1
+ #import "EditMenuUtils.h"
2
+ #import "PasteboardUtils.h"
3
+ #import "StyleConfig.h"
4
+ #include <TargetConditionals.h>
5
+
6
+ #if !TARGET_OS_OSX
7
+
8
+ static NSString *const kMenuIdentifierStandardEdit = @"com.apple.menu.standard-edit";
9
+ static NSString *const kActionIdentifierCopy = @"com.swmansion.enriched.tiptap.copy";
10
+ static NSString *const kActionIdentifierCopyTiptap = @"com.swmansion.enriched.tiptap.copyTiptap";
11
+ static NSString *const kActionIdentifierCopyImageURL = @"com.swmansion.enriched.tiptap.copyImageURL";
12
+
13
+ static UIAction *createCopyAction(NSAttributedString *selectedText, NSString *tiptap, StyleConfig *styleConfig,
14
+ NSString *copyLabel)
15
+ {
16
+ return [UIAction actionWithTitle:copyLabel
17
+ image:[RCTUIImage systemImageNamed:@"doc.on.doc"]
18
+ identifier:kActionIdentifierCopy
19
+ handler:^(__kindof UIAction *action) {
20
+ copyAttributedStringToPasteboard(selectedText, tiptap, styleConfig);
21
+ }];
22
+ }
23
+
24
+ static UIAction *_Nullable createCopyTiptapAction(NSString *tiptap, NSString *copyAsTiptapLabel)
25
+ {
26
+ if (tiptap.length == 0)
27
+ return nil;
28
+
29
+ return [UIAction actionWithTitle:copyAsTiptapLabel
30
+ image:[RCTUIImage systemImageNamed:@"doc.text"]
31
+ identifier:kActionIdentifierCopyTiptap
32
+ handler:^(__kindof UIAction *action) { copyStringToPasteboard(tiptap); }];
33
+ }
34
+
35
+ static UIAction *_Nullable createCopyImageURLAction(NSArray<NSString *> *imageURLs,
36
+ ENRMSelectionMenuConfig selectionMenuConfig)
37
+ {
38
+ if (imageURLs.count == 0)
39
+ return nil;
40
+
41
+ NSString *urlsToCopy = [imageURLs componentsJoinedByString:@"\n"];
42
+ NSString *title = ENRMResolveImageURLsTitle(selectionMenuConfig, imageURLs.count);
43
+
44
+ return [UIAction actionWithTitle:title
45
+ image:[RCTUIImage systemImageNamed:@"link"]
46
+ identifier:kActionIdentifierCopyImageURL
47
+ handler:^(__kindof UIAction *action) { copyStringToPasteboard(urlsToCopy); }];
48
+ }
49
+
50
+ /// Rebuilds the standard-edit menu with the system Copy swapped for the enhanced
51
+ /// copy action. All other system items are kept — dropping them would remove
52
+ /// Select All, which on iOS 16+ is the only way to start a selection from the
53
+ /// long-press menu of a non-editable text view.
54
+ static UIMenu *createEnhancedStandardEditMenu(UIMenu *originalMenu, UIAction *copyAction)
55
+ {
56
+ NSMutableArray<UIMenuElement *> *children = [NSMutableArray arrayWithCapacity:originalMenu.children.count];
57
+ BOOL replacedCopy = NO;
58
+
59
+ for (UIMenuElement *element in originalMenu.children) {
60
+ if (!replacedCopy && [element isKindOfClass:[UICommand class]] &&
61
+ ((UICommand *)element).action == @selector(copy:)) {
62
+ [children addObject:copyAction];
63
+ replacedCopy = YES;
64
+ continue;
65
+ }
66
+ [children addObject:element];
67
+ }
68
+
69
+ if (!replacedCopy) {
70
+ [children insertObject:copyAction atIndex:0];
71
+ }
72
+
73
+ return [UIMenu menuWithTitle:originalMenu.title
74
+ image:originalMenu.image
75
+ identifier:originalMenu.identifier
76
+ options:originalMenu.options
77
+ children:children];
78
+ }
79
+
80
+ static void addOptionalAction(NSMutableArray<UIMenuElement *> *array, UIAction *_Nullable action)
81
+ {
82
+ if (action) {
83
+ [array addObject:action];
84
+ }
85
+ }
86
+
87
+ static void insertOptionalAction(NSMutableArray<UIMenuElement *> *array, UIAction *_Nullable action, NSUInteger index)
88
+ {
89
+ if (action) {
90
+ [array insertObject:action atIndex:index];
91
+ }
92
+ }
93
+
94
+ // TODO: Remove API_AVAILABLE(ios(16.0)) guard when the minimum iOS deployment target in RN is bumped to 16.
95
+ UIMenu *buildEditMenuForSelection(NSAttributedString *attributedText, NSRange range, NSString *_Nullable cachedTiptap,
96
+ StyleConfig *styleConfig, NSArray<UIMenuElement *> *suggestedActions,
97
+ NSArray<UIAction *> *_Nullable customActions,
98
+ ENRMSelectionMenuConfig selectionMenuConfig) API_AVAILABLE(ios(16.0))
99
+ {
100
+ NSAttributedString *selectedText = [attributedText attributedSubstringFromRange:range];
101
+ NSString *tiptap = tiptapForRange(attributedText, range, cachedTiptap);
102
+ NSArray<NSString *> *imageURLs = imageURLsInRange(attributedText, range);
103
+
104
+ UIAction *copyAction = createCopyAction(selectedText, tiptap, styleConfig, selectionMenuConfig.copyLabel);
105
+ UIAction *copyTiptapAction = selectionMenuConfig.copyAsTiptap
106
+ ? createCopyTiptapAction(tiptap, selectionMenuConfig.copyAsTiptapLabel)
107
+ : nil;
108
+ UIAction *copyImageURLAction =
109
+ selectionMenuConfig.copyImageURL ? createCopyImageURLAction(imageURLs, selectionMenuConfig) : nil;
110
+
111
+ NSMutableArray<UIMenuElement *> *result = [NSMutableArray array];
112
+ BOOL foundStandardEditMenu = NO;
113
+
114
+ for (UIMenuElement *element in suggestedActions) {
115
+ if ([element isKindOfClass:[UIMenu class]]) {
116
+ UIMenu *menu = (UIMenu *)element;
117
+
118
+ if ([menu.identifier isEqualToString:kMenuIdentifierStandardEdit]) {
119
+ // Replace standard Copy with our enhanced version
120
+ [result addObject:createEnhancedStandardEditMenu(menu, copyAction)];
121
+ addOptionalAction(result, copyTiptapAction);
122
+ addOptionalAction(result, copyImageURLAction);
123
+ foundStandardEditMenu = YES;
124
+ continue;
125
+ }
126
+ }
127
+ [result addObject:element];
128
+ }
129
+
130
+ if (!foundStandardEditMenu) {
131
+ [result insertObject:copyAction atIndex:0];
132
+ insertOptionalAction(result, copyTiptapAction, 1);
133
+ addOptionalAction(result, copyImageURLAction);
134
+ }
135
+
136
+ if (customActions.count > 0) {
137
+ return [UIMenu menuWithChildren:[customActions arrayByAddingObjectsFromArray:result]];
138
+ }
139
+
140
+ return [UIMenu menuWithChildren:result];
141
+ }
142
+
143
+ #endif
@@ -1,10 +1,10 @@
1
- #import "ENRMUIKit.h"
2
-
3
- @interface FontScaleObserver : NSObject
4
-
5
- @property (nonatomic, assign) BOOL allowFontScaling;
6
- @property (nonatomic, readonly) CGFloat effectiveFontScale;
7
-
8
- @property (nonatomic, copy, nullable) void (^onChange)(void);
9
-
10
- @end
1
+ #import "ENRMUIKit.h"
2
+
3
+ @interface FontScaleObserver : NSObject
4
+
5
+ @property (nonatomic, assign) BOOL allowFontScaling;
6
+ @property (nonatomic, readonly) CGFloat effectiveFontScale;
7
+
8
+ @property (nonatomic, copy, nullable) void (^onChange)(void);
9
+
10
+ @end
@@ -1,55 +1,55 @@
1
- #import "FontScaleObserver.h"
2
- #import <React/RCTUtils.h>
3
- #include <TargetConditionals.h>
4
-
5
- @implementation FontScaleObserver {
6
- CGFloat _currentFontScale;
7
- }
8
-
9
- - (instancetype)init
10
- {
11
- if (self = [super init]) {
12
- _allowFontScaling = YES;
13
- _currentFontScale = RCTFontSizeMultiplier();
14
-
15
- #if !TARGET_OS_OSX
16
- [[NSNotificationCenter defaultCenter] addObserver:self
17
- selector:@selector(contentSizeCategoryDidChange:)
18
- name:UIContentSizeCategoryDidChangeNotification
19
- object:nil];
20
- #endif
21
- // TODO: Observe macOS system font size changes. UIContentSizeCategoryDidChangeNotification
22
- // is iOS-only; macOS has no direct equivalent. Possible approaches: KVO on
23
- // NSApplication.effectiveAppearance or polling NSFont.systemFontSize.
24
- }
25
- return self;
26
- }
27
-
28
- - (void)dealloc
29
- {
30
- #if !TARGET_OS_OSX
31
- [[NSNotificationCenter defaultCenter] removeObserver:self name:UIContentSizeCategoryDidChangeNotification object:nil];
32
- #endif
33
- }
34
-
35
- - (CGFloat)effectiveFontScale
36
- {
37
- return _allowFontScaling ? _currentFontScale : 1.0;
38
- }
39
-
40
- - (void)contentSizeCategoryDidChange:(NSNotification *)notification
41
- {
42
- if (!_allowFontScaling) {
43
- return;
44
- }
45
-
46
- CGFloat newFontScale = RCTFontSizeMultiplier();
47
- if (_currentFontScale != newFontScale) {
48
- _currentFontScale = newFontScale;
49
- if (self.onChange) {
50
- self.onChange();
51
- }
52
- }
53
- }
54
-
55
- @end
1
+ #import "FontScaleObserver.h"
2
+ #import <React/RCTUtils.h>
3
+ #include <TargetConditionals.h>
4
+
5
+ @implementation FontScaleObserver {
6
+ CGFloat _currentFontScale;
7
+ }
8
+
9
+ - (instancetype)init
10
+ {
11
+ if (self = [super init]) {
12
+ _allowFontScaling = YES;
13
+ _currentFontScale = RCTFontSizeMultiplier();
14
+
15
+ #if !TARGET_OS_OSX
16
+ [[NSNotificationCenter defaultCenter] addObserver:self
17
+ selector:@selector(contentSizeCategoryDidChange:)
18
+ name:UIContentSizeCategoryDidChangeNotification
19
+ object:nil];
20
+ #endif
21
+ // TODO: Observe macOS system font size changes. UIContentSizeCategoryDidChangeNotification
22
+ // is iOS-only; macOS has no direct equivalent. Possible approaches: KVO on
23
+ // NSApplication.effectiveAppearance or polling NSFont.systemFontSize.
24
+ }
25
+ return self;
26
+ }
27
+
28
+ - (void)dealloc
29
+ {
30
+ #if !TARGET_OS_OSX
31
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIContentSizeCategoryDidChangeNotification object:nil];
32
+ #endif
33
+ }
34
+
35
+ - (CGFloat)effectiveFontScale
36
+ {
37
+ return _allowFontScaling ? _currentFontScale : 1.0;
38
+ }
39
+
40
+ - (void)contentSizeCategoryDidChange:(NSNotification *)notification
41
+ {
42
+ if (!_allowFontScaling) {
43
+ return;
44
+ }
45
+
46
+ CGFloat newFontScale = RCTFontSizeMultiplier();
47
+ if (_currentFontScale != newFontScale) {
48
+ _currentFontScale = newFontScale;
49
+ if (self.onChange) {
50
+ self.onChange();
51
+ }
52
+ }
53
+ }
54
+
55
+ @end