@mathers101/react-native-render-rich-text 0.1.10 → 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,258 +1,258 @@
|
|
|
1
|
-
#import "BlockquoteRenderer.h"
|
|
2
|
-
#import "BlockquoteBorder.h"
|
|
3
|
-
#import "FontUtils.h"
|
|
4
|
-
#import "LastElementUtils.h"
|
|
5
|
-
#import "ListItemRenderer.h"
|
|
6
|
-
#import "TiptapASTNode.h"
|
|
7
|
-
#import "ParagraphStyleUtils.h"
|
|
8
|
-
#import "RenderContext.h"
|
|
9
|
-
#import "RendererFactory.h"
|
|
10
|
-
#import "StyleConfig.h"
|
|
11
|
-
|
|
12
|
-
static NSString *const kNestedInfoDepthKey = @"depth";
|
|
13
|
-
static NSString *const kNestedInfoRangeKey = @"range";
|
|
14
|
-
|
|
15
|
-
@implementation BlockquoteRenderer
|
|
16
|
-
|
|
17
|
-
- (id)takeContextSnapshot:(RenderContext *)context
|
|
18
|
-
{
|
|
19
|
-
return [context snapshotScope];
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
- (void)renderNodeContent:(TiptapASTNode *)node
|
|
23
|
-
into:(NSMutableAttributedString *)output
|
|
24
|
-
context:(RenderContext *)context
|
|
25
|
-
{
|
|
26
|
-
if (output.length > 0 && ![output.string hasSuffix:@"\n"]) {
|
|
27
|
-
[output appendAttributedString:kNewlineAttributedString];
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
NSInteger currentDepth = context.blockquoteDepth;
|
|
31
|
-
context.blockquoteDepth = currentDepth + 1;
|
|
32
|
-
|
|
33
|
-
[context setBlockStyle:BlockTypeBlockquote
|
|
34
|
-
font:[_config blockquoteFont]
|
|
35
|
-
color:[_config blockquoteColor]
|
|
36
|
-
headingLevel:0];
|
|
37
|
-
|
|
38
|
-
NSUInteger start = output.length;
|
|
39
|
-
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
40
|
-
|
|
41
|
-
NSUInteger end = output.length;
|
|
42
|
-
if (end <= start) {
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
[self applyStylingAndSpacing:output start:start end:end currentDepth:currentDepth context:context];
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
#pragma mark - Styling and Spacing
|
|
50
|
-
|
|
51
|
-
- (void)applyStylingAndSpacing:(NSMutableAttributedString *)output
|
|
52
|
-
start:(NSUInteger)start
|
|
53
|
-
end:(NSUInteger)end
|
|
54
|
-
currentDepth:(NSInteger)currentDepth
|
|
55
|
-
context:(RenderContext *)context
|
|
56
|
-
{
|
|
57
|
-
NSUInteger contentStart = start;
|
|
58
|
-
if (currentDepth == 0) {
|
|
59
|
-
contentStart += applyBlockSpacingBefore(output, start, [_config blockquoteMarginTop]);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// nested quotes pad their own box (matching web CSS padding)
|
|
63
|
-
CGFloat padding = [_config blockquotePadding];
|
|
64
|
-
NSUInteger topPadLength = 0;
|
|
65
|
-
NSUInteger bottomPadLength = 0;
|
|
66
|
-
if (padding > 0) {
|
|
67
|
-
NSMutableParagraphStyle *topSpacerStyle = [context spacerStyleWithHeight:padding spacing:0];
|
|
68
|
-
NSAttributedString *topSpacer = [[NSAttributedString alloc]
|
|
69
|
-
initWithString:@"\n"
|
|
70
|
-
attributes:@{NSParagraphStyleAttributeName : topSpacerStyle, BlockquoteSpacerAttributeName : @YES}];
|
|
71
|
-
[output insertAttributedString:topSpacer atIndex:contentStart];
|
|
72
|
-
topPadLength = 1;
|
|
73
|
-
|
|
74
|
-
NSUInteger bottomSpacerLocation = output.length;
|
|
75
|
-
[output appendAttributedString:kNewlineAttributedString];
|
|
76
|
-
NSMutableParagraphStyle *bottomSpacerStyle = [context spacerStyleWithHeight:padding spacing:0];
|
|
77
|
-
[output addAttributes:@{NSParagraphStyleAttributeName : bottomSpacerStyle, BlockquoteSpacerAttributeName : @YES}
|
|
78
|
-
range:NSMakeRange(bottomSpacerLocation, 1)];
|
|
79
|
-
bottomPadLength = 1;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
NSRange blockquoteRange = NSMakeRange(contentStart, (end - start) + topPadLength + bottomPadLength);
|
|
83
|
-
NSRange innerRange = NSMakeRange(contentStart + topPadLength, end - start);
|
|
84
|
-
CGFloat levelSpacing = [_config blockquoteBorderWidth] + [_config blockquoteGapWidth];
|
|
85
|
-
NSArray<NSDictionary *> *nestedInfo = [self collectNestedBlockquotes:output range:innerRange depth:currentDepth];
|
|
86
|
-
|
|
87
|
-
// Apply base styling (indentation, depth, background, line height)
|
|
88
|
-
[self applyBaseBlockquoteStyle:output
|
|
89
|
-
boxRange:blockquoteRange
|
|
90
|
-
innerRange:innerRange
|
|
91
|
-
depth:currentDepth
|
|
92
|
-
levelSpacing:levelSpacing
|
|
93
|
-
backgroundColor:[_config blockquoteBackgroundColor]
|
|
94
|
-
lineHeight:[_config blockquoteLineHeight]];
|
|
95
|
-
|
|
96
|
-
// Re-apply nested blockquote styles to restore their correct indentation
|
|
97
|
-
// (applyBaseBlockquoteStyle overwrites nested indents with the parent's indent)
|
|
98
|
-
[self reapplyNestedStyles:output nestedInfo:nestedInfo levelSpacing:levelSpacing];
|
|
99
|
-
|
|
100
|
-
if (currentDepth == 0) {
|
|
101
|
-
applyBlockSpacingAfter(output, [_config blockquoteMarginBottom]);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
#pragma mark - Nested Blockquote Handling
|
|
106
|
-
|
|
107
|
-
- (NSArray<NSDictionary *> *)collectNestedBlockquotes:(NSMutableAttributedString *)output
|
|
108
|
-
range:(NSRange)blockquoteRange
|
|
109
|
-
depth:(NSInteger)currentDepth
|
|
110
|
-
{
|
|
111
|
-
NSMutableArray<NSDictionary *> *nestedInfo = [NSMutableArray array];
|
|
112
|
-
|
|
113
|
-
[output
|
|
114
|
-
enumerateAttribute:BlockquoteDepthAttributeName
|
|
115
|
-
inRange:blockquoteRange
|
|
116
|
-
options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
|
|
117
|
-
usingBlock:^(id value, NSRange range, BOOL *stop) {
|
|
118
|
-
NSInteger depth = [value integerValue];
|
|
119
|
-
if (value && depth > currentDepth) {
|
|
120
|
-
[nestedInfo
|
|
121
|
-
addObject:@{kNestedInfoDepthKey : value, kNestedInfoRangeKey : [NSValue valueWithRange:range]}];
|
|
122
|
-
}
|
|
123
|
-
}];
|
|
124
|
-
|
|
125
|
-
return nestedInfo;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
- (void)applyBaseBlockquoteStyle:(NSMutableAttributedString *)output
|
|
129
|
-
boxRange:(NSRange)boxRange
|
|
130
|
-
innerRange:(NSRange)innerRange
|
|
131
|
-
depth:(NSInteger)currentDepth
|
|
132
|
-
levelSpacing:(CGFloat)levelSpacing
|
|
133
|
-
backgroundColor:(RCTUIColor *)backgroundColor
|
|
134
|
-
lineHeight:(CGFloat)lineHeight
|
|
135
|
-
{
|
|
136
|
-
CGFloat totalIndent = blockquoteIndentForDepth(currentDepth + 1, levelSpacing);
|
|
137
|
-
CGFloat padding = [_config blockquotePadding];
|
|
138
|
-
|
|
139
|
-
// Depth and background cover the whole box (incl. padding spacers) so the
|
|
140
|
-
// border and background render behind list content and the padding rows.
|
|
141
|
-
NSMutableDictionary *depthAttributes =
|
|
142
|
-
[NSMutableDictionary dictionaryWithObjectsAndKeys:@(currentDepth), BlockquoteDepthAttributeName, nil];
|
|
143
|
-
if (backgroundColor) {
|
|
144
|
-
depthAttributes[BlockquoteBackgroundColorAttributeName] = backgroundColor;
|
|
145
|
-
}
|
|
146
|
-
[output addAttributes:depthAttributes range:boxRange];
|
|
147
|
-
|
|
148
|
-
// List items bake the blockquote indent into their own paragraph style; only non-list content is stamped here.
|
|
149
|
-
[self enumerateNonListRangesIn:output
|
|
150
|
-
range:innerRange
|
|
151
|
-
usingBlock:^(NSRange nonListRange) {
|
|
152
|
-
NSMutableParagraphStyle *paragraphStyle =
|
|
153
|
-
getOrCreateParagraphStyle(output, nonListRange.location);
|
|
154
|
-
paragraphStyle.firstLineHeadIndent = totalIndent;
|
|
155
|
-
paragraphStyle.headIndent = totalIndent;
|
|
156
|
-
if (padding > 0) {
|
|
157
|
-
paragraphStyle.tailIndent = -padding;
|
|
158
|
-
}
|
|
159
|
-
[output addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:nonListRange];
|
|
160
|
-
applyLineHeight(output, nonListRange, lineHeight);
|
|
161
|
-
applyBaselineOffset(output, nonListRange);
|
|
162
|
-
}];
|
|
163
|
-
|
|
164
|
-
if (padding > 0) {
|
|
165
|
-
[self applyTailIndent:-padding toListRangesIn:output range:innerRange];
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
- (void)applyTailIndent:(CGFloat)tailIndent toListRangesIn:(NSMutableAttributedString *)output range:(NSRange)range
|
|
170
|
-
{
|
|
171
|
-
[output enumerateAttribute:ListDepthAttribute
|
|
172
|
-
inRange:range
|
|
173
|
-
options:0
|
|
174
|
-
usingBlock:^(id value, NSRange listRange, BOOL *stop) {
|
|
175
|
-
if (!value) {
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
[output enumerateAttribute:NSParagraphStyleAttributeName
|
|
179
|
-
inRange:listRange
|
|
180
|
-
options:0
|
|
181
|
-
usingBlock:^(NSParagraphStyle *style, NSRange styleRange, BOOL *innerStop) {
|
|
182
|
-
NSMutableParagraphStyle *mutableStyle =
|
|
183
|
-
style ? [style mutableCopy] : [[NSMutableParagraphStyle alloc] init];
|
|
184
|
-
mutableStyle.tailIndent = tailIndent;
|
|
185
|
-
[output addAttribute:NSParagraphStyleAttributeName
|
|
186
|
-
value:mutableStyle
|
|
187
|
-
range:styleRange];
|
|
188
|
-
}];
|
|
189
|
-
}];
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
- (void)reapplyNestedStyles:(NSMutableAttributedString *)output
|
|
193
|
-
nestedInfo:(NSArray<NSDictionary *> *)nestedInfo
|
|
194
|
-
levelSpacing:(CGFloat)levelSpacing
|
|
195
|
-
{
|
|
196
|
-
// Re-apply indentation to nested blockquotes since applyBaseBlockquoteStyle
|
|
197
|
-
// overwrote them with the parent's indentation
|
|
198
|
-
CGFloat padding = [_config blockquotePadding];
|
|
199
|
-
for (NSDictionary *info in nestedInfo) {
|
|
200
|
-
NSRange nestedRange = [info[kNestedInfoRangeKey] rangeValue];
|
|
201
|
-
NSInteger nestedDepth = [info[kNestedInfoDepthKey] integerValue];
|
|
202
|
-
CGFloat indent = blockquoteIndentForDepth(nestedDepth + 1, levelSpacing);
|
|
203
|
-
|
|
204
|
-
[output addAttribute:BlockquoteDepthAttributeName value:info[kNestedInfoDepthKey] range:nestedRange];
|
|
205
|
-
|
|
206
|
-
[self enumerateNonListRangesIn:output
|
|
207
|
-
range:nestedRange
|
|
208
|
-
usingBlock:^(NSRange nonListRange) {
|
|
209
|
-
NSMutableParagraphStyle *style = getOrCreateParagraphStyle(output, nonListRange.location);
|
|
210
|
-
style.firstLineHeadIndent = indent;
|
|
211
|
-
style.headIndent = indent;
|
|
212
|
-
style.tailIndent = padding > 0 ? -padding : 0;
|
|
213
|
-
[output addAttribute:NSParagraphStyleAttributeName value:style range:nonListRange];
|
|
214
|
-
}];
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
- (void)enumerateNonListRangesIn:(NSMutableAttributedString *)output
|
|
219
|
-
range:(NSRange)range
|
|
220
|
-
usingBlock:(void (^)(NSRange nonListRange))block
|
|
221
|
-
{
|
|
222
|
-
// List items — and code blocks nested inside them (which carry a list-derived
|
|
223
|
-
// indent instead of ListDepthAttribute) — already bake the correct indent in.
|
|
224
|
-
NSMutableArray<NSValue *> *listRanges = [NSMutableArray array];
|
|
225
|
-
void (^collectRanges)(NSString *) = ^(NSString *attribute) {
|
|
226
|
-
[output enumerateAttribute:attribute
|
|
227
|
-
inRange:range
|
|
228
|
-
options:0
|
|
229
|
-
usingBlock:^(id value, NSRange subRange, BOOL *stop) {
|
|
230
|
-
if (value) {
|
|
231
|
-
[listRanges addObject:[NSValue valueWithRange:subRange]];
|
|
232
|
-
}
|
|
233
|
-
}];
|
|
234
|
-
};
|
|
235
|
-
collectRanges(ListDepthAttribute);
|
|
236
|
-
collectRanges(CodeBlockIndentAttributeName);
|
|
237
|
-
collectRanges(BlockquoteSpacerAttributeName);
|
|
238
|
-
[listRanges sortUsingComparator:^NSComparisonResult(NSValue *a, NSValue *b) {
|
|
239
|
-
NSUInteger la = [a rangeValue].location;
|
|
240
|
-
NSUInteger lb = [b rangeValue].location;
|
|
241
|
-
return la < lb ? NSOrderedAscending : (la > lb ? NSOrderedDescending : NSOrderedSame);
|
|
242
|
-
}];
|
|
243
|
-
|
|
244
|
-
NSUInteger pos = range.location;
|
|
245
|
-
const NSUInteger end = NSMaxRange(range);
|
|
246
|
-
for (NSValue *val in listRanges) {
|
|
247
|
-
NSRange listRange = [val rangeValue];
|
|
248
|
-
if (pos < listRange.location) {
|
|
249
|
-
block(NSMakeRange(pos, listRange.location - pos));
|
|
250
|
-
}
|
|
251
|
-
pos = MAX(pos, NSMaxRange(listRange));
|
|
252
|
-
}
|
|
253
|
-
if (pos < end) {
|
|
254
|
-
block(NSMakeRange(pos, end - pos));
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
@end
|
|
1
|
+
#import "BlockquoteRenderer.h"
|
|
2
|
+
#import "BlockquoteBorder.h"
|
|
3
|
+
#import "FontUtils.h"
|
|
4
|
+
#import "LastElementUtils.h"
|
|
5
|
+
#import "ListItemRenderer.h"
|
|
6
|
+
#import "TiptapASTNode.h"
|
|
7
|
+
#import "ParagraphStyleUtils.h"
|
|
8
|
+
#import "RenderContext.h"
|
|
9
|
+
#import "RendererFactory.h"
|
|
10
|
+
#import "StyleConfig.h"
|
|
11
|
+
|
|
12
|
+
static NSString *const kNestedInfoDepthKey = @"depth";
|
|
13
|
+
static NSString *const kNestedInfoRangeKey = @"range";
|
|
14
|
+
|
|
15
|
+
@implementation BlockquoteRenderer
|
|
16
|
+
|
|
17
|
+
- (id)takeContextSnapshot:(RenderContext *)context
|
|
18
|
+
{
|
|
19
|
+
return [context snapshotScope];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
- (void)renderNodeContent:(TiptapASTNode *)node
|
|
23
|
+
into:(NSMutableAttributedString *)output
|
|
24
|
+
context:(RenderContext *)context
|
|
25
|
+
{
|
|
26
|
+
if (output.length > 0 && ![output.string hasSuffix:@"\n"]) {
|
|
27
|
+
[output appendAttributedString:kNewlineAttributedString];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
NSInteger currentDepth = context.blockquoteDepth;
|
|
31
|
+
context.blockquoteDepth = currentDepth + 1;
|
|
32
|
+
|
|
33
|
+
[context setBlockStyle:BlockTypeBlockquote
|
|
34
|
+
font:[_config blockquoteFont]
|
|
35
|
+
color:[_config blockquoteColor]
|
|
36
|
+
headingLevel:0];
|
|
37
|
+
|
|
38
|
+
NSUInteger start = output.length;
|
|
39
|
+
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
40
|
+
|
|
41
|
+
NSUInteger end = output.length;
|
|
42
|
+
if (end <= start) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
[self applyStylingAndSpacing:output start:start end:end currentDepth:currentDepth context:context];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
#pragma mark - Styling and Spacing
|
|
50
|
+
|
|
51
|
+
- (void)applyStylingAndSpacing:(NSMutableAttributedString *)output
|
|
52
|
+
start:(NSUInteger)start
|
|
53
|
+
end:(NSUInteger)end
|
|
54
|
+
currentDepth:(NSInteger)currentDepth
|
|
55
|
+
context:(RenderContext *)context
|
|
56
|
+
{
|
|
57
|
+
NSUInteger contentStart = start;
|
|
58
|
+
if (currentDepth == 0) {
|
|
59
|
+
contentStart += applyBlockSpacingBefore(output, start, [_config blockquoteMarginTop]);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// nested quotes pad their own box (matching web CSS padding)
|
|
63
|
+
CGFloat padding = [_config blockquotePadding];
|
|
64
|
+
NSUInteger topPadLength = 0;
|
|
65
|
+
NSUInteger bottomPadLength = 0;
|
|
66
|
+
if (padding > 0) {
|
|
67
|
+
NSMutableParagraphStyle *topSpacerStyle = [context spacerStyleWithHeight:padding spacing:0];
|
|
68
|
+
NSAttributedString *topSpacer = [[NSAttributedString alloc]
|
|
69
|
+
initWithString:@"\n"
|
|
70
|
+
attributes:@{NSParagraphStyleAttributeName : topSpacerStyle, BlockquoteSpacerAttributeName : @YES}];
|
|
71
|
+
[output insertAttributedString:topSpacer atIndex:contentStart];
|
|
72
|
+
topPadLength = 1;
|
|
73
|
+
|
|
74
|
+
NSUInteger bottomSpacerLocation = output.length;
|
|
75
|
+
[output appendAttributedString:kNewlineAttributedString];
|
|
76
|
+
NSMutableParagraphStyle *bottomSpacerStyle = [context spacerStyleWithHeight:padding spacing:0];
|
|
77
|
+
[output addAttributes:@{NSParagraphStyleAttributeName : bottomSpacerStyle, BlockquoteSpacerAttributeName : @YES}
|
|
78
|
+
range:NSMakeRange(bottomSpacerLocation, 1)];
|
|
79
|
+
bottomPadLength = 1;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
NSRange blockquoteRange = NSMakeRange(contentStart, (end - start) + topPadLength + bottomPadLength);
|
|
83
|
+
NSRange innerRange = NSMakeRange(contentStart + topPadLength, end - start);
|
|
84
|
+
CGFloat levelSpacing = [_config blockquoteBorderWidth] + [_config blockquoteGapWidth];
|
|
85
|
+
NSArray<NSDictionary *> *nestedInfo = [self collectNestedBlockquotes:output range:innerRange depth:currentDepth];
|
|
86
|
+
|
|
87
|
+
// Apply base styling (indentation, depth, background, line height)
|
|
88
|
+
[self applyBaseBlockquoteStyle:output
|
|
89
|
+
boxRange:blockquoteRange
|
|
90
|
+
innerRange:innerRange
|
|
91
|
+
depth:currentDepth
|
|
92
|
+
levelSpacing:levelSpacing
|
|
93
|
+
backgroundColor:[_config blockquoteBackgroundColor]
|
|
94
|
+
lineHeight:[_config blockquoteLineHeight]];
|
|
95
|
+
|
|
96
|
+
// Re-apply nested blockquote styles to restore their correct indentation
|
|
97
|
+
// (applyBaseBlockquoteStyle overwrites nested indents with the parent's indent)
|
|
98
|
+
[self reapplyNestedStyles:output nestedInfo:nestedInfo levelSpacing:levelSpacing];
|
|
99
|
+
|
|
100
|
+
if (currentDepth == 0) {
|
|
101
|
+
applyBlockSpacingAfter(output, [_config blockquoteMarginBottom]);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
#pragma mark - Nested Blockquote Handling
|
|
106
|
+
|
|
107
|
+
- (NSArray<NSDictionary *> *)collectNestedBlockquotes:(NSMutableAttributedString *)output
|
|
108
|
+
range:(NSRange)blockquoteRange
|
|
109
|
+
depth:(NSInteger)currentDepth
|
|
110
|
+
{
|
|
111
|
+
NSMutableArray<NSDictionary *> *nestedInfo = [NSMutableArray array];
|
|
112
|
+
|
|
113
|
+
[output
|
|
114
|
+
enumerateAttribute:BlockquoteDepthAttributeName
|
|
115
|
+
inRange:blockquoteRange
|
|
116
|
+
options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
|
|
117
|
+
usingBlock:^(id value, NSRange range, BOOL *stop) {
|
|
118
|
+
NSInteger depth = [value integerValue];
|
|
119
|
+
if (value && depth > currentDepth) {
|
|
120
|
+
[nestedInfo
|
|
121
|
+
addObject:@{kNestedInfoDepthKey : value, kNestedInfoRangeKey : [NSValue valueWithRange:range]}];
|
|
122
|
+
}
|
|
123
|
+
}];
|
|
124
|
+
|
|
125
|
+
return nestedInfo;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
- (void)applyBaseBlockquoteStyle:(NSMutableAttributedString *)output
|
|
129
|
+
boxRange:(NSRange)boxRange
|
|
130
|
+
innerRange:(NSRange)innerRange
|
|
131
|
+
depth:(NSInteger)currentDepth
|
|
132
|
+
levelSpacing:(CGFloat)levelSpacing
|
|
133
|
+
backgroundColor:(RCTUIColor *)backgroundColor
|
|
134
|
+
lineHeight:(CGFloat)lineHeight
|
|
135
|
+
{
|
|
136
|
+
CGFloat totalIndent = blockquoteIndentForDepth(currentDepth + 1, levelSpacing);
|
|
137
|
+
CGFloat padding = [_config blockquotePadding];
|
|
138
|
+
|
|
139
|
+
// Depth and background cover the whole box (incl. padding spacers) so the
|
|
140
|
+
// border and background render behind list content and the padding rows.
|
|
141
|
+
NSMutableDictionary *depthAttributes =
|
|
142
|
+
[NSMutableDictionary dictionaryWithObjectsAndKeys:@(currentDepth), BlockquoteDepthAttributeName, nil];
|
|
143
|
+
if (backgroundColor) {
|
|
144
|
+
depthAttributes[BlockquoteBackgroundColorAttributeName] = backgroundColor;
|
|
145
|
+
}
|
|
146
|
+
[output addAttributes:depthAttributes range:boxRange];
|
|
147
|
+
|
|
148
|
+
// List items bake the blockquote indent into their own paragraph style; only non-list content is stamped here.
|
|
149
|
+
[self enumerateNonListRangesIn:output
|
|
150
|
+
range:innerRange
|
|
151
|
+
usingBlock:^(NSRange nonListRange) {
|
|
152
|
+
NSMutableParagraphStyle *paragraphStyle =
|
|
153
|
+
getOrCreateParagraphStyle(output, nonListRange.location);
|
|
154
|
+
paragraphStyle.firstLineHeadIndent = totalIndent;
|
|
155
|
+
paragraphStyle.headIndent = totalIndent;
|
|
156
|
+
if (padding > 0) {
|
|
157
|
+
paragraphStyle.tailIndent = -padding;
|
|
158
|
+
}
|
|
159
|
+
[output addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:nonListRange];
|
|
160
|
+
applyLineHeight(output, nonListRange, lineHeight);
|
|
161
|
+
applyBaselineOffset(output, nonListRange);
|
|
162
|
+
}];
|
|
163
|
+
|
|
164
|
+
if (padding > 0) {
|
|
165
|
+
[self applyTailIndent:-padding toListRangesIn:output range:innerRange];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
- (void)applyTailIndent:(CGFloat)tailIndent toListRangesIn:(NSMutableAttributedString *)output range:(NSRange)range
|
|
170
|
+
{
|
|
171
|
+
[output enumerateAttribute:ListDepthAttribute
|
|
172
|
+
inRange:range
|
|
173
|
+
options:0
|
|
174
|
+
usingBlock:^(id value, NSRange listRange, BOOL *stop) {
|
|
175
|
+
if (!value) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
[output enumerateAttribute:NSParagraphStyleAttributeName
|
|
179
|
+
inRange:listRange
|
|
180
|
+
options:0
|
|
181
|
+
usingBlock:^(NSParagraphStyle *style, NSRange styleRange, BOOL *innerStop) {
|
|
182
|
+
NSMutableParagraphStyle *mutableStyle =
|
|
183
|
+
style ? [style mutableCopy] : [[NSMutableParagraphStyle alloc] init];
|
|
184
|
+
mutableStyle.tailIndent = tailIndent;
|
|
185
|
+
[output addAttribute:NSParagraphStyleAttributeName
|
|
186
|
+
value:mutableStyle
|
|
187
|
+
range:styleRange];
|
|
188
|
+
}];
|
|
189
|
+
}];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
- (void)reapplyNestedStyles:(NSMutableAttributedString *)output
|
|
193
|
+
nestedInfo:(NSArray<NSDictionary *> *)nestedInfo
|
|
194
|
+
levelSpacing:(CGFloat)levelSpacing
|
|
195
|
+
{
|
|
196
|
+
// Re-apply indentation to nested blockquotes since applyBaseBlockquoteStyle
|
|
197
|
+
// overwrote them with the parent's indentation
|
|
198
|
+
CGFloat padding = [_config blockquotePadding];
|
|
199
|
+
for (NSDictionary *info in nestedInfo) {
|
|
200
|
+
NSRange nestedRange = [info[kNestedInfoRangeKey] rangeValue];
|
|
201
|
+
NSInteger nestedDepth = [info[kNestedInfoDepthKey] integerValue];
|
|
202
|
+
CGFloat indent = blockquoteIndentForDepth(nestedDepth + 1, levelSpacing);
|
|
203
|
+
|
|
204
|
+
[output addAttribute:BlockquoteDepthAttributeName value:info[kNestedInfoDepthKey] range:nestedRange];
|
|
205
|
+
|
|
206
|
+
[self enumerateNonListRangesIn:output
|
|
207
|
+
range:nestedRange
|
|
208
|
+
usingBlock:^(NSRange nonListRange) {
|
|
209
|
+
NSMutableParagraphStyle *style = getOrCreateParagraphStyle(output, nonListRange.location);
|
|
210
|
+
style.firstLineHeadIndent = indent;
|
|
211
|
+
style.headIndent = indent;
|
|
212
|
+
style.tailIndent = padding > 0 ? -padding : 0;
|
|
213
|
+
[output addAttribute:NSParagraphStyleAttributeName value:style range:nonListRange];
|
|
214
|
+
}];
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
- (void)enumerateNonListRangesIn:(NSMutableAttributedString *)output
|
|
219
|
+
range:(NSRange)range
|
|
220
|
+
usingBlock:(void (^)(NSRange nonListRange))block
|
|
221
|
+
{
|
|
222
|
+
// List items — and code blocks nested inside them (which carry a list-derived
|
|
223
|
+
// indent instead of ListDepthAttribute) — already bake the correct indent in.
|
|
224
|
+
NSMutableArray<NSValue *> *listRanges = [NSMutableArray array];
|
|
225
|
+
void (^collectRanges)(NSString *) = ^(NSString *attribute) {
|
|
226
|
+
[output enumerateAttribute:attribute
|
|
227
|
+
inRange:range
|
|
228
|
+
options:0
|
|
229
|
+
usingBlock:^(id value, NSRange subRange, BOOL *stop) {
|
|
230
|
+
if (value) {
|
|
231
|
+
[listRanges addObject:[NSValue valueWithRange:subRange]];
|
|
232
|
+
}
|
|
233
|
+
}];
|
|
234
|
+
};
|
|
235
|
+
collectRanges(ListDepthAttribute);
|
|
236
|
+
collectRanges(CodeBlockIndentAttributeName);
|
|
237
|
+
collectRanges(BlockquoteSpacerAttributeName);
|
|
238
|
+
[listRanges sortUsingComparator:^NSComparisonResult(NSValue *a, NSValue *b) {
|
|
239
|
+
NSUInteger la = [a rangeValue].location;
|
|
240
|
+
NSUInteger lb = [b rangeValue].location;
|
|
241
|
+
return la < lb ? NSOrderedAscending : (la > lb ? NSOrderedDescending : NSOrderedSame);
|
|
242
|
+
}];
|
|
243
|
+
|
|
244
|
+
NSUInteger pos = range.location;
|
|
245
|
+
const NSUInteger end = NSMaxRange(range);
|
|
246
|
+
for (NSValue *val in listRanges) {
|
|
247
|
+
NSRange listRange = [val rangeValue];
|
|
248
|
+
if (pos < listRange.location) {
|
|
249
|
+
block(NSMakeRange(pos, listRange.location - pos));
|
|
250
|
+
}
|
|
251
|
+
pos = MAX(pos, NSMaxRange(listRange));
|
|
252
|
+
}
|
|
253
|
+
if (pos < end) {
|
|
254
|
+
block(NSMakeRange(pos, end - pos));
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
@end
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
#import "BaseRenderer.h"
|
|
3
|
-
|
|
4
|
-
NS_ASSUME_NONNULL_BEGIN
|
|
5
|
-
|
|
6
|
-
@interface CodeBlockRenderer : BaseRenderer
|
|
7
|
-
@end
|
|
8
|
-
|
|
9
|
-
NS_ASSUME_NONNULL_END
|
|
1
|
+
#pragma once
|
|
2
|
+
#import "BaseRenderer.h"
|
|
3
|
+
|
|
4
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
5
|
+
|
|
6
|
+
@interface CodeBlockRenderer : BaseRenderer
|
|
7
|
+
@end
|
|
8
|
+
|
|
9
|
+
NS_ASSUME_NONNULL_END
|