@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,28 +1,28 @@
|
|
|
1
|
-
package com.renderrichtext.renderer
|
|
2
|
-
|
|
3
|
-
import android.text.SpannableStringBuilder
|
|
4
|
-
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
-
import com.renderrichtext.spans.StrikethroughSpan
|
|
6
|
-
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
-
|
|
8
|
-
class StrikethroughRenderer(
|
|
9
|
-
private val config: RendererConfig,
|
|
10
|
-
) : NodeRenderer {
|
|
11
|
-
override fun render(
|
|
12
|
-
node: TiptapASTNode,
|
|
13
|
-
builder: SpannableStringBuilder,
|
|
14
|
-
onLinkPress: ((String) -> Unit)?,
|
|
15
|
-
onLinkLongPress: ((String) -> Unit)?,
|
|
16
|
-
onFactoidPress: ((String) -> Unit)?,
|
|
17
|
-
factory: RendererFactory,
|
|
18
|
-
) {
|
|
19
|
-
factory.renderWithSpan(builder, { factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress) }) { start, end, blockStyle ->
|
|
20
|
-
builder.setSpan(
|
|
21
|
-
StrikethroughSpan(factory.styleCache.strikethroughColor),
|
|
22
|
-
start,
|
|
23
|
-
end,
|
|
24
|
-
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
25
|
-
)
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
+
import com.renderrichtext.spans.StrikethroughSpan
|
|
6
|
+
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
+
|
|
8
|
+
class StrikethroughRenderer(
|
|
9
|
+
private val config: RendererConfig,
|
|
10
|
+
) : NodeRenderer {
|
|
11
|
+
override fun render(
|
|
12
|
+
node: TiptapASTNode,
|
|
13
|
+
builder: SpannableStringBuilder,
|
|
14
|
+
onLinkPress: ((String) -> Unit)?,
|
|
15
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
16
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
17
|
+
factory: RendererFactory,
|
|
18
|
+
) {
|
|
19
|
+
factory.renderWithSpan(builder, { factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress) }) { start, end, blockStyle ->
|
|
20
|
+
builder.setSpan(
|
|
21
|
+
StrikethroughSpan(factory.styleCache.strikethroughColor),
|
|
22
|
+
start,
|
|
23
|
+
end,
|
|
24
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
package com.renderrichtext.renderer
|
|
2
|
-
|
|
3
|
-
import android.text.SpannableStringBuilder
|
|
4
|
-
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
-
import com.renderrichtext.spans.StrongSpan
|
|
6
|
-
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
-
|
|
8
|
-
class StrongRenderer(
|
|
9
|
-
private val config: RendererConfig,
|
|
10
|
-
) : NodeRenderer {
|
|
11
|
-
override fun render(
|
|
12
|
-
node: TiptapASTNode,
|
|
13
|
-
builder: SpannableStringBuilder,
|
|
14
|
-
onLinkPress: ((String) -> Unit)?,
|
|
15
|
-
onLinkLongPress: ((String) -> Unit)?,
|
|
16
|
-
onFactoidPress: ((String) -> Unit)?,
|
|
17
|
-
factory: RendererFactory,
|
|
18
|
-
) {
|
|
19
|
-
factory.renderWithSpan(builder, { factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress) }) { start, end, blockStyle ->
|
|
20
|
-
builder.setSpan(
|
|
21
|
-
StrongSpan(factory.styleCache, blockStyle),
|
|
22
|
-
start,
|
|
23
|
-
end,
|
|
24
|
-
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
25
|
-
)
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
+
import com.renderrichtext.spans.StrongSpan
|
|
6
|
+
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
+
|
|
8
|
+
class StrongRenderer(
|
|
9
|
+
private val config: RendererConfig,
|
|
10
|
+
) : NodeRenderer {
|
|
11
|
+
override fun render(
|
|
12
|
+
node: TiptapASTNode,
|
|
13
|
+
builder: SpannableStringBuilder,
|
|
14
|
+
onLinkPress: ((String) -> Unit)?,
|
|
15
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
16
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
17
|
+
factory: RendererFactory,
|
|
18
|
+
) {
|
|
19
|
+
factory.renderWithSpan(builder, { factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress) }) { start, end, blockStyle ->
|
|
20
|
+
builder.setSpan(
|
|
21
|
+
StrongSpan(factory.styleCache, blockStyle),
|
|
22
|
+
start,
|
|
23
|
+
end,
|
|
24
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
package com.renderrichtext.renderer
|
|
2
|
-
|
|
3
|
-
import android.text.SpannableStringBuilder
|
|
4
|
-
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
-
import com.renderrichtext.spans.TextSpan
|
|
6
|
-
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
-
|
|
8
|
-
class TextRenderer : NodeRenderer {
|
|
9
|
-
override fun render(
|
|
10
|
-
node: TiptapASTNode,
|
|
11
|
-
builder: SpannableStringBuilder,
|
|
12
|
-
onLinkPress: ((String) -> Unit)?,
|
|
13
|
-
onLinkLongPress: ((String) -> Unit)?,
|
|
14
|
-
onFactoidPress: ((String) -> Unit)?,
|
|
15
|
-
factory: RendererFactory,
|
|
16
|
-
) {
|
|
17
|
-
val content = node.content
|
|
18
|
-
if (content.isEmpty()) return
|
|
19
|
-
|
|
20
|
-
val blockType = factory.blockStyleContext.currentBlockType
|
|
21
|
-
|
|
22
|
-
factory.renderWithSpan(builder, { builder.append(content) }) { start, end, blockStyle ->
|
|
23
|
-
builder.setSpan(
|
|
24
|
-
TextSpan(blockStyle, factory.context),
|
|
25
|
-
start,
|
|
26
|
-
end,
|
|
27
|
-
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
28
|
-
)
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
+
import com.renderrichtext.spans.TextSpan
|
|
6
|
+
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
+
|
|
8
|
+
class TextRenderer : NodeRenderer {
|
|
9
|
+
override fun render(
|
|
10
|
+
node: TiptapASTNode,
|
|
11
|
+
builder: SpannableStringBuilder,
|
|
12
|
+
onLinkPress: ((String) -> Unit)?,
|
|
13
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
14
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
15
|
+
factory: RendererFactory,
|
|
16
|
+
) {
|
|
17
|
+
val content = node.content
|
|
18
|
+
if (content.isEmpty()) return
|
|
19
|
+
|
|
20
|
+
val blockType = factory.blockStyleContext.currentBlockType
|
|
21
|
+
|
|
22
|
+
factory.renderWithSpan(builder, { builder.append(content) }) { start, end, blockStyle ->
|
|
23
|
+
builder.setSpan(
|
|
24
|
+
TextSpan(blockStyle, factory.context),
|
|
25
|
+
start,
|
|
26
|
+
end,
|
|
27
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
package com.renderrichtext.renderer
|
|
2
|
-
|
|
3
|
-
import android.text.SpannableStringBuilder
|
|
4
|
-
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
-
import com.renderrichtext.spans.ThematicBreakSpan
|
|
6
|
-
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
-
|
|
8
|
-
class ThematicBreakRenderer(
|
|
9
|
-
private val config: RendererConfig,
|
|
10
|
-
) : NodeRenderer {
|
|
11
|
-
override fun render(
|
|
12
|
-
node: TiptapASTNode,
|
|
13
|
-
builder: SpannableStringBuilder,
|
|
14
|
-
onLinkPress: ((String) -> Unit)?,
|
|
15
|
-
onLinkLongPress: ((String) -> Unit)?,
|
|
16
|
-
onFactoidPress: ((String) -> Unit)?,
|
|
17
|
-
factory: RendererFactory,
|
|
18
|
-
) {
|
|
19
|
-
builder.ensureNewline()
|
|
20
|
-
|
|
21
|
-
val start = builder.length
|
|
22
|
-
|
|
23
|
-
builder.append(" \n")
|
|
24
|
-
val end = builder.length
|
|
25
|
-
|
|
26
|
-
val style = config.style.thematicBreakStyle
|
|
27
|
-
|
|
28
|
-
builder.setSpan(
|
|
29
|
-
ThematicBreakSpan(
|
|
30
|
-
style.color,
|
|
31
|
-
style.height,
|
|
32
|
-
style.marginTop,
|
|
33
|
-
style.marginBottom,
|
|
34
|
-
),
|
|
35
|
-
start,
|
|
36
|
-
end,
|
|
37
|
-
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
38
|
-
)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
private fun SpannableStringBuilder.ensureNewline() {
|
|
42
|
-
if (isNotEmpty() && this[length - 1] != '\n') {
|
|
43
|
-
append('\n')
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
+
import com.renderrichtext.spans.ThematicBreakSpan
|
|
6
|
+
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
+
|
|
8
|
+
class ThematicBreakRenderer(
|
|
9
|
+
private val config: RendererConfig,
|
|
10
|
+
) : NodeRenderer {
|
|
11
|
+
override fun render(
|
|
12
|
+
node: TiptapASTNode,
|
|
13
|
+
builder: SpannableStringBuilder,
|
|
14
|
+
onLinkPress: ((String) -> Unit)?,
|
|
15
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
16
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
17
|
+
factory: RendererFactory,
|
|
18
|
+
) {
|
|
19
|
+
builder.ensureNewline()
|
|
20
|
+
|
|
21
|
+
val start = builder.length
|
|
22
|
+
|
|
23
|
+
builder.append(" \n")
|
|
24
|
+
val end = builder.length
|
|
25
|
+
|
|
26
|
+
val style = config.style.thematicBreakStyle
|
|
27
|
+
|
|
28
|
+
builder.setSpan(
|
|
29
|
+
ThematicBreakSpan(
|
|
30
|
+
style.color,
|
|
31
|
+
style.height,
|
|
32
|
+
style.marginTop,
|
|
33
|
+
style.marginBottom,
|
|
34
|
+
),
|
|
35
|
+
start,
|
|
36
|
+
end,
|
|
37
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private fun SpannableStringBuilder.ensureNewline() {
|
|
42
|
+
if (isNotEmpty() && this[length - 1] != '\n') {
|
|
43
|
+
append('\n')
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
package com.renderrichtext.renderer
|
|
2
|
-
|
|
3
|
-
import android.text.SpannableStringBuilder
|
|
4
|
-
import android.text.style.UnderlineSpan
|
|
5
|
-
import com.renderrichtext.parser.TiptapASTNode
|
|
6
|
-
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
-
|
|
8
|
-
class UnderlineRenderer(
|
|
9
|
-
private val config: RendererConfig,
|
|
10
|
-
) : NodeRenderer {
|
|
11
|
-
override fun render(
|
|
12
|
-
node: TiptapASTNode,
|
|
13
|
-
builder: SpannableStringBuilder,
|
|
14
|
-
onLinkPress: ((String) -> Unit)?,
|
|
15
|
-
onLinkLongPress: ((String) -> Unit)?,
|
|
16
|
-
onFactoidPress: ((String) -> Unit)?,
|
|
17
|
-
factory: RendererFactory,
|
|
18
|
-
) {
|
|
19
|
-
factory.renderWithSpan(builder, { factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress) }) { start, end, _ ->
|
|
20
|
-
builder.setSpan(
|
|
21
|
-
UnderlineSpan(),
|
|
22
|
-
start,
|
|
23
|
-
end,
|
|
24
|
-
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
25
|
-
)
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import android.text.style.UnderlineSpan
|
|
5
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
6
|
+
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
+
|
|
8
|
+
class UnderlineRenderer(
|
|
9
|
+
private val config: RendererConfig,
|
|
10
|
+
) : NodeRenderer {
|
|
11
|
+
override fun render(
|
|
12
|
+
node: TiptapASTNode,
|
|
13
|
+
builder: SpannableStringBuilder,
|
|
14
|
+
onLinkPress: ((String) -> Unit)?,
|
|
15
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
16
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
17
|
+
factory: RendererFactory,
|
|
18
|
+
) {
|
|
19
|
+
factory.renderWithSpan(builder, { factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress) }) { start, end, _ ->
|
|
20
|
+
builder.setSpan(
|
|
21
|
+
UnderlineSpan(),
|
|
22
|
+
start,
|
|
23
|
+
end,
|
|
24
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
package com.renderrichtext.spans
|
|
2
|
-
|
|
3
|
-
import android.annotation.SuppressLint
|
|
4
|
-
import android.content.Context
|
|
5
|
-
import android.graphics.Canvas
|
|
6
|
-
import android.graphics.Paint
|
|
7
|
-
import android.graphics.Typeface
|
|
8
|
-
import android.text.Layout
|
|
9
|
-
import android.text.Spanned
|
|
10
|
-
import android.text.TextPaint
|
|
11
|
-
import android.text.style.LeadingMarginSpan
|
|
12
|
-
import android.text.style.MetricAffectingSpan
|
|
13
|
-
import com.renderrichtext.renderer.BlockStyle
|
|
14
|
-
import com.renderrichtext.renderer.SpanStyleCache
|
|
15
|
-
import com.renderrichtext.utils.text.extensions.applyBlockStyleFont
|
|
16
|
-
import com.renderrichtext.utils.text.extensions.applyColorPreserving
|
|
17
|
-
|
|
18
|
-
abstract class BaseListSpan(
|
|
19
|
-
val depth: Int,
|
|
20
|
-
protected val context: Context,
|
|
21
|
-
protected val styleCache: SpanStyleCache,
|
|
22
|
-
protected val blockStyle: BlockStyle,
|
|
23
|
-
protected val marginLeft: Float,
|
|
24
|
-
protected val gapWidth: Float,
|
|
25
|
-
internal val drawsMarker: Boolean = true,
|
|
26
|
-
internal val ancestorMarkerOffset: Float = 0f,
|
|
27
|
-
internal val parentMarkerWidth: Float? = null,
|
|
28
|
-
) : MetricAffectingSpan(),
|
|
29
|
-
LeadingMarginSpan {
|
|
30
|
-
private var cachedText: CharSequence? = null
|
|
31
|
-
private var cachedHasDeeperSpanByPosition = mutableMapOf<Int, Boolean>()
|
|
32
|
-
|
|
33
|
-
val markerFontMetrics: Paint.FontMetrics by lazy {
|
|
34
|
-
TextPaint()
|
|
35
|
-
.apply {
|
|
36
|
-
applyBlockStyleFont(blockStyle, context)
|
|
37
|
-
textSize = blockStyle.fontSize
|
|
38
|
-
}.fontMetrics
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
protected abstract fun getMarkerWidth(): Float
|
|
42
|
-
|
|
43
|
-
/** How far an ordered list widened this item's column past the one short lists reserve. */
|
|
44
|
-
internal open val markerExtraWidth: Float = 0f
|
|
45
|
-
|
|
46
|
-
/** This item's marker column without [markerExtraWidth]; a nested item measures its indent against it. */
|
|
47
|
-
internal open val baselineMarkerWidth: Float get() = getMarkerWidth()
|
|
48
|
-
|
|
49
|
-
override fun updateMeasureState(textPaint: TextPaint) = applyTextStyle(textPaint)
|
|
50
|
-
|
|
51
|
-
override fun updateDrawState(textPaint: TextPaint) = applyTextStyle(textPaint)
|
|
52
|
-
|
|
53
|
-
override fun getLeadingMargin(first: Boolean): Int {
|
|
54
|
-
val effectiveGap = gapWidth.coerceAtLeast(DEFAULT_MIN_GAP)
|
|
55
|
-
if (depth == 0) return (getMarkerWidth() + effectiveGap).toInt()
|
|
56
|
-
|
|
57
|
-
// Subtract truncated absolute indents, each measured from its own item's column, so neither mixed
|
|
58
|
-
// columns nor fractional margins accumulate rounding. The widenings are whole pixels and add unchanged.
|
|
59
|
-
val markerWidth = baselineMarkerWidth
|
|
60
|
-
val parentWidth = parentMarkerWidth ?: markerWidth
|
|
61
|
-
val indent = (depth * marginLeft + markerWidth + effectiveGap).toInt()
|
|
62
|
-
val parentIndent = ((depth - 1) * marginLeft + parentWidth + effectiveGap).toInt()
|
|
63
|
-
return indent - parentIndent + markerExtraWidth.toInt()
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
override fun drawLeadingMargin(
|
|
67
|
-
canvas: Canvas,
|
|
68
|
-
paint: Paint,
|
|
69
|
-
x: Int,
|
|
70
|
-
dir: Int,
|
|
71
|
-
top: Int,
|
|
72
|
-
baseline: Int,
|
|
73
|
-
bottom: Int,
|
|
74
|
-
text: CharSequence?,
|
|
75
|
-
start: Int,
|
|
76
|
-
end: Int,
|
|
77
|
-
first: Boolean,
|
|
78
|
-
layout: Layout?,
|
|
79
|
-
) {
|
|
80
|
-
if (!drawsMarker) return
|
|
81
|
-
if (!first || shouldSkipDrawing(text, start) || !hasContent(text, start, end)) return
|
|
82
|
-
|
|
83
|
-
// Only draw the marker on the true first line of this span.
|
|
84
|
-
// \n inside list item content creates inner paragraphs, each with first=true,
|
|
85
|
-
// but only the line at the span start should get a bullet/number.
|
|
86
|
-
if (text is Spanned && text.getSpanStart(this) != start) return
|
|
87
|
-
|
|
88
|
-
drawMarkerAt(canvas, paint, x, dir, top, baseline, bottom, layout, start)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
fun drawMarkerAt(
|
|
92
|
-
canvas: Canvas,
|
|
93
|
-
paint: Paint,
|
|
94
|
-
x: Int,
|
|
95
|
-
dir: Int,
|
|
96
|
-
top: Int,
|
|
97
|
-
baseline: Int,
|
|
98
|
-
bottom: Int,
|
|
99
|
-
layout: Layout?,
|
|
100
|
-
start: Int,
|
|
101
|
-
) {
|
|
102
|
-
val originalStyle = paint.style
|
|
103
|
-
val originalColor = paint.color
|
|
104
|
-
drawMarker(canvas, paint, x, dir, top, baseline, bottom, layout, start)
|
|
105
|
-
paint.style = originalStyle
|
|
106
|
-
paint.color = originalColor
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
protected abstract fun drawMarker(
|
|
110
|
-
canvas: Canvas,
|
|
111
|
-
paint: Paint,
|
|
112
|
-
x: Int,
|
|
113
|
-
dir: Int,
|
|
114
|
-
top: Int,
|
|
115
|
-
baseline: Int,
|
|
116
|
-
bottom: Int,
|
|
117
|
-
layout: Layout?,
|
|
118
|
-
start: Int,
|
|
119
|
-
)
|
|
120
|
-
|
|
121
|
-
@SuppressLint("WrongConstant")
|
|
122
|
-
private fun applyTextStyle(textPaint: TextPaint) {
|
|
123
|
-
textPaint.textSize = blockStyle.fontSize
|
|
124
|
-
|
|
125
|
-
val preservedStyle = (textPaint.typeface?.style ?: 0) and BOLD_ITALIC_MASK
|
|
126
|
-
textPaint.applyBlockStyleFont(blockStyle, context)
|
|
127
|
-
if (preservedStyle != 0) {
|
|
128
|
-
textPaint.typeface?.let { base -> textPaint.typeface = Typeface.create(base, preservedStyle) }
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
textPaint.applyColorPreserving(blockStyle.color, *styleCache.colorsToPreserve)
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
companion object {
|
|
135
|
-
private const val BOLD_ITALIC_MASK = Typeface.BOLD or Typeface.ITALIC
|
|
136
|
-
private const val DEFAULT_MIN_GAP = 4f
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
private fun hasContent(
|
|
140
|
-
text: CharSequence?,
|
|
141
|
-
start: Int,
|
|
142
|
-
end: Int,
|
|
143
|
-
): Boolean {
|
|
144
|
-
if (text == null || end <= start) return false
|
|
145
|
-
return (start until end).any { !text[it].isWhitespace() }
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
private fun shouldSkipDrawing(
|
|
149
|
-
text: CharSequence?,
|
|
150
|
-
start: Int,
|
|
151
|
-
): Boolean {
|
|
152
|
-
if (text !is Spanned) return false
|
|
153
|
-
|
|
154
|
-
if (cachedText !== text) {
|
|
155
|
-
cachedText = text
|
|
156
|
-
cachedHasDeeperSpanByPosition.clear()
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
return cachedHasDeeperSpanByPosition.getOrPut(start) {
|
|
160
|
-
val spans = text.getSpans(start, start + 1, BaseListSpan::class.java)
|
|
161
|
-
spans.any { it.depth > depth }
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
1
|
+
package com.renderrichtext.spans
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint
|
|
4
|
+
import android.content.Context
|
|
5
|
+
import android.graphics.Canvas
|
|
6
|
+
import android.graphics.Paint
|
|
7
|
+
import android.graphics.Typeface
|
|
8
|
+
import android.text.Layout
|
|
9
|
+
import android.text.Spanned
|
|
10
|
+
import android.text.TextPaint
|
|
11
|
+
import android.text.style.LeadingMarginSpan
|
|
12
|
+
import android.text.style.MetricAffectingSpan
|
|
13
|
+
import com.renderrichtext.renderer.BlockStyle
|
|
14
|
+
import com.renderrichtext.renderer.SpanStyleCache
|
|
15
|
+
import com.renderrichtext.utils.text.extensions.applyBlockStyleFont
|
|
16
|
+
import com.renderrichtext.utils.text.extensions.applyColorPreserving
|
|
17
|
+
|
|
18
|
+
abstract class BaseListSpan(
|
|
19
|
+
val depth: Int,
|
|
20
|
+
protected val context: Context,
|
|
21
|
+
protected val styleCache: SpanStyleCache,
|
|
22
|
+
protected val blockStyle: BlockStyle,
|
|
23
|
+
protected val marginLeft: Float,
|
|
24
|
+
protected val gapWidth: Float,
|
|
25
|
+
internal val drawsMarker: Boolean = true,
|
|
26
|
+
internal val ancestorMarkerOffset: Float = 0f,
|
|
27
|
+
internal val parentMarkerWidth: Float? = null,
|
|
28
|
+
) : MetricAffectingSpan(),
|
|
29
|
+
LeadingMarginSpan {
|
|
30
|
+
private var cachedText: CharSequence? = null
|
|
31
|
+
private var cachedHasDeeperSpanByPosition = mutableMapOf<Int, Boolean>()
|
|
32
|
+
|
|
33
|
+
val markerFontMetrics: Paint.FontMetrics by lazy {
|
|
34
|
+
TextPaint()
|
|
35
|
+
.apply {
|
|
36
|
+
applyBlockStyleFont(blockStyle, context)
|
|
37
|
+
textSize = blockStyle.fontSize
|
|
38
|
+
}.fontMetrics
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
protected abstract fun getMarkerWidth(): Float
|
|
42
|
+
|
|
43
|
+
/** How far an ordered list widened this item's column past the one short lists reserve. */
|
|
44
|
+
internal open val markerExtraWidth: Float = 0f
|
|
45
|
+
|
|
46
|
+
/** This item's marker column without [markerExtraWidth]; a nested item measures its indent against it. */
|
|
47
|
+
internal open val baselineMarkerWidth: Float get() = getMarkerWidth()
|
|
48
|
+
|
|
49
|
+
override fun updateMeasureState(textPaint: TextPaint) = applyTextStyle(textPaint)
|
|
50
|
+
|
|
51
|
+
override fun updateDrawState(textPaint: TextPaint) = applyTextStyle(textPaint)
|
|
52
|
+
|
|
53
|
+
override fun getLeadingMargin(first: Boolean): Int {
|
|
54
|
+
val effectiveGap = gapWidth.coerceAtLeast(DEFAULT_MIN_GAP)
|
|
55
|
+
if (depth == 0) return (getMarkerWidth() + effectiveGap).toInt()
|
|
56
|
+
|
|
57
|
+
// Subtract truncated absolute indents, each measured from its own item's column, so neither mixed
|
|
58
|
+
// columns nor fractional margins accumulate rounding. The widenings are whole pixels and add unchanged.
|
|
59
|
+
val markerWidth = baselineMarkerWidth
|
|
60
|
+
val parentWidth = parentMarkerWidth ?: markerWidth
|
|
61
|
+
val indent = (depth * marginLeft + markerWidth + effectiveGap).toInt()
|
|
62
|
+
val parentIndent = ((depth - 1) * marginLeft + parentWidth + effectiveGap).toInt()
|
|
63
|
+
return indent - parentIndent + markerExtraWidth.toInt()
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
override fun drawLeadingMargin(
|
|
67
|
+
canvas: Canvas,
|
|
68
|
+
paint: Paint,
|
|
69
|
+
x: Int,
|
|
70
|
+
dir: Int,
|
|
71
|
+
top: Int,
|
|
72
|
+
baseline: Int,
|
|
73
|
+
bottom: Int,
|
|
74
|
+
text: CharSequence?,
|
|
75
|
+
start: Int,
|
|
76
|
+
end: Int,
|
|
77
|
+
first: Boolean,
|
|
78
|
+
layout: Layout?,
|
|
79
|
+
) {
|
|
80
|
+
if (!drawsMarker) return
|
|
81
|
+
if (!first || shouldSkipDrawing(text, start) || !hasContent(text, start, end)) return
|
|
82
|
+
|
|
83
|
+
// Only draw the marker on the true first line of this span.
|
|
84
|
+
// \n inside list item content creates inner paragraphs, each with first=true,
|
|
85
|
+
// but only the line at the span start should get a bullet/number.
|
|
86
|
+
if (text is Spanned && text.getSpanStart(this) != start) return
|
|
87
|
+
|
|
88
|
+
drawMarkerAt(canvas, paint, x, dir, top, baseline, bottom, layout, start)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
fun drawMarkerAt(
|
|
92
|
+
canvas: Canvas,
|
|
93
|
+
paint: Paint,
|
|
94
|
+
x: Int,
|
|
95
|
+
dir: Int,
|
|
96
|
+
top: Int,
|
|
97
|
+
baseline: Int,
|
|
98
|
+
bottom: Int,
|
|
99
|
+
layout: Layout?,
|
|
100
|
+
start: Int,
|
|
101
|
+
) {
|
|
102
|
+
val originalStyle = paint.style
|
|
103
|
+
val originalColor = paint.color
|
|
104
|
+
drawMarker(canvas, paint, x, dir, top, baseline, bottom, layout, start)
|
|
105
|
+
paint.style = originalStyle
|
|
106
|
+
paint.color = originalColor
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
protected abstract fun drawMarker(
|
|
110
|
+
canvas: Canvas,
|
|
111
|
+
paint: Paint,
|
|
112
|
+
x: Int,
|
|
113
|
+
dir: Int,
|
|
114
|
+
top: Int,
|
|
115
|
+
baseline: Int,
|
|
116
|
+
bottom: Int,
|
|
117
|
+
layout: Layout?,
|
|
118
|
+
start: Int,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
@SuppressLint("WrongConstant")
|
|
122
|
+
private fun applyTextStyle(textPaint: TextPaint) {
|
|
123
|
+
textPaint.textSize = blockStyle.fontSize
|
|
124
|
+
|
|
125
|
+
val preservedStyle = (textPaint.typeface?.style ?: 0) and BOLD_ITALIC_MASK
|
|
126
|
+
textPaint.applyBlockStyleFont(blockStyle, context)
|
|
127
|
+
if (preservedStyle != 0) {
|
|
128
|
+
textPaint.typeface?.let { base -> textPaint.typeface = Typeface.create(base, preservedStyle) }
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
textPaint.applyColorPreserving(blockStyle.color, *styleCache.colorsToPreserve)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
companion object {
|
|
135
|
+
private const val BOLD_ITALIC_MASK = Typeface.BOLD or Typeface.ITALIC
|
|
136
|
+
private const val DEFAULT_MIN_GAP = 4f
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private fun hasContent(
|
|
140
|
+
text: CharSequence?,
|
|
141
|
+
start: Int,
|
|
142
|
+
end: Int,
|
|
143
|
+
): Boolean {
|
|
144
|
+
if (text == null || end <= start) return false
|
|
145
|
+
return (start until end).any { !text[it].isWhitespace() }
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
private fun shouldSkipDrawing(
|
|
149
|
+
text: CharSequence?,
|
|
150
|
+
start: Int,
|
|
151
|
+
): Boolean {
|
|
152
|
+
if (text !is Spanned) return false
|
|
153
|
+
|
|
154
|
+
if (cachedText !== text) {
|
|
155
|
+
cachedText = text
|
|
156
|
+
cachedHasDeeperSpanByPosition.clear()
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return cachedHasDeeperSpanByPosition.getOrPut(start) {
|
|
160
|
+
val spans = text.getSpans(start, start + 1, BaseListSpan::class.java)
|
|
161
|
+
spans.any { it.depth > depth }
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|