@mathers101/react-native-render-rich-text 0.1.9 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -20
- package/README.md +140 -140
- package/ReactNativeRenderRichText.podspec +23 -23
- package/android/build.gradle +86 -86
- package/android/consumer-rules.pro +3 -3
- package/android/src/main/AndroidManifest.xml +2 -2
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextLayoutManager.kt +24 -24
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextPackage.kt +13 -13
- package/android/src/main/java/com/renderrichtext/MeasurementStore.kt +644 -644
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibilityLabels.kt +17 -17
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibleTiptapTextView.kt +112 -112
- package/android/src/main/java/com/renderrichtext/accessibility/TiptapAccessibilityHelper.kt +576 -576
- package/android/src/main/java/com/renderrichtext/events/CodeBlockPressEvent.kt +24 -24
- package/android/src/main/java/com/renderrichtext/events/ContextMenuItemPressEvent.kt +28 -28
- package/android/src/main/java/com/renderrichtext/events/CopyPressEvent.kt +24 -24
- package/android/src/main/java/com/renderrichtext/events/ImagePressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/LatexErrorEvent.kt +29 -29
- package/android/src/main/java/com/renderrichtext/events/LinkLongPressEvent.kt +23 -23
- package/android/src/main/java/com/renderrichtext/events/LinkPressEvent.kt +23 -23
- package/android/src/main/java/com/renderrichtext/events/MentionLongPressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/MentionPressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/TaskListItemPressEvent.kt +26 -26
- package/android/src/main/java/com/renderrichtext/math/LatexErrorReporter.kt +9 -9
- package/android/src/main/java/com/renderrichtext/parser/Parser.kt +59 -59
- package/android/src/main/java/com/renderrichtext/parser/TextLinkMatching.kt +35 -35
- package/android/src/main/java/com/renderrichtext/renderer/BaselineShiftRenderer.kt +45 -45
- package/android/src/main/java/com/renderrichtext/renderer/BlankLineRenderer.kt +39 -39
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteRenderer.kt +243 -243
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteTextRenderer.kt +56 -56
- package/android/src/main/java/com/renderrichtext/renderer/CodeBlockRenderer.kt +135 -135
- package/android/src/main/java/com/renderrichtext/renderer/CodeRenderer.kt +37 -37
- package/android/src/main/java/com/renderrichtext/renderer/EmphasisRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/HeadingRenderer.kt +81 -81
- package/android/src/main/java/com/renderrichtext/renderer/HighlightRenderer.kt +26 -26
- package/android/src/main/java/com/renderrichtext/renderer/LineBreakRenderer.kt +17 -17
- package/android/src/main/java/com/renderrichtext/renderer/LinkRenderer.kt +90 -90
- package/android/src/main/java/com/renderrichtext/renderer/ListContextManager.kt +109 -109
- package/android/src/main/java/com/renderrichtext/renderer/ListItemRenderer.kt +211 -211
- package/android/src/main/java/com/renderrichtext/renderer/ListRenderer.kt +133 -133
- package/android/src/main/java/com/renderrichtext/renderer/MentionRenderer.kt +85 -85
- package/android/src/main/java/com/renderrichtext/renderer/ParagraphRenderer.kt +91 -91
- package/android/src/main/java/com/renderrichtext/renderer/Renderer.kt +148 -148
- package/android/src/main/java/com/renderrichtext/renderer/SoftBreakRenderer.kt +17 -17
- package/android/src/main/java/com/renderrichtext/renderer/SpanStyleCache.kt +143 -143
- package/android/src/main/java/com/renderrichtext/renderer/StrikethroughRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/StrongRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/TextRenderer.kt +31 -31
- package/android/src/main/java/com/renderrichtext/renderer/ThematicBreakRenderer.kt +46 -46
- package/android/src/main/java/com/renderrichtext/renderer/UnderlineRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/spans/BaseListSpan.kt +164 -164
- package/android/src/main/java/com/renderrichtext/spans/BaselineShiftSpan.kt +27 -27
- package/android/src/main/java/com/renderrichtext/spans/BlockquoteSpan.kt +302 -302
- package/android/src/main/java/com/renderrichtext/spans/CodeBackgroundSpan.kt +205 -205
- package/android/src/main/java/com/renderrichtext/spans/CodeBlockSpan.kt +216 -216
- package/android/src/main/java/com/renderrichtext/spans/CodeSpan.kt +32 -32
- package/android/src/main/java/com/renderrichtext/spans/EmphasisSpan.kt +42 -42
- package/android/src/main/java/com/renderrichtext/spans/FadeInSpan.kt +29 -29
- package/android/src/main/java/com/renderrichtext/spans/HeadingSpan.kt +38 -38
- package/android/src/main/java/com/renderrichtext/spans/HighlightSpan.kt +80 -80
- package/android/src/main/java/com/renderrichtext/spans/ImageSpan.kt +481 -481
- package/android/src/main/java/com/renderrichtext/spans/InlineBackgroundGeometry.kt +42 -42
- package/android/src/main/java/com/renderrichtext/spans/LineHeightSpan.kt +39 -39
- package/android/src/main/java/com/renderrichtext/spans/LinkPillIconCache.kt +154 -154
- package/android/src/main/java/com/renderrichtext/spans/LinkPillSpan.kt +381 -381
- package/android/src/main/java/com/renderrichtext/spans/LinkSpan.kt +68 -68
- package/android/src/main/java/com/renderrichtext/spans/ListItemSpacingSpan.kt +33 -33
- package/android/src/main/java/com/renderrichtext/spans/ListMarkerAnchorSpan.kt +38 -38
- package/android/src/main/java/com/renderrichtext/spans/MarginBottomSpan.kt +76 -76
- package/android/src/main/java/com/renderrichtext/spans/MentionChipSpan.kt +132 -132
- package/android/src/main/java/com/renderrichtext/spans/MentionSpan.kt +46 -46
- package/android/src/main/java/com/renderrichtext/spans/OrderedListSpan.kt +127 -127
- package/android/src/main/java/com/renderrichtext/spans/SpoilerSpan.kt +33 -33
- package/android/src/main/java/com/renderrichtext/spans/StrikethroughSpan.kt +12 -12
- package/android/src/main/java/com/renderrichtext/spans/StrongSpan.kt +39 -39
- package/android/src/main/java/com/renderrichtext/spans/TaskListSpan.kt +143 -143
- package/android/src/main/java/com/renderrichtext/spans/TextSpan.kt +26 -26
- package/android/src/main/java/com/renderrichtext/spans/ThematicBreakSpan.kt +69 -69
- package/android/src/main/java/com/renderrichtext/spans/UnorderedListSpan.kt +96 -96
- package/android/src/main/java/com/renderrichtext/spoiler/SpoilerStubs.kt +46 -46
- package/android/src/main/java/com/renderrichtext/styles/BaseBlockStyle.kt +11 -11
- package/android/src/main/java/com/renderrichtext/styles/BlockquoteStyle.kt +83 -83
- package/android/src/main/java/com/renderrichtext/styles/CodeBlockStyle.kt +80 -80
- package/android/src/main/java/com/renderrichtext/styles/CodeStyle.kt +26 -26
- package/android/src/main/java/com/renderrichtext/styles/EmphasisStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/FactoidStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/HeadingStyle.kt +33 -33
- package/android/src/main/java/com/renderrichtext/styles/HighlightStyle.kt +19 -19
- package/android/src/main/java/com/renderrichtext/styles/ImageStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/InlineImageStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/InlineMathStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/LinkPillContent.kt +36 -36
- package/android/src/main/java/com/renderrichtext/styles/LinkPillStyle.kt +44 -44
- package/android/src/main/java/com/renderrichtext/styles/LinkStyle.kt +23 -23
- package/android/src/main/java/com/renderrichtext/styles/LinkVariantEntry.kt +34 -34
- package/android/src/main/java/com/renderrichtext/styles/ListStyle.kt +65 -65
- package/android/src/main/java/com/renderrichtext/styles/MathStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/MentionStyle.kt +19 -19
- package/android/src/main/java/com/renderrichtext/styles/ParagraphStyle.kt +33 -33
- package/android/src/main/java/com/renderrichtext/styles/SpoilerStyle.kt +27 -27
- package/android/src/main/java/com/renderrichtext/styles/StrikethroughStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/StrongStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/StyleConfig.kt +411 -411
- package/android/src/main/java/com/renderrichtext/styles/StyleParser.kt +92 -92
- package/android/src/main/java/com/renderrichtext/styles/SubscriptStyle.kt +16 -16
- package/android/src/main/java/com/renderrichtext/styles/SuperscriptStyle.kt +16 -16
- package/android/src/main/java/com/renderrichtext/styles/TableStyle.kt +75 -75
- package/android/src/main/java/com/renderrichtext/styles/TaskListStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/TextAlignment.kt +32 -32
- package/android/src/main/java/com/renderrichtext/styles/ThematicBreakStyle.kt +23 -23
- package/android/src/main/java/com/renderrichtext/styles/UnderlineStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/VideoStyle.kt +31 -31
- package/android/src/main/java/com/renderrichtext/utils/common/BorderStyleUtils.kt +86 -86
- package/android/src/main/java/com/renderrichtext/utils/common/BreakStrategyUtils.kt +32 -32
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockHighlighter.kt +36 -36
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockNode.kt +42 -42
- package/android/src/main/java/com/renderrichtext/utils/common/EllipsizeUtils.kt +27 -27
- package/android/src/main/java/com/renderrichtext/utils/common/EnrichedTiptapAncestorUtils.kt +10 -10
- package/android/src/main/java/com/renderrichtext/utils/common/FeatureFlags.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRecognitionProps.kt +31 -31
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRegexConfig.kt +56 -56
- package/android/src/main/java/com/renderrichtext/utils/common/MotionPreferences.kt +18 -18
- package/android/src/main/java/com/renderrichtext/utils/common/ReadableMapExtensions.kt +28 -28
- package/android/src/main/java/com/renderrichtext/utils/common/layout/RTLUtils.kt +6 -6
- package/android/src/main/java/com/renderrichtext/utils/common/serialization/TiptapASTSerializer.kt +368 -368
- package/android/src/main/java/com/renderrichtext/utils/text/ImageCache.kt +88 -88
- package/android/src/main/java/com/renderrichtext/utils/text/ImageDownloader.kt +203 -203
- package/android/src/main/java/com/renderrichtext/utils/text/LocalImageLoader.kt +167 -167
- package/android/src/main/java/com/renderrichtext/utils/text/TailFadeInAnimator.kt +84 -84
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/HTMLGenerator.kt +1105 -1105
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/TiptapExtractor.kt +423 -423
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/ParagraphUtils.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/SpannableExtensions.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/TextPaintExtensions.kt +76 -76
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/CheckboxTouchHelper.kt +61 -61
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/TaskListTapUtils.kt +286 -286
- package/android/src/main/java/com/renderrichtext/utils/text/span/ApplyLineHeight.kt +39 -39
- package/android/src/main/java/com/renderrichtext/utils/text/span/BlockSpacing.kt +142 -142
- package/android/src/main/java/com/renderrichtext/utils/text/span/SpanFlags.kt +43 -43
- package/android/src/main/java/com/renderrichtext/utils/text/span/WidthAwareSpans.kt +30 -30
- package/android/src/main/java/com/renderrichtext/utils/text/view/CodeBlockPressHost.kt +15 -15
- package/android/src/main/java/com/renderrichtext/utils/text/view/ImagePressHost.kt +19 -19
- package/android/src/main/java/com/renderrichtext/utils/text/view/SelectionActionMode.kt +235 -235
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextSelectionColors.kt +48 -48
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextViewSetup.kt +119 -119
- package/android/src/main/java/com/renderrichtext/views/ContextMenuPopup.kt +217 -217
- package/android/src/main/java/com/renderrichtext/views/CopyGlyph.kt +101 -101
- package/android/src/main/java/com/renderrichtext/views/WrapGlyph.kt +40 -40
- package/android/src/main/jni/CMakeLists.txt +52 -52
- package/android/src/main/jni/react/renderer/components/RichTextSpec/ComponentDescriptors.h +30 -30
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextComponentDescriptor.h +29 -29
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.cpp +45 -45
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.h +21 -21
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.cpp +38 -38
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.h +53 -53
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.cpp +9 -9
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.h +24 -24
- package/android/src/main/jni/react/renderer/components/RichTextSpec/conversions.h +40 -40
- package/cpp/parser/TiptapParser.hpp +13 -13
- package/cpp/vendor/nlohmann/json.hpp +24765 -24765
- package/ios/EnrichedTiptapText.h +27 -27
- package/ios/attachments/ENRMImageAttachment.h +51 -51
- package/ios/attachments/ENRMImageAttachment.m +398 -398
- package/ios/attachments/ENRMLinkPillAttachment.h +47 -47
- package/ios/attachments/ENRMLinkPillAttachment.m +324 -324
- package/ios/attachments/ENRMLinkPillIconCache.h +28 -28
- package/ios/attachments/ENRMLinkPillIconCache.m +181 -181
- package/ios/attachments/ENRMLinkPillText.h +27 -27
- package/ios/attachments/ENRMLinkPillText.m +118 -118
- package/ios/attachments/ENRMMathInlineAttachment.h +7 -7
- package/ios/attachments/ENRMMathInlineAttachment.m +4 -4
- package/ios/attachments/ThematicBreakAttachment.h +15 -15
- package/ios/attachments/ThematicBreakAttachment.m +33 -33
- package/ios/internals/ENRMViewFreeMeasurement.h +208 -208
- package/ios/internals/EnrichedTiptapTextComponentDescriptor.h +19 -19
- package/ios/internals/EnrichedTiptapTextShadowNode.h +43 -43
- package/ios/internals/EnrichedTiptapTextShadowNode.mm +69 -69
- package/ios/internals/EnrichedTiptapTextState.h +24 -24
- package/ios/internals/MeasurementCache.h +308 -308
- package/ios/internals/ShadowMeasurementUtils.h +145 -145
- package/ios/parser/ENRMTextLinkAttributes.h +7 -7
- package/ios/parser/ENRMTiptapParser.h +33 -33
- package/ios/parser/ENRMTiptapParser.mm +73 -73
- package/ios/parser/TiptapASTNode.m +52 -52
- package/ios/renderer/AttributedRenderer.h +23 -23
- package/ios/renderer/AttributedRenderer.m +229 -229
- package/ios/renderer/BaseRenderer.h +33 -33
- package/ios/renderer/BaseRenderer.m +46 -46
- package/ios/renderer/BaselineShiftTextAttributes.h +10 -10
- package/ios/renderer/BaselineShiftTextAttributes.m +26 -26
- package/ios/renderer/BlankLineRenderer.h +4 -4
- package/ios/renderer/BlankLineRenderer.m +51 -51
- package/ios/renderer/BlockquoteRenderer.h +6 -6
- package/ios/renderer/BlockquoteRenderer.m +258 -258
- package/ios/renderer/CodeBlockRenderer.h +9 -9
- package/ios/renderer/CodeBlockRenderer.m +99 -99
- package/ios/renderer/CodeRenderer.h +9 -9
- package/ios/renderer/CodeRenderer.m +69 -69
- package/ios/renderer/ENRMBlockquoteTextRenderer.h +25 -25
- package/ios/renderer/ENRMBlockquoteTextRenderer.m +48 -48
- package/ios/renderer/EmphasisRenderer.h +5 -5
- package/ios/renderer/EmphasisRenderer.m +99 -99
- package/ios/renderer/HeadingRenderer.h +6 -6
- package/ios/renderer/HeadingRenderer.m +102 -102
- package/ios/renderer/HighlightRenderer.h +7 -7
- package/ios/renderer/HighlightRenderer.m +33 -33
- package/ios/renderer/LinkRenderer.h +6 -6
- package/ios/renderer/LinkRenderer.m +157 -157
- package/ios/renderer/ListItemRenderer.h +24 -24
- package/ios/renderer/ListItemRenderer.m +283 -283
- package/ios/renderer/ListRenderer.h +13 -13
- package/ios/renderer/ListRenderer.m +126 -126
- package/ios/renderer/MentionRenderer.h +9 -9
- package/ios/renderer/MentionRenderer.m +96 -96
- package/ios/renderer/NodeRenderer.h +8 -8
- package/ios/renderer/ParagraphRenderer.h +6 -6
- package/ios/renderer/ParagraphRenderer.m +85 -85
- package/ios/renderer/RenderContext.h +145 -145
- package/ios/renderer/RenderContext.m +402 -402
- package/ios/renderer/RendererFactory.h +12 -12
- package/ios/renderer/StrikethroughRenderer.h +5 -5
- package/ios/renderer/StrikethroughRenderer.m +30 -30
- package/ios/renderer/StrongRenderer.h +5 -5
- package/ios/renderer/StrongRenderer.m +87 -87
- package/ios/renderer/TextRenderer.h +6 -6
- package/ios/renderer/TextRenderer.m +18 -18
- package/ios/renderer/ThematicBreakRenderer.h +4 -4
- package/ios/renderer/ThematicBreakRenderer.m +41 -41
- package/ios/renderer/UnderlineRenderer.h +4 -4
- package/ios/renderer/UnderlineRenderer.m +41 -41
- package/ios/styles/ENRMFontSlot.h +12 -12
- package/ios/styles/ENRMFontSlot.m +24 -24
- package/ios/styles/StyleConfig.h +488 -488
- package/ios/styles/StyleConfig.mm +2820 -2820
- package/ios/utils/AccessibilityInfo.h +35 -35
- package/ios/utils/AccessibilityInfo.m +24 -24
- package/ios/utils/BlockquoteBorder.h +26 -26
- package/ios/utils/BlockquoteBorder.m +294 -294
- package/ios/utils/CodeBackground.h +19 -19
- package/ios/utils/CodeBackground.m +196 -196
- package/ios/utils/CodeBlockBackground.h +17 -17
- package/ios/utils/CodeBlockBackground.m +102 -102
- package/ios/utils/ContextMenuUtils.h +76 -76
- package/ios/utils/ContextMenuUtils.mm +75 -75
- package/ios/utils/ENRMAccessibilityLabels.h +40 -40
- package/ios/utils/ENRMAccessibilityLabels.m +5 -5
- package/ios/utils/ENRMAsyncRenderCoordinator.h +24 -24
- package/ios/utils/ENRMAsyncRenderCoordinator.m +37 -37
- package/ios/utils/ENRMAtomicSize.h +65 -65
- package/ios/utils/ENRMCodeBlockContent.h +37 -37
- package/ios/utils/ENRMCodeBlockContent.mm +89 -89
- package/ios/utils/ENRMFeatureFlags.h +25 -25
- package/ios/utils/ENRMImageDownloader.h +30 -30
- package/ios/utils/ENRMImageDownloader.m +168 -168
- package/ios/utils/ENRMLatexErrorCoordinator.h +27 -27
- package/ios/utils/ENRMLatexErrorCoordinator.mm +75 -75
- package/ios/utils/ENRMLatexErrorReporting.h +13 -13
- package/ios/utils/ENRMLinkContextMenus.h +93 -93
- package/ios/utils/ENRMLinkContextMenus.m +178 -178
- package/ios/utils/ENRMLinkRegexConfig.h +30 -30
- package/ios/utils/ENRMLinkRegexConfig.mm +104 -104
- package/ios/utils/ENRMLinkRegexProps.h +23 -23
- package/ios/utils/ENRMLocalImageLoader.h +35 -35
- package/ios/utils/ENRMLocalImageLoader.m +111 -111
- package/ios/utils/ENRMMenuAction.h +27 -27
- package/ios/utils/ENRMMenuAction.m +33 -33
- package/ios/utils/ENRMSpoilerOverlayManager.h +15 -15
- package/ios/utils/ENRMSpoilerOverlayManager.m +19 -19
- package/ios/utils/ENRMSpoilerTapUtils.h +6 -6
- package/ios/utils/ENRMSpoilerTapUtils.m +11 -11
- package/ios/utils/ENRMTailFadeInAnimator.h +16 -16
- package/ios/utils/ENRMTailFadeInAnimator.m +161 -161
- package/ios/utils/ENRMTextHitTest.h +23 -23
- package/ios/utils/ENRMTextHitTest.m +20 -20
- package/ios/utils/ENRMTextInteractionUtils.h +20 -20
- package/ios/utils/ENRMTextInteractionUtils.m +15 -15
- package/ios/utils/ENRMTextRenderer.h +38 -38
- package/ios/utils/ENRMTextRenderer.m +54 -54
- package/ios/utils/ENRMTextViewSetup.h +132 -132
- package/ios/utils/ENRMUIKit.h +429 -429
- package/ios/utils/EditMenuUtils.h +105 -105
- package/ios/utils/EditMenuUtils.m +143 -143
- package/ios/utils/FontScaleObserver.h +10 -10
- package/ios/utils/FontScaleObserver.m +55 -55
- package/ios/utils/FontUtils.h +31 -31
- package/ios/utils/FontUtils.m +63 -63
- package/ios/utils/HTMLGenerator.h +25 -25
- package/ios/utils/HTMLGenerator.m +1041 -1041
- package/ios/utils/HeightUpdateUtils.h +25 -25
- package/ios/utils/ImageRequestHeaderUtils.h +35 -35
- package/ios/utils/LastElementUtils.h +97 -97
- package/ios/utils/LinkContextMenuUtils.h +55 -55
- package/ios/utils/LinkPillContentUtils.h +46 -46
- package/ios/utils/ListMarkerDrawer.h +15 -15
- package/ios/utils/ListMarkerDrawer.m +239 -239
- package/ios/utils/MentionBackground.h +26 -26
- package/ios/utils/MentionBackground.m +86 -86
- package/ios/utils/ParagraphStyleUtils.h +87 -87
- package/ios/utils/ParagraphStyleUtils.m +484 -484
- package/ios/utils/PasteboardUtils.h +48 -48
- package/ios/utils/PasteboardUtils.m +166 -166
- package/ios/utils/RTFExportUtils.h +24 -24
- package/ios/utils/RTFExportUtils.m +299 -299
- package/ios/utils/SelectionColorUtils.h +14 -14
- package/ios/utils/StylePropsUtils.h +1340 -1340
- package/ios/utils/TaskListTapUtils.h +6 -6
- package/ios/utils/TaskListTapUtils.m +14 -14
- package/ios/utils/TextViewLayoutManager.h +14 -14
- package/ios/utils/TiptapAccessibilityElementBuilder.h +43 -43
- package/ios/utils/TiptapAccessibilityElementBuilder.m +432 -432
- package/ios/utils/TiptapExtractor.h +17 -17
- package/ios/utils/TiptapExtractor.m +367 -367
- package/ios/views/ENRMTiptapTextView.h +25 -25
- package/ios/views/ENRMTiptapTextView.m +247 -247
- package/package.json +65 -70
- package/react-native.config.js +10 -10
- package/src/admonitionDefaults.ts +58 -58
- package/src/darkModeTextStyle.ts +99 -99
- package/src/headingDefaults.ts +21 -21
- package/src/index.tsx +4 -4
- package/src/linkVariantUtils.ts +120 -120
- package/src/normalizeTiptapStyle.ts +397 -397
- package/src/rn-globals.d.ts +1 -1
- package/src/styleUtils.ts +107 -107
- package/src/types/TiptapStyle.ts +532 -532
- package/src/types/TiptapStyleInternal.ts +299 -299
- package/src/types/linkPill.ts +9 -9
- package/src/utils/isDev.ts +4 -4
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
#import "ENRMUIKit.h"
|
|
3
|
-
|
|
4
|
-
#if !TARGET_OS_OSX
|
|
5
|
-
NS_ASSUME_NONNULL_BEGIN
|
|
6
|
-
|
|
7
|
-
/// Pill icons, kept small in one bounded cache. Local files decode synchronously, so a bundled
|
|
8
|
-
/// icon is there on the first layout; every other source goes through the shared image
|
|
9
|
-
/// downloader, like tiptap images, and arrives asynchronously.
|
|
10
|
-
|
|
11
|
-
/// A local file icon, or nil when the source is not a readable local file.
|
|
12
|
-
FOUNDATION_EXPORT UIImage *_Nullable ENRMLoadLinkPillIcon(NSString *_Nullable iconUri);
|
|
13
|
-
|
|
14
|
-
FOUNDATION_EXPORT UIImage *_Nullable ENRMCachedLinkPillIcon(NSString *iconUri,
|
|
15
|
-
NSDictionary<NSString *, NSString *> *_Nullable headers);
|
|
16
|
-
|
|
17
|
-
/// YES for a while after an asynchronous load of this source failed; callers then do not
|
|
18
|
-
/// reserve an icon slot. The source is tried again once that period has passed.
|
|
19
|
-
FOUNDATION_EXPORT BOOL ENRMLinkPillIconDidFail(NSString *iconUri,
|
|
20
|
-
NSDictionary<NSString *, NSString *> *_Nullable headers);
|
|
21
|
-
|
|
22
|
-
/// Loads through the shared image pipeline. `completion` runs on the main thread; nil means the source failed.
|
|
23
|
-
FOUNDATION_EXPORT void ENRMLoadLinkPillIconAsync(NSString *iconUri,
|
|
24
|
-
NSDictionary<NSString *, NSString *> *_Nullable headers,
|
|
25
|
-
void (^completion)(UIImage *_Nullable icon));
|
|
26
|
-
|
|
27
|
-
NS_ASSUME_NONNULL_END
|
|
28
|
-
#endif
|
|
1
|
+
#pragma once
|
|
2
|
+
#import "ENRMUIKit.h"
|
|
3
|
+
|
|
4
|
+
#if !TARGET_OS_OSX
|
|
5
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
6
|
+
|
|
7
|
+
/// Pill icons, kept small in one bounded cache. Local files decode synchronously, so a bundled
|
|
8
|
+
/// icon is there on the first layout; every other source goes through the shared image
|
|
9
|
+
/// downloader, like tiptap images, and arrives asynchronously.
|
|
10
|
+
|
|
11
|
+
/// A local file icon, or nil when the source is not a readable local file.
|
|
12
|
+
FOUNDATION_EXPORT UIImage *_Nullable ENRMLoadLinkPillIcon(NSString *_Nullable iconUri);
|
|
13
|
+
|
|
14
|
+
FOUNDATION_EXPORT UIImage *_Nullable ENRMCachedLinkPillIcon(NSString *iconUri,
|
|
15
|
+
NSDictionary<NSString *, NSString *> *_Nullable headers);
|
|
16
|
+
|
|
17
|
+
/// YES for a while after an asynchronous load of this source failed; callers then do not
|
|
18
|
+
/// reserve an icon slot. The source is tried again once that period has passed.
|
|
19
|
+
FOUNDATION_EXPORT BOOL ENRMLinkPillIconDidFail(NSString *iconUri,
|
|
20
|
+
NSDictionary<NSString *, NSString *> *_Nullable headers);
|
|
21
|
+
|
|
22
|
+
/// Loads through the shared image pipeline. `completion` runs on the main thread; nil means the source failed.
|
|
23
|
+
FOUNDATION_EXPORT void ENRMLoadLinkPillIconAsync(NSString *iconUri,
|
|
24
|
+
NSDictionary<NSString *, NSString *> *_Nullable headers,
|
|
25
|
+
void (^completion)(UIImage *_Nullable icon));
|
|
26
|
+
|
|
27
|
+
NS_ASSUME_NONNULL_END
|
|
28
|
+
#endif
|
|
@@ -1,181 +1,181 @@
|
|
|
1
|
-
#import "ENRMLinkPillIconCache.h"
|
|
2
|
-
#import "ENRMImageDownloader.h"
|
|
3
|
-
#import "ENRMLocalImageLoader.h"
|
|
4
|
-
#if !TARGET_OS_OSX
|
|
5
|
-
#import <ImageIO/ImageIO.h>
|
|
6
|
-
#import <QuartzCore/QuartzCore.h>
|
|
7
|
-
|
|
8
|
-
// Icons are drawn at the label's font size, so even a large heading at 3x needs few pixels.
|
|
9
|
-
static const CGFloat kMaxIconPixelSize = 128;
|
|
10
|
-
|
|
11
|
-
static NSCache<NSString *, UIImage *> *ENRMLinkPillIcons(void)
|
|
12
|
-
{
|
|
13
|
-
static NSCache<NSString *, UIImage *> *icons;
|
|
14
|
-
static dispatch_once_t once;
|
|
15
|
-
dispatch_once(&once, ^{
|
|
16
|
-
icons = [NSCache new];
|
|
17
|
-
icons.countLimit = 64;
|
|
18
|
-
icons.totalCostLimit = 8 * 1024 * 1024;
|
|
19
|
-
});
|
|
20
|
-
return icons;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// A failed source is left alone for a while, so a broken URL is not requested on every
|
|
24
|
-
// render, and then tried again, so a transient failure does not hide the icon for good.
|
|
25
|
-
static const CFTimeInterval kFailedIconRetryInterval = 30;
|
|
26
|
-
|
|
27
|
-
static NSCache<NSString *, NSNumber *> *ENRMFailedLinkPillIcons(void)
|
|
28
|
-
{
|
|
29
|
-
static NSCache<NSString *, NSNumber *> *failed;
|
|
30
|
-
static dispatch_once_t once;
|
|
31
|
-
dispatch_once(&once, ^{
|
|
32
|
-
failed = [NSCache new];
|
|
33
|
-
failed.countLimit = 256;
|
|
34
|
-
});
|
|
35
|
-
return failed;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// A local icon and the state of its file when it was decoded.
|
|
39
|
-
@interface ENRMLocalLinkPillIcon : NSObject
|
|
40
|
-
@property (nonatomic, strong) UIImage *image;
|
|
41
|
-
@property (nonatomic, copy) NSString *path;
|
|
42
|
-
@property (nonatomic, strong, nullable) NSDate *modified;
|
|
43
|
-
@property (nonatomic, assign) unsigned long long fileSize;
|
|
44
|
-
@property (nonatomic, assign) CFTimeInterval checkedAt;
|
|
45
|
-
@end
|
|
46
|
-
|
|
47
|
-
@implementation ENRMLocalLinkPillIcon
|
|
48
|
-
@end
|
|
49
|
-
|
|
50
|
-
// Every render asks for the same icons again, so the file is looked at no more than once
|
|
51
|
-
// per interval; a file replaced under the same path is picked up after that.
|
|
52
|
-
static const CFTimeInterval kLocalIconRevalidateInterval = 1;
|
|
53
|
-
|
|
54
|
-
static NSCache<NSString *, ENRMLocalLinkPillIcon *> *ENRMLocalLinkPillIcons(void)
|
|
55
|
-
{
|
|
56
|
-
static NSCache<NSString *, ENRMLocalLinkPillIcon *> *icons;
|
|
57
|
-
static dispatch_once_t once;
|
|
58
|
-
dispatch_once(&once, ^{
|
|
59
|
-
icons = [NSCache new];
|
|
60
|
-
icons.countLimit = 64;
|
|
61
|
-
icons.totalCostLimit = 8 * 1024 * 1024;
|
|
62
|
-
});
|
|
63
|
-
return icons;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
static UIImage *ENRMDecodeLinkPillIcon(NSString *path)
|
|
67
|
-
{
|
|
68
|
-
CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:path], NULL);
|
|
69
|
-
if (!source)
|
|
70
|
-
return nil;
|
|
71
|
-
NSDictionary *options = @{
|
|
72
|
-
(__bridge NSString *)kCGImageSourceCreateThumbnailFromImageAlways : @YES,
|
|
73
|
-
(__bridge NSString *)kCGImageSourceCreateThumbnailWithTransform : @YES,
|
|
74
|
-
(__bridge NSString *)kCGImageSourceShouldCacheImmediately : @YES,
|
|
75
|
-
(__bridge NSString *)kCGImageSourceThumbnailMaxPixelSize : @(kMaxIconPixelSize),
|
|
76
|
-
};
|
|
77
|
-
CGImageRef decoded = CGImageSourceCreateThumbnailAtIndex(source, 0, (__bridge CFDictionaryRef)options);
|
|
78
|
-
CFRelease(source);
|
|
79
|
-
if (!decoded)
|
|
80
|
-
return nil;
|
|
81
|
-
UIImage *image = [UIImage imageWithCGImage:decoded];
|
|
82
|
-
CGImageRelease(decoded);
|
|
83
|
-
return image;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
UIImage *ENRMLoadLinkPillIcon(NSString *iconUri)
|
|
87
|
-
{
|
|
88
|
-
if (iconUri.length == 0)
|
|
89
|
-
return nil;
|
|
90
|
-
NSCache<NSString *, ENRMLocalLinkPillIcon *> *icons = ENRMLocalLinkPillIcons();
|
|
91
|
-
ENRMLocalLinkPillIcon *cached = [icons objectForKey:iconUri];
|
|
92
|
-
CFTimeInterval now = CACurrentMediaTime();
|
|
93
|
-
if (cached && now - cached.checkedAt < kLocalIconRevalidateInterval)
|
|
94
|
-
return cached.image;
|
|
95
|
-
|
|
96
|
-
NSString *path = cached.path ?: ENRMResolveLocalImagePath(iconUri);
|
|
97
|
-
if (!path)
|
|
98
|
-
return nil;
|
|
99
|
-
NSDictionary *attributes = [NSFileManager.defaultManager attributesOfItemAtPath:path error:nil];
|
|
100
|
-
NSDate *modified = attributes[NSFileModificationDate];
|
|
101
|
-
unsigned long long fileSize = [attributes[NSFileSize] unsignedLongLongValue];
|
|
102
|
-
if (cached && attributes && cached.fileSize == fileSize && [cached.modified isEqualToDate:modified]) {
|
|
103
|
-
cached.checkedAt = now;
|
|
104
|
-
return cached.image;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
UIImage *image = attributes ? ENRMDecodeLinkPillIcon(path) : nil;
|
|
108
|
-
if (!image) {
|
|
109
|
-
[icons removeObjectForKey:iconUri];
|
|
110
|
-
return nil;
|
|
111
|
-
}
|
|
112
|
-
ENRMLocalLinkPillIcon *entry = [ENRMLocalLinkPillIcon new];
|
|
113
|
-
entry.image = image;
|
|
114
|
-
entry.path = path;
|
|
115
|
-
entry.modified = modified;
|
|
116
|
-
entry.fileSize = fileSize;
|
|
117
|
-
entry.checkedAt = now;
|
|
118
|
-
[icons setObject:entry forKey:iconUri cost:ENRMImageByteCost(image)];
|
|
119
|
-
return image;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
UIImage *ENRMCachedLinkPillIcon(NSString *iconUri, NSDictionary<NSString *, NSString *> *headers)
|
|
123
|
-
{
|
|
124
|
-
return [ENRMLinkPillIcons() objectForKey:ENRMImageCacheKey(iconUri, headers)];
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
BOOL ENRMLinkPillIconDidFail(NSString *iconUri, NSDictionary<NSString *, NSString *> *headers)
|
|
128
|
-
{
|
|
129
|
-
NSString *key = ENRMImageCacheKey(iconUri, headers);
|
|
130
|
-
NSNumber *failedAt = [ENRMFailedLinkPillIcons() objectForKey:key];
|
|
131
|
-
if (!failedAt)
|
|
132
|
-
return NO;
|
|
133
|
-
if (CACurrentMediaTime() - failedAt.doubleValue < kFailedIconRetryInterval)
|
|
134
|
-
return YES;
|
|
135
|
-
[ENRMFailedLinkPillIcons() removeObjectForKey:key];
|
|
136
|
-
return NO;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
static UIImage *ENRMLinkPillThumbnail(UIImage *image)
|
|
140
|
-
{
|
|
141
|
-
CGFloat pixelWidth = image.size.width * image.scale;
|
|
142
|
-
CGFloat pixelHeight = image.size.height * image.scale;
|
|
143
|
-
CGFloat longest = MAX(pixelWidth, pixelHeight);
|
|
144
|
-
if (longest <= kMaxIconPixelSize || longest <= 0)
|
|
145
|
-
return image;
|
|
146
|
-
CGFloat ratio = kMaxIconPixelSize / longest;
|
|
147
|
-
CGSize size = CGSizeMake(MAX(1, floor(pixelWidth * ratio)), MAX(1, floor(pixelHeight * ratio)));
|
|
148
|
-
UIGraphicsImageRendererFormat *format = [UIGraphicsImageRendererFormat preferredFormat];
|
|
149
|
-
format.scale = 1;
|
|
150
|
-
format.opaque = NO;
|
|
151
|
-
UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:size format:format];
|
|
152
|
-
return [renderer imageWithActions:^(UIGraphicsImageRendererContext *context) {
|
|
153
|
-
[image drawInRect:(CGRect){CGPointZero, size}];
|
|
154
|
-
}];
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
void ENRMLoadLinkPillIconAsync(NSString *iconUri, NSDictionary<NSString *, NSString *> *headers,
|
|
158
|
-
void (^completion)(UIImage *_Nullable icon))
|
|
159
|
-
{
|
|
160
|
-
NSString *key = ENRMImageCacheKey(iconUri, headers);
|
|
161
|
-
[[ENRMImageDownloader shared] downloadURL:iconUri
|
|
162
|
-
headers:headers
|
|
163
|
-
completion:^(RCTUIImage *image) {
|
|
164
|
-
// Drawn pills are cached by icon identity: every pill waiting
|
|
165
|
-
// for this icon gets the same image.
|
|
166
|
-
UIImage *icon = [ENRMLinkPillIcons() objectForKey:key];
|
|
167
|
-
if (!icon && image) {
|
|
168
|
-
icon = ENRMLinkPillThumbnail(image);
|
|
169
|
-
[ENRMLinkPillIcons() setObject:icon forKey:key cost:ENRMImageByteCost(icon)];
|
|
170
|
-
}
|
|
171
|
-
if (!icon) {
|
|
172
|
-
[ENRMFailedLinkPillIcons() setObject:@(CACurrentMediaTime()) forKey:key];
|
|
173
|
-
}
|
|
174
|
-
if (NSThread.isMainThread) {
|
|
175
|
-
completion(icon);
|
|
176
|
-
} else {
|
|
177
|
-
dispatch_async(dispatch_get_main_queue(), ^{ completion(icon); });
|
|
178
|
-
}
|
|
179
|
-
}];
|
|
180
|
-
}
|
|
181
|
-
#endif
|
|
1
|
+
#import "ENRMLinkPillIconCache.h"
|
|
2
|
+
#import "ENRMImageDownloader.h"
|
|
3
|
+
#import "ENRMLocalImageLoader.h"
|
|
4
|
+
#if !TARGET_OS_OSX
|
|
5
|
+
#import <ImageIO/ImageIO.h>
|
|
6
|
+
#import <QuartzCore/QuartzCore.h>
|
|
7
|
+
|
|
8
|
+
// Icons are drawn at the label's font size, so even a large heading at 3x needs few pixels.
|
|
9
|
+
static const CGFloat kMaxIconPixelSize = 128;
|
|
10
|
+
|
|
11
|
+
static NSCache<NSString *, UIImage *> *ENRMLinkPillIcons(void)
|
|
12
|
+
{
|
|
13
|
+
static NSCache<NSString *, UIImage *> *icons;
|
|
14
|
+
static dispatch_once_t once;
|
|
15
|
+
dispatch_once(&once, ^{
|
|
16
|
+
icons = [NSCache new];
|
|
17
|
+
icons.countLimit = 64;
|
|
18
|
+
icons.totalCostLimit = 8 * 1024 * 1024;
|
|
19
|
+
});
|
|
20
|
+
return icons;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// A failed source is left alone for a while, so a broken URL is not requested on every
|
|
24
|
+
// render, and then tried again, so a transient failure does not hide the icon for good.
|
|
25
|
+
static const CFTimeInterval kFailedIconRetryInterval = 30;
|
|
26
|
+
|
|
27
|
+
static NSCache<NSString *, NSNumber *> *ENRMFailedLinkPillIcons(void)
|
|
28
|
+
{
|
|
29
|
+
static NSCache<NSString *, NSNumber *> *failed;
|
|
30
|
+
static dispatch_once_t once;
|
|
31
|
+
dispatch_once(&once, ^{
|
|
32
|
+
failed = [NSCache new];
|
|
33
|
+
failed.countLimit = 256;
|
|
34
|
+
});
|
|
35
|
+
return failed;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// A local icon and the state of its file when it was decoded.
|
|
39
|
+
@interface ENRMLocalLinkPillIcon : NSObject
|
|
40
|
+
@property (nonatomic, strong) UIImage *image;
|
|
41
|
+
@property (nonatomic, copy) NSString *path;
|
|
42
|
+
@property (nonatomic, strong, nullable) NSDate *modified;
|
|
43
|
+
@property (nonatomic, assign) unsigned long long fileSize;
|
|
44
|
+
@property (nonatomic, assign) CFTimeInterval checkedAt;
|
|
45
|
+
@end
|
|
46
|
+
|
|
47
|
+
@implementation ENRMLocalLinkPillIcon
|
|
48
|
+
@end
|
|
49
|
+
|
|
50
|
+
// Every render asks for the same icons again, so the file is looked at no more than once
|
|
51
|
+
// per interval; a file replaced under the same path is picked up after that.
|
|
52
|
+
static const CFTimeInterval kLocalIconRevalidateInterval = 1;
|
|
53
|
+
|
|
54
|
+
static NSCache<NSString *, ENRMLocalLinkPillIcon *> *ENRMLocalLinkPillIcons(void)
|
|
55
|
+
{
|
|
56
|
+
static NSCache<NSString *, ENRMLocalLinkPillIcon *> *icons;
|
|
57
|
+
static dispatch_once_t once;
|
|
58
|
+
dispatch_once(&once, ^{
|
|
59
|
+
icons = [NSCache new];
|
|
60
|
+
icons.countLimit = 64;
|
|
61
|
+
icons.totalCostLimit = 8 * 1024 * 1024;
|
|
62
|
+
});
|
|
63
|
+
return icons;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
static UIImage *ENRMDecodeLinkPillIcon(NSString *path)
|
|
67
|
+
{
|
|
68
|
+
CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:path], NULL);
|
|
69
|
+
if (!source)
|
|
70
|
+
return nil;
|
|
71
|
+
NSDictionary *options = @{
|
|
72
|
+
(__bridge NSString *)kCGImageSourceCreateThumbnailFromImageAlways : @YES,
|
|
73
|
+
(__bridge NSString *)kCGImageSourceCreateThumbnailWithTransform : @YES,
|
|
74
|
+
(__bridge NSString *)kCGImageSourceShouldCacheImmediately : @YES,
|
|
75
|
+
(__bridge NSString *)kCGImageSourceThumbnailMaxPixelSize : @(kMaxIconPixelSize),
|
|
76
|
+
};
|
|
77
|
+
CGImageRef decoded = CGImageSourceCreateThumbnailAtIndex(source, 0, (__bridge CFDictionaryRef)options);
|
|
78
|
+
CFRelease(source);
|
|
79
|
+
if (!decoded)
|
|
80
|
+
return nil;
|
|
81
|
+
UIImage *image = [UIImage imageWithCGImage:decoded];
|
|
82
|
+
CGImageRelease(decoded);
|
|
83
|
+
return image;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
UIImage *ENRMLoadLinkPillIcon(NSString *iconUri)
|
|
87
|
+
{
|
|
88
|
+
if (iconUri.length == 0)
|
|
89
|
+
return nil;
|
|
90
|
+
NSCache<NSString *, ENRMLocalLinkPillIcon *> *icons = ENRMLocalLinkPillIcons();
|
|
91
|
+
ENRMLocalLinkPillIcon *cached = [icons objectForKey:iconUri];
|
|
92
|
+
CFTimeInterval now = CACurrentMediaTime();
|
|
93
|
+
if (cached && now - cached.checkedAt < kLocalIconRevalidateInterval)
|
|
94
|
+
return cached.image;
|
|
95
|
+
|
|
96
|
+
NSString *path = cached.path ?: ENRMResolveLocalImagePath(iconUri);
|
|
97
|
+
if (!path)
|
|
98
|
+
return nil;
|
|
99
|
+
NSDictionary *attributes = [NSFileManager.defaultManager attributesOfItemAtPath:path error:nil];
|
|
100
|
+
NSDate *modified = attributes[NSFileModificationDate];
|
|
101
|
+
unsigned long long fileSize = [attributes[NSFileSize] unsignedLongLongValue];
|
|
102
|
+
if (cached && attributes && cached.fileSize == fileSize && [cached.modified isEqualToDate:modified]) {
|
|
103
|
+
cached.checkedAt = now;
|
|
104
|
+
return cached.image;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
UIImage *image = attributes ? ENRMDecodeLinkPillIcon(path) : nil;
|
|
108
|
+
if (!image) {
|
|
109
|
+
[icons removeObjectForKey:iconUri];
|
|
110
|
+
return nil;
|
|
111
|
+
}
|
|
112
|
+
ENRMLocalLinkPillIcon *entry = [ENRMLocalLinkPillIcon new];
|
|
113
|
+
entry.image = image;
|
|
114
|
+
entry.path = path;
|
|
115
|
+
entry.modified = modified;
|
|
116
|
+
entry.fileSize = fileSize;
|
|
117
|
+
entry.checkedAt = now;
|
|
118
|
+
[icons setObject:entry forKey:iconUri cost:ENRMImageByteCost(image)];
|
|
119
|
+
return image;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
UIImage *ENRMCachedLinkPillIcon(NSString *iconUri, NSDictionary<NSString *, NSString *> *headers)
|
|
123
|
+
{
|
|
124
|
+
return [ENRMLinkPillIcons() objectForKey:ENRMImageCacheKey(iconUri, headers)];
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
BOOL ENRMLinkPillIconDidFail(NSString *iconUri, NSDictionary<NSString *, NSString *> *headers)
|
|
128
|
+
{
|
|
129
|
+
NSString *key = ENRMImageCacheKey(iconUri, headers);
|
|
130
|
+
NSNumber *failedAt = [ENRMFailedLinkPillIcons() objectForKey:key];
|
|
131
|
+
if (!failedAt)
|
|
132
|
+
return NO;
|
|
133
|
+
if (CACurrentMediaTime() - failedAt.doubleValue < kFailedIconRetryInterval)
|
|
134
|
+
return YES;
|
|
135
|
+
[ENRMFailedLinkPillIcons() removeObjectForKey:key];
|
|
136
|
+
return NO;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
static UIImage *ENRMLinkPillThumbnail(UIImage *image)
|
|
140
|
+
{
|
|
141
|
+
CGFloat pixelWidth = image.size.width * image.scale;
|
|
142
|
+
CGFloat pixelHeight = image.size.height * image.scale;
|
|
143
|
+
CGFloat longest = MAX(pixelWidth, pixelHeight);
|
|
144
|
+
if (longest <= kMaxIconPixelSize || longest <= 0)
|
|
145
|
+
return image;
|
|
146
|
+
CGFloat ratio = kMaxIconPixelSize / longest;
|
|
147
|
+
CGSize size = CGSizeMake(MAX(1, floor(pixelWidth * ratio)), MAX(1, floor(pixelHeight * ratio)));
|
|
148
|
+
UIGraphicsImageRendererFormat *format = [UIGraphicsImageRendererFormat preferredFormat];
|
|
149
|
+
format.scale = 1;
|
|
150
|
+
format.opaque = NO;
|
|
151
|
+
UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:size format:format];
|
|
152
|
+
return [renderer imageWithActions:^(UIGraphicsImageRendererContext *context) {
|
|
153
|
+
[image drawInRect:(CGRect){CGPointZero, size}];
|
|
154
|
+
}];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
void ENRMLoadLinkPillIconAsync(NSString *iconUri, NSDictionary<NSString *, NSString *> *headers,
|
|
158
|
+
void (^completion)(UIImage *_Nullable icon))
|
|
159
|
+
{
|
|
160
|
+
NSString *key = ENRMImageCacheKey(iconUri, headers);
|
|
161
|
+
[[ENRMImageDownloader shared] downloadURL:iconUri
|
|
162
|
+
headers:headers
|
|
163
|
+
completion:^(RCTUIImage *image) {
|
|
164
|
+
// Drawn pills are cached by icon identity: every pill waiting
|
|
165
|
+
// for this icon gets the same image.
|
|
166
|
+
UIImage *icon = [ENRMLinkPillIcons() objectForKey:key];
|
|
167
|
+
if (!icon && image) {
|
|
168
|
+
icon = ENRMLinkPillThumbnail(image);
|
|
169
|
+
[ENRMLinkPillIcons() setObject:icon forKey:key cost:ENRMImageByteCost(icon)];
|
|
170
|
+
}
|
|
171
|
+
if (!icon) {
|
|
172
|
+
[ENRMFailedLinkPillIcons() setObject:@(CACurrentMediaTime()) forKey:key];
|
|
173
|
+
}
|
|
174
|
+
if (NSThread.isMainThread) {
|
|
175
|
+
completion(icon);
|
|
176
|
+
} else {
|
|
177
|
+
dispatch_async(dispatch_get_main_queue(), ^{ completion(icon); });
|
|
178
|
+
}
|
|
179
|
+
}];
|
|
180
|
+
}
|
|
181
|
+
#endif
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
#import "ENRMUIKit.h"
|
|
3
|
-
|
|
4
|
-
NS_ASSUME_NONNULL_BEGIN
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* In text storage a link pill is one placeholder character. Wherever text leaves the
|
|
8
|
-
* view it must carry the link text again: the Tiptap, HTML and RTF exporters expand
|
|
9
|
-
* pills themselves, and code that reads plain text out of storage calls these functions.
|
|
10
|
-
* On macOS, where pills are not rendered, they return their input unchanged.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Returns `text` with every pill placeholder replaced by the link content it stands for,
|
|
15
|
-
* or `text` itself when it holds no pills. `ioRange`, when given, is a range in `text` on
|
|
16
|
-
* input and the matching range in the result on output.
|
|
17
|
-
*/
|
|
18
|
-
FOUNDATION_EXPORT NSAttributedString *ENRMAttributedStringByExpandingLinkPills(NSAttributedString *text,
|
|
19
|
-
NSRange *_Nullable ioRange);
|
|
20
|
-
|
|
21
|
-
FOUNDATION_EXPORT NSString *ENRMStringByExpandingLinkPills(NSAttributedString *text);
|
|
22
|
-
|
|
23
|
-
/// Enclosing strong/emphasis restyle the placeholder after the pill was created. Run once
|
|
24
|
-
/// rendering is finished so each label uses the font ordinary link text would have.
|
|
25
|
-
FOUNDATION_EXPORT void ENRMLinkPillsAdoptPlaceholderFonts(NSAttributedString *text);
|
|
26
|
-
|
|
27
|
-
NS_ASSUME_NONNULL_END
|
|
1
|
+
#pragma once
|
|
2
|
+
#import "ENRMUIKit.h"
|
|
3
|
+
|
|
4
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* In text storage a link pill is one placeholder character. Wherever text leaves the
|
|
8
|
+
* view it must carry the link text again: the Tiptap, HTML and RTF exporters expand
|
|
9
|
+
* pills themselves, and code that reads plain text out of storage calls these functions.
|
|
10
|
+
* On macOS, where pills are not rendered, they return their input unchanged.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Returns `text` with every pill placeholder replaced by the link content it stands for,
|
|
15
|
+
* or `text` itself when it holds no pills. `ioRange`, when given, is a range in `text` on
|
|
16
|
+
* input and the matching range in the result on output.
|
|
17
|
+
*/
|
|
18
|
+
FOUNDATION_EXPORT NSAttributedString *ENRMAttributedStringByExpandingLinkPills(NSAttributedString *text,
|
|
19
|
+
NSRange *_Nullable ioRange);
|
|
20
|
+
|
|
21
|
+
FOUNDATION_EXPORT NSString *ENRMStringByExpandingLinkPills(NSAttributedString *text);
|
|
22
|
+
|
|
23
|
+
/// Enclosing strong/emphasis restyle the placeholder after the pill was created. Run once
|
|
24
|
+
/// rendering is finished so each label uses the font ordinary link text would have.
|
|
25
|
+
FOUNDATION_EXPORT void ENRMLinkPillsAdoptPlaceholderFonts(NSAttributedString *text);
|
|
26
|
+
|
|
27
|
+
NS_ASSUME_NONNULL_END
|