@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,133 +1,133 @@
|
|
|
1
|
-
package com.renderrichtext.renderer
|
|
2
|
-
|
|
3
|
-
import android.text.SpannableStringBuilder
|
|
4
|
-
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
-
import com.renderrichtext.spans.ListItemSpacingSpan
|
|
6
|
-
import com.renderrichtext.spans.MarginBottomSpan
|
|
7
|
-
import com.renderrichtext.spans.OrderedListSpan
|
|
8
|
-
import com.renderrichtext.styles.ListStyle
|
|
9
|
-
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
10
|
-
import com.renderrichtext.utils.text.span.applyLineHeightSkippingImages
|
|
11
|
-
import com.renderrichtext.utils.text.span.applyMarginTop
|
|
12
|
-
|
|
13
|
-
class ListRenderer(
|
|
14
|
-
private val config: RendererConfig,
|
|
15
|
-
private val isOrdered: Boolean,
|
|
16
|
-
) : NodeRenderer {
|
|
17
|
-
override fun render(
|
|
18
|
-
node: TiptapASTNode,
|
|
19
|
-
builder: SpannableStringBuilder,
|
|
20
|
-
onLinkPress: ((String) -> Unit)?,
|
|
21
|
-
onLinkLongPress: ((String) -> Unit)?,
|
|
22
|
-
onFactoidPress: ((String) -> Unit)?,
|
|
23
|
-
factory: RendererFactory,
|
|
24
|
-
) {
|
|
25
|
-
val start = builder.length
|
|
26
|
-
val listStyle = config.style.listStyle
|
|
27
|
-
val listType = if (isOrdered) BlockStyleContext.ListType.ORDERED else BlockStyleContext.ListType.UNORDERED
|
|
28
|
-
|
|
29
|
-
val startNumber =
|
|
30
|
-
if (isOrdered) {
|
|
31
|
-
node.getAttribute("start")?.toIntOrNull()?.coerceAtLeast(0) ?: 1
|
|
32
|
-
} else {
|
|
33
|
-
1
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
val markerExtraWidth = if (isOrdered) markerExtraWidth(node, listStyle, startNumber, factory) else 0f
|
|
37
|
-
val contextManager = ListContextManager(factory.blockStyleContext)
|
|
38
|
-
val entryState = contextManager.enterList(listType, listStyle, startNumber, markerExtraWidth)
|
|
39
|
-
|
|
40
|
-
// For top-level lists, insert marginTop spacer before rendering content
|
|
41
|
-
if (entryState.previousDepth == 0) {
|
|
42
|
-
applyMarginTop(builder, start, listStyle.marginTop)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Track start index after the potential 1-character marginTop spacer
|
|
46
|
-
val contentStart = if (entryState.previousDepth == 0 && listStyle.marginTop > 0) start + 1 else start
|
|
47
|
-
|
|
48
|
-
// Ensure nested lists start on a new line if the parent hasn't provided one
|
|
49
|
-
if (entryState.previousDepth > 0 && builder.isNotEmpty() && builder.last() != '\n') {
|
|
50
|
-
builder.append("\n")
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
try {
|
|
54
|
-
factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress)
|
|
55
|
-
} finally {
|
|
56
|
-
contextManager.exitList(entryState)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (builder.length > contentStart) {
|
|
60
|
-
applyListSpacing(builder, contentStart, entryState.previousDepth, listStyle, factory.blockStyleContext)
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/** Lists under 100 keep the `99.` column, so only numbers from 100 on widen it. Task items draw a checkbox. */
|
|
65
|
-
private fun markerExtraWidth(
|
|
66
|
-
node: TiptapASTNode,
|
|
67
|
-
listStyle: ListStyle,
|
|
68
|
-
startNumber: Int,
|
|
69
|
-
factory: RendererFactory,
|
|
70
|
-
): Float {
|
|
71
|
-
val wideNumbers = mutableListOf<Int>()
|
|
72
|
-
var number = startNumber
|
|
73
|
-
for (item in node.children) {
|
|
74
|
-
if (item.type != TiptapASTNode.NodeType.ListItem) continue
|
|
75
|
-
if (number >= 100 && item.attributes["isTask"] != "true") wideNumbers += number
|
|
76
|
-
number++
|
|
77
|
-
}
|
|
78
|
-
return OrderedListSpan.measureExtraWidth(listStyle, factory.context, wideNumbers)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
private fun applyListSpacing(
|
|
82
|
-
builder: SpannableStringBuilder,
|
|
83
|
-
start: Int,
|
|
84
|
-
depth: Int,
|
|
85
|
-
style: ListStyle,
|
|
86
|
-
styleContext: BlockStyleContext,
|
|
87
|
-
) {
|
|
88
|
-
// TODO: LineHeightSpan may also clip superscript/subscript glyphs that extend
|
|
89
|
-
// outside the normal line bounds. A similar "skip" strategy as for images may
|
|
90
|
-
// be needed here once super/subscript usage in practice is better understood.
|
|
91
|
-
applyLineHeightSkippingImages(builder, start, builder.length, style.lineHeight)
|
|
92
|
-
|
|
93
|
-
// Item spacing and external bottom margin are only handled by the root-level list
|
|
94
|
-
if (depth == 0) {
|
|
95
|
-
applyItemSpacing(builder, start, style.itemSpacing, styleContext)
|
|
96
|
-
|
|
97
|
-
builder.append("\n")
|
|
98
|
-
builder.setSpan(
|
|
99
|
-
MarginBottomSpan(style.marginBottom),
|
|
100
|
-
builder.length - 1,
|
|
101
|
-
builder.length,
|
|
102
|
-
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
103
|
-
)
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Inserts the vertical gap between consecutive items (including nested ones)
|
|
108
|
-
// by spanning the newline that precedes each item start. The first item of
|
|
109
|
-
// the root list gets no spacing above it.
|
|
110
|
-
private fun applyItemSpacing(
|
|
111
|
-
builder: SpannableStringBuilder,
|
|
112
|
-
start: Int,
|
|
113
|
-
itemSpacing: Float,
|
|
114
|
-
styleContext: BlockStyleContext,
|
|
115
|
-
) {
|
|
116
|
-
if (itemSpacing <= 0f) return
|
|
117
|
-
|
|
118
|
-
val itemStarts =
|
|
119
|
-
styleContext.listItemStarts
|
|
120
|
-
.filter { it in start until builder.length }
|
|
121
|
-
.distinct()
|
|
122
|
-
.sorted()
|
|
123
|
-
|
|
124
|
-
for (itemStart in itemStarts.drop(1)) {
|
|
125
|
-
builder.setSpan(
|
|
126
|
-
ListItemSpacingSpan(itemSpacing),
|
|
127
|
-
itemStart - 1,
|
|
128
|
-
itemStart,
|
|
129
|
-
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
130
|
-
)
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
+
import com.renderrichtext.spans.ListItemSpacingSpan
|
|
6
|
+
import com.renderrichtext.spans.MarginBottomSpan
|
|
7
|
+
import com.renderrichtext.spans.OrderedListSpan
|
|
8
|
+
import com.renderrichtext.styles.ListStyle
|
|
9
|
+
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
10
|
+
import com.renderrichtext.utils.text.span.applyLineHeightSkippingImages
|
|
11
|
+
import com.renderrichtext.utils.text.span.applyMarginTop
|
|
12
|
+
|
|
13
|
+
class ListRenderer(
|
|
14
|
+
private val config: RendererConfig,
|
|
15
|
+
private val isOrdered: Boolean,
|
|
16
|
+
) : NodeRenderer {
|
|
17
|
+
override fun render(
|
|
18
|
+
node: TiptapASTNode,
|
|
19
|
+
builder: SpannableStringBuilder,
|
|
20
|
+
onLinkPress: ((String) -> Unit)?,
|
|
21
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
22
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
23
|
+
factory: RendererFactory,
|
|
24
|
+
) {
|
|
25
|
+
val start = builder.length
|
|
26
|
+
val listStyle = config.style.listStyle
|
|
27
|
+
val listType = if (isOrdered) BlockStyleContext.ListType.ORDERED else BlockStyleContext.ListType.UNORDERED
|
|
28
|
+
|
|
29
|
+
val startNumber =
|
|
30
|
+
if (isOrdered) {
|
|
31
|
+
node.getAttribute("start")?.toIntOrNull()?.coerceAtLeast(0) ?: 1
|
|
32
|
+
} else {
|
|
33
|
+
1
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
val markerExtraWidth = if (isOrdered) markerExtraWidth(node, listStyle, startNumber, factory) else 0f
|
|
37
|
+
val contextManager = ListContextManager(factory.blockStyleContext)
|
|
38
|
+
val entryState = contextManager.enterList(listType, listStyle, startNumber, markerExtraWidth)
|
|
39
|
+
|
|
40
|
+
// For top-level lists, insert marginTop spacer before rendering content
|
|
41
|
+
if (entryState.previousDepth == 0) {
|
|
42
|
+
applyMarginTop(builder, start, listStyle.marginTop)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Track start index after the potential 1-character marginTop spacer
|
|
46
|
+
val contentStart = if (entryState.previousDepth == 0 && listStyle.marginTop > 0) start + 1 else start
|
|
47
|
+
|
|
48
|
+
// Ensure nested lists start on a new line if the parent hasn't provided one
|
|
49
|
+
if (entryState.previousDepth > 0 && builder.isNotEmpty() && builder.last() != '\n') {
|
|
50
|
+
builder.append("\n")
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress)
|
|
55
|
+
} finally {
|
|
56
|
+
contextManager.exitList(entryState)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (builder.length > contentStart) {
|
|
60
|
+
applyListSpacing(builder, contentStart, entryState.previousDepth, listStyle, factory.blockStyleContext)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Lists under 100 keep the `99.` column, so only numbers from 100 on widen it. Task items draw a checkbox. */
|
|
65
|
+
private fun markerExtraWidth(
|
|
66
|
+
node: TiptapASTNode,
|
|
67
|
+
listStyle: ListStyle,
|
|
68
|
+
startNumber: Int,
|
|
69
|
+
factory: RendererFactory,
|
|
70
|
+
): Float {
|
|
71
|
+
val wideNumbers = mutableListOf<Int>()
|
|
72
|
+
var number = startNumber
|
|
73
|
+
for (item in node.children) {
|
|
74
|
+
if (item.type != TiptapASTNode.NodeType.ListItem) continue
|
|
75
|
+
if (number >= 100 && item.attributes["isTask"] != "true") wideNumbers += number
|
|
76
|
+
number++
|
|
77
|
+
}
|
|
78
|
+
return OrderedListSpan.measureExtraWidth(listStyle, factory.context, wideNumbers)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private fun applyListSpacing(
|
|
82
|
+
builder: SpannableStringBuilder,
|
|
83
|
+
start: Int,
|
|
84
|
+
depth: Int,
|
|
85
|
+
style: ListStyle,
|
|
86
|
+
styleContext: BlockStyleContext,
|
|
87
|
+
) {
|
|
88
|
+
// TODO: LineHeightSpan may also clip superscript/subscript glyphs that extend
|
|
89
|
+
// outside the normal line bounds. A similar "skip" strategy as for images may
|
|
90
|
+
// be needed here once super/subscript usage in practice is better understood.
|
|
91
|
+
applyLineHeightSkippingImages(builder, start, builder.length, style.lineHeight)
|
|
92
|
+
|
|
93
|
+
// Item spacing and external bottom margin are only handled by the root-level list
|
|
94
|
+
if (depth == 0) {
|
|
95
|
+
applyItemSpacing(builder, start, style.itemSpacing, styleContext)
|
|
96
|
+
|
|
97
|
+
builder.append("\n")
|
|
98
|
+
builder.setSpan(
|
|
99
|
+
MarginBottomSpan(style.marginBottom),
|
|
100
|
+
builder.length - 1,
|
|
101
|
+
builder.length,
|
|
102
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
103
|
+
)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Inserts the vertical gap between consecutive items (including nested ones)
|
|
108
|
+
// by spanning the newline that precedes each item start. The first item of
|
|
109
|
+
// the root list gets no spacing above it.
|
|
110
|
+
private fun applyItemSpacing(
|
|
111
|
+
builder: SpannableStringBuilder,
|
|
112
|
+
start: Int,
|
|
113
|
+
itemSpacing: Float,
|
|
114
|
+
styleContext: BlockStyleContext,
|
|
115
|
+
) {
|
|
116
|
+
if (itemSpacing <= 0f) return
|
|
117
|
+
|
|
118
|
+
val itemStarts =
|
|
119
|
+
styleContext.listItemStarts
|
|
120
|
+
.filter { it in start until builder.length }
|
|
121
|
+
.distinct()
|
|
122
|
+
.sorted()
|
|
123
|
+
|
|
124
|
+
for (itemStart in itemStarts.drop(1)) {
|
|
125
|
+
builder.setSpan(
|
|
126
|
+
ListItemSpacingSpan(itemSpacing),
|
|
127
|
+
itemStart - 1,
|
|
128
|
+
itemStart,
|
|
129
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
package com.renderrichtext.renderer
|
|
2
|
-
|
|
3
|
-
import android.text.SpannableStringBuilder
|
|
4
|
-
import com.facebook.react.uimanager.PixelUtil
|
|
5
|
-
import com.renderrichtext.parser.TiptapASTNode
|
|
6
|
-
import com.renderrichtext.spans.MentionChipSpan
|
|
7
|
-
import com.renderrichtext.spans.MentionSpan
|
|
8
|
-
import com.renderrichtext.spans.TextSpan
|
|
9
|
-
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Tiptap mention atom. The node has no children; the visible text is `@` plus
|
|
13
|
-
* `label`, or `id` when `label` is blank. That is the suggestion character the
|
|
14
|
-
* Mention extension inserts.
|
|
15
|
-
*
|
|
16
|
-
* Weight is medium (`500`), the Android face used for a name inside body text.
|
|
17
|
-
* iOS uses semibold for the same role.
|
|
18
|
-
*/
|
|
19
|
-
class MentionRenderer(
|
|
20
|
-
private val config: RendererConfig,
|
|
21
|
-
) : NodeRenderer {
|
|
22
|
-
override fun render(
|
|
23
|
-
node: TiptapASTNode,
|
|
24
|
-
builder: SpannableStringBuilder,
|
|
25
|
-
onLinkPress: ((String) -> Unit)?,
|
|
26
|
-
onLinkLongPress: ((String) -> Unit)?,
|
|
27
|
-
onFactoidPress: ((String) -> Unit)?,
|
|
28
|
-
factory: RendererFactory,
|
|
29
|
-
) {
|
|
30
|
-
val mentionId = node.getAttribute("id").orEmpty()
|
|
31
|
-
val label = node.getAttribute("label").orEmpty()
|
|
32
|
-
val name = label.ifBlank { mentionId }
|
|
33
|
-
val text = "@$name"
|
|
34
|
-
val mentionStyle = config.style.mentionStyle
|
|
35
|
-
val block = factory.blockStyleContext.currentBlockStyleOrNull()
|
|
36
|
-
val fontSize = block?.fontSize ?: config.style.paragraphStyle.fontSize
|
|
37
|
-
val fontFamily = block?.fontFamily ?: config.style.paragraphStyle.fontFamily
|
|
38
|
-
|
|
39
|
-
val start = builder.length
|
|
40
|
-
builder.append(text)
|
|
41
|
-
val end = builder.length
|
|
42
|
-
builder.setSpan(
|
|
43
|
-
TextSpan(
|
|
44
|
-
BlockStyle(
|
|
45
|
-
fontSize = fontSize,
|
|
46
|
-
fontFamily = fontFamily,
|
|
47
|
-
fontWeight = "500",
|
|
48
|
-
color = mentionStyle.color,
|
|
49
|
-
),
|
|
50
|
-
factory.context,
|
|
51
|
-
),
|
|
52
|
-
start,
|
|
53
|
-
end,
|
|
54
|
-
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
55
|
-
)
|
|
56
|
-
builder.setSpan(
|
|
57
|
-
MentionSpan(
|
|
58
|
-
mentionId,
|
|
59
|
-
label,
|
|
60
|
-
mentionStyle.color,
|
|
61
|
-
factory.onMentionPress,
|
|
62
|
-
factory.onMentionLongPress,
|
|
63
|
-
),
|
|
64
|
-
start,
|
|
65
|
-
end,
|
|
66
|
-
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
67
|
-
)
|
|
68
|
-
builder.setSpan(
|
|
69
|
-
MentionChipSpan(
|
|
70
|
-
backgroundColor = mentionStyle.backgroundColor,
|
|
71
|
-
textColor = mentionStyle.color,
|
|
72
|
-
paddingX = PixelUtil.toPixelFromDIP(PADDING_X_DP),
|
|
73
|
-
paddingY = PixelUtil.toPixelFromDIP(PADDING_Y_DP),
|
|
74
|
-
),
|
|
75
|
-
start,
|
|
76
|
-
end,
|
|
77
|
-
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
78
|
-
)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
companion object {
|
|
82
|
-
private const val PADDING_X_DP = 3f
|
|
83
|
-
private const val PADDING_Y_DP = 1f
|
|
84
|
-
}
|
|
85
|
-
}
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import com.facebook.react.uimanager.PixelUtil
|
|
5
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
6
|
+
import com.renderrichtext.spans.MentionChipSpan
|
|
7
|
+
import com.renderrichtext.spans.MentionSpan
|
|
8
|
+
import com.renderrichtext.spans.TextSpan
|
|
9
|
+
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Tiptap mention atom. The node has no children; the visible text is `@` plus
|
|
13
|
+
* `label`, or `id` when `label` is blank. That is the suggestion character the
|
|
14
|
+
* Mention extension inserts.
|
|
15
|
+
*
|
|
16
|
+
* Weight is medium (`500`), the Android face used for a name inside body text.
|
|
17
|
+
* iOS uses semibold for the same role.
|
|
18
|
+
*/
|
|
19
|
+
class MentionRenderer(
|
|
20
|
+
private val config: RendererConfig,
|
|
21
|
+
) : NodeRenderer {
|
|
22
|
+
override fun render(
|
|
23
|
+
node: TiptapASTNode,
|
|
24
|
+
builder: SpannableStringBuilder,
|
|
25
|
+
onLinkPress: ((String) -> Unit)?,
|
|
26
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
27
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
28
|
+
factory: RendererFactory,
|
|
29
|
+
) {
|
|
30
|
+
val mentionId = node.getAttribute("id").orEmpty()
|
|
31
|
+
val label = node.getAttribute("label").orEmpty()
|
|
32
|
+
val name = label.ifBlank { mentionId }
|
|
33
|
+
val text = "@$name"
|
|
34
|
+
val mentionStyle = config.style.mentionStyle
|
|
35
|
+
val block = factory.blockStyleContext.currentBlockStyleOrNull()
|
|
36
|
+
val fontSize = block?.fontSize ?: config.style.paragraphStyle.fontSize
|
|
37
|
+
val fontFamily = block?.fontFamily ?: config.style.paragraphStyle.fontFamily
|
|
38
|
+
|
|
39
|
+
val start = builder.length
|
|
40
|
+
builder.append(text)
|
|
41
|
+
val end = builder.length
|
|
42
|
+
builder.setSpan(
|
|
43
|
+
TextSpan(
|
|
44
|
+
BlockStyle(
|
|
45
|
+
fontSize = fontSize,
|
|
46
|
+
fontFamily = fontFamily,
|
|
47
|
+
fontWeight = "500",
|
|
48
|
+
color = mentionStyle.color,
|
|
49
|
+
),
|
|
50
|
+
factory.context,
|
|
51
|
+
),
|
|
52
|
+
start,
|
|
53
|
+
end,
|
|
54
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
55
|
+
)
|
|
56
|
+
builder.setSpan(
|
|
57
|
+
MentionSpan(
|
|
58
|
+
mentionId,
|
|
59
|
+
label,
|
|
60
|
+
mentionStyle.color,
|
|
61
|
+
factory.onMentionPress,
|
|
62
|
+
factory.onMentionLongPress,
|
|
63
|
+
),
|
|
64
|
+
start,
|
|
65
|
+
end,
|
|
66
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
67
|
+
)
|
|
68
|
+
builder.setSpan(
|
|
69
|
+
MentionChipSpan(
|
|
70
|
+
backgroundColor = mentionStyle.backgroundColor,
|
|
71
|
+
textColor = mentionStyle.color,
|
|
72
|
+
paddingX = PixelUtil.toPixelFromDIP(PADDING_X_DP),
|
|
73
|
+
paddingY = PixelUtil.toPixelFromDIP(PADDING_Y_DP),
|
|
74
|
+
),
|
|
75
|
+
start,
|
|
76
|
+
end,
|
|
77
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
companion object {
|
|
82
|
+
private const val PADDING_X_DP = 3f
|
|
83
|
+
private const val PADDING_Y_DP = 1f
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -1,91 +1,91 @@
|
|
|
1
|
-
package com.renderrichtext.renderer
|
|
2
|
-
|
|
3
|
-
import android.text.SpannableStringBuilder
|
|
4
|
-
import android.text.style.AlignmentSpan
|
|
5
|
-
import com.renderrichtext.parser.TiptapASTNode
|
|
6
|
-
import com.renderrichtext.styles.ParagraphStyle
|
|
7
|
-
import com.renderrichtext.utils.text.extensions.containsBlockImage
|
|
8
|
-
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
9
|
-
import com.renderrichtext.utils.text.span.applyLineHeightSkippingImages
|
|
10
|
-
import com.renderrichtext.utils.text.span.applyMarginBottom
|
|
11
|
-
import com.renderrichtext.utils.text.span.applyMarginTop
|
|
12
|
-
|
|
13
|
-
class ParagraphRenderer(
|
|
14
|
-
private val config: RendererConfig,
|
|
15
|
-
) : NodeRenderer {
|
|
16
|
-
override fun render(
|
|
17
|
-
node: TiptapASTNode,
|
|
18
|
-
builder: SpannableStringBuilder,
|
|
19
|
-
onLinkPress: ((String) -> Unit)?,
|
|
20
|
-
onLinkLongPress: ((String) -> Unit)?,
|
|
21
|
-
onFactoidPress: ((String) -> Unit)?,
|
|
22
|
-
factory: RendererFactory,
|
|
23
|
-
) {
|
|
24
|
-
val context = factory.blockStyleContext
|
|
25
|
-
|
|
26
|
-
// Inside a list, render tight with a single newline - lists own their item spacing.
|
|
27
|
-
if (context.listDepth > 0) {
|
|
28
|
-
factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress)
|
|
29
|
-
builder.append("\n")
|
|
30
|
-
return
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
val start = builder.length
|
|
34
|
-
val style = config.style.paragraphStyle
|
|
35
|
-
|
|
36
|
-
// Inside a blockquote, keep the quote's block style (font/color) and line height
|
|
37
|
-
// - applied by BlockquoteTextRenderer.postProcess - but still emit block margins so
|
|
38
|
-
// spacing between blocks matches the top-level document (a heading defaults to
|
|
39
|
-
// marginTop 0, so the gap before it comes from the preceding paragraph's marginBottom).
|
|
40
|
-
if (context.blockquoteDepth > 0) {
|
|
41
|
-
factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress)
|
|
42
|
-
if (builder.length > start) {
|
|
43
|
-
val marginTop = if (node.containsBlockImage()) config.style.imageStyle.marginTop else style.marginTop
|
|
44
|
-
applyMarginTop(builder, start, marginTop)
|
|
45
|
-
val marginBottom = if (node.containsBlockImage()) config.style.imageStyle.marginBottom else style.marginBottom
|
|
46
|
-
applyMarginBottom(builder, marginBottom)
|
|
47
|
-
}
|
|
48
|
-
return
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
context.setParagraphStyle(style)
|
|
52
|
-
try {
|
|
53
|
-
factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress)
|
|
54
|
-
} finally {
|
|
55
|
-
context.popBlockStyle()
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (builder.length > start) {
|
|
59
|
-
builder.applySpans(node, style, start)
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
private fun SpannableStringBuilder.applySpans(
|
|
64
|
-
node: TiptapASTNode,
|
|
65
|
-
style: ParagraphStyle,
|
|
66
|
-
start: Int,
|
|
67
|
-
) {
|
|
68
|
-
val end = length
|
|
69
|
-
|
|
70
|
-
// TODO: LineHeightSpan may also clip superscript/subscript glyphs that extend
|
|
71
|
-
// outside the normal line bounds. A similar "skip" strategy as for images may
|
|
72
|
-
// be needed here once super/subscript usage in practice is better understood.
|
|
73
|
-
applyLineHeightSkippingImages(this, start, end, style.lineHeight)
|
|
74
|
-
|
|
75
|
-
// Only apply AlignmentSpan for non-default alignments (Center/Right)
|
|
76
|
-
if (style.textAlign.needsAlignmentSpan) {
|
|
77
|
-
setSpan(
|
|
78
|
-
AlignmentSpan.Standard(style.textAlign.layoutAlignment),
|
|
79
|
-
start,
|
|
80
|
-
end,
|
|
81
|
-
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
82
|
-
)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
val marginTop = if (node.containsBlockImage()) config.style.imageStyle.marginTop else style.marginTop
|
|
86
|
-
applyMarginTop(this, start, marginTop)
|
|
87
|
-
|
|
88
|
-
val marginBottom = if (node.containsBlockImage()) config.style.imageStyle.marginBottom else style.marginBottom
|
|
89
|
-
applyMarginBottom(this, marginBottom)
|
|
90
|
-
}
|
|
91
|
-
}
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import android.text.style.AlignmentSpan
|
|
5
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
6
|
+
import com.renderrichtext.styles.ParagraphStyle
|
|
7
|
+
import com.renderrichtext.utils.text.extensions.containsBlockImage
|
|
8
|
+
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
9
|
+
import com.renderrichtext.utils.text.span.applyLineHeightSkippingImages
|
|
10
|
+
import com.renderrichtext.utils.text.span.applyMarginBottom
|
|
11
|
+
import com.renderrichtext.utils.text.span.applyMarginTop
|
|
12
|
+
|
|
13
|
+
class ParagraphRenderer(
|
|
14
|
+
private val config: RendererConfig,
|
|
15
|
+
) : NodeRenderer {
|
|
16
|
+
override fun render(
|
|
17
|
+
node: TiptapASTNode,
|
|
18
|
+
builder: SpannableStringBuilder,
|
|
19
|
+
onLinkPress: ((String) -> Unit)?,
|
|
20
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
21
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
22
|
+
factory: RendererFactory,
|
|
23
|
+
) {
|
|
24
|
+
val context = factory.blockStyleContext
|
|
25
|
+
|
|
26
|
+
// Inside a list, render tight with a single newline - lists own their item spacing.
|
|
27
|
+
if (context.listDepth > 0) {
|
|
28
|
+
factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress)
|
|
29
|
+
builder.append("\n")
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
val start = builder.length
|
|
34
|
+
val style = config.style.paragraphStyle
|
|
35
|
+
|
|
36
|
+
// Inside a blockquote, keep the quote's block style (font/color) and line height
|
|
37
|
+
// - applied by BlockquoteTextRenderer.postProcess - but still emit block margins so
|
|
38
|
+
// spacing between blocks matches the top-level document (a heading defaults to
|
|
39
|
+
// marginTop 0, so the gap before it comes from the preceding paragraph's marginBottom).
|
|
40
|
+
if (context.blockquoteDepth > 0) {
|
|
41
|
+
factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress)
|
|
42
|
+
if (builder.length > start) {
|
|
43
|
+
val marginTop = if (node.containsBlockImage()) config.style.imageStyle.marginTop else style.marginTop
|
|
44
|
+
applyMarginTop(builder, start, marginTop)
|
|
45
|
+
val marginBottom = if (node.containsBlockImage()) config.style.imageStyle.marginBottom else style.marginBottom
|
|
46
|
+
applyMarginBottom(builder, marginBottom)
|
|
47
|
+
}
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
context.setParagraphStyle(style)
|
|
52
|
+
try {
|
|
53
|
+
factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress)
|
|
54
|
+
} finally {
|
|
55
|
+
context.popBlockStyle()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (builder.length > start) {
|
|
59
|
+
builder.applySpans(node, style, start)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private fun SpannableStringBuilder.applySpans(
|
|
64
|
+
node: TiptapASTNode,
|
|
65
|
+
style: ParagraphStyle,
|
|
66
|
+
start: Int,
|
|
67
|
+
) {
|
|
68
|
+
val end = length
|
|
69
|
+
|
|
70
|
+
// TODO: LineHeightSpan may also clip superscript/subscript glyphs that extend
|
|
71
|
+
// outside the normal line bounds. A similar "skip" strategy as for images may
|
|
72
|
+
// be needed here once super/subscript usage in practice is better understood.
|
|
73
|
+
applyLineHeightSkippingImages(this, start, end, style.lineHeight)
|
|
74
|
+
|
|
75
|
+
// Only apply AlignmentSpan for non-default alignments (Center/Right)
|
|
76
|
+
if (style.textAlign.needsAlignmentSpan) {
|
|
77
|
+
setSpan(
|
|
78
|
+
AlignmentSpan.Standard(style.textAlign.layoutAlignment),
|
|
79
|
+
start,
|
|
80
|
+
end,
|
|
81
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
val marginTop = if (node.containsBlockImage()) config.style.imageStyle.marginTop else style.marginTop
|
|
86
|
+
applyMarginTop(this, start, marginTop)
|
|
87
|
+
|
|
88
|
+
val marginBottom = if (node.containsBlockImage()) config.style.imageStyle.marginBottom else style.marginBottom
|
|
89
|
+
applyMarginBottom(this, marginBottom)
|
|
90
|
+
}
|
|
91
|
+
}
|