@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,25 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
#import "ENRMUIKit.h"
|
|
3
|
+
#import <React/RCTUtils.h>
|
|
4
|
+
#include <memory>
|
|
5
|
+
#import <react/utils/ManagedObjectWrapper.h>
|
|
6
|
+
|
|
7
|
+
/// Returns YES if the measured content height differs from the frame height
|
|
8
|
+
/// Yoga assigned, comparing at physical-pixel granularity to avoid
|
|
9
|
+
/// false positives from sub-pixel floating-point differences.
|
|
10
|
+
static inline BOOL needsHeightUpdate(CGSize measuredSize, CGRect bounds)
|
|
11
|
+
{
|
|
12
|
+
CGFloat scale = RCTScreenScale();
|
|
13
|
+
CGFloat assignedHeight = ceil(bounds.size.height * scale) / scale;
|
|
14
|
+
CGFloat measuredHeight = ceil(measuredSize.height * scale) / scale;
|
|
15
|
+
return assignedHeight != measuredHeight;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
template <typename StateDataT, typename ConcreteStateT>
|
|
19
|
+
inline void ENRMRequestHeightUpdate(std::shared_ptr<const ConcreteStateT> const &state, int &counter, id self)
|
|
20
|
+
{
|
|
21
|
+
if (!state)
|
|
22
|
+
return;
|
|
23
|
+
counter++;
|
|
24
|
+
state->updateState(StateDataT(counter, facebook::react::wrapManagedObjectWeakly(self)));
|
|
25
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#import <Foundation/Foundation.h>
|
|
4
|
+
|
|
5
|
+
#ifdef __cplusplus
|
|
6
|
+
#include <vector>
|
|
7
|
+
|
|
8
|
+
template <typename T>
|
|
9
|
+
static bool ENRMImageRequestHeadersChanged(const std::vector<T> &oldHeaders, const std::vector<T> &newHeaders)
|
|
10
|
+
{
|
|
11
|
+
if (newHeaders.size() != oldHeaders.size()) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
for (size_t i = 0; i < newHeaders.size(); i++) {
|
|
15
|
+
if (newHeaders[i].name != oldHeaders[i].name || newHeaders[i].value != oldHeaders[i].value) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
template <typename T>
|
|
23
|
+
static NSDictionary<NSString *, NSString *> *_Nullable ENRMImageRequestHeadersFromProps(const std::vector<T> &headers)
|
|
24
|
+
{
|
|
25
|
+
if (headers.empty()) {
|
|
26
|
+
return nil;
|
|
27
|
+
}
|
|
28
|
+
NSMutableDictionary<NSString *, NSString *> *result = [NSMutableDictionary dictionaryWithCapacity:headers.size()];
|
|
29
|
+
for (const auto &header : headers) {
|
|
30
|
+
result[@(header.name.c_str())] = @(header.value.c_str());
|
|
31
|
+
}
|
|
32
|
+
return [result copy];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
#endif
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
#import "ENRMLinkPillAttachment.h"
|
|
3
|
+
#import "ENRMUIKit.h"
|
|
4
|
+
|
|
5
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
6
|
+
|
|
7
|
+
static NSString *const CodeBlockAttributeName = @"CodeBlock";
|
|
8
|
+
static NSString *const CodeBlockIndentAttributeName = @"CodeBlockIndent";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Returns YES when the last semantic block in the storage is a code block, ignoring any
|
|
12
|
+
* trailing newline spacers (e.g. codeBlockMarginBottom) that may follow it.
|
|
13
|
+
*
|
|
14
|
+
* Detection is based on the last non-newline character: if it sits inside a CodeBlock
|
|
15
|
+
* attribute run, the answer is YES regardless of what newlines come after.
|
|
16
|
+
*
|
|
17
|
+
* Use this in render-time cleanup paths (e.g. removeTrailingSpacing) that need to know
|
|
18
|
+
* "is the document ending with a code block?" before any trailing newlines have been trimmed.
|
|
19
|
+
* The stricter `isLastElementCodeBlock` would answer NO in that pre-trim state because
|
|
20
|
+
* the CodeBlock range hasn't yet been pushed to text.length.
|
|
21
|
+
*/
|
|
22
|
+
static inline BOOL isLastBlockACodeBlock(NSAttributedString *text)
|
|
23
|
+
{
|
|
24
|
+
if (text.length == 0)
|
|
25
|
+
return NO;
|
|
26
|
+
|
|
27
|
+
NSRange lastContent = [text.string rangeOfCharacterFromSet:[[NSCharacterSet newlineCharacterSet] invertedSet]
|
|
28
|
+
options:NSBackwardsSearch];
|
|
29
|
+
if (lastContent.location == NSNotFound)
|
|
30
|
+
return NO;
|
|
31
|
+
|
|
32
|
+
NSNumber *isCodeBlock = [text attribute:CodeBlockAttributeName atIndex:lastContent.location effectiveRange:nil];
|
|
33
|
+
return isCodeBlock.boolValue;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Stricter sibling of `isLastBlockACodeBlock`: requires both that the last non-newline
|
|
38
|
+
* character is inside a CodeBlock run AND that the CodeBlock range extends literally to
|
|
39
|
+
* text.length (i.e. no characters at all live after the code block).
|
|
40
|
+
*
|
|
41
|
+
* Used in the iOS measurement path (and the analogous drawing-compensation check) to
|
|
42
|
+
* decide whether to add `codeBlockPadding` to make up for iOS not measuring/drawing
|
|
43
|
+
* trailing newlines that carry custom minimum/maximum line heights.
|
|
44
|
+
*
|
|
45
|
+
* After `removeTrailingSpacing` runs, the bottom padding spacer is preserved together
|
|
46
|
+
* with a single trailing newline outside the code block range, so this returns NO and
|
|
47
|
+
* the compensation is skipped — the bottom padding spacer is no longer the trailing
|
|
48
|
+
* paragraph terminator, so iOS lays its line fragment out as part of usedRect normally.
|
|
49
|
+
* The check still exists as a safety net for unexpected storage shapes.
|
|
50
|
+
*/
|
|
51
|
+
static inline BOOL isLastElementCodeBlock(NSAttributedString *text)
|
|
52
|
+
{
|
|
53
|
+
if (text.length == 0)
|
|
54
|
+
return NO;
|
|
55
|
+
|
|
56
|
+
NSRange lastContent = [text.string rangeOfCharacterFromSet:[[NSCharacterSet newlineCharacterSet] invertedSet]
|
|
57
|
+
options:NSBackwardsSearch];
|
|
58
|
+
if (lastContent.location == NSNotFound)
|
|
59
|
+
return NO;
|
|
60
|
+
|
|
61
|
+
NSNumber *isCodeBlock = [text attribute:CodeBlockAttributeName atIndex:lastContent.location effectiveRange:nil];
|
|
62
|
+
if (!isCodeBlock.boolValue)
|
|
63
|
+
return NO;
|
|
64
|
+
|
|
65
|
+
NSRange codeBlockRange;
|
|
66
|
+
[text attribute:CodeBlockAttributeName atIndex:lastContent.location effectiveRange:&codeBlockRange];
|
|
67
|
+
return NSMaxRange(codeBlockRange) == text.length;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Checks if the last element in the attributed string is an image attachment.
|
|
72
|
+
* Used to compensate for iOS text attachment baseline spacing issues.
|
|
73
|
+
*/
|
|
74
|
+
static inline BOOL isLastElementImage(NSAttributedString *text)
|
|
75
|
+
{
|
|
76
|
+
if (text.length == 0)
|
|
77
|
+
return NO;
|
|
78
|
+
|
|
79
|
+
NSRange lastContent = [text.string rangeOfCharacterFromSet:[[NSCharacterSet newlineCharacterSet] invertedSet]
|
|
80
|
+
options:NSBackwardsSearch];
|
|
81
|
+
if (lastContent.location == NSNotFound)
|
|
82
|
+
return NO;
|
|
83
|
+
|
|
84
|
+
unichar lastChar = [text.string characterAtIndex:lastContent.location];
|
|
85
|
+
if (lastChar != 0xFFFC)
|
|
86
|
+
return NO;
|
|
87
|
+
|
|
88
|
+
id attachment = [text attribute:NSAttachmentAttributeName atIndex:lastContent.location effectiveRange:nil];
|
|
89
|
+
#if !TARGET_OS_OSX
|
|
90
|
+
// A link pill sits on the text baseline like a word; it needs no image compensation.
|
|
91
|
+
if ([attachment isKindOfClass:[ENRMLinkPillAttachment class]])
|
|
92
|
+
return NO;
|
|
93
|
+
#endif
|
|
94
|
+
return attachment != nil;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#import "ENRMLinkContextMenus.h"
|
|
4
|
+
#import <Foundation/Foundation.h>
|
|
5
|
+
|
|
6
|
+
#ifdef __cplusplus
|
|
7
|
+
#include <vector>
|
|
8
|
+
|
|
9
|
+
// The `linkContextMenuItems` prop: link long-press menu items by URL pattern.
|
|
10
|
+
|
|
11
|
+
template <typename T>
|
|
12
|
+
static bool ENRMLinkContextMenuItemsChanged(const std::vector<T> &oldMenus, const std::vector<T> &newMenus)
|
|
13
|
+
{
|
|
14
|
+
if (newMenus.size() != oldMenus.size()) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
for (size_t i = 0; i < newMenus.size(); i++) {
|
|
18
|
+
const auto &oldItems = oldMenus[i].items;
|
|
19
|
+
const auto &newItems = newMenus[i].items;
|
|
20
|
+
if (newMenus[i].pattern != oldMenus[i].pattern || newItems.size() != oldItems.size()) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
for (size_t j = 0; j < newItems.size(); j++) {
|
|
24
|
+
if (newItems[j].text != oldItems[j].text || newItems[j].icon != oldItems[j].icon ||
|
|
25
|
+
newItems[j].disabled != oldItems[j].disabled || newItems[j].destructive != oldItems[j].destructive) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
template <typename T>
|
|
34
|
+
static NSArray<ENRMLinkContextMenuEntry *> *_Nonnull ENRMLinkContextMenuEntriesFromProps(const std::vector<T> &menus)
|
|
35
|
+
{
|
|
36
|
+
NSMutableArray<ENRMLinkContextMenuEntry *> *entries = [NSMutableArray arrayWithCapacity:menus.size()];
|
|
37
|
+
for (const auto &menu : menus) {
|
|
38
|
+
NSMutableArray<ENRMLinkContextMenuItem *> *items = [NSMutableArray arrayWithCapacity:menu.items.size()];
|
|
39
|
+
for (const auto &source : menu.items) {
|
|
40
|
+
ENRMLinkContextMenuItem *item = [[ENRMLinkContextMenuItem alloc] init];
|
|
41
|
+
item.text = @(source.text.c_str());
|
|
42
|
+
item.icon = @(source.icon.c_str());
|
|
43
|
+
item.disabled = source.disabled;
|
|
44
|
+
item.destructive = source.destructive;
|
|
45
|
+
[items addObject:item];
|
|
46
|
+
}
|
|
47
|
+
ENRMLinkContextMenuEntry *entry = [[ENRMLinkContextMenuEntry alloc] init];
|
|
48
|
+
entry.pattern = @(menu.pattern.c_str());
|
|
49
|
+
entry.items = items;
|
|
50
|
+
[entries addObject:entry];
|
|
51
|
+
}
|
|
52
|
+
return entries;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
#endif
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#import "StyleConfig.h"
|
|
4
|
+
#import <Foundation/Foundation.h>
|
|
5
|
+
|
|
6
|
+
#ifdef __cplusplus
|
|
7
|
+
#import <React/RCTConversions.h>
|
|
8
|
+
#include <vector>
|
|
9
|
+
|
|
10
|
+
// The `linkPillContent` prop: per-link pill label and icon, keyed by exact URL.
|
|
11
|
+
|
|
12
|
+
template <typename T>
|
|
13
|
+
static bool ENRMLinkPillContentChanged(const std::vector<T> &oldContent, const std::vector<T> &newContent)
|
|
14
|
+
{
|
|
15
|
+
if (newContent.size() != oldContent.size()) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
for (size_t i = 0; i < newContent.size(); i++) {
|
|
19
|
+
if (newContent[i].url != oldContent[i].url || newContent[i].label != oldContent[i].label ||
|
|
20
|
+
newContent[i].iconUri != oldContent[i].iconUri || newContent[i].iconTintColor != oldContent[i].iconTintColor) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
template <typename T>
|
|
28
|
+
static NSDictionary<NSString *, LinkPillContent *> *_Nullable ENRMLinkPillContentFromProps(
|
|
29
|
+
const std::vector<T> &content)
|
|
30
|
+
{
|
|
31
|
+
if (content.empty()) {
|
|
32
|
+
return nil;
|
|
33
|
+
}
|
|
34
|
+
NSMutableDictionary<NSString *, LinkPillContent *> *result =
|
|
35
|
+
[NSMutableDictionary dictionaryWithCapacity:content.size()];
|
|
36
|
+
for (const auto &entry : content) {
|
|
37
|
+
LinkPillContent *value = [[LinkPillContent alloc] init];
|
|
38
|
+
value.label = @(entry.label.c_str());
|
|
39
|
+
value.iconUri = @(entry.iconUri.c_str());
|
|
40
|
+
value.iconTintColor = entry.iconTintColor ? RCTUIColorFromSharedColor(entry.iconTintColor) : nil;
|
|
41
|
+
result[@(entry.url.c_str())] = value;
|
|
42
|
+
}
|
|
43
|
+
return [result copy];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
#endif
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#import "ENRMUIKit.h"
|
|
4
|
+
|
|
5
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
6
|
+
|
|
7
|
+
#ifdef __cplusplus
|
|
8
|
+
extern "C" {
|
|
9
|
+
#endif
|
|
10
|
+
|
|
11
|
+
/// Returns the link URL at the tap location, or nil if no link was tapped.
|
|
12
|
+
NSString *_Nullable linkURLAtTapLocation(ENRMPlatformTextView *textView, ENRMTapRecognizer *recognizer);
|
|
13
|
+
|
|
14
|
+
/// Returns the original link URL at a point in text-view coordinates.
|
|
15
|
+
NSString *_Nullable linkURLAtPoint(ENRMPlatformTextView *textView, CGPoint point);
|
|
16
|
+
|
|
17
|
+
/// Returns the link URL at the given character range, or nil if none found.
|
|
18
|
+
NSString *_Nullable linkURLAtRange(ENRMPlatformTextView *textView, NSRange characterRange);
|
|
19
|
+
|
|
20
|
+
/// What the user sees the link at `index` as: its pill label, or its text. Nil when there is no link.
|
|
21
|
+
NSString *_Nullable linkTitleAtIndex(NSAttributedString *text, NSUInteger index);
|
|
22
|
+
|
|
23
|
+
/// Returns the tapped image as @{@"url": ..., @"altText": ...}, or nil if the
|
|
24
|
+
/// tap did not land on an image. A linked image resolves to its link (the
|
|
25
|
+
/// linkURL attribute wins), so this returns nil for it.
|
|
26
|
+
NSDictionary<NSString *, NSString *> *_Nullable imageAtTapLocation(ENRMPlatformTextView *textView,
|
|
27
|
+
ENRMTapRecognizer *recognizer);
|
|
28
|
+
|
|
29
|
+
/// Returns the tapped factoid's id, an empty string when the factoid has no id, or nil
|
|
30
|
+
/// when the tap did not land on a factoid.
|
|
31
|
+
NSString *_Nullable factoidIdAtTapLocation(ENRMPlatformTextView *textView, ENRMTapRecognizer *recognizer);
|
|
32
|
+
|
|
33
|
+
/// Returns @{@"id": ..., @"label": ...} for the mention under the tap, or nil.
|
|
34
|
+
NSDictionary<NSString *, NSString *> *_Nullable mentionAtTapLocation(ENRMPlatformTextView *textView,
|
|
35
|
+
ENRMTapRecognizer *recognizer);
|
|
36
|
+
|
|
37
|
+
/// Returns @{@"id": ..., @"label": ...} for the mention under a point in text-view coordinates, or nil.
|
|
38
|
+
NSDictionary<NSString *, NSString *> *_Nullable mentionAtPoint(ENRMPlatformTextView *textView, CGPoint point);
|
|
39
|
+
|
|
40
|
+
/// Returns the tapped code block as @{@"code": ..., @"language": ...}, or nil if
|
|
41
|
+
/// the tap did not land on a commonmark code block.
|
|
42
|
+
NSDictionary<NSString *, NSString *> *_Nullable codeBlockAtTapLocation(ENRMPlatformTextView *textView,
|
|
43
|
+
ENRMTapRecognizer *recognizer);
|
|
44
|
+
|
|
45
|
+
/// Returns YES if the point (in textView coordinates) is on a link or task list
|
|
46
|
+
/// checkbox. When `includeImages` is YES, images also count as interactive
|
|
47
|
+
/// (used to stop a parent press handler once `onImagePress` is enabled), and
|
|
48
|
+
/// likewise `includeCodeBlock` for `onCodeBlockPress`.
|
|
49
|
+
BOOL isPointOnInteractiveElement(ENRMPlatformTextView *textView, CGPoint point, BOOL includeImages,
|
|
50
|
+
BOOL includeCodeBlock);
|
|
51
|
+
|
|
52
|
+
#ifdef __cplusplus
|
|
53
|
+
}
|
|
54
|
+
#endif
|
|
55
|
+
|
|
56
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#import "LinkTapUtils.h"
|
|
2
|
+
#import "ENRMLinkPillAttachment.h"
|
|
3
|
+
#import "ENRMSpoilerTapUtils.h"
|
|
4
|
+
#import "ENRMTextHitTest.h"
|
|
5
|
+
#import "FactoidBackground.h"
|
|
6
|
+
#import "MentionBackground.h"
|
|
7
|
+
|
|
8
|
+
NSString *_Nullable linkURLAtTapLocation(ENRMPlatformTextView *textView, ENRMTapRecognizer *recognizer)
|
|
9
|
+
{
|
|
10
|
+
NSUInteger characterIndex = ENRMCharacterIndexForTap(textView, recognizer);
|
|
11
|
+
if (characterIndex == NSNotFound)
|
|
12
|
+
return nil;
|
|
13
|
+
|
|
14
|
+
NSAttributedString *attrText = ENRMGetAttributedText(textView);
|
|
15
|
+
return [attrText attribute:@"linkURL" atIndex:characterIndex effectiveRange:NULL];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
NSString *_Nullable linkURLAtPoint(ENRMPlatformTextView *textView, CGPoint point)
|
|
19
|
+
{
|
|
20
|
+
NSUInteger index = ENRMCharacterIndexAtPoint(textView, point);
|
|
21
|
+
if (index == NSNotFound)
|
|
22
|
+
return nil;
|
|
23
|
+
return [ENRMGetAttributedText(textView) attribute:@"linkURL" atIndex:index effectiveRange:NULL];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
NSString *_Nullable linkURLAtRange(ENRMPlatformTextView *textView, NSRange characterRange)
|
|
27
|
+
{
|
|
28
|
+
NSAttributedString *attrText = ENRMGetAttributedText(textView);
|
|
29
|
+
if (characterRange.location >= attrText.length) {
|
|
30
|
+
return nil;
|
|
31
|
+
}
|
|
32
|
+
return [attrText attribute:@"linkURL" atIndex:characterRange.location effectiveRange:NULL];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
NSString *_Nullable linkTitleAtIndex(NSAttributedString *text, NSUInteger index)
|
|
36
|
+
{
|
|
37
|
+
if (index >= text.length)
|
|
38
|
+
return nil;
|
|
39
|
+
#if !TARGET_OS_OSX
|
|
40
|
+
id attachment = [text attribute:NSAttachmentAttributeName atIndex:index effectiveRange:NULL];
|
|
41
|
+
if ([attachment isKindOfClass:ENRMLinkPillAttachment.class])
|
|
42
|
+
return ((ENRMLinkPillAttachment *)attachment).label;
|
|
43
|
+
#endif
|
|
44
|
+
NSRange range;
|
|
45
|
+
id url = [text attribute:@"linkURL" atIndex:index longestEffectiveRange:&range inRange:NSMakeRange(0, text.length)];
|
|
46
|
+
return url ? [text.string substringWithRange:range] : nil;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
NSDictionary<NSString *, NSString *> *_Nullable imageAtTapLocation(ENRMPlatformTextView *textView,
|
|
50
|
+
ENRMTapRecognizer *recognizer)
|
|
51
|
+
{
|
|
52
|
+
NSUInteger characterIndex = ENRMCharacterIndexForTap(textView, recognizer);
|
|
53
|
+
if (characterIndex == NSNotFound)
|
|
54
|
+
return nil;
|
|
55
|
+
|
|
56
|
+
NSAttributedString *attrText = ENRMGetAttributedText(textView);
|
|
57
|
+
if ([attrText attribute:@"linkURL" atIndex:characterIndex effectiveRange:NULL] != nil)
|
|
58
|
+
return nil;
|
|
59
|
+
|
|
60
|
+
NSString *url = [attrText attribute:@"imageURL" atIndex:characterIndex effectiveRange:NULL];
|
|
61
|
+
if (!url)
|
|
62
|
+
return nil;
|
|
63
|
+
|
|
64
|
+
NSString *altText = [attrText attribute:@"imageAltText" atIndex:characterIndex effectiveRange:NULL];
|
|
65
|
+
return @{@"url" : url, @"altText" : altText ?: @""};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static NSDictionary<NSString *, NSString *> *_Nullable mentionAtIndex(NSAttributedString *attrText, NSUInteger characterIndex)
|
|
69
|
+
{
|
|
70
|
+
if (characterIndex == NSNotFound || characterIndex >= attrText.length)
|
|
71
|
+
return nil;
|
|
72
|
+
if ([attrText attribute:MentionAttributeName atIndex:characterIndex effectiveRange:NULL] == nil)
|
|
73
|
+
return nil;
|
|
74
|
+
|
|
75
|
+
NSString *mentionId = [attrText attribute:MentionIdAttributeName atIndex:characterIndex effectiveRange:NULL] ?: @"";
|
|
76
|
+
NSString *label = [attrText attribute:MentionLabelAttributeName atIndex:characterIndex effectiveRange:NULL] ?: @"";
|
|
77
|
+
return @{@"id" : mentionId, @"label" : label};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
NSDictionary<NSString *, NSString *> *_Nullable mentionAtTapLocation(ENRMPlatformTextView *textView,
|
|
81
|
+
ENRMTapRecognizer *recognizer)
|
|
82
|
+
{
|
|
83
|
+
return mentionAtIndex(ENRMGetAttributedText(textView), ENRMCharacterIndexForTap(textView, recognizer));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
NSDictionary<NSString *, NSString *> *_Nullable mentionAtPoint(ENRMPlatformTextView *textView, CGPoint point)
|
|
87
|
+
{
|
|
88
|
+
return mentionAtIndex(ENRMGetAttributedText(textView), ENRMCharacterIndexAtPoint(textView, point));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
NSString *_Nullable factoidIdAtTapLocation(ENRMPlatformTextView *textView, ENRMTapRecognizer *recognizer)
|
|
92
|
+
{
|
|
93
|
+
NSUInteger characterIndex = ENRMCharacterIndexForTap(textView, recognizer);
|
|
94
|
+
if (characterIndex == NSNotFound)
|
|
95
|
+
return nil;
|
|
96
|
+
|
|
97
|
+
NSAttributedString *attrText = ENRMGetAttributedText(textView);
|
|
98
|
+
if (characterIndex >= attrText.length)
|
|
99
|
+
return nil;
|
|
100
|
+
if ([attrText attribute:FactoidAttributeName atIndex:characterIndex effectiveRange:NULL] == nil)
|
|
101
|
+
return nil;
|
|
102
|
+
|
|
103
|
+
NSString *factoidId = [attrText attribute:FactoidIdAttributeName atIndex:characterIndex effectiveRange:NULL];
|
|
104
|
+
return factoidId ?: @"";
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
NSDictionary<NSString *, NSString *> *_Nullable codeBlockAtTapLocation(ENRMPlatformTextView *textView,
|
|
108
|
+
ENRMTapRecognizer *recognizer)
|
|
109
|
+
{
|
|
110
|
+
NSUInteger characterIndex = ENRMCharacterIndexForTap(textView, recognizer);
|
|
111
|
+
if (characterIndex == NSNotFound)
|
|
112
|
+
return nil;
|
|
113
|
+
|
|
114
|
+
NSAttributedString *attrText = ENRMGetAttributedText(textView);
|
|
115
|
+
NSString *code = [attrText attribute:@"codeBlockText" atIndex:characterIndex effectiveRange:NULL];
|
|
116
|
+
if (!code)
|
|
117
|
+
return nil;
|
|
118
|
+
|
|
119
|
+
NSString *language = [attrText attribute:@"codeBlockLanguage" atIndex:characterIndex effectiveRange:NULL];
|
|
120
|
+
return @{@"code" : code, @"language" : language ?: @""};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
BOOL isPointOnInteractiveElement(ENRMPlatformTextView *textView, CGPoint point, BOOL includeImages,
|
|
124
|
+
BOOL includeCodeBlock)
|
|
125
|
+
{
|
|
126
|
+
NSUInteger charIndex = ENRMCharacterIndexAtPoint(textView, point);
|
|
127
|
+
if (charIndex == NSNotFound)
|
|
128
|
+
return NO;
|
|
129
|
+
|
|
130
|
+
NSDictionary *attrs = [ENRMGetAttributedText(textView) attributesAtIndex:charIndex effectiveRange:NULL];
|
|
131
|
+
if (attrs[@"linkURL"] != nil || [attrs[@"TaskItem"] boolValue] || attrs[SpoilerAttributeName] != nil ||
|
|
132
|
+
attrs[FactoidAttributeName] != nil || attrs[MentionAttributeName] != nil)
|
|
133
|
+
return YES;
|
|
134
|
+
|
|
135
|
+
if (includeImages && attrs[@"imageURL"] != nil)
|
|
136
|
+
return YES;
|
|
137
|
+
|
|
138
|
+
return includeCodeBlock && attrs[@"codeBlockText"] != nil;
|
|
139
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#import "ENRMUIKit.h"
|
|
2
|
+
#import <Foundation/Foundation.h>
|
|
3
|
+
|
|
4
|
+
@class StyleConfig;
|
|
5
|
+
|
|
6
|
+
@interface ListMarkerDrawer : NSObject
|
|
7
|
+
|
|
8
|
+
- (instancetype)initWithConfig:(StyleConfig *)config;
|
|
9
|
+
|
|
10
|
+
- (void)drawMarkersForGlyphRange:(NSRange)glyphsToShow
|
|
11
|
+
layoutManager:(NSLayoutManager *)layoutManager
|
|
12
|
+
textContainer:(NSTextContainer *)textContainer
|
|
13
|
+
atPoint:(CGPoint)origin;
|
|
14
|
+
|
|
15
|
+
@end
|