@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.
- package/LICENSE +20 -20
- package/README.md +140 -140
- package/ReactNativeRenderRichText.podspec +23 -23
- package/android/build.gradle +86 -86
- package/android/consumer-rules.pro +3 -3
- package/android/src/main/AndroidManifest.xml +2 -2
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextLayoutManager.kt +24 -24
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextPackage.kt +13 -13
- package/android/src/main/java/com/renderrichtext/MeasurementStore.kt +644 -644
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibilityLabels.kt +17 -17
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibleTiptapTextView.kt +112 -112
- package/android/src/main/java/com/renderrichtext/accessibility/TiptapAccessibilityHelper.kt +576 -576
- package/android/src/main/java/com/renderrichtext/events/CodeBlockPressEvent.kt +24 -24
- package/android/src/main/java/com/renderrichtext/events/ContextMenuItemPressEvent.kt +28 -28
- package/android/src/main/java/com/renderrichtext/events/CopyPressEvent.kt +24 -24
- package/android/src/main/java/com/renderrichtext/events/ImagePressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/LatexErrorEvent.kt +29 -29
- package/android/src/main/java/com/renderrichtext/events/LinkLongPressEvent.kt +23 -23
- package/android/src/main/java/com/renderrichtext/events/LinkPressEvent.kt +23 -23
- package/android/src/main/java/com/renderrichtext/events/MentionLongPressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/MentionPressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/TaskListItemPressEvent.kt +26 -26
- package/android/src/main/java/com/renderrichtext/math/LatexErrorReporter.kt +9 -9
- package/android/src/main/java/com/renderrichtext/parser/Parser.kt +59 -59
- package/android/src/main/java/com/renderrichtext/parser/TextLinkMatching.kt +35 -35
- package/android/src/main/java/com/renderrichtext/renderer/BaselineShiftRenderer.kt +45 -45
- package/android/src/main/java/com/renderrichtext/renderer/BlankLineRenderer.kt +39 -39
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteRenderer.kt +243 -243
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteTextRenderer.kt +56 -56
- package/android/src/main/java/com/renderrichtext/renderer/CodeBlockRenderer.kt +135 -135
- package/android/src/main/java/com/renderrichtext/renderer/CodeRenderer.kt +37 -37
- package/android/src/main/java/com/renderrichtext/renderer/EmphasisRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/HeadingRenderer.kt +81 -81
- package/android/src/main/java/com/renderrichtext/renderer/HighlightRenderer.kt +26 -26
- package/android/src/main/java/com/renderrichtext/renderer/LineBreakRenderer.kt +17 -17
- package/android/src/main/java/com/renderrichtext/renderer/LinkRenderer.kt +90 -90
- package/android/src/main/java/com/renderrichtext/renderer/ListContextManager.kt +109 -109
- package/android/src/main/java/com/renderrichtext/renderer/ListItemRenderer.kt +211 -211
- package/android/src/main/java/com/renderrichtext/renderer/ListRenderer.kt +133 -133
- package/android/src/main/java/com/renderrichtext/renderer/MentionRenderer.kt +85 -85
- package/android/src/main/java/com/renderrichtext/renderer/ParagraphRenderer.kt +91 -91
- package/android/src/main/java/com/renderrichtext/renderer/Renderer.kt +148 -148
- package/android/src/main/java/com/renderrichtext/renderer/SoftBreakRenderer.kt +17 -17
- package/android/src/main/java/com/renderrichtext/renderer/SpanStyleCache.kt +143 -143
- package/android/src/main/java/com/renderrichtext/renderer/StrikethroughRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/StrongRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/TextRenderer.kt +31 -31
- package/android/src/main/java/com/renderrichtext/renderer/ThematicBreakRenderer.kt +46 -46
- package/android/src/main/java/com/renderrichtext/renderer/UnderlineRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/spans/BaseListSpan.kt +164 -164
- package/android/src/main/java/com/renderrichtext/spans/BaselineShiftSpan.kt +27 -27
- package/android/src/main/java/com/renderrichtext/spans/BlockquoteSpan.kt +302 -302
- package/android/src/main/java/com/renderrichtext/spans/CodeBackgroundSpan.kt +205 -205
- package/android/src/main/java/com/renderrichtext/spans/CodeBlockSpan.kt +216 -216
- package/android/src/main/java/com/renderrichtext/spans/CodeSpan.kt +32 -32
- package/android/src/main/java/com/renderrichtext/spans/EmphasisSpan.kt +42 -42
- package/android/src/main/java/com/renderrichtext/spans/FadeInSpan.kt +29 -29
- package/android/src/main/java/com/renderrichtext/spans/HeadingSpan.kt +38 -38
- package/android/src/main/java/com/renderrichtext/spans/HighlightSpan.kt +80 -80
- package/android/src/main/java/com/renderrichtext/spans/ImageSpan.kt +481 -481
- package/android/src/main/java/com/renderrichtext/spans/InlineBackgroundGeometry.kt +42 -42
- package/android/src/main/java/com/renderrichtext/spans/LineHeightSpan.kt +39 -39
- package/android/src/main/java/com/renderrichtext/spans/LinkPillIconCache.kt +154 -154
- package/android/src/main/java/com/renderrichtext/spans/LinkPillSpan.kt +381 -381
- package/android/src/main/java/com/renderrichtext/spans/LinkSpan.kt +68 -68
- package/android/src/main/java/com/renderrichtext/spans/ListItemSpacingSpan.kt +33 -33
- package/android/src/main/java/com/renderrichtext/spans/ListMarkerAnchorSpan.kt +38 -38
- package/android/src/main/java/com/renderrichtext/spans/MarginBottomSpan.kt +76 -76
- package/android/src/main/java/com/renderrichtext/spans/MentionChipSpan.kt +132 -132
- package/android/src/main/java/com/renderrichtext/spans/MentionSpan.kt +46 -46
- package/android/src/main/java/com/renderrichtext/spans/OrderedListSpan.kt +127 -127
- package/android/src/main/java/com/renderrichtext/spans/SpoilerSpan.kt +33 -33
- package/android/src/main/java/com/renderrichtext/spans/StrikethroughSpan.kt +12 -12
- package/android/src/main/java/com/renderrichtext/spans/StrongSpan.kt +39 -39
- package/android/src/main/java/com/renderrichtext/spans/TaskListSpan.kt +143 -143
- package/android/src/main/java/com/renderrichtext/spans/TextSpan.kt +26 -26
- package/android/src/main/java/com/renderrichtext/spans/ThematicBreakSpan.kt +69 -69
- package/android/src/main/java/com/renderrichtext/spans/UnorderedListSpan.kt +96 -96
- package/android/src/main/java/com/renderrichtext/spoiler/SpoilerStubs.kt +46 -46
- package/android/src/main/java/com/renderrichtext/styles/BaseBlockStyle.kt +11 -11
- package/android/src/main/java/com/renderrichtext/styles/BlockquoteStyle.kt +83 -83
- package/android/src/main/java/com/renderrichtext/styles/CodeBlockStyle.kt +80 -80
- package/android/src/main/java/com/renderrichtext/styles/CodeStyle.kt +26 -26
- package/android/src/main/java/com/renderrichtext/styles/EmphasisStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/FactoidStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/HeadingStyle.kt +33 -33
- package/android/src/main/java/com/renderrichtext/styles/HighlightStyle.kt +19 -19
- package/android/src/main/java/com/renderrichtext/styles/ImageStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/InlineImageStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/InlineMathStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/LinkPillContent.kt +36 -36
- package/android/src/main/java/com/renderrichtext/styles/LinkPillStyle.kt +44 -44
- package/android/src/main/java/com/renderrichtext/styles/LinkStyle.kt +23 -23
- package/android/src/main/java/com/renderrichtext/styles/LinkVariantEntry.kt +34 -34
- package/android/src/main/java/com/renderrichtext/styles/ListStyle.kt +65 -65
- package/android/src/main/java/com/renderrichtext/styles/MathStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/MentionStyle.kt +19 -19
- package/android/src/main/java/com/renderrichtext/styles/ParagraphStyle.kt +33 -33
- package/android/src/main/java/com/renderrichtext/styles/SpoilerStyle.kt +27 -27
- package/android/src/main/java/com/renderrichtext/styles/StrikethroughStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/StrongStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/StyleConfig.kt +411 -411
- package/android/src/main/java/com/renderrichtext/styles/StyleParser.kt +92 -92
- package/android/src/main/java/com/renderrichtext/styles/SubscriptStyle.kt +16 -16
- package/android/src/main/java/com/renderrichtext/styles/SuperscriptStyle.kt +16 -16
- package/android/src/main/java/com/renderrichtext/styles/TableStyle.kt +75 -75
- package/android/src/main/java/com/renderrichtext/styles/TaskListStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/TextAlignment.kt +32 -32
- package/android/src/main/java/com/renderrichtext/styles/ThematicBreakStyle.kt +23 -23
- package/android/src/main/java/com/renderrichtext/styles/UnderlineStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/VideoStyle.kt +31 -31
- package/android/src/main/java/com/renderrichtext/utils/common/BorderStyleUtils.kt +86 -86
- package/android/src/main/java/com/renderrichtext/utils/common/BreakStrategyUtils.kt +32 -32
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockHighlighter.kt +36 -36
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockNode.kt +42 -42
- package/android/src/main/java/com/renderrichtext/utils/common/EllipsizeUtils.kt +27 -27
- package/android/src/main/java/com/renderrichtext/utils/common/EnrichedTiptapAncestorUtils.kt +10 -10
- package/android/src/main/java/com/renderrichtext/utils/common/FeatureFlags.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRecognitionProps.kt +31 -31
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRegexConfig.kt +56 -56
- package/android/src/main/java/com/renderrichtext/utils/common/MotionPreferences.kt +18 -18
- package/android/src/main/java/com/renderrichtext/utils/common/ReadableMapExtensions.kt +28 -28
- package/android/src/main/java/com/renderrichtext/utils/common/layout/RTLUtils.kt +6 -6
- package/android/src/main/java/com/renderrichtext/utils/common/serialization/TiptapASTSerializer.kt +368 -368
- package/android/src/main/java/com/renderrichtext/utils/text/ImageCache.kt +88 -88
- package/android/src/main/java/com/renderrichtext/utils/text/ImageDownloader.kt +203 -203
- package/android/src/main/java/com/renderrichtext/utils/text/LocalImageLoader.kt +167 -167
- package/android/src/main/java/com/renderrichtext/utils/text/TailFadeInAnimator.kt +84 -84
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/HTMLGenerator.kt +1105 -1105
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/TiptapExtractor.kt +423 -423
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/ParagraphUtils.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/SpannableExtensions.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/TextPaintExtensions.kt +76 -76
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/CheckboxTouchHelper.kt +61 -61
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/TaskListTapUtils.kt +286 -286
- package/android/src/main/java/com/renderrichtext/utils/text/span/ApplyLineHeight.kt +39 -39
- package/android/src/main/java/com/renderrichtext/utils/text/span/BlockSpacing.kt +142 -142
- package/android/src/main/java/com/renderrichtext/utils/text/span/SpanFlags.kt +43 -43
- package/android/src/main/java/com/renderrichtext/utils/text/span/WidthAwareSpans.kt +30 -30
- package/android/src/main/java/com/renderrichtext/utils/text/view/CodeBlockPressHost.kt +15 -15
- package/android/src/main/java/com/renderrichtext/utils/text/view/ImagePressHost.kt +19 -19
- package/android/src/main/java/com/renderrichtext/utils/text/view/SelectionActionMode.kt +235 -235
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextSelectionColors.kt +48 -48
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextViewSetup.kt +119 -119
- package/android/src/main/java/com/renderrichtext/views/ContextMenuPopup.kt +217 -217
- package/android/src/main/java/com/renderrichtext/views/CopyGlyph.kt +101 -101
- package/android/src/main/java/com/renderrichtext/views/WrapGlyph.kt +40 -40
- package/android/src/main/jni/CMakeLists.txt +52 -52
- package/android/src/main/jni/react/renderer/components/RichTextSpec/ComponentDescriptors.h +30 -30
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextComponentDescriptor.h +29 -29
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.cpp +45 -45
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.h +21 -21
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.cpp +38 -38
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.h +53 -53
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.cpp +9 -9
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.h +24 -24
- package/android/src/main/jni/react/renderer/components/RichTextSpec/conversions.h +40 -40
- package/cpp/parser/TiptapParser.hpp +13 -13
- package/cpp/vendor/nlohmann/json.hpp +24765 -24765
- package/ios/EnrichedTiptapText.h +27 -27
- package/ios/attachments/ENRMImageAttachment.h +51 -51
- package/ios/attachments/ENRMImageAttachment.m +398 -398
- package/ios/attachments/ENRMLinkPillAttachment.h +47 -47
- package/ios/attachments/ENRMLinkPillAttachment.m +324 -324
- package/ios/attachments/ENRMLinkPillIconCache.h +28 -28
- package/ios/attachments/ENRMLinkPillIconCache.m +181 -181
- package/ios/attachments/ENRMLinkPillText.h +27 -27
- package/ios/attachments/ENRMLinkPillText.m +118 -118
- package/ios/attachments/ENRMMathInlineAttachment.h +7 -7
- package/ios/attachments/ENRMMathInlineAttachment.m +4 -4
- package/ios/attachments/ThematicBreakAttachment.h +15 -15
- package/ios/attachments/ThematicBreakAttachment.m +33 -33
- package/ios/internals/ENRMViewFreeMeasurement.h +208 -208
- package/ios/internals/EnrichedTiptapTextComponentDescriptor.h +19 -19
- package/ios/internals/EnrichedTiptapTextShadowNode.h +43 -43
- package/ios/internals/EnrichedTiptapTextShadowNode.mm +69 -69
- package/ios/internals/EnrichedTiptapTextState.h +24 -24
- package/ios/internals/MeasurementCache.h +308 -308
- package/ios/internals/ShadowMeasurementUtils.h +145 -145
- package/ios/parser/ENRMTextLinkAttributes.h +7 -7
- package/ios/parser/ENRMTiptapParser.h +33 -33
- package/ios/parser/ENRMTiptapParser.mm +73 -73
- package/ios/parser/TiptapASTNode.m +52 -52
- package/ios/renderer/AttributedRenderer.h +23 -23
- package/ios/renderer/AttributedRenderer.m +229 -229
- package/ios/renderer/BaseRenderer.h +33 -33
- package/ios/renderer/BaseRenderer.m +46 -46
- package/ios/renderer/BaselineShiftTextAttributes.h +10 -10
- package/ios/renderer/BaselineShiftTextAttributes.m +26 -26
- package/ios/renderer/BlankLineRenderer.h +4 -4
- package/ios/renderer/BlankLineRenderer.m +51 -51
- package/ios/renderer/BlockquoteRenderer.h +6 -6
- package/ios/renderer/BlockquoteRenderer.m +258 -258
- package/ios/renderer/CodeBlockRenderer.h +9 -9
- package/ios/renderer/CodeBlockRenderer.m +99 -99
- package/ios/renderer/CodeRenderer.h +9 -9
- package/ios/renderer/CodeRenderer.m +69 -69
- package/ios/renderer/ENRMBlockquoteTextRenderer.h +25 -25
- package/ios/renderer/ENRMBlockquoteTextRenderer.m +48 -48
- package/ios/renderer/EmphasisRenderer.h +5 -5
- package/ios/renderer/EmphasisRenderer.m +99 -99
- package/ios/renderer/HeadingRenderer.h +6 -6
- package/ios/renderer/HeadingRenderer.m +102 -102
- package/ios/renderer/HighlightRenderer.h +7 -7
- package/ios/renderer/HighlightRenderer.m +33 -33
- package/ios/renderer/LinkRenderer.h +6 -6
- package/ios/renderer/LinkRenderer.m +157 -157
- package/ios/renderer/ListItemRenderer.h +24 -24
- package/ios/renderer/ListItemRenderer.m +283 -283
- package/ios/renderer/ListRenderer.h +13 -13
- package/ios/renderer/ListRenderer.m +126 -126
- package/ios/renderer/MentionRenderer.h +9 -9
- package/ios/renderer/MentionRenderer.m +96 -96
- package/ios/renderer/NodeRenderer.h +8 -8
- package/ios/renderer/ParagraphRenderer.h +6 -6
- package/ios/renderer/ParagraphRenderer.m +85 -85
- package/ios/renderer/RenderContext.h +145 -145
- package/ios/renderer/RenderContext.m +402 -402
- package/ios/renderer/RendererFactory.h +12 -12
- package/ios/renderer/StrikethroughRenderer.h +5 -5
- package/ios/renderer/StrikethroughRenderer.m +30 -30
- package/ios/renderer/StrongRenderer.h +5 -5
- package/ios/renderer/StrongRenderer.m +87 -87
- package/ios/renderer/TextRenderer.h +6 -6
- package/ios/renderer/TextRenderer.m +18 -18
- package/ios/renderer/ThematicBreakRenderer.h +4 -4
- package/ios/renderer/ThematicBreakRenderer.m +41 -41
- package/ios/renderer/UnderlineRenderer.h +4 -4
- package/ios/renderer/UnderlineRenderer.m +41 -41
- package/ios/styles/ENRMFontSlot.h +12 -12
- package/ios/styles/ENRMFontSlot.m +24 -24
- package/ios/styles/StyleConfig.h +488 -488
- package/ios/styles/StyleConfig.mm +2820 -2820
- package/ios/utils/AccessibilityInfo.h +35 -35
- package/ios/utils/AccessibilityInfo.m +24 -24
- package/ios/utils/BlockquoteBorder.h +26 -26
- package/ios/utils/BlockquoteBorder.m +294 -294
- package/ios/utils/CodeBackground.h +19 -19
- package/ios/utils/CodeBackground.m +196 -196
- package/ios/utils/CodeBlockBackground.h +17 -17
- package/ios/utils/CodeBlockBackground.m +102 -102
- package/ios/utils/ContextMenuUtils.h +76 -76
- package/ios/utils/ContextMenuUtils.mm +75 -75
- package/ios/utils/ENRMAccessibilityLabels.h +40 -40
- package/ios/utils/ENRMAccessibilityLabels.m +5 -5
- package/ios/utils/ENRMAsyncRenderCoordinator.h +24 -24
- package/ios/utils/ENRMAsyncRenderCoordinator.m +37 -37
- package/ios/utils/ENRMAtomicSize.h +65 -65
- package/ios/utils/ENRMCodeBlockContent.h +37 -37
- package/ios/utils/ENRMCodeBlockContent.mm +89 -89
- package/ios/utils/ENRMFeatureFlags.h +25 -25
- package/ios/utils/ENRMImageDownloader.h +30 -30
- package/ios/utils/ENRMImageDownloader.m +168 -168
- package/ios/utils/ENRMLatexErrorCoordinator.h +27 -27
- package/ios/utils/ENRMLatexErrorCoordinator.mm +75 -75
- package/ios/utils/ENRMLatexErrorReporting.h +13 -13
- package/ios/utils/ENRMLinkContextMenus.h +93 -93
- package/ios/utils/ENRMLinkContextMenus.m +178 -178
- package/ios/utils/ENRMLinkRegexConfig.h +30 -30
- package/ios/utils/ENRMLinkRegexConfig.mm +104 -104
- package/ios/utils/ENRMLinkRegexProps.h +23 -23
- package/ios/utils/ENRMLocalImageLoader.h +35 -35
- package/ios/utils/ENRMLocalImageLoader.m +111 -111
- package/ios/utils/ENRMMenuAction.h +27 -27
- package/ios/utils/ENRMMenuAction.m +33 -33
- package/ios/utils/ENRMSpoilerOverlayManager.h +15 -15
- package/ios/utils/ENRMSpoilerOverlayManager.m +19 -19
- package/ios/utils/ENRMSpoilerTapUtils.h +6 -6
- package/ios/utils/ENRMSpoilerTapUtils.m +11 -11
- package/ios/utils/ENRMTailFadeInAnimator.h +16 -16
- package/ios/utils/ENRMTailFadeInAnimator.m +161 -161
- package/ios/utils/ENRMTextHitTest.h +23 -23
- package/ios/utils/ENRMTextHitTest.m +20 -20
- package/ios/utils/ENRMTextInteractionUtils.h +20 -20
- package/ios/utils/ENRMTextInteractionUtils.m +15 -15
- package/ios/utils/ENRMTextRenderer.h +38 -38
- package/ios/utils/ENRMTextRenderer.m +54 -54
- package/ios/utils/ENRMTextViewSetup.h +132 -132
- package/ios/utils/ENRMUIKit.h +429 -429
- package/ios/utils/EditMenuUtils.h +105 -105
- package/ios/utils/EditMenuUtils.m +143 -143
- package/ios/utils/FontScaleObserver.h +10 -10
- package/ios/utils/FontScaleObserver.m +55 -55
- package/ios/utils/FontUtils.h +31 -31
- package/ios/utils/FontUtils.m +63 -63
- package/ios/utils/HTMLGenerator.h +25 -25
- package/ios/utils/HTMLGenerator.m +1041 -1041
- package/ios/utils/HeightUpdateUtils.h +25 -25
- package/ios/utils/ImageRequestHeaderUtils.h +35 -35
- package/ios/utils/LastElementUtils.h +97 -97
- package/ios/utils/LinkContextMenuUtils.h +55 -55
- package/ios/utils/LinkPillContentUtils.h +46 -46
- package/ios/utils/ListMarkerDrawer.h +15 -15
- package/ios/utils/ListMarkerDrawer.m +239 -239
- package/ios/utils/MentionBackground.h +26 -26
- package/ios/utils/MentionBackground.m +86 -86
- package/ios/utils/ParagraphStyleUtils.h +87 -87
- package/ios/utils/ParagraphStyleUtils.m +484 -484
- package/ios/utils/PasteboardUtils.h +48 -48
- package/ios/utils/PasteboardUtils.m +166 -166
- package/ios/utils/RTFExportUtils.h +24 -24
- package/ios/utils/RTFExportUtils.m +299 -299
- package/ios/utils/SelectionColorUtils.h +14 -14
- package/ios/utils/StylePropsUtils.h +1340 -1340
- package/ios/utils/TaskListTapUtils.h +6 -6
- package/ios/utils/TaskListTapUtils.m +14 -14
- package/ios/utils/TextViewLayoutManager.h +14 -14
- package/ios/utils/TiptapAccessibilityElementBuilder.h +43 -43
- package/ios/utils/TiptapAccessibilityElementBuilder.m +432 -432
- package/ios/utils/TiptapExtractor.h +17 -17
- package/ios/utils/TiptapExtractor.m +367 -367
- package/ios/views/ENRMTiptapTextView.h +25 -25
- package/ios/views/ENRMTiptapTextView.m +247 -247
- package/package.json +65 -70
- package/react-native.config.js +10 -10
- package/src/admonitionDefaults.ts +58 -58
- package/src/darkModeTextStyle.ts +99 -99
- package/src/headingDefaults.ts +21 -21
- package/src/index.tsx +4 -4
- package/src/linkVariantUtils.ts +120 -120
- package/src/normalizeTiptapStyle.ts +397 -397
- package/src/rn-globals.d.ts +1 -1
- package/src/styleUtils.ts +107 -107
- package/src/types/TiptapStyle.ts +532 -532
- package/src/types/TiptapStyleInternal.ts +299 -299
- package/src/types/linkPill.ts +9 -9
- 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
|