@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,143 @@
|
|
|
1
|
+
#import "EditMenuUtils.h"
|
|
2
|
+
#import "PasteboardUtils.h"
|
|
3
|
+
#import "StyleConfig.h"
|
|
4
|
+
#include <TargetConditionals.h>
|
|
5
|
+
|
|
6
|
+
#if !TARGET_OS_OSX
|
|
7
|
+
|
|
8
|
+
static NSString *const kMenuIdentifierStandardEdit = @"com.apple.menu.standard-edit";
|
|
9
|
+
static NSString *const kActionIdentifierCopy = @"com.swmansion.enriched.tiptap.copy";
|
|
10
|
+
static NSString *const kActionIdentifierCopyTiptap = @"com.swmansion.enriched.tiptap.copyTiptap";
|
|
11
|
+
static NSString *const kActionIdentifierCopyImageURL = @"com.swmansion.enriched.tiptap.copyImageURL";
|
|
12
|
+
|
|
13
|
+
static UIAction *createCopyAction(NSAttributedString *selectedText, NSString *tiptap, StyleConfig *styleConfig,
|
|
14
|
+
NSString *copyLabel)
|
|
15
|
+
{
|
|
16
|
+
return [UIAction actionWithTitle:copyLabel
|
|
17
|
+
image:[RCTUIImage systemImageNamed:@"doc.on.doc"]
|
|
18
|
+
identifier:kActionIdentifierCopy
|
|
19
|
+
handler:^(__kindof UIAction *action) {
|
|
20
|
+
copyAttributedStringToPasteboard(selectedText, tiptap, styleConfig);
|
|
21
|
+
}];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
static UIAction *_Nullable createCopyTiptapAction(NSString *tiptap, NSString *copyAsTiptapLabel)
|
|
25
|
+
{
|
|
26
|
+
if (tiptap.length == 0)
|
|
27
|
+
return nil;
|
|
28
|
+
|
|
29
|
+
return [UIAction actionWithTitle:copyAsTiptapLabel
|
|
30
|
+
image:[RCTUIImage systemImageNamed:@"doc.text"]
|
|
31
|
+
identifier:kActionIdentifierCopyTiptap
|
|
32
|
+
handler:^(__kindof UIAction *action) { copyStringToPasteboard(tiptap); }];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static UIAction *_Nullable createCopyImageURLAction(NSArray<NSString *> *imageURLs,
|
|
36
|
+
ENRMSelectionMenuConfig selectionMenuConfig)
|
|
37
|
+
{
|
|
38
|
+
if (imageURLs.count == 0)
|
|
39
|
+
return nil;
|
|
40
|
+
|
|
41
|
+
NSString *urlsToCopy = [imageURLs componentsJoinedByString:@"\n"];
|
|
42
|
+
NSString *title = ENRMResolveImageURLsTitle(selectionMenuConfig, imageURLs.count);
|
|
43
|
+
|
|
44
|
+
return [UIAction actionWithTitle:title
|
|
45
|
+
image:[RCTUIImage systemImageNamed:@"link"]
|
|
46
|
+
identifier:kActionIdentifierCopyImageURL
|
|
47
|
+
handler:^(__kindof UIAction *action) { copyStringToPasteboard(urlsToCopy); }];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/// Rebuilds the standard-edit menu with the system Copy swapped for the enhanced
|
|
51
|
+
/// copy action. All other system items are kept — dropping them would remove
|
|
52
|
+
/// Select All, which on iOS 16+ is the only way to start a selection from the
|
|
53
|
+
/// long-press menu of a non-editable text view.
|
|
54
|
+
static UIMenu *createEnhancedStandardEditMenu(UIMenu *originalMenu, UIAction *copyAction)
|
|
55
|
+
{
|
|
56
|
+
NSMutableArray<UIMenuElement *> *children = [NSMutableArray arrayWithCapacity:originalMenu.children.count];
|
|
57
|
+
BOOL replacedCopy = NO;
|
|
58
|
+
|
|
59
|
+
for (UIMenuElement *element in originalMenu.children) {
|
|
60
|
+
if (!replacedCopy && [element isKindOfClass:[UICommand class]] &&
|
|
61
|
+
((UICommand *)element).action == @selector(copy:)) {
|
|
62
|
+
[children addObject:copyAction];
|
|
63
|
+
replacedCopy = YES;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
[children addObject:element];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (!replacedCopy) {
|
|
70
|
+
[children insertObject:copyAction atIndex:0];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return [UIMenu menuWithTitle:originalMenu.title
|
|
74
|
+
image:originalMenu.image
|
|
75
|
+
identifier:originalMenu.identifier
|
|
76
|
+
options:originalMenu.options
|
|
77
|
+
children:children];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
static void addOptionalAction(NSMutableArray<UIMenuElement *> *array, UIAction *_Nullable action)
|
|
81
|
+
{
|
|
82
|
+
if (action) {
|
|
83
|
+
[array addObject:action];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
static void insertOptionalAction(NSMutableArray<UIMenuElement *> *array, UIAction *_Nullable action, NSUInteger index)
|
|
88
|
+
{
|
|
89
|
+
if (action) {
|
|
90
|
+
[array insertObject:action atIndex:index];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// TODO: Remove API_AVAILABLE(ios(16.0)) guard when the minimum iOS deployment target in RN is bumped to 16.
|
|
95
|
+
UIMenu *buildEditMenuForSelection(NSAttributedString *attributedText, NSRange range, NSString *_Nullable cachedTiptap,
|
|
96
|
+
StyleConfig *styleConfig, NSArray<UIMenuElement *> *suggestedActions,
|
|
97
|
+
NSArray<UIAction *> *_Nullable customActions,
|
|
98
|
+
ENRMSelectionMenuConfig selectionMenuConfig) API_AVAILABLE(ios(16.0))
|
|
99
|
+
{
|
|
100
|
+
NSAttributedString *selectedText = [attributedText attributedSubstringFromRange:range];
|
|
101
|
+
NSString *tiptap = tiptapForRange(attributedText, range, cachedTiptap);
|
|
102
|
+
NSArray<NSString *> *imageURLs = imageURLsInRange(attributedText, range);
|
|
103
|
+
|
|
104
|
+
UIAction *copyAction = createCopyAction(selectedText, tiptap, styleConfig, selectionMenuConfig.copyLabel);
|
|
105
|
+
UIAction *copyTiptapAction = selectionMenuConfig.copyAsTiptap
|
|
106
|
+
? createCopyTiptapAction(tiptap, selectionMenuConfig.copyAsTiptapLabel)
|
|
107
|
+
: nil;
|
|
108
|
+
UIAction *copyImageURLAction =
|
|
109
|
+
selectionMenuConfig.copyImageURL ? createCopyImageURLAction(imageURLs, selectionMenuConfig) : nil;
|
|
110
|
+
|
|
111
|
+
NSMutableArray<UIMenuElement *> *result = [NSMutableArray array];
|
|
112
|
+
BOOL foundStandardEditMenu = NO;
|
|
113
|
+
|
|
114
|
+
for (UIMenuElement *element in suggestedActions) {
|
|
115
|
+
if ([element isKindOfClass:[UIMenu class]]) {
|
|
116
|
+
UIMenu *menu = (UIMenu *)element;
|
|
117
|
+
|
|
118
|
+
if ([menu.identifier isEqualToString:kMenuIdentifierStandardEdit]) {
|
|
119
|
+
// Replace standard Copy with our enhanced version
|
|
120
|
+
[result addObject:createEnhancedStandardEditMenu(menu, copyAction)];
|
|
121
|
+
addOptionalAction(result, copyTiptapAction);
|
|
122
|
+
addOptionalAction(result, copyImageURLAction);
|
|
123
|
+
foundStandardEditMenu = YES;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
[result addObject:element];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (!foundStandardEditMenu) {
|
|
131
|
+
[result insertObject:copyAction atIndex:0];
|
|
132
|
+
insertOptionalAction(result, copyTiptapAction, 1);
|
|
133
|
+
addOptionalAction(result, copyImageURLAction);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (customActions.count > 0) {
|
|
137
|
+
return [UIMenu menuWithChildren:[customActions arrayByAddingObjectsFromArray:result]];
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return [UIMenu menuWithChildren:result];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
#endif
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
#import "ENRMUIKit.h"
|
|
3
|
+
|
|
4
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
5
|
+
|
|
6
|
+
extern NSString *const FactoidAttributeName;
|
|
7
|
+
extern NSString *const FactoidIdAttributeName;
|
|
8
|
+
extern NSString *const FactoidBackgroundColorAttributeName;
|
|
9
|
+
extern NSString *const FactoidBorderColorAttributeName;
|
|
10
|
+
|
|
11
|
+
@interface FactoidBackground : NSObject
|
|
12
|
+
|
|
13
|
+
- (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
|
|
14
|
+
layoutManager:(NSLayoutManager *)layoutManager
|
|
15
|
+
textContainer:(NSTextContainer *)textContainer
|
|
16
|
+
atPoint:(CGPoint)origin;
|
|
17
|
+
|
|
18
|
+
@end
|
|
19
|
+
|
|
20
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#import "FactoidBackground.h"
|
|
2
|
+
|
|
3
|
+
NSString *const FactoidAttributeName = @"Factoid";
|
|
4
|
+
NSString *const FactoidIdAttributeName = @"factoidId";
|
|
5
|
+
NSString *const FactoidBackgroundColorAttributeName = @"FactoidBackgroundColor";
|
|
6
|
+
NSString *const FactoidBorderColorAttributeName = @"FactoidBorderColor";
|
|
7
|
+
|
|
8
|
+
static const CGFloat kFactoidCornerRadius = 4.0;
|
|
9
|
+
static const CGFloat kFactoidBorderWidth = 1.0;
|
|
10
|
+
|
|
11
|
+
@implementation FactoidBackground
|
|
12
|
+
|
|
13
|
+
- (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
|
|
14
|
+
layoutManager:(NSLayoutManager *)layoutManager
|
|
15
|
+
textContainer:(NSTextContainer *)textContainer
|
|
16
|
+
atPoint:(CGPoint)origin
|
|
17
|
+
{
|
|
18
|
+
NSTextStorage *textStorage = layoutManager.textStorage;
|
|
19
|
+
if (!textStorage || textStorage.length == 0)
|
|
20
|
+
return;
|
|
21
|
+
|
|
22
|
+
NSRange charRange = [layoutManager characterRangeForGlyphRange:glyphsToShow actualGlyphRange:NULL];
|
|
23
|
+
if (charRange.location == NSNotFound || charRange.length == 0)
|
|
24
|
+
return;
|
|
25
|
+
|
|
26
|
+
[textStorage enumerateAttribute:FactoidAttributeName
|
|
27
|
+
inRange:NSMakeRange(0, textStorage.length)
|
|
28
|
+
options:0
|
|
29
|
+
usingBlock:^(id value, NSRange range, BOOL *stop) {
|
|
30
|
+
if (!value || range.length == 0)
|
|
31
|
+
return;
|
|
32
|
+
if (NSIntersectionRange(range, charRange).length == 0)
|
|
33
|
+
return;
|
|
34
|
+
|
|
35
|
+
RCTUIColor *backgroundColor =
|
|
36
|
+
[textStorage attribute:FactoidBackgroundColorAttributeName atIndex:range.location effectiveRange:NULL];
|
|
37
|
+
RCTUIColor *borderColor =
|
|
38
|
+
[textStorage attribute:FactoidBorderColorAttributeName atIndex:range.location effectiveRange:NULL];
|
|
39
|
+
if (!backgroundColor && !borderColor)
|
|
40
|
+
return;
|
|
41
|
+
|
|
42
|
+
[self drawFactoidForRange:range
|
|
43
|
+
layoutManager:layoutManager
|
|
44
|
+
textContainer:textContainer
|
|
45
|
+
atPoint:origin
|
|
46
|
+
backgroundColor:backgroundColor
|
|
47
|
+
borderColor:borderColor];
|
|
48
|
+
}];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
- (void)drawFactoidForRange:(NSRange)range
|
|
52
|
+
layoutManager:(NSLayoutManager *)layoutManager
|
|
53
|
+
textContainer:(NSTextContainer *)textContainer
|
|
54
|
+
atPoint:(CGPoint)origin
|
|
55
|
+
backgroundColor:(RCTUIColor *)backgroundColor
|
|
56
|
+
borderColor:(RCTUIColor *)borderColor
|
|
57
|
+
{
|
|
58
|
+
NSRange glyphRange = [layoutManager glyphRangeForCharacterRange:range actualCharacterRange:NULL];
|
|
59
|
+
if (glyphRange.location == NSNotFound || glyphRange.length == 0)
|
|
60
|
+
return;
|
|
61
|
+
|
|
62
|
+
[layoutManager
|
|
63
|
+
enumerateLineFragmentsForGlyphRange:glyphRange
|
|
64
|
+
usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer *tc, NSRange lineRange,
|
|
65
|
+
BOOL *stop) {
|
|
66
|
+
(void)usedRect;
|
|
67
|
+
(void)tc;
|
|
68
|
+
(void)stop;
|
|
69
|
+
NSRange intersect = NSIntersectionRange(lineRange, glyphRange);
|
|
70
|
+
if (intersect.length == 0)
|
|
71
|
+
return;
|
|
72
|
+
|
|
73
|
+
BOOL isFirst = (intersect.location == glyphRange.location);
|
|
74
|
+
BOOL isLast = (NSMaxRange(intersect) == NSMaxRange(glyphRange));
|
|
75
|
+
CGRect textRect = [layoutManager boundingRectForGlyphRange:intersect inTextContainer:textContainer];
|
|
76
|
+
// Full line height, but only as wide as the glyphs. A wrapped factoid stops at
|
|
77
|
+
// the last glyph instead of running out to the line edge.
|
|
78
|
+
CGRect finalRect = CGRectMake(textRect.origin.x + origin.x, rect.origin.y + origin.y,
|
|
79
|
+
textRect.size.width, rect.size.height);
|
|
80
|
+
[self drawBackgroundAndBorders:finalRect
|
|
81
|
+
backgroundColor:backgroundColor
|
|
82
|
+
borderColor:borderColor
|
|
83
|
+
isFirst:isFirst
|
|
84
|
+
isLast:isLast];
|
|
85
|
+
}];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
- (void)drawBackgroundAndBorders:(CGRect)rect
|
|
89
|
+
backgroundColor:(RCTUIColor *)backgroundColor
|
|
90
|
+
borderColor:(RCTUIColor *)borderColor
|
|
91
|
+
isFirst:(BOOL)isFirst
|
|
92
|
+
isLast:(BOOL)isLast
|
|
93
|
+
{
|
|
94
|
+
UIBezierPath *path = [self pathForRect:rect isFirst:isFirst isLast:isLast];
|
|
95
|
+
if (backgroundColor) {
|
|
96
|
+
[backgroundColor setFill];
|
|
97
|
+
[path fill];
|
|
98
|
+
}
|
|
99
|
+
if (!borderColor)
|
|
100
|
+
return;
|
|
101
|
+
|
|
102
|
+
[borderColor setStroke];
|
|
103
|
+
UIBezierPath *strokePath = (isFirst && isLast) ? path : [self openBorderPathForRect:rect isFirst:isFirst isLast:isLast];
|
|
104
|
+
strokePath.lineWidth = kFactoidBorderWidth;
|
|
105
|
+
BezierPathSetRoundStyle(strokePath);
|
|
106
|
+
[strokePath stroke];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
- (UIBezierPath *)pathForRect:(CGRect)rect isFirst:(BOOL)isFirst isLast:(BOOL)isLast
|
|
110
|
+
{
|
|
111
|
+
#if !TARGET_OS_OSX
|
|
112
|
+
UIRectCorner corners = 0;
|
|
113
|
+
if (isFirst)
|
|
114
|
+
corners |= (UIRectCornerTopLeft | UIRectCornerBottomLeft);
|
|
115
|
+
if (isLast)
|
|
116
|
+
corners |= (UIRectCornerTopRight | UIRectCornerBottomRight);
|
|
117
|
+
|
|
118
|
+
return [UIBezierPath bezierPathWithRoundedRect:rect
|
|
119
|
+
byRoundingCorners:corners
|
|
120
|
+
cornerRadii:CGSizeMake(kFactoidCornerRadius, kFactoidCornerRadius)];
|
|
121
|
+
#else
|
|
122
|
+
CGFloat cornerRadius = (isFirst || isLast) ? kFactoidCornerRadius : 0;
|
|
123
|
+
return UIBezierPathWithRoundedRect(rect, cornerRadius);
|
|
124
|
+
#endif
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
- (UIBezierPath *)openBorderPathForRect:(CGRect)rect isFirst:(BOOL)isFirst isLast:(BOOL)isLast
|
|
128
|
+
{
|
|
129
|
+
UIBezierPath *path = [UIBezierPath bezierPath];
|
|
130
|
+
CGFloat r = kFactoidCornerRadius;
|
|
131
|
+
CGFloat inset = kFactoidBorderWidth / 2.0;
|
|
132
|
+
CGRect insetRect = CGRectInset(rect, inset, inset);
|
|
133
|
+
|
|
134
|
+
if (isFirst) {
|
|
135
|
+
[path moveToPoint:CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y)];
|
|
136
|
+
BezierPathAddLine(path, CGPointMake(insetRect.origin.x + r, insetRect.origin.y));
|
|
137
|
+
BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x, insetRect.origin.y + r),
|
|
138
|
+
CGPointMake(insetRect.origin.x, insetRect.origin.y));
|
|
139
|
+
BezierPathAddLine(path, CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect) - r));
|
|
140
|
+
BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x + r, CGRectGetMaxY(insetRect)),
|
|
141
|
+
CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect)));
|
|
142
|
+
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
|
|
143
|
+
} else if (isLast) {
|
|
144
|
+
[path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
|
|
145
|
+
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect) - r, insetRect.origin.y));
|
|
146
|
+
BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y + r),
|
|
147
|
+
CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y));
|
|
148
|
+
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect) - r));
|
|
149
|
+
BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect) - r, CGRectGetMaxY(insetRect)),
|
|
150
|
+
CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect)));
|
|
151
|
+
BezierPathAddLine(path, CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect)));
|
|
152
|
+
} else {
|
|
153
|
+
[path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
|
|
154
|
+
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y));
|
|
155
|
+
[path moveToPoint:CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect))];
|
|
156
|
+
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
|
|
157
|
+
}
|
|
158
|
+
return path;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
@end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#import "FontScaleObserver.h"
|
|
2
|
+
#import <React/RCTUtils.h>
|
|
3
|
+
#include <TargetConditionals.h>
|
|
4
|
+
|
|
5
|
+
@implementation FontScaleObserver {
|
|
6
|
+
CGFloat _currentFontScale;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
- (instancetype)init
|
|
10
|
+
{
|
|
11
|
+
if (self = [super init]) {
|
|
12
|
+
_allowFontScaling = YES;
|
|
13
|
+
_currentFontScale = RCTFontSizeMultiplier();
|
|
14
|
+
|
|
15
|
+
#if !TARGET_OS_OSX
|
|
16
|
+
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
17
|
+
selector:@selector(contentSizeCategoryDidChange:)
|
|
18
|
+
name:UIContentSizeCategoryDidChangeNotification
|
|
19
|
+
object:nil];
|
|
20
|
+
#endif
|
|
21
|
+
// TODO: Observe macOS system font size changes. UIContentSizeCategoryDidChangeNotification
|
|
22
|
+
// is iOS-only; macOS has no direct equivalent. Possible approaches: KVO on
|
|
23
|
+
// NSApplication.effectiveAppearance or polling NSFont.systemFontSize.
|
|
24
|
+
}
|
|
25
|
+
return self;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
- (void)dealloc
|
|
29
|
+
{
|
|
30
|
+
#if !TARGET_OS_OSX
|
|
31
|
+
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIContentSizeCategoryDidChangeNotification object:nil];
|
|
32
|
+
#endif
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
- (CGFloat)effectiveFontScale
|
|
36
|
+
{
|
|
37
|
+
return _allowFontScaling ? _currentFontScale : 1.0;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
- (void)contentSizeCategoryDidChange:(NSNotification *)notification
|
|
41
|
+
{
|
|
42
|
+
if (!_allowFontScaling) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
CGFloat newFontScale = RCTFontSizeMultiplier();
|
|
47
|
+
if (_currentFontScale != newFontScale) {
|
|
48
|
+
_currentFontScale = newFontScale;
|
|
49
|
+
if (self.onChange) {
|
|
50
|
+
self.onChange();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#import "ENRMUIKit.h"
|
|
2
|
+
#import <Foundation/Foundation.h>
|
|
3
|
+
|
|
4
|
+
@class BlockStyle;
|
|
5
|
+
@class RenderContext;
|
|
6
|
+
|
|
7
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
8
|
+
|
|
9
|
+
#ifdef __cplusplus
|
|
10
|
+
extern "C" {
|
|
11
|
+
#endif
|
|
12
|
+
|
|
13
|
+
/** Returns a cached UIFont from BlockStyle properties via RenderContext. */
|
|
14
|
+
extern UIFont *cachedFontFromBlockStyle(BlockStyle *blockStyle, RenderContext *context);
|
|
15
|
+
|
|
16
|
+
/** Returns the font scale multiplier, capped by maxFontSizeMultiplier.
|
|
17
|
+
* Uses React Native's RCTFontSizeMultiplier() internally.
|
|
18
|
+
* @param maxFontSizeMultiplier Values >= 1.0 cap the result, < 1.0 means no cap. */
|
|
19
|
+
extern CGFloat RCTFontSizeMultiplierWithMax(CGFloat maxFontSizeMultiplier);
|
|
20
|
+
|
|
21
|
+
/** Converts a CSS-style font weight string to a UIFontWeight constant.
|
|
22
|
+
* Mirrors React Native's RCTFont table: "100"/"ultralight" through
|
|
23
|
+
* "900"/"black", plus the "normal"/"regular"/"bold"/etc. aliases.
|
|
24
|
+
* Returns UIFontWeightRegular for unrecognised or nil input. */
|
|
25
|
+
extern UIFontWeight ENRMFontWeightFromString(NSString *_Nullable weightString);
|
|
26
|
+
|
|
27
|
+
#ifdef __cplusplus
|
|
28
|
+
}
|
|
29
|
+
#endif
|
|
30
|
+
|
|
31
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#import "FontUtils.h"
|
|
2
|
+
#import "RenderContext.h"
|
|
3
|
+
#import <React/RCTUtils.h>
|
|
4
|
+
|
|
5
|
+
UIFont *cachedFontFromBlockStyle(BlockStyle *blockStyle, RenderContext *context)
|
|
6
|
+
{
|
|
7
|
+
if (!blockStyle) {
|
|
8
|
+
return nil;
|
|
9
|
+
}
|
|
10
|
+
if (blockStyle.cachedFont) {
|
|
11
|
+
return blockStyle.cachedFont;
|
|
12
|
+
}
|
|
13
|
+
return [context cachedFontForSize:blockStyle.fontSize family:blockStyle.fontFamily weight:blockStyle.fontWeight];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
CGFloat RCTFontSizeMultiplierWithMax(CGFloat maxFontSizeMultiplier)
|
|
17
|
+
{
|
|
18
|
+
CGFloat multiplier = RCTFontSizeMultiplier();
|
|
19
|
+
|
|
20
|
+
// Apply maxFontSizeMultiplier cap if >= 1.0
|
|
21
|
+
// Values < 1.0 (including 0 and NaN) mean no cap is applied
|
|
22
|
+
if (!isnan(maxFontSizeMultiplier) && maxFontSizeMultiplier >= 1.0) {
|
|
23
|
+
return fmin(maxFontSizeMultiplier, multiplier);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return multiplier;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
UIFontWeight ENRMFontWeightFromString(NSString *weightString)
|
|
30
|
+
{
|
|
31
|
+
if (weightString.length == 0) {
|
|
32
|
+
return UIFontWeightRegular;
|
|
33
|
+
}
|
|
34
|
+
if ([weightString isEqualToString:@"ultralight"] || [weightString isEqualToString:@"100"]) {
|
|
35
|
+
return UIFontWeightUltraLight;
|
|
36
|
+
}
|
|
37
|
+
if ([weightString isEqualToString:@"thin"] || [weightString isEqualToString:@"200"]) {
|
|
38
|
+
return UIFontWeightThin;
|
|
39
|
+
}
|
|
40
|
+
if ([weightString isEqualToString:@"light"] || [weightString isEqualToString:@"300"]) {
|
|
41
|
+
return UIFontWeightLight;
|
|
42
|
+
}
|
|
43
|
+
if ([weightString isEqualToString:@"normal"] || [weightString isEqualToString:@"regular"] ||
|
|
44
|
+
[weightString isEqualToString:@"400"]) {
|
|
45
|
+
return UIFontWeightRegular;
|
|
46
|
+
}
|
|
47
|
+
if ([weightString isEqualToString:@"medium"] || [weightString isEqualToString:@"500"]) {
|
|
48
|
+
return UIFontWeightMedium;
|
|
49
|
+
}
|
|
50
|
+
if ([weightString isEqualToString:@"semibold"] || [weightString isEqualToString:@"600"]) {
|
|
51
|
+
return UIFontWeightSemibold;
|
|
52
|
+
}
|
|
53
|
+
if ([weightString isEqualToString:@"bold"] || [weightString isEqualToString:@"700"]) {
|
|
54
|
+
return UIFontWeightBold;
|
|
55
|
+
}
|
|
56
|
+
if ([weightString isEqualToString:@"heavy"] || [weightString isEqualToString:@"800"]) {
|
|
57
|
+
return UIFontWeightHeavy;
|
|
58
|
+
}
|
|
59
|
+
if ([weightString isEqualToString:@"black"] || [weightString isEqualToString:@"900"]) {
|
|
60
|
+
return UIFontWeightBlack;
|
|
61
|
+
}
|
|
62
|
+
return UIFontWeightRegular;
|
|
63
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
#import "ENRMUIKit.h"
|
|
3
|
+
#import <Foundation/Foundation.h>
|
|
4
|
+
|
|
5
|
+
@class StyleConfig;
|
|
6
|
+
|
|
7
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
8
|
+
|
|
9
|
+
#ifdef __cplusplus
|
|
10
|
+
extern "C" {
|
|
11
|
+
#endif
|
|
12
|
+
|
|
13
|
+
/// Generates semantic HTML with inline styles (email-client compatible).
|
|
14
|
+
/// Document direction is read from the first paragraph style of `attributedString`.
|
|
15
|
+
NSString *_Nullable generateHTML(NSAttributedString *attributedString, StyleConfig *styleConfig);
|
|
16
|
+
|
|
17
|
+
/// Generates an HTML `<table>` with inline styles from rows of cell dictionaries.
|
|
18
|
+
/// Table direction is read from the first paragraph style of the first non-empty cell.
|
|
19
|
+
NSString *_Nullable generateTableHTML(NSArray<NSArray<NSDictionary *> *> *rows, StyleConfig *styleConfig);
|
|
20
|
+
|
|
21
|
+
#ifdef __cplusplus
|
|
22
|
+
}
|
|
23
|
+
#endif
|
|
24
|
+
|
|
25
|
+
NS_ASSUME_NONNULL_END
|