@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,15 +1,15 @@
|
|
|
1
|
-
#import "ENRMTextInteractionUtils.h"
|
|
2
|
-
#import "LinkTapUtils.h"
|
|
3
|
-
|
|
4
|
-
BOOL ENRMHandleTapOnTextView(ENRMPlatformTextView *textView, ENRMTapRecognizer *recognizer,
|
|
5
|
-
void (^onLinkPress)(NSString *url))
|
|
6
|
-
{
|
|
7
|
-
NSString *url = linkURLAtTapLocation(textView, recognizer);
|
|
8
|
-
if (!url) {
|
|
9
|
-
ENRMClearSelection(textView);
|
|
10
|
-
return NO;
|
|
11
|
-
}
|
|
12
|
-
if (onLinkPress)
|
|
13
|
-
onLinkPress(url);
|
|
14
|
-
return YES;
|
|
15
|
-
}
|
|
1
|
+
#import "ENRMTextInteractionUtils.h"
|
|
2
|
+
#import "LinkTapUtils.h"
|
|
3
|
+
|
|
4
|
+
BOOL ENRMHandleTapOnTextView(ENRMPlatformTextView *textView, ENRMTapRecognizer *recognizer,
|
|
5
|
+
void (^onLinkPress)(NSString *url))
|
|
6
|
+
{
|
|
7
|
+
NSString *url = linkURLAtTapLocation(textView, recognizer);
|
|
8
|
+
if (!url) {
|
|
9
|
+
ENRMClearSelection(textView);
|
|
10
|
+
return NO;
|
|
11
|
+
}
|
|
12
|
+
if (onLinkPress)
|
|
13
|
+
onLinkPress(url);
|
|
14
|
+
return YES;
|
|
15
|
+
}
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
#import <Foundation/Foundation.h>
|
|
3
|
-
|
|
4
|
-
@class AccessibilityInfo;
|
|
5
|
-
@class TiptapASTNode;
|
|
6
|
-
@class RenderContext;
|
|
7
|
-
@class StyleConfig;
|
|
8
|
-
|
|
9
|
-
NS_ASSUME_NONNULL_BEGIN
|
|
10
|
-
|
|
11
|
-
@interface ENRMRenderResult : NSObject
|
|
12
|
-
@property (nonatomic, strong) NSMutableAttributedString *attributedText;
|
|
13
|
-
@property (nonatomic, strong) RenderContext *context;
|
|
14
|
-
@property (nonatomic, strong) AccessibilityInfo *accessibilityInfo;
|
|
15
|
-
@property (nonatomic, assign) CGFloat lastElementMarginBottom;
|
|
16
|
-
@end
|
|
17
|
-
|
|
18
|
-
#ifdef __cplusplus
|
|
19
|
-
extern "C" {
|
|
20
|
-
#endif
|
|
21
|
-
|
|
22
|
-
ENRMRenderResult *ENRMRenderASTNodes(NSArray<TiptapASTNode *> *nodes, StyleConfig *config, BOOL allowTrailingMargin,
|
|
23
|
-
BOOL allowFontScaling, CGFloat maxFontSizeMultiplier,
|
|
24
|
-
NSLineBreakStrategy lineBreakStrategy);
|
|
25
|
-
|
|
26
|
-
// Renders a blockquote's own text content: like ENRMRenderASTNodes but with a blockquote baseline
|
|
27
|
-
// (tight paragraphs, quote font/color) and the quote's line height applied over the result. Draws
|
|
28
|
-
// no box - the ENRMBlockquoteContainerView draws the border/background/padding. Mirrors Android's
|
|
29
|
-
// BlockquoteTextRenderer.
|
|
30
|
-
ENRMRenderResult *ENRMRenderBlockquoteContentNodes(NSArray<TiptapASTNode *> *nodes, StyleConfig *config,
|
|
31
|
-
BOOL allowFontScaling, CGFloat maxFontSizeMultiplier,
|
|
32
|
-
NSLineBreakStrategy lineBreakStrategy);
|
|
33
|
-
|
|
34
|
-
#ifdef __cplusplus
|
|
35
|
-
}
|
|
36
|
-
#endif
|
|
37
|
-
|
|
38
|
-
NS_ASSUME_NONNULL_END
|
|
1
|
+
#pragma once
|
|
2
|
+
#import <Foundation/Foundation.h>
|
|
3
|
+
|
|
4
|
+
@class AccessibilityInfo;
|
|
5
|
+
@class TiptapASTNode;
|
|
6
|
+
@class RenderContext;
|
|
7
|
+
@class StyleConfig;
|
|
8
|
+
|
|
9
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
10
|
+
|
|
11
|
+
@interface ENRMRenderResult : NSObject
|
|
12
|
+
@property (nonatomic, strong) NSMutableAttributedString *attributedText;
|
|
13
|
+
@property (nonatomic, strong) RenderContext *context;
|
|
14
|
+
@property (nonatomic, strong) AccessibilityInfo *accessibilityInfo;
|
|
15
|
+
@property (nonatomic, assign) CGFloat lastElementMarginBottom;
|
|
16
|
+
@end
|
|
17
|
+
|
|
18
|
+
#ifdef __cplusplus
|
|
19
|
+
extern "C" {
|
|
20
|
+
#endif
|
|
21
|
+
|
|
22
|
+
ENRMRenderResult *ENRMRenderASTNodes(NSArray<TiptapASTNode *> *nodes, StyleConfig *config, BOOL allowTrailingMargin,
|
|
23
|
+
BOOL allowFontScaling, CGFloat maxFontSizeMultiplier,
|
|
24
|
+
NSLineBreakStrategy lineBreakStrategy);
|
|
25
|
+
|
|
26
|
+
// Renders a blockquote's own text content: like ENRMRenderASTNodes but with a blockquote baseline
|
|
27
|
+
// (tight paragraphs, quote font/color) and the quote's line height applied over the result. Draws
|
|
28
|
+
// no box - the ENRMBlockquoteContainerView draws the border/background/padding. Mirrors Android's
|
|
29
|
+
// BlockquoteTextRenderer.
|
|
30
|
+
ENRMRenderResult *ENRMRenderBlockquoteContentNodes(NSArray<TiptapASTNode *> *nodes, StyleConfig *config,
|
|
31
|
+
BOOL allowFontScaling, CGFloat maxFontSizeMultiplier,
|
|
32
|
+
NSLineBreakStrategy lineBreakStrategy);
|
|
33
|
+
|
|
34
|
+
#ifdef __cplusplus
|
|
35
|
+
}
|
|
36
|
+
#endif
|
|
37
|
+
|
|
38
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
#import "ENRMTextRenderer.h"
|
|
2
|
-
#import "AccessibilityInfo.h"
|
|
3
|
-
#import "AttributedRenderer.h"
|
|
4
|
-
#import "ENRMBlockquoteTextRenderer.h"
|
|
5
|
-
#import "ParagraphStyleUtils.h"
|
|
6
|
-
#import "RenderContext.h"
|
|
7
|
-
#import "StyleConfig.h"
|
|
8
|
-
|
|
9
|
-
@implementation ENRMRenderResult
|
|
10
|
-
@end
|
|
11
|
-
|
|
12
|
-
static ENRMRenderResult *ENRMRenderASTNodesCore(NSArray<TiptapASTNode *> *nodes, StyleConfig *config,
|
|
13
|
-
BOOL allowTrailingMargin, BOOL allowFontScaling,
|
|
14
|
-
CGFloat maxFontSizeMultiplier, NSLineBreakStrategy lineBreakStrategy,
|
|
15
|
-
ENRMBlockquoteTextRenderer *block)
|
|
16
|
-
{
|
|
17
|
-
AttributedRenderer *renderer = [[AttributedRenderer alloc] initWithConfig:config];
|
|
18
|
-
[renderer setAllowTrailingMargin:allowTrailingMargin];
|
|
19
|
-
|
|
20
|
-
RenderContext *context = [RenderContext new];
|
|
21
|
-
context.allowFontScaling = allowFontScaling;
|
|
22
|
-
context.maxFontSizeMultiplier = maxFontSizeMultiplier;
|
|
23
|
-
|
|
24
|
-
NSMutableAttributedString *attributedText = [renderer renderNodes:nodes context:context block:block];
|
|
25
|
-
|
|
26
|
-
[context applyLinkAttributesToString:attributedText];
|
|
27
|
-
[context applyImageAttributesToString:attributedText];
|
|
28
|
-
ENRMApplyLineBreakStrategyToParagraphStyles(attributedText, lineBreakStrategy);
|
|
29
|
-
ENRMPinLineMetricsToStyledFonts(attributedText, NSMakeRange(0, attributedText.length));
|
|
30
|
-
|
|
31
|
-
ENRMRenderResult *result = [[ENRMRenderResult alloc] init];
|
|
32
|
-
result.attributedText = attributedText;
|
|
33
|
-
result.context = context;
|
|
34
|
-
result.accessibilityInfo = [AccessibilityInfo infoFromContext:context];
|
|
35
|
-
result.lastElementMarginBottom = [renderer getLastElementMarginBottom];
|
|
36
|
-
return result;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
ENRMRenderResult *ENRMRenderASTNodes(NSArray<TiptapASTNode *> *nodes, StyleConfig *config, BOOL allowTrailingMargin,
|
|
40
|
-
BOOL allowFontScaling, CGFloat maxFontSizeMultiplier,
|
|
41
|
-
NSLineBreakStrategy lineBreakStrategy)
|
|
42
|
-
{
|
|
43
|
-
return ENRMRenderASTNodesCore(nodes, config, allowTrailingMargin, allowFontScaling, maxFontSizeMultiplier,
|
|
44
|
-
lineBreakStrategy, /*block*/ nil);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
ENRMRenderResult *ENRMRenderBlockquoteContentNodes(NSArray<TiptapASTNode *> *nodes, StyleConfig *config,
|
|
48
|
-
BOOL allowFontScaling, CGFloat maxFontSizeMultiplier,
|
|
49
|
-
NSLineBreakStrategy lineBreakStrategy)
|
|
50
|
-
{
|
|
51
|
-
ENRMBlockquoteTextRenderer *block = [[ENRMBlockquoteTextRenderer alloc] initWithConfig:config];
|
|
52
|
-
return ENRMRenderASTNodesCore(nodes, config, /*allowTrailingMargin*/ NO, allowFontScaling, maxFontSizeMultiplier,
|
|
53
|
-
lineBreakStrategy, block);
|
|
54
|
-
}
|
|
1
|
+
#import "ENRMTextRenderer.h"
|
|
2
|
+
#import "AccessibilityInfo.h"
|
|
3
|
+
#import "AttributedRenderer.h"
|
|
4
|
+
#import "ENRMBlockquoteTextRenderer.h"
|
|
5
|
+
#import "ParagraphStyleUtils.h"
|
|
6
|
+
#import "RenderContext.h"
|
|
7
|
+
#import "StyleConfig.h"
|
|
8
|
+
|
|
9
|
+
@implementation ENRMRenderResult
|
|
10
|
+
@end
|
|
11
|
+
|
|
12
|
+
static ENRMRenderResult *ENRMRenderASTNodesCore(NSArray<TiptapASTNode *> *nodes, StyleConfig *config,
|
|
13
|
+
BOOL allowTrailingMargin, BOOL allowFontScaling,
|
|
14
|
+
CGFloat maxFontSizeMultiplier, NSLineBreakStrategy lineBreakStrategy,
|
|
15
|
+
ENRMBlockquoteTextRenderer *block)
|
|
16
|
+
{
|
|
17
|
+
AttributedRenderer *renderer = [[AttributedRenderer alloc] initWithConfig:config];
|
|
18
|
+
[renderer setAllowTrailingMargin:allowTrailingMargin];
|
|
19
|
+
|
|
20
|
+
RenderContext *context = [RenderContext new];
|
|
21
|
+
context.allowFontScaling = allowFontScaling;
|
|
22
|
+
context.maxFontSizeMultiplier = maxFontSizeMultiplier;
|
|
23
|
+
|
|
24
|
+
NSMutableAttributedString *attributedText = [renderer renderNodes:nodes context:context block:block];
|
|
25
|
+
|
|
26
|
+
[context applyLinkAttributesToString:attributedText];
|
|
27
|
+
[context applyImageAttributesToString:attributedText];
|
|
28
|
+
ENRMApplyLineBreakStrategyToParagraphStyles(attributedText, lineBreakStrategy);
|
|
29
|
+
ENRMPinLineMetricsToStyledFonts(attributedText, NSMakeRange(0, attributedText.length));
|
|
30
|
+
|
|
31
|
+
ENRMRenderResult *result = [[ENRMRenderResult alloc] init];
|
|
32
|
+
result.attributedText = attributedText;
|
|
33
|
+
result.context = context;
|
|
34
|
+
result.accessibilityInfo = [AccessibilityInfo infoFromContext:context];
|
|
35
|
+
result.lastElementMarginBottom = [renderer getLastElementMarginBottom];
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
ENRMRenderResult *ENRMRenderASTNodes(NSArray<TiptapASTNode *> *nodes, StyleConfig *config, BOOL allowTrailingMargin,
|
|
40
|
+
BOOL allowFontScaling, CGFloat maxFontSizeMultiplier,
|
|
41
|
+
NSLineBreakStrategy lineBreakStrategy)
|
|
42
|
+
{
|
|
43
|
+
return ENRMRenderASTNodesCore(nodes, config, allowTrailingMargin, allowFontScaling, maxFontSizeMultiplier,
|
|
44
|
+
lineBreakStrategy, /*block*/ nil);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
ENRMRenderResult *ENRMRenderBlockquoteContentNodes(NSArray<TiptapASTNode *> *nodes, StyleConfig *config,
|
|
48
|
+
BOOL allowFontScaling, CGFloat maxFontSizeMultiplier,
|
|
49
|
+
NSLineBreakStrategy lineBreakStrategy)
|
|
50
|
+
{
|
|
51
|
+
ENRMBlockquoteTextRenderer *block = [[ENRMBlockquoteTextRenderer alloc] initWithConfig:config];
|
|
52
|
+
return ENRMRenderASTNodesCore(nodes, config, /*allowTrailingMargin*/ NO, allowFontScaling, maxFontSizeMultiplier,
|
|
53
|
+
lineBreakStrategy, block);
|
|
54
|
+
}
|
|
@@ -1,132 +1,132 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
#import "ENRMUIKit.h"
|
|
3
|
-
#import "LastElementUtils.h"
|
|
4
|
-
#import "StyleConfig.h"
|
|
5
|
-
#import "TextViewLayoutManager.h"
|
|
6
|
-
#import <React/RCTUtils.h>
|
|
7
|
-
#import <objc/runtime.h>
|
|
8
|
-
|
|
9
|
-
NS_ASSUME_NONNULL_BEGIN
|
|
10
|
-
|
|
11
|
-
static inline void ENRMAttachLayoutManager(ENRMPlatformTextView *textView, StyleConfig *_Nullable config)
|
|
12
|
-
{
|
|
13
|
-
NSLayoutManager *layoutManager = textView.layoutManager;
|
|
14
|
-
if (layoutManager == nil) {
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
layoutManager.allowsNonContiguousLayout = NO;
|
|
18
|
-
object_setClass(layoutManager, [TextViewLayoutManager class]);
|
|
19
|
-
if (config != nil) {
|
|
20
|
-
[layoutManager setValue:config forKey:@"config"];
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
static inline void ENRMDetachLayoutManager(ENRMPlatformTextView *textView)
|
|
25
|
-
{
|
|
26
|
-
NSLayoutManager *layoutManager = textView.layoutManager;
|
|
27
|
-
if (layoutManager != nil && [object_getClass(layoutManager) isEqual:[TextViewLayoutManager class]]) {
|
|
28
|
-
[layoutManager setValue:nil forKey:@"config"];
|
|
29
|
-
object_setClass(layoutManager, [NSLayoutManager class]);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/// Returns maxWidth for soft-wrapped content, otherwise the tight width of its
|
|
34
|
-
/// lines, or fallbackWidth when no line fragment was laid out. The tight width
|
|
35
|
-
/// adds each line's head and tail indent to its used rect, which TextKit leaves
|
|
36
|
-
/// out; lists and code blocks re-wrap without them.
|
|
37
|
-
static inline CGFloat ENRMContentWidth(NSLayoutManager *layoutManager, CGFloat maxWidth, CGFloat fallbackWidth)
|
|
38
|
-
{
|
|
39
|
-
CGFloat tightWidth = 0;
|
|
40
|
-
NSTextStorage *storage = layoutManager.textStorage;
|
|
41
|
-
NSString *string = storage.string;
|
|
42
|
-
NSCharacterSet *newlines = [NSCharacterSet newlineCharacterSet];
|
|
43
|
-
NSUInteger glyphCount = [layoutManager numberOfGlyphs];
|
|
44
|
-
BOOL startsParagraph = YES;
|
|
45
|
-
NSUInteger glyphIndex = 0;
|
|
46
|
-
while (glyphIndex < glyphCount) {
|
|
47
|
-
NSRange lineGlyphRange;
|
|
48
|
-
CGRect usedRect = [layoutManager lineFragmentUsedRectForGlyphAtIndex:glyphIndex effectiveRange:&lineGlyphRange];
|
|
49
|
-
if (lineGlyphRange.location == NSNotFound || NSMaxRange(lineGlyphRange) <= glyphIndex) {
|
|
50
|
-
break; // past a numberOfLines clamp: no fragment holds these glyphs
|
|
51
|
-
}
|
|
52
|
-
NSRange lineCharRange = [layoutManager characterRangeForGlyphRange:lineGlyphRange actualGlyphRange:NULL];
|
|
53
|
-
if (lineCharRange.length == 0) {
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
NSParagraphStyle *style = [storage attribute:NSParagraphStyleAttributeName
|
|
58
|
-
atIndex:lineCharRange.location
|
|
59
|
-
effectiveRange:NULL];
|
|
60
|
-
CGFloat headIndent = startsParagraph ? style.firstLineHeadIndent : style.headIndent;
|
|
61
|
-
CGFloat tailInset = style.tailIndent < 0 ? -style.tailIndent : 0;
|
|
62
|
-
tightWidth = MAX(tightWidth, usedRect.size.width + headIndent + tailInset);
|
|
63
|
-
if (tightWidth >= maxWidth) {
|
|
64
|
-
return maxWidth;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
BOOL endsParagraph = [newlines characterIsMember:[string characterAtIndex:NSMaxRange(lineCharRange) - 1]];
|
|
68
|
-
NSUInteger nextGlyphIndex = NSMaxRange(lineGlyphRange);
|
|
69
|
-
if (nextGlyphIndex < glyphCount && !endsParagraph) {
|
|
70
|
-
return maxWidth; // soft wrap
|
|
71
|
-
}
|
|
72
|
-
startsParagraph = endsParagraph;
|
|
73
|
-
glyphIndex = nextGlyphIndex;
|
|
74
|
-
}
|
|
75
|
-
return tightWidth > 0 ? tightWidth : fallbackWidth;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/// Turns a raw TextKit layout pass into the final measured size. Shared by
|
|
79
|
-
/// the view-backed path (`ENRMMeasureTiptapText`) and the view-free path
|
|
80
|
-
/// (`ENRMMeasureTiptapViewFree`) so both measure with one algorithm.
|
|
81
|
-
///
|
|
82
|
-
/// Steps, in order:
|
|
83
|
-
/// - Soft-wrapped content reports maxWidth: a tight width would let flexShrink
|
|
84
|
-
/// narrow the view, re-wrapping it and mismatching the measured height.
|
|
85
|
-
/// Content broken only by explicit newlines keeps its tight width.
|
|
86
|
-
/// - Optionally subtract the extra line fragment (iOS counts a trailing
|
|
87
|
-
/// newline's empty line fragment into usedRect). Read-only tiptap passes
|
|
88
|
-
/// YES; text input passes NO so trailing newlines keep a blank line (RN Text
|
|
89
|
-
/// parity).
|
|
90
|
-
/// - Add code-block padding when the last element is a code block, and the
|
|
91
|
-
/// trailing margin when enabled.
|
|
92
|
-
/// - Round up to the pixel grid of `scale` (pass `RCTScreenScale()` on main;
|
|
93
|
-
/// off-main callers must pass `LayoutContext::pointScaleFactor` instead —
|
|
94
|
-
/// `RCTScreenScale()` dispatch_syncs to main on first use, which the
|
|
95
|
-
/// measure path must never do, see issue #550).
|
|
96
|
-
static inline CGSize ENRMFinalizeMeasuredTextSize(ENRMTextLayoutResult layout, NSLayoutManager *layoutManager,
|
|
97
|
-
CGFloat maxWidth, StyleConfig *config, BOOL allowTrailingMargin,
|
|
98
|
-
CGFloat lastElementMarginBottom, BOOL subtractExtraLineFragment,
|
|
99
|
-
CGFloat scale)
|
|
100
|
-
{
|
|
101
|
-
CGFloat measuredWidth = ENRMContentWidth(layoutManager, maxWidth, layout.usedRect.size.width);
|
|
102
|
-
CGFloat measuredHeight = layout.usedRect.size.height;
|
|
103
|
-
|
|
104
|
-
if (subtractExtraLineFragment && !CGRectIsEmpty(layout.extraLineFragmentRect)) {
|
|
105
|
-
measuredHeight -= layout.extraLineFragmentRect.size.height;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (isLastElementCodeBlock(layoutManager.textStorage)) {
|
|
109
|
-
measuredHeight += [config codeBlockPadding];
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (allowTrailingMargin && lastElementMarginBottom > 0) {
|
|
113
|
-
measuredHeight += lastElementMarginBottom;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
return CGSizeMake(ceil(measuredWidth * scale) / scale, ceil(measuredHeight * scale) / scale);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
static inline CGSize ENRMMeasureTiptapText(ENRMPlatformTextView *textView, CGFloat maxWidth, StyleConfig *config,
|
|
120
|
-
BOOL allowTrailingMargin, CGFloat lastElementMarginBottom)
|
|
121
|
-
{
|
|
122
|
-
NSAttributedString *text = ENRMGetAttributedText(textView);
|
|
123
|
-
if (text.length == 0) {
|
|
124
|
-
return CGSizeZero;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
ENRMTextLayoutResult layout = ENRMMeasureTextLayout(textView, maxWidth);
|
|
128
|
-
return ENRMFinalizeMeasuredTextSize(layout, textView.layoutManager, maxWidth, config, allowTrailingMargin,
|
|
129
|
-
lastElementMarginBottom, YES, RCTScreenScale());
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
NS_ASSUME_NONNULL_END
|
|
1
|
+
#pragma once
|
|
2
|
+
#import "ENRMUIKit.h"
|
|
3
|
+
#import "LastElementUtils.h"
|
|
4
|
+
#import "StyleConfig.h"
|
|
5
|
+
#import "TextViewLayoutManager.h"
|
|
6
|
+
#import <React/RCTUtils.h>
|
|
7
|
+
#import <objc/runtime.h>
|
|
8
|
+
|
|
9
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
10
|
+
|
|
11
|
+
static inline void ENRMAttachLayoutManager(ENRMPlatformTextView *textView, StyleConfig *_Nullable config)
|
|
12
|
+
{
|
|
13
|
+
NSLayoutManager *layoutManager = textView.layoutManager;
|
|
14
|
+
if (layoutManager == nil) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
layoutManager.allowsNonContiguousLayout = NO;
|
|
18
|
+
object_setClass(layoutManager, [TextViewLayoutManager class]);
|
|
19
|
+
if (config != nil) {
|
|
20
|
+
[layoutManager setValue:config forKey:@"config"];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
static inline void ENRMDetachLayoutManager(ENRMPlatformTextView *textView)
|
|
25
|
+
{
|
|
26
|
+
NSLayoutManager *layoutManager = textView.layoutManager;
|
|
27
|
+
if (layoutManager != nil && [object_getClass(layoutManager) isEqual:[TextViewLayoutManager class]]) {
|
|
28
|
+
[layoutManager setValue:nil forKey:@"config"];
|
|
29
|
+
object_setClass(layoutManager, [NSLayoutManager class]);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/// Returns maxWidth for soft-wrapped content, otherwise the tight width of its
|
|
34
|
+
/// lines, or fallbackWidth when no line fragment was laid out. The tight width
|
|
35
|
+
/// adds each line's head and tail indent to its used rect, which TextKit leaves
|
|
36
|
+
/// out; lists and code blocks re-wrap without them.
|
|
37
|
+
static inline CGFloat ENRMContentWidth(NSLayoutManager *layoutManager, CGFloat maxWidth, CGFloat fallbackWidth)
|
|
38
|
+
{
|
|
39
|
+
CGFloat tightWidth = 0;
|
|
40
|
+
NSTextStorage *storage = layoutManager.textStorage;
|
|
41
|
+
NSString *string = storage.string;
|
|
42
|
+
NSCharacterSet *newlines = [NSCharacterSet newlineCharacterSet];
|
|
43
|
+
NSUInteger glyphCount = [layoutManager numberOfGlyphs];
|
|
44
|
+
BOOL startsParagraph = YES;
|
|
45
|
+
NSUInteger glyphIndex = 0;
|
|
46
|
+
while (glyphIndex < glyphCount) {
|
|
47
|
+
NSRange lineGlyphRange;
|
|
48
|
+
CGRect usedRect = [layoutManager lineFragmentUsedRectForGlyphAtIndex:glyphIndex effectiveRange:&lineGlyphRange];
|
|
49
|
+
if (lineGlyphRange.location == NSNotFound || NSMaxRange(lineGlyphRange) <= glyphIndex) {
|
|
50
|
+
break; // past a numberOfLines clamp: no fragment holds these glyphs
|
|
51
|
+
}
|
|
52
|
+
NSRange lineCharRange = [layoutManager characterRangeForGlyphRange:lineGlyphRange actualGlyphRange:NULL];
|
|
53
|
+
if (lineCharRange.length == 0) {
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
NSParagraphStyle *style = [storage attribute:NSParagraphStyleAttributeName
|
|
58
|
+
atIndex:lineCharRange.location
|
|
59
|
+
effectiveRange:NULL];
|
|
60
|
+
CGFloat headIndent = startsParagraph ? style.firstLineHeadIndent : style.headIndent;
|
|
61
|
+
CGFloat tailInset = style.tailIndent < 0 ? -style.tailIndent : 0;
|
|
62
|
+
tightWidth = MAX(tightWidth, usedRect.size.width + headIndent + tailInset);
|
|
63
|
+
if (tightWidth >= maxWidth) {
|
|
64
|
+
return maxWidth;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
BOOL endsParagraph = [newlines characterIsMember:[string characterAtIndex:NSMaxRange(lineCharRange) - 1]];
|
|
68
|
+
NSUInteger nextGlyphIndex = NSMaxRange(lineGlyphRange);
|
|
69
|
+
if (nextGlyphIndex < glyphCount && !endsParagraph) {
|
|
70
|
+
return maxWidth; // soft wrap
|
|
71
|
+
}
|
|
72
|
+
startsParagraph = endsParagraph;
|
|
73
|
+
glyphIndex = nextGlyphIndex;
|
|
74
|
+
}
|
|
75
|
+
return tightWidth > 0 ? tightWidth : fallbackWidth;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/// Turns a raw TextKit layout pass into the final measured size. Shared by
|
|
79
|
+
/// the view-backed path (`ENRMMeasureTiptapText`) and the view-free path
|
|
80
|
+
/// (`ENRMMeasureTiptapViewFree`) so both measure with one algorithm.
|
|
81
|
+
///
|
|
82
|
+
/// Steps, in order:
|
|
83
|
+
/// - Soft-wrapped content reports maxWidth: a tight width would let flexShrink
|
|
84
|
+
/// narrow the view, re-wrapping it and mismatching the measured height.
|
|
85
|
+
/// Content broken only by explicit newlines keeps its tight width.
|
|
86
|
+
/// - Optionally subtract the extra line fragment (iOS counts a trailing
|
|
87
|
+
/// newline's empty line fragment into usedRect). Read-only tiptap passes
|
|
88
|
+
/// YES; text input passes NO so trailing newlines keep a blank line (RN Text
|
|
89
|
+
/// parity).
|
|
90
|
+
/// - Add code-block padding when the last element is a code block, and the
|
|
91
|
+
/// trailing margin when enabled.
|
|
92
|
+
/// - Round up to the pixel grid of `scale` (pass `RCTScreenScale()` on main;
|
|
93
|
+
/// off-main callers must pass `LayoutContext::pointScaleFactor` instead —
|
|
94
|
+
/// `RCTScreenScale()` dispatch_syncs to main on first use, which the
|
|
95
|
+
/// measure path must never do, see issue #550).
|
|
96
|
+
static inline CGSize ENRMFinalizeMeasuredTextSize(ENRMTextLayoutResult layout, NSLayoutManager *layoutManager,
|
|
97
|
+
CGFloat maxWidth, StyleConfig *config, BOOL allowTrailingMargin,
|
|
98
|
+
CGFloat lastElementMarginBottom, BOOL subtractExtraLineFragment,
|
|
99
|
+
CGFloat scale)
|
|
100
|
+
{
|
|
101
|
+
CGFloat measuredWidth = ENRMContentWidth(layoutManager, maxWidth, layout.usedRect.size.width);
|
|
102
|
+
CGFloat measuredHeight = layout.usedRect.size.height;
|
|
103
|
+
|
|
104
|
+
if (subtractExtraLineFragment && !CGRectIsEmpty(layout.extraLineFragmentRect)) {
|
|
105
|
+
measuredHeight -= layout.extraLineFragmentRect.size.height;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (isLastElementCodeBlock(layoutManager.textStorage)) {
|
|
109
|
+
measuredHeight += [config codeBlockPadding];
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (allowTrailingMargin && lastElementMarginBottom > 0) {
|
|
113
|
+
measuredHeight += lastElementMarginBottom;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return CGSizeMake(ceil(measuredWidth * scale) / scale, ceil(measuredHeight * scale) / scale);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
static inline CGSize ENRMMeasureTiptapText(ENRMPlatformTextView *textView, CGFloat maxWidth, StyleConfig *config,
|
|
120
|
+
BOOL allowTrailingMargin, CGFloat lastElementMarginBottom)
|
|
121
|
+
{
|
|
122
|
+
NSAttributedString *text = ENRMGetAttributedText(textView);
|
|
123
|
+
if (text.length == 0) {
|
|
124
|
+
return CGSizeZero;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
ENRMTextLayoutResult layout = ENRMMeasureTextLayout(textView, maxWidth);
|
|
128
|
+
return ENRMFinalizeMeasuredTextSize(layout, textView.layoutManager, maxWidth, config, allowTrailingMargin,
|
|
129
|
+
lastElementMarginBottom, YES, RCTScreenScale());
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
NS_ASSUME_NONNULL_END
|