@mathers101/react-native-render-rich-text 0.0.0-stage → 0.1.9
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 -0
- package/README.md +140 -3
- package/ReactNativeRenderRichText.podspec +23 -0
- package/android/build.gradle +86 -0
- package/android/consumer-rules.pro +3 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/cpp/jni-adapter.cpp +191 -0
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapText.kt +673 -0
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextLayoutManager.kt +24 -0
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextManager.kt +405 -0
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextPackage.kt +13 -0
- package/android/src/main/java/com/renderrichtext/MeasurementStore.kt +644 -0
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibilityLabels.kt +17 -0
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibleTiptapTextView.kt +112 -0
- package/android/src/main/java/com/renderrichtext/accessibility/TiptapAccessibilityHelper.kt +576 -0
- package/android/src/main/java/com/renderrichtext/events/CodeBlockPressEvent.kt +24 -0
- package/android/src/main/java/com/renderrichtext/events/ContextMenuItemPressEvent.kt +28 -0
- package/android/src/main/java/com/renderrichtext/events/CopyPressEvent.kt +24 -0
- package/android/src/main/java/com/renderrichtext/events/FactoidPressEvent.kt +23 -0
- package/android/src/main/java/com/renderrichtext/events/ImagePressEvent.kt +25 -0
- package/android/src/main/java/com/renderrichtext/events/LatexErrorEvent.kt +29 -0
- package/android/src/main/java/com/renderrichtext/events/LinkLongPressEvent.kt +23 -0
- package/android/src/main/java/com/renderrichtext/events/LinkPressEvent.kt +23 -0
- package/android/src/main/java/com/renderrichtext/events/MentionLongPressEvent.kt +25 -0
- package/android/src/main/java/com/renderrichtext/events/MentionPressEvent.kt +25 -0
- package/android/src/main/java/com/renderrichtext/events/TaskListItemPressEvent.kt +26 -0
- package/android/src/main/java/com/renderrichtext/math/LatexErrorReporter.kt +9 -0
- package/android/src/main/java/com/renderrichtext/parser/Parser.kt +59 -0
- package/android/src/main/java/com/renderrichtext/parser/TextLinkMatching.kt +35 -0
- package/android/src/main/java/com/renderrichtext/parser/TiptapASTNode.kt +69 -0
- package/android/src/main/java/com/renderrichtext/renderer/BaselineShiftRenderer.kt +45 -0
- package/android/src/main/java/com/renderrichtext/renderer/BlankLineRenderer.kt +39 -0
- package/android/src/main/java/com/renderrichtext/renderer/BlockStyleContext.kt +181 -0
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteRenderer.kt +243 -0
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteTextRenderer.kt +56 -0
- package/android/src/main/java/com/renderrichtext/renderer/CodeBlockRenderer.kt +135 -0
- package/android/src/main/java/com/renderrichtext/renderer/CodeRenderer.kt +37 -0
- package/android/src/main/java/com/renderrichtext/renderer/EmphasisRenderer.kt +28 -0
- package/android/src/main/java/com/renderrichtext/renderer/FactoidRenderer.kt +97 -0
- package/android/src/main/java/com/renderrichtext/renderer/HeadingRenderer.kt +81 -0
- package/android/src/main/java/com/renderrichtext/renderer/HighlightRenderer.kt +26 -0
- package/android/src/main/java/com/renderrichtext/renderer/LineBreakRenderer.kt +17 -0
- package/android/src/main/java/com/renderrichtext/renderer/LinkRenderer.kt +90 -0
- package/android/src/main/java/com/renderrichtext/renderer/ListContextManager.kt +109 -0
- package/android/src/main/java/com/renderrichtext/renderer/ListItemRenderer.kt +211 -0
- package/android/src/main/java/com/renderrichtext/renderer/ListRenderer.kt +133 -0
- package/android/src/main/java/com/renderrichtext/renderer/MentionRenderer.kt +85 -0
- package/android/src/main/java/com/renderrichtext/renderer/NodeRenderer.kt +207 -0
- package/android/src/main/java/com/renderrichtext/renderer/ParagraphRenderer.kt +91 -0
- package/android/src/main/java/com/renderrichtext/renderer/Renderer.kt +148 -0
- package/android/src/main/java/com/renderrichtext/renderer/SoftBreakRenderer.kt +17 -0
- package/android/src/main/java/com/renderrichtext/renderer/SpanStyleCache.kt +143 -0
- package/android/src/main/java/com/renderrichtext/renderer/StrikethroughRenderer.kt +28 -0
- package/android/src/main/java/com/renderrichtext/renderer/StrongRenderer.kt +28 -0
- package/android/src/main/java/com/renderrichtext/renderer/TextRenderer.kt +31 -0
- package/android/src/main/java/com/renderrichtext/renderer/ThematicBreakRenderer.kt +46 -0
- package/android/src/main/java/com/renderrichtext/renderer/UnderlineRenderer.kt +28 -0
- package/android/src/main/java/com/renderrichtext/spans/BaseListSpan.kt +164 -0
- package/android/src/main/java/com/renderrichtext/spans/BaselineShiftSpan.kt +27 -0
- package/android/src/main/java/com/renderrichtext/spans/BlockquoteSpan.kt +302 -0
- package/android/src/main/java/com/renderrichtext/spans/CodeBackgroundSpan.kt +205 -0
- package/android/src/main/java/com/renderrichtext/spans/CodeBlockSpan.kt +216 -0
- package/android/src/main/java/com/renderrichtext/spans/CodeSpan.kt +32 -0
- package/android/src/main/java/com/renderrichtext/spans/EmphasisSpan.kt +42 -0
- package/android/src/main/java/com/renderrichtext/spans/FactoidBackgroundSpan.kt +265 -0
- package/android/src/main/java/com/renderrichtext/spans/FactoidPaddingSpan.kt +258 -0
- package/android/src/main/java/com/renderrichtext/spans/FactoidSpan.kt +32 -0
- package/android/src/main/java/com/renderrichtext/spans/FadeInSpan.kt +29 -0
- package/android/src/main/java/com/renderrichtext/spans/HeadingSpan.kt +38 -0
- package/android/src/main/java/com/renderrichtext/spans/HighlightSpan.kt +80 -0
- package/android/src/main/java/com/renderrichtext/spans/ImageSpan.kt +481 -0
- package/android/src/main/java/com/renderrichtext/spans/InlineBackgroundGeometry.kt +42 -0
- package/android/src/main/java/com/renderrichtext/spans/LineHeightSpan.kt +39 -0
- package/android/src/main/java/com/renderrichtext/spans/LinkPillIconCache.kt +154 -0
- package/android/src/main/java/com/renderrichtext/spans/LinkPillSpan.kt +381 -0
- package/android/src/main/java/com/renderrichtext/spans/LinkSpan.kt +68 -0
- package/android/src/main/java/com/renderrichtext/spans/ListItemSpacingSpan.kt +33 -0
- package/android/src/main/java/com/renderrichtext/spans/ListMarkerAnchorSpan.kt +38 -0
- package/android/src/main/java/com/renderrichtext/spans/MarginBottomSpan.kt +76 -0
- package/android/src/main/java/com/renderrichtext/spans/MentionChipSpan.kt +132 -0
- package/android/src/main/java/com/renderrichtext/spans/MentionSpan.kt +46 -0
- package/android/src/main/java/com/renderrichtext/spans/OrderedListSpan.kt +127 -0
- package/android/src/main/java/com/renderrichtext/spans/SpoilerSpan.kt +33 -0
- package/android/src/main/java/com/renderrichtext/spans/StrikethroughSpan.kt +12 -0
- package/android/src/main/java/com/renderrichtext/spans/StrongSpan.kt +39 -0
- package/android/src/main/java/com/renderrichtext/spans/TaskListSpan.kt +143 -0
- package/android/src/main/java/com/renderrichtext/spans/TextSpan.kt +26 -0
- package/android/src/main/java/com/renderrichtext/spans/ThematicBreakSpan.kt +69 -0
- package/android/src/main/java/com/renderrichtext/spans/UnorderedListSpan.kt +96 -0
- package/android/src/main/java/com/renderrichtext/spoiler/SpoilerStubs.kt +46 -0
- package/android/src/main/java/com/renderrichtext/styles/BaseBlockStyle.kt +11 -0
- package/android/src/main/java/com/renderrichtext/styles/BlockquoteStyle.kt +83 -0
- package/android/src/main/java/com/renderrichtext/styles/CodeBlockStyle.kt +80 -0
- package/android/src/main/java/com/renderrichtext/styles/CodeStyle.kt +26 -0
- package/android/src/main/java/com/renderrichtext/styles/EmphasisStyle.kt +21 -0
- package/android/src/main/java/com/renderrichtext/styles/FactoidStyle.kt +21 -0
- package/android/src/main/java/com/renderrichtext/styles/HeadingStyle.kt +33 -0
- package/android/src/main/java/com/renderrichtext/styles/HighlightStyle.kt +19 -0
- package/android/src/main/java/com/renderrichtext/styles/ImageStyle.kt +29 -0
- package/android/src/main/java/com/renderrichtext/styles/InlineImageStyle.kt +17 -0
- package/android/src/main/java/com/renderrichtext/styles/InlineMathStyle.kt +17 -0
- package/android/src/main/java/com/renderrichtext/styles/LinkPillContent.kt +36 -0
- package/android/src/main/java/com/renderrichtext/styles/LinkPillStyle.kt +44 -0
- package/android/src/main/java/com/renderrichtext/styles/LinkStyle.kt +23 -0
- package/android/src/main/java/com/renderrichtext/styles/LinkVariantEntry.kt +34 -0
- package/android/src/main/java/com/renderrichtext/styles/ListStyle.kt +65 -0
- package/android/src/main/java/com/renderrichtext/styles/MathStyle.kt +29 -0
- package/android/src/main/java/com/renderrichtext/styles/MentionStyle.kt +19 -0
- package/android/src/main/java/com/renderrichtext/styles/ParagraphStyle.kt +33 -0
- package/android/src/main/java/com/renderrichtext/styles/SpoilerStyle.kt +27 -0
- package/android/src/main/java/com/renderrichtext/styles/StrikethroughStyle.kt +17 -0
- package/android/src/main/java/com/renderrichtext/styles/StrongStyle.kt +21 -0
- package/android/src/main/java/com/renderrichtext/styles/StyleConfig.kt +411 -0
- package/android/src/main/java/com/renderrichtext/styles/StyleParser.kt +92 -0
- package/android/src/main/java/com/renderrichtext/styles/SubscriptStyle.kt +16 -0
- package/android/src/main/java/com/renderrichtext/styles/SuperscriptStyle.kt +16 -0
- package/android/src/main/java/com/renderrichtext/styles/TableStyle.kt +75 -0
- package/android/src/main/java/com/renderrichtext/styles/TaskListStyle.kt +29 -0
- package/android/src/main/java/com/renderrichtext/styles/TextAlignment.kt +32 -0
- package/android/src/main/java/com/renderrichtext/styles/ThematicBreakStyle.kt +23 -0
- package/android/src/main/java/com/renderrichtext/styles/UnderlineStyle.kt +17 -0
- package/android/src/main/java/com/renderrichtext/styles/VideoStyle.kt +31 -0
- package/android/src/main/java/com/renderrichtext/utils/common/BorderStyleUtils.kt +86 -0
- package/android/src/main/java/com/renderrichtext/utils/common/BreakStrategyUtils.kt +32 -0
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockHighlighter.kt +36 -0
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockNode.kt +42 -0
- package/android/src/main/java/com/renderrichtext/utils/common/EllipsizeUtils.kt +27 -0
- package/android/src/main/java/com/renderrichtext/utils/common/EnrichedTiptapAncestorUtils.kt +10 -0
- package/android/src/main/java/com/renderrichtext/utils/common/FeatureFlags.kt +9 -0
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRecognitionProps.kt +31 -0
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRegexConfig.kt +56 -0
- package/android/src/main/java/com/renderrichtext/utils/common/MotionPreferences.kt +18 -0
- package/android/src/main/java/com/renderrichtext/utils/common/ReadableMapExtensions.kt +28 -0
- package/android/src/main/java/com/renderrichtext/utils/common/TiptapViewManagerUtils.kt +242 -0
- package/android/src/main/java/com/renderrichtext/utils/common/layout/RTLUtils.kt +6 -0
- package/android/src/main/java/com/renderrichtext/utils/common/serialization/TiptapASTSerializer.kt +368 -0
- package/android/src/main/java/com/renderrichtext/utils/text/ImageCache.kt +88 -0
- package/android/src/main/java/com/renderrichtext/utils/text/ImageDownloader.kt +203 -0
- package/android/src/main/java/com/renderrichtext/utils/text/LocalImageLoader.kt +167 -0
- package/android/src/main/java/com/renderrichtext/utils/text/TailFadeInAnimator.kt +84 -0
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/HTMLGenerator.kt +1105 -0
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/TiptapExtractor.kt +423 -0
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/ParagraphUtils.kt +9 -0
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/SpannableExtensions.kt +9 -0
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/TextPaintExtensions.kt +76 -0
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/CheckboxTouchHelper.kt +61 -0
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/TaskListTapUtils.kt +286 -0
- package/android/src/main/java/com/renderrichtext/utils/text/span/ApplyLineHeight.kt +39 -0
- package/android/src/main/java/com/renderrichtext/utils/text/span/BlockSpacing.kt +142 -0
- package/android/src/main/java/com/renderrichtext/utils/text/span/SpanFlags.kt +43 -0
- package/android/src/main/java/com/renderrichtext/utils/text/span/WidthAwareSpans.kt +30 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/CodeBlockPressHost.kt +15 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/ImagePressHost.kt +19 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/LinkEvents.kt +88 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/LinkLongPressMovementMethod.kt +449 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/SelectionActionMode.kt +235 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextSelectionColors.kt +48 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextViewSetup.kt +119 -0
- package/android/src/main/java/com/renderrichtext/views/ContextMenuPopup.kt +217 -0
- package/android/src/main/java/com/renderrichtext/views/CopyGlyph.kt +101 -0
- package/android/src/main/java/com/renderrichtext/views/WrapGlyph.kt +40 -0
- package/android/src/main/jni/CMakeLists.txt +52 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/ComponentDescriptors.h +30 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextComponentDescriptor.h +29 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.cpp +45 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.h +21 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.cpp +38 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.h +53 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.cpp +9 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.h +24 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/conversions.h +40 -0
- package/cpp/parser/TiptapASTNode.hpp +68 -0
- package/cpp/parser/TiptapParser.cpp +233 -0
- package/cpp/parser/TiptapParser.hpp +13 -0
- package/cpp/vendor/nlohmann/json.hpp +24765 -0
- package/ios/EnrichedTiptapText.h +27 -0
- package/ios/EnrichedTiptapText.mm +1222 -0
- package/ios/attachments/ENRMImageAttachment.h +51 -0
- package/ios/attachments/ENRMImageAttachment.m +398 -0
- package/ios/attachments/ENRMLinkPillAttachment.h +47 -0
- package/ios/attachments/ENRMLinkPillAttachment.m +324 -0
- package/ios/attachments/ENRMLinkPillIconCache.h +28 -0
- package/ios/attachments/ENRMLinkPillIconCache.m +181 -0
- package/ios/attachments/ENRMLinkPillText.h +27 -0
- package/ios/attachments/ENRMLinkPillText.m +118 -0
- package/ios/attachments/ENRMMathInlineAttachment.h +7 -0
- package/ios/attachments/ENRMMathInlineAttachment.m +4 -0
- package/ios/attachments/ThematicBreakAttachment.h +15 -0
- package/ios/attachments/ThematicBreakAttachment.m +33 -0
- package/ios/internals/ENRMViewFreeMeasurement.h +208 -0
- package/ios/internals/EnrichedTiptapTextComponentDescriptor.h +19 -0
- package/ios/internals/EnrichedTiptapTextShadowNode.h +43 -0
- package/ios/internals/EnrichedTiptapTextShadowNode.mm +69 -0
- package/ios/internals/EnrichedTiptapTextState.h +24 -0
- package/ios/internals/MeasurementCache.h +308 -0
- package/ios/internals/ShadowMeasurementUtils.h +145 -0
- package/ios/parser/ENRMTextLinkAttributes.h +7 -0
- package/ios/parser/ENRMTiptapParser.h +33 -0
- package/ios/parser/ENRMTiptapParser.mm +73 -0
- package/ios/parser/TiptapASTNode.h +57 -0
- package/ios/parser/TiptapASTNode.m +52 -0
- package/ios/parser/TiptapParserBridge.mm +179 -0
- package/ios/renderer/AttributedRenderer.h +23 -0
- package/ios/renderer/AttributedRenderer.m +229 -0
- package/ios/renderer/BaseRenderer.h +33 -0
- package/ios/renderer/BaseRenderer.m +46 -0
- package/ios/renderer/BaselineShiftTextAttributes.h +10 -0
- package/ios/renderer/BaselineShiftTextAttributes.m +26 -0
- package/ios/renderer/BlankLineRenderer.h +4 -0
- package/ios/renderer/BlankLineRenderer.m +51 -0
- package/ios/renderer/BlockquoteRenderer.h +6 -0
- package/ios/renderer/BlockquoteRenderer.m +258 -0
- package/ios/renderer/CodeBlockRenderer.h +9 -0
- package/ios/renderer/CodeBlockRenderer.m +99 -0
- package/ios/renderer/CodeRenderer.h +9 -0
- package/ios/renderer/CodeRenderer.m +69 -0
- package/ios/renderer/ENRMBlockquoteTextRenderer.h +25 -0
- package/ios/renderer/ENRMBlockquoteTextRenderer.m +48 -0
- package/ios/renderer/EmphasisRenderer.h +5 -0
- package/ios/renderer/EmphasisRenderer.m +100 -0
- package/ios/renderer/FactoidRenderer.h +9 -0
- package/ios/renderer/FactoidRenderer.m +130 -0
- package/ios/renderer/HeadingRenderer.h +6 -0
- package/ios/renderer/HeadingRenderer.m +103 -0
- package/ios/renderer/HighlightRenderer.h +7 -0
- package/ios/renderer/HighlightRenderer.m +33 -0
- package/ios/renderer/LinkRenderer.h +6 -0
- package/ios/renderer/LinkRenderer.m +158 -0
- package/ios/renderer/ListItemRenderer.h +24 -0
- package/ios/renderer/ListItemRenderer.m +283 -0
- package/ios/renderer/ListRenderer.h +13 -0
- package/ios/renderer/ListRenderer.m +126 -0
- package/ios/renderer/MentionRenderer.h +9 -0
- package/ios/renderer/MentionRenderer.m +96 -0
- package/ios/renderer/NodeRenderer.h +8 -0
- package/ios/renderer/ParagraphRenderer.h +6 -0
- package/ios/renderer/ParagraphRenderer.m +85 -0
- package/ios/renderer/RenderContext.h +145 -0
- package/ios/renderer/RenderContext.m +403 -0
- package/ios/renderer/RendererFactory.h +12 -0
- package/ios/renderer/RendererFactory.m +158 -0
- package/ios/renderer/StrikethroughRenderer.h +5 -0
- package/ios/renderer/StrikethroughRenderer.m +30 -0
- package/ios/renderer/StrongRenderer.h +5 -0
- package/ios/renderer/StrongRenderer.m +88 -0
- package/ios/renderer/TextRenderer.h +6 -0
- package/ios/renderer/TextRenderer.m +18 -0
- package/ios/renderer/ThematicBreakRenderer.h +4 -0
- package/ios/renderer/ThematicBreakRenderer.m +42 -0
- package/ios/renderer/UnderlineRenderer.h +4 -0
- package/ios/renderer/UnderlineRenderer.m +41 -0
- package/ios/styles/ENRMFontSlot.h +12 -0
- package/ios/styles/ENRMFontSlot.m +24 -0
- package/ios/styles/StyleConfig.h +488 -0
- package/ios/styles/StyleConfig.mm +2820 -0
- package/ios/utils/AccessibilityInfo.h +35 -0
- package/ios/utils/AccessibilityInfo.m +24 -0
- package/ios/utils/BlockquoteBorder.h +26 -0
- package/ios/utils/BlockquoteBorder.m +294 -0
- package/ios/utils/CodeBackground.h +19 -0
- package/ios/utils/CodeBackground.m +197 -0
- package/ios/utils/CodeBlockBackground.h +17 -0
- package/ios/utils/CodeBlockBackground.m +103 -0
- package/ios/utils/ContextMenuUtils.h +76 -0
- package/ios/utils/ContextMenuUtils.mm +75 -0
- package/ios/utils/ENRMAccessibilityLabels.h +40 -0
- package/ios/utils/ENRMAccessibilityLabels.m +5 -0
- package/ios/utils/ENRMAsyncRenderCoordinator.h +24 -0
- package/ios/utils/ENRMAsyncRenderCoordinator.m +37 -0
- package/ios/utils/ENRMAtomicSize.h +65 -0
- package/ios/utils/ENRMCodeBlockContent.h +37 -0
- package/ios/utils/ENRMCodeBlockContent.mm +89 -0
- package/ios/utils/ENRMFeatureFlags.h +25 -0
- package/ios/utils/ENRMImageDownloader.h +30 -0
- package/ios/utils/ENRMImageDownloader.m +168 -0
- package/ios/utils/ENRMLatexErrorCoordinator.h +27 -0
- package/ios/utils/ENRMLatexErrorCoordinator.mm +75 -0
- package/ios/utils/ENRMLatexErrorReporting.h +13 -0
- package/ios/utils/ENRMLinkContextMenus.h +93 -0
- package/ios/utils/ENRMLinkContextMenus.m +178 -0
- package/ios/utils/ENRMLinkRegexConfig.h +30 -0
- package/ios/utils/ENRMLinkRegexConfig.mm +104 -0
- package/ios/utils/ENRMLinkRegexProps.h +23 -0
- package/ios/utils/ENRMLocalImageLoader.h +35 -0
- package/ios/utils/ENRMLocalImageLoader.m +111 -0
- package/ios/utils/ENRMMenuAction.h +27 -0
- package/ios/utils/ENRMMenuAction.m +33 -0
- package/ios/utils/ENRMSpoilerOverlayManager.h +15 -0
- package/ios/utils/ENRMSpoilerOverlayManager.m +19 -0
- package/ios/utils/ENRMSpoilerTapUtils.h +6 -0
- package/ios/utils/ENRMSpoilerTapUtils.m +11 -0
- package/ios/utils/ENRMTailFadeInAnimator.h +16 -0
- package/ios/utils/ENRMTailFadeInAnimator.m +161 -0
- package/ios/utils/ENRMTextHitTest.h +23 -0
- package/ios/utils/ENRMTextHitTest.m +20 -0
- package/ios/utils/ENRMTextInteractionUtils.h +20 -0
- package/ios/utils/ENRMTextInteractionUtils.m +15 -0
- package/ios/utils/ENRMTextRenderer.h +38 -0
- package/ios/utils/ENRMTextRenderer.m +54 -0
- package/ios/utils/ENRMTextViewSetup.h +132 -0
- package/ios/utils/ENRMUIKit.h +429 -0
- package/ios/utils/EditMenuUtils.h +105 -0
- package/ios/utils/EditMenuUtils.m +143 -0
- package/ios/utils/FactoidBackground.h +20 -0
- package/ios/utils/FactoidBackground.m +161 -0
- package/ios/utils/FontScaleObserver.h +10 -0
- package/ios/utils/FontScaleObserver.m +55 -0
- package/ios/utils/FontUtils.h +31 -0
- package/ios/utils/FontUtils.m +63 -0
- package/ios/utils/HTMLGenerator.h +25 -0
- package/ios/utils/HTMLGenerator.m +1041 -0
- package/ios/utils/HeightUpdateUtils.h +25 -0
- package/ios/utils/ImageRequestHeaderUtils.h +35 -0
- package/ios/utils/LastElementUtils.h +97 -0
- package/ios/utils/LinkContextMenuUtils.h +55 -0
- package/ios/utils/LinkPillContentUtils.h +46 -0
- package/ios/utils/LinkTapUtils.h +56 -0
- package/ios/utils/LinkTapUtils.m +139 -0
- package/ios/utils/ListMarkerDrawer.h +15 -0
- package/ios/utils/ListMarkerDrawer.m +239 -0
- package/ios/utils/MentionBackground.h +26 -0
- package/ios/utils/MentionBackground.m +86 -0
- package/ios/utils/ParagraphStyleUtils.h +87 -0
- package/ios/utils/ParagraphStyleUtils.m +484 -0
- package/ios/utils/PasteboardUtils.h +48 -0
- package/ios/utils/PasteboardUtils.m +166 -0
- package/ios/utils/RTFExportUtils.h +24 -0
- package/ios/utils/RTFExportUtils.m +299 -0
- package/ios/utils/RuntimeKeys.h +44 -0
- package/ios/utils/RuntimeKeys.m +13 -0
- package/ios/utils/SelectionColorUtils.h +14 -0
- package/ios/utils/StylePropsUtils.h +1340 -0
- package/ios/utils/TaskListTapUtils.h +6 -0
- package/ios/utils/TaskListTapUtils.m +14 -0
- package/ios/utils/TextViewLayoutManager.h +14 -0
- package/ios/utils/TextViewLayoutManager.mm +198 -0
- package/ios/utils/TiptapAccessibilityElementBuilder.h +43 -0
- package/ios/utils/TiptapAccessibilityElementBuilder.m +432 -0
- package/ios/utils/TiptapExtractor.h +17 -0
- package/ios/utils/TiptapExtractor.m +367 -0
- package/ios/views/ENRMTiptapTextView.h +25 -0
- package/ios/views/ENRMTiptapTextView.m +247 -0
- package/package.json +70 -6
- package/react-native.config.js +10 -0
- package/src/EnrichedTiptapTextNativeComponent.ts +739 -0
- package/src/RichText.tsx +164 -0
- package/src/admonitionDefaults.ts +58 -0
- package/src/darkModeTextStyle.ts +99 -0
- package/src/headingDefaults.ts +21 -0
- package/src/index.tsx +4 -0
- package/src/linkVariantUtils.ts +120 -0
- package/src/normalizeTiptapStyle.ts +397 -0
- package/src/rn-globals.d.ts +1 -0
- package/src/styleUtils.ts +107 -0
- package/src/types/TiptapStyle.ts +532 -0
- package/src/types/TiptapStyleInternal.ts +299 -0
- package/src/types/linkPill.ts +9 -0
- package/src/utils/isDev.ts +4 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
#import "ENRMUIKit.h"
|
|
3
|
+
|
|
4
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
5
|
+
|
|
6
|
+
@interface ThematicBreakAttachment : NSTextAttachment
|
|
7
|
+
|
|
8
|
+
@property (nonatomic, strong) RCTUIColor *lineColor;
|
|
9
|
+
@property (nonatomic, assign) CGFloat lineHeight;
|
|
10
|
+
@property (nonatomic, assign) CGFloat marginTop;
|
|
11
|
+
@property (nonatomic, assign) CGFloat marginBottom;
|
|
12
|
+
|
|
13
|
+
@end
|
|
14
|
+
|
|
15
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#import "ThematicBreakAttachment.h"
|
|
2
|
+
|
|
3
|
+
@implementation ThematicBreakAttachment
|
|
4
|
+
|
|
5
|
+
- (CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer
|
|
6
|
+
proposedLineFragment:(CGRect)lineFrag
|
|
7
|
+
glyphPosition:(CGPoint)position
|
|
8
|
+
characterIndex:(NSUInteger)charIndex
|
|
9
|
+
{
|
|
10
|
+
CGFloat totalHeight = self.marginTop + self.lineHeight + self.marginBottom;
|
|
11
|
+
return CGRectMake(0, 0, CGRectGetWidth(lineFrag), totalHeight);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
- (RCTUIImage *)imageForBounds:(CGRect)imageBounds
|
|
15
|
+
textContainer:(NSTextContainer *)textContainer
|
|
16
|
+
characterIndex:(NSUInteger)charIndex
|
|
17
|
+
{
|
|
18
|
+
RCTUIGraphicsImageRenderer *renderer = [[RCTUIGraphicsImageRenderer alloc] initWithSize:imageBounds.size];
|
|
19
|
+
|
|
20
|
+
return [renderer imageWithActions:^(RCTUIGraphicsImageRendererContext *_Nonnull rendererContext) {
|
|
21
|
+
CGContextRef ctx = rendererContext.CGContext;
|
|
22
|
+
|
|
23
|
+
CGFloat lineY = self.marginTop + (self.lineHeight / 2.0);
|
|
24
|
+
|
|
25
|
+
[self.lineColor setStroke];
|
|
26
|
+
CGContextSetLineWidth(ctx, self.lineHeight);
|
|
27
|
+
CGContextMoveToPoint(ctx, 0, lineY);
|
|
28
|
+
CGContextAddLineToPoint(ctx, imageBounds.size.width, lineY);
|
|
29
|
+
CGContextStrokePath(ctx);
|
|
30
|
+
}];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@end
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#import "ENRMFeatureFlags.h"
|
|
4
|
+
#import "ENRMLinkRegexProps.h"
|
|
5
|
+
#import "ENRMTiptapParser.h"
|
|
6
|
+
#import "ENRMTextRenderer.h"
|
|
7
|
+
#import "ENRMTextViewSetup.h"
|
|
8
|
+
#import "ImageRequestHeaderUtils.h"
|
|
9
|
+
#import "LinkPillContentUtils.h"
|
|
10
|
+
#import "TiptapASTNode.h"
|
|
11
|
+
#import "ParagraphStyleUtils.h"
|
|
12
|
+
#import "StylePropsUtils.h"
|
|
13
|
+
#include <type_traits>
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* View-free tiptap measurement (issue #550).
|
|
17
|
+
*
|
|
18
|
+
* The previous measurement path built throwaway component views on the main
|
|
19
|
+
* thread via `dispatch_sync` — a deadlock when `measureContent` runs under
|
|
20
|
+
* RN's locked commit fallback while a main-thread committer (Reanimated) is
|
|
21
|
+
* blocked on the same mutex, and a serialization bottleneck (streaming jank)
|
|
22
|
+
* even when it doesn't deadlock.
|
|
23
|
+
*
|
|
24
|
+
* These pipelines measure on the calling thread with no view and no
|
|
25
|
+
* main-thread dependency, mirroring RN core's `RCTTextLayoutManager` (which
|
|
26
|
+
* measures every `<Text>` this way in production) and this library's own
|
|
27
|
+
* Android `MeasurementStore`:
|
|
28
|
+
*
|
|
29
|
+
* - `ENRMMeasureTiptapViewFree` (EnrichedTiptapText): parse (md4c) →
|
|
30
|
+
* `ENRMRenderASTNodes` (the SAME renderer the visible view uses, so
|
|
31
|
+
* measured layout ≡ rendered layout) → a fresh per-call
|
|
32
|
+
* NSTextStorage/NSLayoutManager/NSTextContainer stack → shared finalize.
|
|
33
|
+
* - `ENRMMeasureSegmentedTiptapViewFree` (EnrichedTiptap): the iOS
|
|
34
|
+
* counterpart of Android's `MeasurementStore.measureAndCacheSplit` — split
|
|
35
|
+
* the AST into segments via the same `ENRMRenderSegmentsFromAST` the view
|
|
36
|
+
* uses, then walk them exactly like the view's
|
|
37
|
+
* `computeSegmentLayoutForWidth:`: text via the TextKit stack, tables via
|
|
38
|
+
* `+[TableContainerView measureHeightForTableNode:…]`, math via
|
|
39
|
+
* `+[ENRMMathContainerView measureHeightForLatex:…]`, with the same
|
|
40
|
+
* margin arithmetic.
|
|
41
|
+
*
|
|
42
|
+
* TextKit objects are thread-CONFINED, not main-thread-only: safe off main as
|
|
43
|
+
* long as one thread owns a given stack (Apple-sanctioned; the
|
|
44
|
+
* Texture/AsyncDisplayKit pattern). Allocating the stack per call — exactly
|
|
45
|
+
* what `RCTTextLayoutManager` does — makes confinement trivially true.
|
|
46
|
+
* `boundingRectWithSize:` (tables, math fallback) is documented thread-safe.
|
|
47
|
+
*
|
|
48
|
+
* Ambient-state rules for this path:
|
|
49
|
+
* - Font scale comes in as a parameter (from `LayoutContext::fontSizeMultiplier`),
|
|
50
|
+
* never from `RCTFontSizeMultiplier()` (UIKit read).
|
|
51
|
+
* - Pixel rounding uses `LayoutContext::pointScaleFactor`, never
|
|
52
|
+
* `RCTScreenScale()` (dispatch_syncs to main on first use).
|
|
53
|
+
* - The resolved layout direction comes from `LayoutConstraints::layoutDirection`,
|
|
54
|
+
* never from `RCTI18nUtil`.
|
|
55
|
+
* - The geometry config must match the visible view's
|
|
56
|
+
* (`ENRMConfigureTiptapTextView`): zero insets, `lineFragmentPadding = 0`,
|
|
57
|
+
* `allowsNonContiguousLayout = NO`. The view's custom `TextViewLayoutManager`
|
|
58
|
+
* subclass only draws backgrounds and does not affect geometry.
|
|
59
|
+
* - Each entry point drains its own `@autoreleasepool`. The calling JS/layout
|
|
60
|
+
* thread has no runloop draining pools, and a full measure autoreleases
|
|
61
|
+
* thousands of objects (AST, attributed string, TextKit stack, fonts) — the
|
|
62
|
+
* old main-thread path silently leaned on the main runloop's per-cycle
|
|
63
|
+
* drain, and without a local pool sustained re-measurement accumulates
|
|
64
|
+
* until jetsam kills the app.
|
|
65
|
+
*
|
|
66
|
+
* RaTeX concurrency (math segments and lazily-measured inline math
|
|
67
|
+
* attachments now parse on the calling thread, possibly concurrently with the
|
|
68
|
+
* render thread): verified safe against RaTeX sources. The Swift engine is
|
|
69
|
+
* stateless per call, font registration is NSLock-guarded and idempotent
|
|
70
|
+
* (RaTeXFontLoader), the FFI's last-error slot is thread_local, the Rust
|
|
71
|
+
* core's only statics are immutable OnceLock/LazyLock tables, and renderer
|
|
72
|
+
* font caches are per-call locals.
|
|
73
|
+
*/
|
|
74
|
+
|
|
75
|
+
template <typename Md4cFlagsT> static inline ENRMMd4cFlags *ENRMMd4cFlagsFromProps(const Md4cFlagsT &props)
|
|
76
|
+
{
|
|
77
|
+
ENRMMd4cFlags *flags = [ENRMMd4cFlags defaultFlags];
|
|
78
|
+
flags.underline = props.underline;
|
|
79
|
+
flags.superscript = props.superscript;
|
|
80
|
+
flags.subscript = props.subscript;
|
|
81
|
+
flags.latexMath = props.latexMath;
|
|
82
|
+
flags.highlight = props.highlight;
|
|
83
|
+
flags.hardSoftBreaks = props.hardSoftBreaks;
|
|
84
|
+
flags.preserveBlankLines = props.preserveBlankLines;
|
|
85
|
+
flags.admonitions = props.admonitions;
|
|
86
|
+
return flags;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Builds a StyleConfig from props alone, replicating the mock-view recipe
|
|
91
|
+
* field for field: a fresh config receives the props' style diffed against a
|
|
92
|
+
* default-constructed style struct (the mock view's `updateProps
|
|
93
|
+
* oldProps:nullptr` applied the same diff against default props), then the
|
|
94
|
+
* font scale, max multiplier, and image request headers.
|
|
95
|
+
*/
|
|
96
|
+
template <typename PropsT>
|
|
97
|
+
static inline StyleConfig *ENRMStyleConfigFromProps(const PropsT &typedProps, CGFloat fontScale)
|
|
98
|
+
{
|
|
99
|
+
StyleConfig *config = [[StyleConfig alloc] init];
|
|
100
|
+
using StyleT = std::remove_cv_t<std::remove_reference_t<decltype(typedProps.tiptapStyle)>>;
|
|
101
|
+
static const StyleT kDefaultStyle{};
|
|
102
|
+
applyTiptapStyleToConfig(config, typedProps.tiptapStyle, kDefaultStyle);
|
|
103
|
+
[config setFontScaleMultiplier:fontScale];
|
|
104
|
+
[config setMaxFontSizeMultiplier:typedProps.maxFontSizeMultiplier];
|
|
105
|
+
[config setImageRequestHeaders:ENRMImageRequestHeadersFromProps(typedProps.imageRequestHeaders)];
|
|
106
|
+
[config setLinkPillContent:ENRMLinkPillContentFromProps(typedProps.linkPillContent)];
|
|
107
|
+
return config;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Lays out an already-rendered attributed string in a fresh, call-confined
|
|
112
|
+
* TextKit stack and finalizes with the shared algorithm
|
|
113
|
+
* (`ENRMFinalizeMeasuredTextSize`). Returns CGSizeZero for empty text — the
|
|
114
|
+
* same result the view path produces, and a guard against TextKit's
|
|
115
|
+
* empty-string layout freeze (see RCTTextLayoutManager).
|
|
116
|
+
*
|
|
117
|
+
* Uses the same `usesFontLeading` as the views that draw the text; see
|
|
118
|
+
* ENRMLayoutManagerUsesFontLeading.
|
|
119
|
+
*/
|
|
120
|
+
static inline CGSize ENRMMeasureAttributedTextViewFree(NSAttributedString *text, CGFloat maxWidth, StyleConfig *config,
|
|
121
|
+
BOOL allowTrailingMargin, CGFloat lastElementMarginBottom,
|
|
122
|
+
CGFloat pointScaleFactor, NSInteger numberOfLines,
|
|
123
|
+
NSLineBreakMode lineBreakMode, BOOL subtractExtraLineFragment)
|
|
124
|
+
{
|
|
125
|
+
if (text.length == 0) {
|
|
126
|
+
return CGSizeZero;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeMake(maxWidth, CGFLOAT_MAX)];
|
|
130
|
+
textContainer.lineFragmentPadding = 0;
|
|
131
|
+
if (numberOfLines > 0) {
|
|
132
|
+
textContainer.maximumNumberOfLines = numberOfLines;
|
|
133
|
+
textContainer.lineBreakMode = lineBreakMode;
|
|
134
|
+
}
|
|
135
|
+
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
|
|
136
|
+
layoutManager.allowsNonContiguousLayout = NO;
|
|
137
|
+
layoutManager.usesFontLeading = ENRMLayoutManagerUsesFontLeading;
|
|
138
|
+
[layoutManager addTextContainer:textContainer];
|
|
139
|
+
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:text];
|
|
140
|
+
[textStorage addLayoutManager:layoutManager];
|
|
141
|
+
|
|
142
|
+
[layoutManager ensureLayoutForTextContainer:textContainer];
|
|
143
|
+
ENRMTextLayoutResult layout;
|
|
144
|
+
layout.usedRect = [layoutManager usedRectForTextContainer:textContainer];
|
|
145
|
+
layout.extraLineFragmentRect = layoutManager.extraLineFragmentRect;
|
|
146
|
+
|
|
147
|
+
return ENRMFinalizeMeasuredTextSize(layout, layoutManager, maxWidth, config, allowTrailingMargin,
|
|
148
|
+
lastElementMarginBottom, subtractExtraLineFragment, pointScaleFactor);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Measures EnrichedTiptapText content from props alone, on the calling
|
|
153
|
+
* thread. The line-break strategy and writing-direction mode are resolved
|
|
154
|
+
* from the props exactly as `updateProps:` resolves them. Falls back to
|
|
155
|
+
* (maxWidth × system-16 line height) for empty tiptap, parse failures, and
|
|
156
|
+
* empty render output — the same fallback `measureSize:` produced.
|
|
157
|
+
*/
|
|
158
|
+
template <typename PropsT>
|
|
159
|
+
static inline CGSize ENRMMeasureTiptapViewFree(const PropsT &typedProps, CGFloat maxWidth, CGFloat fontScale,
|
|
160
|
+
CGFloat pointScaleFactor, NSWritingDirection resolvedLayoutDirection)
|
|
161
|
+
{
|
|
162
|
+
@autoreleasepool {
|
|
163
|
+
CGSize fallback = CGSizeMake(maxWidth, UIFontLineHeight([UIFont systemFontOfSize:16.0]));
|
|
164
|
+
if (typedProps.document.empty()) {
|
|
165
|
+
return fallback;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
NSString *tiptap = [[NSString alloc] initWithUTF8String:typedProps.document.c_str()];
|
|
169
|
+
StyleConfig *config = ENRMStyleConfigFromProps(typedProps, fontScale);
|
|
170
|
+
|
|
171
|
+
ENRMMd4cFlags *flags = ENRMMd4cFlagsFromProps(typedProps.md4cFlags);
|
|
172
|
+
ENRMTiptapParser *parser = [[ENRMTiptapParser alloc] init];
|
|
173
|
+
TiptapASTNode *ast = [parser parseTiptap:tiptap
|
|
174
|
+
flags:flags
|
|
175
|
+
isGFM:typedProps.isGFM
|
|
176
|
+
linkRegex:ENRMLinkRegexConfigFromProps(typedProps.linkRecognition.text)
|
|
177
|
+
inlineCodeLinkRegex:ENRMLinkRegexConfigFromProps(typedProps.linkRecognition.inlineCode)];
|
|
178
|
+
if (!ast) {
|
|
179
|
+
return fallback;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
NSLineBreakStrategy lineBreakStrategy =
|
|
183
|
+
ENRMResolveLineBreakStrategy([[NSString alloc] initWithUTF8String:typedProps.lineBreakStrategyIOS.c_str()]);
|
|
184
|
+
ENRMRenderResult *result =
|
|
185
|
+
ENRMRenderASTNodes(ast.children, config, typedProps.allowTrailingMargin, typedProps.allowFontScaling,
|
|
186
|
+
typedProps.maxFontSizeMultiplier, lineBreakStrategy);
|
|
187
|
+
NSMutableAttributedString *text = result.attributedText;
|
|
188
|
+
if (text.length == 0) {
|
|
189
|
+
return fallback;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
ENRMWritingDirectionMode writingDirectionMode =
|
|
193
|
+
ENRMResolveWritingDirectionMode([[NSString alloc] initWithUTF8String:typedProps.writingDirection.c_str()]);
|
|
194
|
+
ENRMApplyWritingDirectionMode(text, writingDirectionMode, resolvedLayoutDirection);
|
|
195
|
+
|
|
196
|
+
NSInteger numberOfLines = (NSInteger)typedProps.numberOfLines;
|
|
197
|
+
NSLineBreakMode lineBreakMode =
|
|
198
|
+
ENRMResolveEllipsizeLineBreakMode([[NSString alloc] initWithUTF8String:typedProps.ellipsizeMode.c_str()]);
|
|
199
|
+
CGSize size = ENRMMeasureAttributedTextViewFree(text, maxWidth, config, typedProps.allowTrailingMargin,
|
|
200
|
+
result.lastElementMarginBottom, pointScaleFactor, numberOfLines,
|
|
201
|
+
lineBreakMode, YES);
|
|
202
|
+
if (size.height == 0) {
|
|
203
|
+
return fallback;
|
|
204
|
+
}
|
|
205
|
+
return size;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
#include "EnrichedTiptapTextShadowNode.h"
|
|
3
|
+
#include <react/debug/react_native_assert.h>
|
|
4
|
+
#include <react/renderer/core/ConcreteComponentDescriptor.h>
|
|
5
|
+
|
|
6
|
+
namespace facebook::react {
|
|
7
|
+
|
|
8
|
+
class EnrichedTiptapTextComponentDescriptor final
|
|
9
|
+
: public ConcreteComponentDescriptor<EnrichedTiptapTextShadowNode> {
|
|
10
|
+
public:
|
|
11
|
+
using ConcreteComponentDescriptor::ConcreteComponentDescriptor;
|
|
12
|
+
|
|
13
|
+
void adopt(ShadowNode &shadowNode) const override {
|
|
14
|
+
react_native_assert(dynamic_cast<EnrichedTiptapTextShadowNode *>(&shadowNode));
|
|
15
|
+
ConcreteComponentDescriptor::adopt(shadowNode);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
#include "MeasurementCache.h"
|
|
3
|
+
#include <ReactNativeRenderRichText/EnrichedTiptapTextState.h>
|
|
4
|
+
#include <ReactNativeRenderRichText/EventEmitters.h>
|
|
5
|
+
#include <ReactNativeRenderRichText/Props.h>
|
|
6
|
+
#include <react/renderer/components/view/ConcreteViewShadowNode.h>
|
|
7
|
+
#include <react/renderer/core/LayoutConstraints.h>
|
|
8
|
+
|
|
9
|
+
namespace facebook::react {
|
|
10
|
+
|
|
11
|
+
JSI_EXPORT extern const char EnrichedTiptapTextComponentName[];
|
|
12
|
+
|
|
13
|
+
/// ShadowNode implementing measureContent for automatic height calculation.
|
|
14
|
+
class EnrichedTiptapTextShadowNode
|
|
15
|
+
: public ConcreteViewShadowNode<EnrichedTiptapTextComponentName, EnrichedTiptapTextProps,
|
|
16
|
+
EnrichedTiptapTextEventEmitter, EnrichedTiptapTextState> {
|
|
17
|
+
public:
|
|
18
|
+
using ConcreteViewShadowNode::ConcreteViewShadowNode;
|
|
19
|
+
|
|
20
|
+
EnrichedTiptapTextShadowNode(const ShadowNodeFragment &fragment, const ShadowNodeFamily::Shared &family,
|
|
21
|
+
ShadowNodeTraits traits);
|
|
22
|
+
|
|
23
|
+
EnrichedTiptapTextShadowNode(const ShadowNode &sourceShadowNode, const ShadowNodeFragment &fragment);
|
|
24
|
+
|
|
25
|
+
void dirtyLayoutIfNeeded();
|
|
26
|
+
|
|
27
|
+
Size measureContent(const LayoutContext &layoutContext, const LayoutConstraints &layoutConstraints) const override;
|
|
28
|
+
|
|
29
|
+
static ShadowNodeTraits BaseTraits()
|
|
30
|
+
{
|
|
31
|
+
auto traits = ConcreteViewShadowNode::BaseTraits();
|
|
32
|
+
traits.set(ShadowNodeTraits::Trait::LeafYogaNode);
|
|
33
|
+
traits.set(ShadowNodeTraits::Trait::MeasurableYogaNode);
|
|
34
|
+
return traits;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private:
|
|
38
|
+
int localHeightRecalculationCounter_{0};
|
|
39
|
+
mutable int lastExactMeasurementCounter_{0};
|
|
40
|
+
mutable CGSize lastExactMeasurementSize_{0, 0};
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#import "EnrichedTiptapTextShadowNode.h"
|
|
2
|
+
#import "ENRMViewFreeMeasurement.h"
|
|
3
|
+
#import "EnrichedTiptapText.h"
|
|
4
|
+
#import "ShadowMeasurementUtils.h"
|
|
5
|
+
#import <yoga/Yoga.h>
|
|
6
|
+
|
|
7
|
+
namespace facebook::react {
|
|
8
|
+
|
|
9
|
+
extern const char EnrichedTiptapTextComponentName[] = "EnrichedTiptapText";
|
|
10
|
+
|
|
11
|
+
EnrichedTiptapTextShadowNode::EnrichedTiptapTextShadowNode(const ShadowNodeFragment &fragment,
|
|
12
|
+
const ShadowNodeFamily::Shared &family,
|
|
13
|
+
ShadowNodeTraits traits)
|
|
14
|
+
: ConcreteViewShadowNode(fragment, family, traits)
|
|
15
|
+
{
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
EnrichedTiptapTextShadowNode::EnrichedTiptapTextShadowNode(const ShadowNode &sourceShadowNode,
|
|
19
|
+
const ShadowNodeFragment &fragment)
|
|
20
|
+
: ConcreteViewShadowNode(sourceShadowNode, fragment),
|
|
21
|
+
localHeightRecalculationCounter_(
|
|
22
|
+
static_cast<const EnrichedTiptapTextShadowNode &>(sourceShadowNode).localHeightRecalculationCounter_),
|
|
23
|
+
lastExactMeasurementCounter_(
|
|
24
|
+
static_cast<const EnrichedTiptapTextShadowNode &>(sourceShadowNode).lastExactMeasurementCounter_),
|
|
25
|
+
lastExactMeasurementSize_(
|
|
26
|
+
static_cast<const EnrichedTiptapTextShadowNode &>(sourceShadowNode).lastExactMeasurementSize_)
|
|
27
|
+
{
|
|
28
|
+
const auto &oldProps = *std::static_pointer_cast<const EnrichedTiptapTextProps>(sourceShadowNode.getProps());
|
|
29
|
+
const auto &newProps = *std::static_pointer_cast<const EnrichedTiptapTextProps>(this->getProps());
|
|
30
|
+
|
|
31
|
+
if (newProps.streamingAnimation && ENRMPropsNeedExactStreamingMeasurement(oldProps, newProps)) {
|
|
32
|
+
lastExactMeasurementCounter_ = -1;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
dirtyLayoutIfNeeded();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
void EnrichedTiptapTextShadowNode::dirtyLayoutIfNeeded()
|
|
39
|
+
{
|
|
40
|
+
const auto state = this->getStateData();
|
|
41
|
+
const int receivedCounter = state.getHeightRecalculationCounter();
|
|
42
|
+
|
|
43
|
+
if (receivedCounter > localHeightRecalculationCounter_) {
|
|
44
|
+
localHeightRecalculationCounter_ = receivedCounter;
|
|
45
|
+
YGNodeMarkDirty(&yogaNode_);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Size EnrichedTiptapTextShadowNode::measureContent(const LayoutContext &layoutContext,
|
|
50
|
+
const LayoutConstraints &layoutConstraints) const
|
|
51
|
+
{
|
|
52
|
+
const auto propsHandle = std::static_pointer_cast<const EnrichedTiptapTextProps>(this->getProps());
|
|
53
|
+
const auto &typedProps = *propsHandle;
|
|
54
|
+
const int receivedCounter = getStateData().getHeightRecalculationCounter();
|
|
55
|
+
const EnrichedTiptapTextProps *props = propsHandle.get();
|
|
56
|
+
CGFloat pointScaleFactor = layoutContext.pointScaleFactor;
|
|
57
|
+
NSWritingDirection resolvedLayoutDirection = layoutConstraints.layoutDirection == LayoutDirection::RightToLeft
|
|
58
|
+
? NSWritingDirectionRightToLeft
|
|
59
|
+
: NSWritingDirectionLeftToRight;
|
|
60
|
+
|
|
61
|
+
return ENRMMeasureTiptapContent<EnrichedTiptapTextProps, EnrichedTiptapText>(
|
|
62
|
+
typedProps, getStateData().getComponentViewRef(), receivedCounter, lastExactMeasurementCounter_,
|
|
63
|
+
lastExactMeasurementSize_, TiptapFlavor::CommonMark, layoutContext, layoutConstraints,
|
|
64
|
+
^(EnrichedTiptapText *view, CGFloat maxWidth, CGFloat fontScale) {
|
|
65
|
+
return ENRMMeasureTiptapViewFree(*props, maxWidth, fontScale, pointScaleFactor, resolvedLayoutDirection);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
#include <memory>
|
|
3
|
+
|
|
4
|
+
namespace facebook::react {
|
|
5
|
+
|
|
6
|
+
/// Counter triggers layout recalculation, viewRef allows shadow node to access view for measurement.
|
|
7
|
+
class EnrichedTiptapTextState {
|
|
8
|
+
public:
|
|
9
|
+
EnrichedTiptapTextState() = default;
|
|
10
|
+
EnrichedTiptapTextState(int counter, std::shared_ptr<void> ref) : counter_(counter), viewRef_(ref) {}
|
|
11
|
+
|
|
12
|
+
int getHeightRecalculationCounter() const {
|
|
13
|
+
return counter_;
|
|
14
|
+
}
|
|
15
|
+
std::shared_ptr<void> getComponentViewRef() const {
|
|
16
|
+
return viewRef_;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
private:
|
|
20
|
+
int counter_{0};
|
|
21
|
+
std::shared_ptr<void> viewRef_{nullptr};
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
} // namespace facebook::react
|