@mathers101/react-native-render-rich-text 0.0.0-stage → 0.1.10
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,130 @@
|
|
|
1
|
+
#import "FactoidRenderer.h"
|
|
2
|
+
#import "FactoidBackground.h"
|
|
3
|
+
#import "TiptapASTNode.h"
|
|
4
|
+
#import "RenderContext.h"
|
|
5
|
+
#import "RendererFactory.h"
|
|
6
|
+
#import "StyleConfig.h"
|
|
7
|
+
|
|
8
|
+
static RCTUIColor *ENRMColorFromString(NSString *value)
|
|
9
|
+
{
|
|
10
|
+
if (value.length == 0)
|
|
11
|
+
return nil;
|
|
12
|
+
|
|
13
|
+
NSString *trimmed = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
|
14
|
+
if (trimmed.length == 0)
|
|
15
|
+
return nil;
|
|
16
|
+
|
|
17
|
+
if ([trimmed characterAtIndex:0] == '#') {
|
|
18
|
+
NSString *hex = [trimmed substringFromIndex:1];
|
|
19
|
+
if (hex.length != 6 && hex.length != 8)
|
|
20
|
+
return nil;
|
|
21
|
+
unsigned int rgba = 0;
|
|
22
|
+
NSScanner *scanner = [NSScanner scannerWithString:hex];
|
|
23
|
+
if (![scanner scanHexInt:&rgba] || !scanner.isAtEnd)
|
|
24
|
+
return nil;
|
|
25
|
+
CGFloat alpha = 1.0;
|
|
26
|
+
CGFloat red;
|
|
27
|
+
CGFloat green;
|
|
28
|
+
CGFloat blue;
|
|
29
|
+
if (hex.length == 8) {
|
|
30
|
+
alpha = ((rgba >> 24) & 0xFF) / 255.0;
|
|
31
|
+
red = ((rgba >> 16) & 0xFF) / 255.0;
|
|
32
|
+
green = ((rgba >> 8) & 0xFF) / 255.0;
|
|
33
|
+
blue = (rgba & 0xFF) / 255.0;
|
|
34
|
+
} else {
|
|
35
|
+
red = ((rgba >> 16) & 0xFF) / 255.0;
|
|
36
|
+
green = ((rgba >> 8) & 0xFF) / 255.0;
|
|
37
|
+
blue = (rgba & 0xFF) / 255.0;
|
|
38
|
+
}
|
|
39
|
+
return [RCTUIColor colorWithRed:red green:green blue:blue alpha:alpha];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
static NSDictionary<NSString *, RCTUIColor *> *namedColors;
|
|
43
|
+
static dispatch_once_t onceToken;
|
|
44
|
+
dispatch_once(&onceToken, ^{
|
|
45
|
+
namedColors = @{
|
|
46
|
+
@"black" : [RCTUIColor blackColor],
|
|
47
|
+
@"darkgray" : [RCTUIColor darkGrayColor],
|
|
48
|
+
@"darkgrey" : [RCTUIColor darkGrayColor],
|
|
49
|
+
@"gray" : [RCTUIColor grayColor],
|
|
50
|
+
@"grey" : [RCTUIColor grayColor],
|
|
51
|
+
@"lightgray" : [RCTUIColor lightGrayColor],
|
|
52
|
+
@"lightgrey" : [RCTUIColor lightGrayColor],
|
|
53
|
+
@"white" : [RCTUIColor whiteColor],
|
|
54
|
+
@"red" : [RCTUIColor redColor],
|
|
55
|
+
@"green" : [RCTUIColor greenColor],
|
|
56
|
+
@"blue" : [RCTUIColor blueColor],
|
|
57
|
+
@"yellow" : [RCTUIColor yellowColor],
|
|
58
|
+
@"cyan" : [RCTUIColor cyanColor],
|
|
59
|
+
@"aqua" : [RCTUIColor cyanColor],
|
|
60
|
+
@"magenta" : [RCTUIColor magentaColor],
|
|
61
|
+
@"fuchsia" : [RCTUIColor magentaColor],
|
|
62
|
+
@"lime" : [RCTUIColor colorWithRed:0 green:1 blue:0 alpha:1],
|
|
63
|
+
@"maroon" : [RCTUIColor colorWithRed:0.5 green:0 blue:0 alpha:1],
|
|
64
|
+
@"navy" : [RCTUIColor colorWithRed:0 green:0 blue:0.5 alpha:1],
|
|
65
|
+
@"olive" : [RCTUIColor colorWithRed:0.5 green:0.5 blue:0 alpha:1],
|
|
66
|
+
@"purple" : [RCTUIColor colorWithRed:0.5 green:0 blue:0.5 alpha:1],
|
|
67
|
+
@"silver" : [RCTUIColor colorWithRed:0.75 green:0.75 blue:0.75 alpha:1],
|
|
68
|
+
@"teal" : [RCTUIColor colorWithRed:0 green:0.5 blue:0.5 alpha:1],
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
return namedColors[trimmed.lowercaseString];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
static RCTUIColor *ENRMFactoidColor(NSString *value, RCTUIColor *styleColor, unsigned int rgb)
|
|
75
|
+
{
|
|
76
|
+
RCTUIColor *parsed = ENRMColorFromString(value);
|
|
77
|
+
if (parsed)
|
|
78
|
+
return parsed;
|
|
79
|
+
if (styleColor)
|
|
80
|
+
return styleColor;
|
|
81
|
+
return [RCTUIColor colorWithRed:((rgb >> 16) & 0xFF) / 255.0
|
|
82
|
+
green:((rgb >> 8) & 0xFF) / 255.0
|
|
83
|
+
blue:(rgb & 0xFF) / 255.0
|
|
84
|
+
alpha:1.0];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@implementation FactoidRenderer
|
|
88
|
+
|
|
89
|
+
- (id)takeContextSnapshot:(RenderContext *)context
|
|
90
|
+
{
|
|
91
|
+
return [context snapshotScope];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
- (void)renderNodeContent:(TiptapASTNode *)node
|
|
95
|
+
into:(NSMutableAttributedString *)output
|
|
96
|
+
context:(RenderContext *)context
|
|
97
|
+
{
|
|
98
|
+
NSString *factoidId = node.attributes[@"id"] ?: @"";
|
|
99
|
+
// A node attribute replaces the matching textStyle.factoid color. The RGB values are the
|
|
100
|
+
// same defaults JS applies when textStyle.factoid omits a color.
|
|
101
|
+
RCTUIColor *textColor = ENRMFactoidColor(node.attributes[@"color"], _config.factoidColor, 0x205710);
|
|
102
|
+
RCTUIColor *backgroundColor =
|
|
103
|
+
ENRMFactoidColor(node.attributes[@"backgroundColor"], _config.factoidBackgroundColor, 0x9BFC6E);
|
|
104
|
+
RCTUIColor *borderColor =
|
|
105
|
+
ENRMFactoidColor(node.attributes[@"borderColor"], _config.factoidBorderColor, 0x23670D);
|
|
106
|
+
|
|
107
|
+
// Inline children keep the surrounding font. The text color becomes their base color.
|
|
108
|
+
BlockStyle *block = [context getBlockStyle];
|
|
109
|
+
UIFont *font = block.cachedFont;
|
|
110
|
+
if (!font) {
|
|
111
|
+
font = [context cachedFontForSize:block.fontSize family:block.fontFamily weight:block.fontWeight];
|
|
112
|
+
}
|
|
113
|
+
[context setBlockStyle:context.currentBlockType
|
|
114
|
+
font:font
|
|
115
|
+
color:textColor
|
|
116
|
+
headingLevel:context.currentHeadingLevel];
|
|
117
|
+
|
|
118
|
+
NSUInteger start = output.length;
|
|
119
|
+
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
120
|
+
NSRange range = NSMakeRange(start, output.length > start ? output.length - start : 0);
|
|
121
|
+
if (range.length == 0)
|
|
122
|
+
return;
|
|
123
|
+
|
|
124
|
+
[output addAttribute:FactoidAttributeName value:@YES range:range];
|
|
125
|
+
[output addAttribute:FactoidIdAttributeName value:factoidId range:range];
|
|
126
|
+
[output addAttribute:FactoidBackgroundColorAttributeName value:backgroundColor range:range];
|
|
127
|
+
[output addAttribute:FactoidBorderColorAttributeName value:borderColor range:range];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
@end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#import "HeadingRenderer.h"
|
|
2
|
+
#import "ENRMLinkPillText.h"
|
|
3
|
+
#import "FontUtils.h"
|
|
4
|
+
#import "ParagraphStyleUtils.h"
|
|
5
|
+
#import "RenderContext.h"
|
|
6
|
+
#import "RendererFactory.h"
|
|
7
|
+
#import "RuntimeKeys.h"
|
|
8
|
+
#import "StyleConfig.h"
|
|
9
|
+
|
|
10
|
+
// Lightweight struct to hold style data without object overhead
|
|
11
|
+
typedef struct {
|
|
12
|
+
__unsafe_unretained UIFont *font;
|
|
13
|
+
__unsafe_unretained RCTUIColor *color;
|
|
14
|
+
CGFloat marginTop;
|
|
15
|
+
CGFloat marginBottom;
|
|
16
|
+
CGFloat lineHeight;
|
|
17
|
+
NSTextAlignment textAlign;
|
|
18
|
+
} HeadingStyle;
|
|
19
|
+
|
|
20
|
+
static NSString *const kHeadingTypes[] = {nil, @"heading-1", @"heading-2", @"heading-3",
|
|
21
|
+
@"heading-4", @"heading-5", @"heading-6"};
|
|
22
|
+
|
|
23
|
+
@implementation HeadingRenderer
|
|
24
|
+
|
|
25
|
+
- (id)takeContextSnapshot:(RenderContext *)context
|
|
26
|
+
{
|
|
27
|
+
return [context snapshotScope];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
- (void)renderNodeContent:(TiptapASTNode *)node
|
|
31
|
+
into:(NSMutableAttributedString *)output
|
|
32
|
+
context:(RenderContext *)context
|
|
33
|
+
{
|
|
34
|
+
if (output.length > 0 && ![output.string hasSuffix:@"\n"]) {
|
|
35
|
+
[output appendAttributedString:kNewlineAttributedString];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
NSInteger level = [node.attributes[@"level"] integerValue];
|
|
39
|
+
if (level < 1 || level > 6)
|
|
40
|
+
level = 1;
|
|
41
|
+
|
|
42
|
+
HeadingStyle style = [self styleForLevel:level];
|
|
43
|
+
[context setBlockStyle:BlockTypeHeading font:style.font color:style.color headingLevel:level];
|
|
44
|
+
|
|
45
|
+
NSUInteger start = output.length;
|
|
46
|
+
NSUInteger contentStart = start;
|
|
47
|
+
|
|
48
|
+
// Spacing at the very start of the document requires a spacer character (index 0 check)
|
|
49
|
+
if (start == 0) {
|
|
50
|
+
NSUInteger offset = applyBlockSpacingBefore(output, 0, style.marginTop);
|
|
51
|
+
contentStart += offset;
|
|
52
|
+
start += offset;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
56
|
+
|
|
57
|
+
NSRange range = NSMakeRange(start, output.length - start);
|
|
58
|
+
if (range.length == 0)
|
|
59
|
+
return;
|
|
60
|
+
|
|
61
|
+
// Register heading for accessibility
|
|
62
|
+
NSString *headingText = ENRMStringByExpandingLinkPills([output attributedSubstringFromRange:range]);
|
|
63
|
+
[context registerHeadingRange:range level:level text:headingText];
|
|
64
|
+
|
|
65
|
+
// Metadata attribute used for post-processing (e.g., Export to Tiptap/HTML)
|
|
66
|
+
[output addAttribute:TiptapTypeAttributeName value:kHeadingTypes[level] range:range];
|
|
67
|
+
|
|
68
|
+
applyLineHeight(output, range, style.lineHeight);
|
|
69
|
+
applyBaselineOffset(output, range);
|
|
70
|
+
applyTextAlignment(output, range, style.textAlign);
|
|
71
|
+
|
|
72
|
+
// Skip marginTop for the first block — already handled by applyBlockSpacingBefore above
|
|
73
|
+
if (contentStart != 1) {
|
|
74
|
+
NSUInteger inserted = applyParagraphSpacingBefore(output, range, style.marginTop);
|
|
75
|
+
start += inserted;
|
|
76
|
+
}
|
|
77
|
+
applyParagraphSpacingAfter(output, start, style.marginBottom);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
#pragma mark - Style Mapping
|
|
81
|
+
|
|
82
|
+
- (HeadingStyle)styleForLevel:(NSInteger)level
|
|
83
|
+
{
|
|
84
|
+
StyleConfig *c = _config;
|
|
85
|
+
switch (level) {
|
|
86
|
+
case 1:
|
|
87
|
+
return (HeadingStyle){c.h1Font, c.h1Color, c.h1MarginTop, c.h1MarginBottom, c.h1LineHeight, c.h1TextAlign};
|
|
88
|
+
case 2:
|
|
89
|
+
return (HeadingStyle){c.h2Font, c.h2Color, c.h2MarginTop, c.h2MarginBottom, c.h2LineHeight, c.h2TextAlign};
|
|
90
|
+
case 3:
|
|
91
|
+
return (HeadingStyle){c.h3Font, c.h3Color, c.h3MarginTop, c.h3MarginBottom, c.h3LineHeight, c.h3TextAlign};
|
|
92
|
+
case 4:
|
|
93
|
+
return (HeadingStyle){c.h4Font, c.h4Color, c.h4MarginTop, c.h4MarginBottom, c.h4LineHeight, c.h4TextAlign};
|
|
94
|
+
case 5:
|
|
95
|
+
return (HeadingStyle){c.h5Font, c.h5Color, c.h5MarginTop, c.h5MarginBottom, c.h5LineHeight, c.h5TextAlign};
|
|
96
|
+
case 6:
|
|
97
|
+
return (HeadingStyle){c.h6Font, c.h6Color, c.h6MarginTop, c.h6MarginBottom, c.h6LineHeight, c.h6TextAlign};
|
|
98
|
+
default:
|
|
99
|
+
return [self styleForLevel:1];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#import "HighlightRenderer.h"
|
|
2
|
+
#import "TiptapASTNode.h"
|
|
3
|
+
#import "RenderContext.h"
|
|
4
|
+
#import "RendererFactory.h"
|
|
5
|
+
#import "StyleConfig.h"
|
|
6
|
+
|
|
7
|
+
NSString *const HighlightAttributeName = @"EnrichedTiptapHighlight";
|
|
8
|
+
|
|
9
|
+
@implementation HighlightRenderer
|
|
10
|
+
|
|
11
|
+
#pragma mark - Rendering
|
|
12
|
+
|
|
13
|
+
- (void)renderNodeContent:(TiptapASTNode *)node
|
|
14
|
+
into:(NSMutableAttributedString *)output
|
|
15
|
+
context:(RenderContext *)context
|
|
16
|
+
{
|
|
17
|
+
NSUInteger start = output.length;
|
|
18
|
+
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
19
|
+
|
|
20
|
+
NSRange range = NSMakeRange(start, output.length - start);
|
|
21
|
+
if (range.length == 0)
|
|
22
|
+
return;
|
|
23
|
+
|
|
24
|
+
BlockStyle *blockStyle = [context getBlockStyle];
|
|
25
|
+
RCTUIColor *foregroundColor = [RenderContext calculateHighlightColor:[_config highlightColor]
|
|
26
|
+
paragraphColor:[_config paragraphColor]
|
|
27
|
+
blockColor:blockStyle.color];
|
|
28
|
+
[output addAttribute:NSForegroundColorAttributeName value:foregroundColor range:range];
|
|
29
|
+
[output addAttribute:NSBackgroundColorAttributeName value:[_config highlightBackgroundColor] range:range];
|
|
30
|
+
[output addAttribute:HighlightAttributeName value:@YES range:range];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@end
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
#import "LinkRenderer.h"
|
|
2
|
+
#import "CodeBackground.h"
|
|
3
|
+
#import "ENRMLinkPillAttachment.h"
|
|
4
|
+
#import "ENRMSpoilerTapUtils.h"
|
|
5
|
+
#import "ENRMTextLinkAttributes.h"
|
|
6
|
+
#import "FontUtils.h"
|
|
7
|
+
#import "RenderContext.h"
|
|
8
|
+
#import "RendererFactory.h"
|
|
9
|
+
#import "StyleConfig.h"
|
|
10
|
+
#import <React/RCTFont.h>
|
|
11
|
+
|
|
12
|
+
#if !TARGET_OS_OSX
|
|
13
|
+
static BOOL ENRMRangeHasAttribute(NSAttributedString *text, NSRange range, NSAttributedStringKey key)
|
|
14
|
+
{
|
|
15
|
+
__block BOOL found = NO;
|
|
16
|
+
[text enumerateAttribute:key
|
|
17
|
+
inRange:range
|
|
18
|
+
options:0
|
|
19
|
+
usingBlock:^(id value, NSRange subrange, BOOL *stop) {
|
|
20
|
+
if (value) {
|
|
21
|
+
found = YES;
|
|
22
|
+
*stop = YES;
|
|
23
|
+
}
|
|
24
|
+
}];
|
|
25
|
+
return found;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/// Replaces the rendered link content with one attachment character and returns its range.
|
|
29
|
+
static NSRange ENRMCollapseLinkIntoPill(NSMutableAttributedString *output, NSRange range, NSString *url,
|
|
30
|
+
LinkVariantConfig *variant, StyleConfig *config, RenderContext *context)
|
|
31
|
+
{
|
|
32
|
+
LinkPillContent *content = [config linkPillContent][url];
|
|
33
|
+
BOOL hasOwnIcon = content.iconUri.length > 0;
|
|
34
|
+
// A tint set for the link wins. The variant's tint is for the variant's own icon, not for an
|
|
35
|
+
// icon supplied per link (an avatar would become a silhouette).
|
|
36
|
+
RCTUIColor *iconTint = content.iconTintColor ?: (hasOwnIcon ? nil : variant.pill.iconTintColor);
|
|
37
|
+
NSDictionary<NSAttributedStringKey, id> *attributes = [output attributesAtIndex:range.location effectiveRange:NULL];
|
|
38
|
+
ENRMLinkPillAttachment *pill = [[ENRMLinkPillAttachment alloc]
|
|
39
|
+
initWithOriginalText:[output attributedSubstringFromRange:range]
|
|
40
|
+
variant:variant
|
|
41
|
+
label:content.label.length > 0 ? content.label : variant.pill.label
|
|
42
|
+
iconUri:hasOwnIcon ? content.iconUri : variant.pill.iconUri
|
|
43
|
+
iconTintColor:iconTint
|
|
44
|
+
font:attributes[NSFontAttributeName] ?: [context getBlockStyle].cachedFont
|
|
45
|
+
requestHeaders:[config imageRequestHeaders]];
|
|
46
|
+
pill.lineHeight = [config lineHeightForLinkPill:variant.pill];
|
|
47
|
+
|
|
48
|
+
// The placeholder keeps the block context of the text it replaces. The pill draws its own
|
|
49
|
+
// background, underline and label, so inline decoration of that text must not show around it.
|
|
50
|
+
NSMutableDictionary<NSAttributedStringKey, id> *placeholder = [attributes mutableCopy];
|
|
51
|
+
[placeholder removeObjectsForKeys:@[
|
|
52
|
+
NSBackgroundColorAttributeName, NSUnderlineStyleAttributeName, NSUnderlineColorAttributeName,
|
|
53
|
+
NSStrikethroughStyleAttributeName, CodeAttributeName
|
|
54
|
+
]];
|
|
55
|
+
placeholder[NSAttachmentAttributeName] = pill;
|
|
56
|
+
[output replaceCharactersInRange:range
|
|
57
|
+
withAttributedString:[[NSAttributedString alloc] initWithString:@"\uFFFC" attributes:placeholder]];
|
|
58
|
+
return NSMakeRange(range.location, 1);
|
|
59
|
+
}
|
|
60
|
+
#endif
|
|
61
|
+
|
|
62
|
+
@implementation LinkRenderer
|
|
63
|
+
|
|
64
|
+
#pragma mark - Rendering
|
|
65
|
+
|
|
66
|
+
- (void)renderNodeContent:(TiptapASTNode *)node
|
|
67
|
+
into:(NSMutableAttributedString *)output
|
|
68
|
+
context:(RenderContext *)context
|
|
69
|
+
{
|
|
70
|
+
BOOL recognizedLink = [node.attributes[@"recognizedLink"] isEqualToString:@"true"];
|
|
71
|
+
NSUInteger start = output.length;
|
|
72
|
+
|
|
73
|
+
// 1. Render children first to establish base attributes
|
|
74
|
+
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
75
|
+
|
|
76
|
+
NSRange range = NSMakeRange(start, output.length - start);
|
|
77
|
+
if (range.length == 0)
|
|
78
|
+
return;
|
|
79
|
+
|
|
80
|
+
// 2. Extract configuration
|
|
81
|
+
NSString *url = node.attributes[@"url"] ?: @"";
|
|
82
|
+
LinkVariantConfig *variant = [_config effectiveLinkVariantForURL:url];
|
|
83
|
+
|
|
84
|
+
RCTUIColor *linkColor = variant.color ?: [_config linkColor];
|
|
85
|
+
BOOL linkUnderline = variant ? variant.underline : [_config linkUnderline];
|
|
86
|
+
NSString *linkFontFamily = variant.fontFamily.length > 0 ? variant.fontFamily : [_config linkFontFamily];
|
|
87
|
+
RCTUIColor *backgroundColor = variant ? variant.backgroundColor : [_config linkBackgroundColor];
|
|
88
|
+
|
|
89
|
+
NSNumber *underlineStyle = @(linkUnderline ? NSUnderlineStyleSingle : NSUnderlineStyleNone);
|
|
90
|
+
|
|
91
|
+
// 3. Apply core link functionality (non-destructive)
|
|
92
|
+
[output addAttribute:NSLinkAttributeName value:url range:range];
|
|
93
|
+
|
|
94
|
+
// 4. Optimize visual attributes via enumeration to avoid redundant updates
|
|
95
|
+
[output enumerateAttributesInRange:range
|
|
96
|
+
options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
|
|
97
|
+
usingBlock:^(NSDictionary<NSAttributedStringKey, id> *attrs, NSRange subrange, BOOL *stop) {
|
|
98
|
+
NSMutableDictionary *newAttributes = [NSMutableDictionary dictionary];
|
|
99
|
+
if (recognizedLink) {
|
|
100
|
+
newAttributes[ENRMRecognizedLinkAttributeName] = @YES;
|
|
101
|
+
newAttributes[ENRMRecognizedLinkOriginalUnderlineAttributeName] =
|
|
102
|
+
attrs[NSUnderlineStyleAttributeName] ?: @0;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Only apply link color if the subrange isn't already colored by the link style
|
|
106
|
+
if (linkColor && ![attrs[NSForegroundColorAttributeName] isEqual:linkColor]) {
|
|
107
|
+
newAttributes[NSForegroundColorAttributeName] = linkColor;
|
|
108
|
+
newAttributes[NSUnderlineColorAttributeName] = linkColor;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Only update underline style if it differs from the config
|
|
112
|
+
if (![attrs[NSUnderlineStyleAttributeName] isEqual:underlineStyle]) {
|
|
113
|
+
newAttributes[NSUnderlineStyleAttributeName] = underlineStyle;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (linkFontFamily.length > 0) {
|
|
117
|
+
UIFont *currentFont = attrs[NSFontAttributeName];
|
|
118
|
+
if (currentFont) {
|
|
119
|
+
UIFont *linkFont = [RCTFont updateFont:currentFont
|
|
120
|
+
withFamily:linkFontFamily
|
|
121
|
+
size:nil
|
|
122
|
+
weight:nil
|
|
123
|
+
style:nil
|
|
124
|
+
variant:nil
|
|
125
|
+
scaleMultiplier:1.0];
|
|
126
|
+
if (linkFont && ![currentFont isEqual:linkFont]) {
|
|
127
|
+
newAttributes[NSFontAttributeName] = linkFont;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (newAttributes.count > 0) {
|
|
133
|
+
[output addAttributes:newAttributes range:subrange];
|
|
134
|
+
}
|
|
135
|
+
}];
|
|
136
|
+
|
|
137
|
+
#if !TARGET_OS_OSX
|
|
138
|
+
// A pill is one line and one unit: links holding attachments or a line break stay ordinary links.
|
|
139
|
+
// So do links holding a spoiler, whose hidden text the label would show.
|
|
140
|
+
BOOL willBePill =
|
|
141
|
+
variant.pill != nil && !ENRMRangeHasAttribute(output, range, NSAttachmentAttributeName) &&
|
|
142
|
+
!ENRMRangeHasAttribute(output, range, SpoilerAttributeName) &&
|
|
143
|
+
[output.string rangeOfCharacterFromSet:NSCharacterSet.newlineCharacterSet options:0 range:range].location ==
|
|
144
|
+
NSNotFound;
|
|
145
|
+
#else
|
|
146
|
+
BOOL willBePill = NO;
|
|
147
|
+
#endif
|
|
148
|
+
if (backgroundColor && !willBePill)
|
|
149
|
+
[output addAttribute:NSBackgroundColorAttributeName value:backgroundColor range:range];
|
|
150
|
+
|
|
151
|
+
#if !TARGET_OS_OSX
|
|
152
|
+
if (willBePill)
|
|
153
|
+
range = ENRMCollapseLinkIntoPill(output, range, url, variant, _config, context);
|
|
154
|
+
#endif
|
|
155
|
+
[context registerLinkRange:range url:url];
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
@end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#import "BaseRenderer.h"
|
|
2
|
+
#import "RenderContext.h"
|
|
3
|
+
|
|
4
|
+
extern NSString *const ListDepthAttribute;
|
|
5
|
+
extern NSString *const ListTypeAttribute;
|
|
6
|
+
extern NSString *const ListItemNumberAttribute;
|
|
7
|
+
extern NSString *const ListItemMarkerStartAttribute;
|
|
8
|
+
|
|
9
|
+
extern NSString *const TaskItemAttribute;
|
|
10
|
+
extern NSString *const TaskCheckedAttribute;
|
|
11
|
+
extern NSString *const TaskIndexAttribute;
|
|
12
|
+
|
|
13
|
+
@interface ENRMListMarkerDescriptor : NSObject
|
|
14
|
+
@property (nonatomic, assign) BOOL isTask;
|
|
15
|
+
@property (nonatomic, assign) BOOL isChecked;
|
|
16
|
+
@property (nonatomic, assign) NSInteger taskIndex;
|
|
17
|
+
@property (nonatomic, assign) ListType listType;
|
|
18
|
+
@property (nonatomic, assign) NSInteger number;
|
|
19
|
+
@property (nonatomic, assign) NSInteger depth;
|
|
20
|
+
@property (nonatomic, assign) CGFloat indent;
|
|
21
|
+
@end
|
|
22
|
+
|
|
23
|
+
@interface ListItemRenderer : BaseRenderer
|
|
24
|
+
@end
|