@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,216 +1,216 @@
|
|
|
1
|
-
package com.renderrichtext.spans
|
|
2
|
-
|
|
3
|
-
import android.content.Context
|
|
4
|
-
import android.graphics.Canvas
|
|
5
|
-
import android.graphics.Paint
|
|
6
|
-
import android.graphics.Path
|
|
7
|
-
import android.graphics.RectF
|
|
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.LineBackgroundSpan
|
|
13
|
-
import android.text.style.MetricAffectingSpan
|
|
14
|
-
import androidx.core.graphics.withSave
|
|
15
|
-
import com.renderrichtext.renderer.SpanStyleCache
|
|
16
|
-
import com.renderrichtext.styles.CodeBlockStyle
|
|
17
|
-
import com.renderrichtext.utils.text.extensions.applyCodeBlockTextStyle
|
|
18
|
-
import com.renderrichtext.utils.text.extensions.applyColorPreserving
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Draws the commonmark-flavor code block box as per-line strips. The visual
|
|
22
|
-
* conventions (half-stroke border inset, radius reduced by that inset) must
|
|
23
|
-
* stay in sync with the whole-rect box the github flavor draws in
|
|
24
|
-
* CodeBlockContainerView.
|
|
25
|
-
*/
|
|
26
|
-
class CodeBlockSpan(
|
|
27
|
-
private val codeBlockStyle: CodeBlockStyle,
|
|
28
|
-
private val context: Context,
|
|
29
|
-
private val styleCache: SpanStyleCache,
|
|
30
|
-
private val leadingIndent: Int = 0,
|
|
31
|
-
// Recovered by a tap on this span for onCodeBlockPress; unused by drawing.
|
|
32
|
-
val code: String = "",
|
|
33
|
-
val language: String = "",
|
|
34
|
-
) : MetricAffectingSpan(),
|
|
35
|
-
LineBackgroundSpan,
|
|
36
|
-
LeadingMarginSpan {
|
|
37
|
-
private val path = Path()
|
|
38
|
-
private val rect = RectF()
|
|
39
|
-
private val arcRect = RectF()
|
|
40
|
-
private val radiiArray = FloatArray(8)
|
|
41
|
-
|
|
42
|
-
companion object {
|
|
43
|
-
private val sharedBackgroundPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { style = Paint.Style.FILL }
|
|
44
|
-
private val sharedBorderPaint =
|
|
45
|
-
Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
|
46
|
-
style = Paint.Style.STROKE
|
|
47
|
-
strokeCap = Paint.Cap.BUTT
|
|
48
|
-
strokeJoin = Paint.Join.ROUND
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
private fun configureBackgroundPaint(): Paint =
|
|
53
|
-
sharedBackgroundPaint.apply {
|
|
54
|
-
color = codeBlockStyle.backgroundColor
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
private fun configureBorderPaint(): Paint =
|
|
58
|
-
sharedBorderPaint.apply {
|
|
59
|
-
strokeWidth = codeBlockStyle.borderWidth
|
|
60
|
-
color = codeBlockStyle.borderColor
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
override fun getLeadingMargin(first: Boolean): Int = codeBlockStyle.padding.toInt() + leadingIndent
|
|
64
|
-
|
|
65
|
-
override fun drawLeadingMargin(
|
|
66
|
-
c: Canvas?,
|
|
67
|
-
p: Paint?,
|
|
68
|
-
x: Int,
|
|
69
|
-
dir: Int,
|
|
70
|
-
top: Int,
|
|
71
|
-
baseline: Int,
|
|
72
|
-
bottom: Int,
|
|
73
|
-
text: CharSequence?,
|
|
74
|
-
start: Int,
|
|
75
|
-
end: Int,
|
|
76
|
-
first: Boolean,
|
|
77
|
-
layout: Layout?,
|
|
78
|
-
) { /* Leading margin is handled by getLeadingMargin */ }
|
|
79
|
-
|
|
80
|
-
override fun updateMeasureState(tp: TextPaint) = applyTextStyle(tp)
|
|
81
|
-
|
|
82
|
-
override fun updateDrawState(tp: TextPaint) = applyTextStyle(tp)
|
|
83
|
-
|
|
84
|
-
override fun drawBackground(
|
|
85
|
-
canvas: Canvas,
|
|
86
|
-
p: Paint,
|
|
87
|
-
left: Int,
|
|
88
|
-
right: Int,
|
|
89
|
-
top: Int,
|
|
90
|
-
baseline: Int,
|
|
91
|
-
bottom: Int,
|
|
92
|
-
text: CharSequence,
|
|
93
|
-
start: Int,
|
|
94
|
-
end: Int,
|
|
95
|
-
lineNum: Int,
|
|
96
|
-
) {
|
|
97
|
-
if (text !is Spanned) return
|
|
98
|
-
|
|
99
|
-
val spanStart = text.getSpanStart(this)
|
|
100
|
-
val spanEnd = text.getSpanEnd(this)
|
|
101
|
-
if (spanStart !in 0 until spanEnd) return
|
|
102
|
-
|
|
103
|
-
val isFirstLine = start == spanStart
|
|
104
|
-
val isLastLine = isLastDrawnLine(text, end, spanEnd)
|
|
105
|
-
|
|
106
|
-
val inset = codeBlockStyle.borderWidth / 2f
|
|
107
|
-
|
|
108
|
-
rect.set(
|
|
109
|
-
left.toFloat() + leadingIndent + inset,
|
|
110
|
-
top.toFloat() + (if (isFirstLine) inset else 0f),
|
|
111
|
-
right.toFloat() - inset,
|
|
112
|
-
bottom.toFloat() - (if (isLastLine) inset else 0f),
|
|
113
|
-
)
|
|
114
|
-
if (rect.left >= rect.right) return
|
|
115
|
-
|
|
116
|
-
val radius = codeBlockStyle.borderRadius
|
|
117
|
-
val adjRadius = if (radius > inset) radius - inset else radius
|
|
118
|
-
|
|
119
|
-
// Reset and fill radii array based on boundary state
|
|
120
|
-
radiiArray.fill(0f)
|
|
121
|
-
if (isFirstLine) {
|
|
122
|
-
radiiArray[0] = adjRadius
|
|
123
|
-
radiiArray[1] = adjRadius // Top-Left
|
|
124
|
-
radiiArray[2] = adjRadius
|
|
125
|
-
radiiArray[3] = adjRadius // Top-Right
|
|
126
|
-
}
|
|
127
|
-
if (isLastLine) {
|
|
128
|
-
radiiArray[4] = adjRadius
|
|
129
|
-
radiiArray[5] = adjRadius // Bottom-Right
|
|
130
|
-
radiiArray[6] = adjRadius
|
|
131
|
-
radiiArray[7] = adjRadius // Bottom-Left
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
path.reset()
|
|
135
|
-
path.addRoundRect(rect, radiiArray, Path.Direction.CW)
|
|
136
|
-
|
|
137
|
-
val backgroundPaint = configureBackgroundPaint()
|
|
138
|
-
val borderPaint = configureBorderPaint()
|
|
139
|
-
|
|
140
|
-
canvas.withSave {
|
|
141
|
-
drawPath(path, backgroundPaint)
|
|
142
|
-
|
|
143
|
-
if (codeBlockStyle.borderWidth > 0) {
|
|
144
|
-
val bLeft = rect.left
|
|
145
|
-
val bRight = rect.right
|
|
146
|
-
val bTop = rect.top
|
|
147
|
-
val bBottom = rect.bottom
|
|
148
|
-
|
|
149
|
-
when {
|
|
150
|
-
// Case: Single-line code block
|
|
151
|
-
isFirstLine && isLastLine -> {
|
|
152
|
-
drawPath(path, borderPaint)
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// Case: Top of a multi-line block
|
|
156
|
-
isFirstLine -> {
|
|
157
|
-
drawLine(bLeft + adjRadius, bTop, bRight - adjRadius, bTop, borderPaint)
|
|
158
|
-
drawLine(bLeft, bTop + adjRadius, bLeft, bBottom, borderPaint)
|
|
159
|
-
drawLine(bRight, bTop + adjRadius, bRight, bBottom, borderPaint)
|
|
160
|
-
|
|
161
|
-
arcRect.set(bLeft, bTop, bLeft + 2 * adjRadius, bTop + 2 * adjRadius)
|
|
162
|
-
drawArc(arcRect, 180f, 90f, false, borderPaint)
|
|
163
|
-
|
|
164
|
-
arcRect.set(bRight - 2 * adjRadius, bTop, bRight, bTop + 2 * adjRadius)
|
|
165
|
-
drawArc(arcRect, 270f, 90f, false, borderPaint)
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Case: Bottom of a multi-line block
|
|
169
|
-
isLastLine -> {
|
|
170
|
-
drawLine(bLeft + adjRadius, bBottom, bRight - adjRadius, bBottom, borderPaint)
|
|
171
|
-
drawLine(bLeft, bTop, bLeft, bBottom - adjRadius, borderPaint)
|
|
172
|
-
drawLine(bRight, bTop, bRight, bBottom - adjRadius, borderPaint)
|
|
173
|
-
|
|
174
|
-
arcRect.set(bLeft, bBottom - 2 * adjRadius, bLeft + 2 * adjRadius, bBottom)
|
|
175
|
-
drawArc(arcRect, 90f, 90f, false, borderPaint)
|
|
176
|
-
|
|
177
|
-
arcRect.set(bRight - 2 * adjRadius, bBottom - 2 * adjRadius, bRight, bBottom)
|
|
178
|
-
drawArc(arcRect, 0f, 90f, false, borderPaint)
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Case: Middle lines only need vertical sides
|
|
182
|
-
else -> {
|
|
183
|
-
drawLine(bLeft, bTop, bLeft, bBottom, borderPaint)
|
|
184
|
-
drawLine(bRight, bTop, bRight, bBottom, borderPaint)
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
private fun applyTextStyle(tp: TextPaint) {
|
|
192
|
-
tp.applyCodeBlockTextStyle(codeBlockStyle, context)
|
|
193
|
-
|
|
194
|
-
tp.applyColorPreserving(codeBlockStyle.color, *styleCache.colorsToPreserve)
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* True when [lineEnd] is the last drawn line of a span ending at [spanEnd].
|
|
200
|
-
*
|
|
201
|
-
* The span range can include a trailing '\n' that belongs to the last content
|
|
202
|
-
* line rather than forming a line of its own, and the margin newline after the
|
|
203
|
-
* span can push the line end past getSpanEnd. Compare against the end of the
|
|
204
|
-
* visible content, same as [BlockquoteSpan]'s last-line check.
|
|
205
|
-
*/
|
|
206
|
-
internal fun isLastDrawnLine(
|
|
207
|
-
text: CharSequence,
|
|
208
|
-
lineEnd: Int,
|
|
209
|
-
spanEnd: Int,
|
|
210
|
-
): Boolean {
|
|
211
|
-
var visibleEnd = spanEnd.coerceAtMost(text.length)
|
|
212
|
-
while (visibleEnd > 0 && text[visibleEnd - 1] == '\n') {
|
|
213
|
-
visibleEnd--
|
|
214
|
-
}
|
|
215
|
-
return lineEnd >= visibleEnd
|
|
216
|
-
}
|
|
1
|
+
package com.renderrichtext.spans
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.graphics.Canvas
|
|
5
|
+
import android.graphics.Paint
|
|
6
|
+
import android.graphics.Path
|
|
7
|
+
import android.graphics.RectF
|
|
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.LineBackgroundSpan
|
|
13
|
+
import android.text.style.MetricAffectingSpan
|
|
14
|
+
import androidx.core.graphics.withSave
|
|
15
|
+
import com.renderrichtext.renderer.SpanStyleCache
|
|
16
|
+
import com.renderrichtext.styles.CodeBlockStyle
|
|
17
|
+
import com.renderrichtext.utils.text.extensions.applyCodeBlockTextStyle
|
|
18
|
+
import com.renderrichtext.utils.text.extensions.applyColorPreserving
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Draws the commonmark-flavor code block box as per-line strips. The visual
|
|
22
|
+
* conventions (half-stroke border inset, radius reduced by that inset) must
|
|
23
|
+
* stay in sync with the whole-rect box the github flavor draws in
|
|
24
|
+
* CodeBlockContainerView.
|
|
25
|
+
*/
|
|
26
|
+
class CodeBlockSpan(
|
|
27
|
+
private val codeBlockStyle: CodeBlockStyle,
|
|
28
|
+
private val context: Context,
|
|
29
|
+
private val styleCache: SpanStyleCache,
|
|
30
|
+
private val leadingIndent: Int = 0,
|
|
31
|
+
// Recovered by a tap on this span for onCodeBlockPress; unused by drawing.
|
|
32
|
+
val code: String = "",
|
|
33
|
+
val language: String = "",
|
|
34
|
+
) : MetricAffectingSpan(),
|
|
35
|
+
LineBackgroundSpan,
|
|
36
|
+
LeadingMarginSpan {
|
|
37
|
+
private val path = Path()
|
|
38
|
+
private val rect = RectF()
|
|
39
|
+
private val arcRect = RectF()
|
|
40
|
+
private val radiiArray = FloatArray(8)
|
|
41
|
+
|
|
42
|
+
companion object {
|
|
43
|
+
private val sharedBackgroundPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { style = Paint.Style.FILL }
|
|
44
|
+
private val sharedBorderPaint =
|
|
45
|
+
Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
|
46
|
+
style = Paint.Style.STROKE
|
|
47
|
+
strokeCap = Paint.Cap.BUTT
|
|
48
|
+
strokeJoin = Paint.Join.ROUND
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private fun configureBackgroundPaint(): Paint =
|
|
53
|
+
sharedBackgroundPaint.apply {
|
|
54
|
+
color = codeBlockStyle.backgroundColor
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private fun configureBorderPaint(): Paint =
|
|
58
|
+
sharedBorderPaint.apply {
|
|
59
|
+
strokeWidth = codeBlockStyle.borderWidth
|
|
60
|
+
color = codeBlockStyle.borderColor
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
override fun getLeadingMargin(first: Boolean): Int = codeBlockStyle.padding.toInt() + leadingIndent
|
|
64
|
+
|
|
65
|
+
override fun drawLeadingMargin(
|
|
66
|
+
c: Canvas?,
|
|
67
|
+
p: Paint?,
|
|
68
|
+
x: Int,
|
|
69
|
+
dir: Int,
|
|
70
|
+
top: Int,
|
|
71
|
+
baseline: Int,
|
|
72
|
+
bottom: Int,
|
|
73
|
+
text: CharSequence?,
|
|
74
|
+
start: Int,
|
|
75
|
+
end: Int,
|
|
76
|
+
first: Boolean,
|
|
77
|
+
layout: Layout?,
|
|
78
|
+
) { /* Leading margin is handled by getLeadingMargin */ }
|
|
79
|
+
|
|
80
|
+
override fun updateMeasureState(tp: TextPaint) = applyTextStyle(tp)
|
|
81
|
+
|
|
82
|
+
override fun updateDrawState(tp: TextPaint) = applyTextStyle(tp)
|
|
83
|
+
|
|
84
|
+
override fun drawBackground(
|
|
85
|
+
canvas: Canvas,
|
|
86
|
+
p: Paint,
|
|
87
|
+
left: Int,
|
|
88
|
+
right: Int,
|
|
89
|
+
top: Int,
|
|
90
|
+
baseline: Int,
|
|
91
|
+
bottom: Int,
|
|
92
|
+
text: CharSequence,
|
|
93
|
+
start: Int,
|
|
94
|
+
end: Int,
|
|
95
|
+
lineNum: Int,
|
|
96
|
+
) {
|
|
97
|
+
if (text !is Spanned) return
|
|
98
|
+
|
|
99
|
+
val spanStart = text.getSpanStart(this)
|
|
100
|
+
val spanEnd = text.getSpanEnd(this)
|
|
101
|
+
if (spanStart !in 0 until spanEnd) return
|
|
102
|
+
|
|
103
|
+
val isFirstLine = start == spanStart
|
|
104
|
+
val isLastLine = isLastDrawnLine(text, end, spanEnd)
|
|
105
|
+
|
|
106
|
+
val inset = codeBlockStyle.borderWidth / 2f
|
|
107
|
+
|
|
108
|
+
rect.set(
|
|
109
|
+
left.toFloat() + leadingIndent + inset,
|
|
110
|
+
top.toFloat() + (if (isFirstLine) inset else 0f),
|
|
111
|
+
right.toFloat() - inset,
|
|
112
|
+
bottom.toFloat() - (if (isLastLine) inset else 0f),
|
|
113
|
+
)
|
|
114
|
+
if (rect.left >= rect.right) return
|
|
115
|
+
|
|
116
|
+
val radius = codeBlockStyle.borderRadius
|
|
117
|
+
val adjRadius = if (radius > inset) radius - inset else radius
|
|
118
|
+
|
|
119
|
+
// Reset and fill radii array based on boundary state
|
|
120
|
+
radiiArray.fill(0f)
|
|
121
|
+
if (isFirstLine) {
|
|
122
|
+
radiiArray[0] = adjRadius
|
|
123
|
+
radiiArray[1] = adjRadius // Top-Left
|
|
124
|
+
radiiArray[2] = adjRadius
|
|
125
|
+
radiiArray[3] = adjRadius // Top-Right
|
|
126
|
+
}
|
|
127
|
+
if (isLastLine) {
|
|
128
|
+
radiiArray[4] = adjRadius
|
|
129
|
+
radiiArray[5] = adjRadius // Bottom-Right
|
|
130
|
+
radiiArray[6] = adjRadius
|
|
131
|
+
radiiArray[7] = adjRadius // Bottom-Left
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
path.reset()
|
|
135
|
+
path.addRoundRect(rect, radiiArray, Path.Direction.CW)
|
|
136
|
+
|
|
137
|
+
val backgroundPaint = configureBackgroundPaint()
|
|
138
|
+
val borderPaint = configureBorderPaint()
|
|
139
|
+
|
|
140
|
+
canvas.withSave {
|
|
141
|
+
drawPath(path, backgroundPaint)
|
|
142
|
+
|
|
143
|
+
if (codeBlockStyle.borderWidth > 0) {
|
|
144
|
+
val bLeft = rect.left
|
|
145
|
+
val bRight = rect.right
|
|
146
|
+
val bTop = rect.top
|
|
147
|
+
val bBottom = rect.bottom
|
|
148
|
+
|
|
149
|
+
when {
|
|
150
|
+
// Case: Single-line code block
|
|
151
|
+
isFirstLine && isLastLine -> {
|
|
152
|
+
drawPath(path, borderPaint)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Case: Top of a multi-line block
|
|
156
|
+
isFirstLine -> {
|
|
157
|
+
drawLine(bLeft + adjRadius, bTop, bRight - adjRadius, bTop, borderPaint)
|
|
158
|
+
drawLine(bLeft, bTop + adjRadius, bLeft, bBottom, borderPaint)
|
|
159
|
+
drawLine(bRight, bTop + adjRadius, bRight, bBottom, borderPaint)
|
|
160
|
+
|
|
161
|
+
arcRect.set(bLeft, bTop, bLeft + 2 * adjRadius, bTop + 2 * adjRadius)
|
|
162
|
+
drawArc(arcRect, 180f, 90f, false, borderPaint)
|
|
163
|
+
|
|
164
|
+
arcRect.set(bRight - 2 * adjRadius, bTop, bRight, bTop + 2 * adjRadius)
|
|
165
|
+
drawArc(arcRect, 270f, 90f, false, borderPaint)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Case: Bottom of a multi-line block
|
|
169
|
+
isLastLine -> {
|
|
170
|
+
drawLine(bLeft + adjRadius, bBottom, bRight - adjRadius, bBottom, borderPaint)
|
|
171
|
+
drawLine(bLeft, bTop, bLeft, bBottom - adjRadius, borderPaint)
|
|
172
|
+
drawLine(bRight, bTop, bRight, bBottom - adjRadius, borderPaint)
|
|
173
|
+
|
|
174
|
+
arcRect.set(bLeft, bBottom - 2 * adjRadius, bLeft + 2 * adjRadius, bBottom)
|
|
175
|
+
drawArc(arcRect, 90f, 90f, false, borderPaint)
|
|
176
|
+
|
|
177
|
+
arcRect.set(bRight - 2 * adjRadius, bBottom - 2 * adjRadius, bRight, bBottom)
|
|
178
|
+
drawArc(arcRect, 0f, 90f, false, borderPaint)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Case: Middle lines only need vertical sides
|
|
182
|
+
else -> {
|
|
183
|
+
drawLine(bLeft, bTop, bLeft, bBottom, borderPaint)
|
|
184
|
+
drawLine(bRight, bTop, bRight, bBottom, borderPaint)
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
private fun applyTextStyle(tp: TextPaint) {
|
|
192
|
+
tp.applyCodeBlockTextStyle(codeBlockStyle, context)
|
|
193
|
+
|
|
194
|
+
tp.applyColorPreserving(codeBlockStyle.color, *styleCache.colorsToPreserve)
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* True when [lineEnd] is the last drawn line of a span ending at [spanEnd].
|
|
200
|
+
*
|
|
201
|
+
* The span range can include a trailing '\n' that belongs to the last content
|
|
202
|
+
* line rather than forming a line of its own, and the margin newline after the
|
|
203
|
+
* span can push the line end past getSpanEnd. Compare against the end of the
|
|
204
|
+
* visible content, same as [BlockquoteSpan]'s last-line check.
|
|
205
|
+
*/
|
|
206
|
+
internal fun isLastDrawnLine(
|
|
207
|
+
text: CharSequence,
|
|
208
|
+
lineEnd: Int,
|
|
209
|
+
spanEnd: Int,
|
|
210
|
+
): Boolean {
|
|
211
|
+
var visibleEnd = spanEnd.coerceAtMost(text.length)
|
|
212
|
+
while (visibleEnd > 0 && text[visibleEnd - 1] == '\n') {
|
|
213
|
+
visibleEnd--
|
|
214
|
+
}
|
|
215
|
+
return lineEnd >= visibleEnd
|
|
216
|
+
}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
package com.renderrichtext.spans
|
|
2
|
-
|
|
3
|
-
import android.graphics.Typeface
|
|
4
|
-
import android.text.TextPaint
|
|
5
|
-
import android.text.style.MetricAffectingSpan
|
|
6
|
-
import com.renderrichtext.renderer.BlockStyle
|
|
7
|
-
import com.renderrichtext.renderer.SpanStyleCache
|
|
8
|
-
|
|
9
|
-
class CodeSpan(
|
|
10
|
-
private val styleCache: SpanStyleCache,
|
|
11
|
-
private val blockStyle: BlockStyle,
|
|
12
|
-
) : MetricAffectingSpan() {
|
|
13
|
-
override fun updateDrawState(tp: TextPaint) {
|
|
14
|
-
applyMonospacedFont(tp)
|
|
15
|
-
tp.color = styleCache.codeColor
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
override fun updateMeasureState(tp: TextPaint) {
|
|
19
|
-
applyMonospacedFont(tp)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
private fun applyMonospacedFont(paint: TextPaint) {
|
|
23
|
-
paint.textSize = if (styleCache.codeFontSize > 0) styleCache.codeFontSize else blockStyle.fontSize
|
|
24
|
-
val preservedStyle = (paint.typeface?.style ?: 0) and (Typeface.BOLD or Typeface.ITALIC)
|
|
25
|
-
paint.typeface =
|
|
26
|
-
if (styleCache.codeFontFamily.isNotEmpty()) {
|
|
27
|
-
styleCache.getTypeface(styleCache.codeFontFamily, preservedStyle)
|
|
28
|
-
} else {
|
|
29
|
-
SpanStyleCache.getMonospaceTypeface(preservedStyle)
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
1
|
+
package com.renderrichtext.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.MetricAffectingSpan
|
|
6
|
+
import com.renderrichtext.renderer.BlockStyle
|
|
7
|
+
import com.renderrichtext.renderer.SpanStyleCache
|
|
8
|
+
|
|
9
|
+
class CodeSpan(
|
|
10
|
+
private val styleCache: SpanStyleCache,
|
|
11
|
+
private val blockStyle: BlockStyle,
|
|
12
|
+
) : MetricAffectingSpan() {
|
|
13
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
14
|
+
applyMonospacedFont(tp)
|
|
15
|
+
tp.color = styleCache.codeColor
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
override fun updateMeasureState(tp: TextPaint) {
|
|
19
|
+
applyMonospacedFont(tp)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private fun applyMonospacedFont(paint: TextPaint) {
|
|
23
|
+
paint.textSize = if (styleCache.codeFontSize > 0) styleCache.codeFontSize else blockStyle.fontSize
|
|
24
|
+
val preservedStyle = (paint.typeface?.style ?: 0) and (Typeface.BOLD or Typeface.ITALIC)
|
|
25
|
+
paint.typeface =
|
|
26
|
+
if (styleCache.codeFontFamily.isNotEmpty()) {
|
|
27
|
+
styleCache.getTypeface(styleCache.codeFontFamily, preservedStyle)
|
|
28
|
+
} else {
|
|
29
|
+
SpanStyleCache.getMonospaceTypeface(preservedStyle)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
package com.renderrichtext.spans
|
|
2
|
-
|
|
3
|
-
import android.graphics.Typeface
|
|
4
|
-
import android.text.TextPaint
|
|
5
|
-
import android.text.style.MetricAffectingSpan
|
|
6
|
-
import com.renderrichtext.renderer.BlockStyle
|
|
7
|
-
import com.renderrichtext.renderer.SpanStyleCache
|
|
8
|
-
import com.renderrichtext.utils.text.extensions.applyColorPreserving
|
|
9
|
-
|
|
10
|
-
class EmphasisSpan(
|
|
11
|
-
private val styleCache: SpanStyleCache,
|
|
12
|
-
private val blockStyle: BlockStyle,
|
|
13
|
-
) : MetricAffectingSpan() {
|
|
14
|
-
override fun updateDrawState(tp: TextPaint) {
|
|
15
|
-
applyEmphasisStyle(tp)
|
|
16
|
-
applyEmphasisColor(tp)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
override fun updateMeasureState(tp: TextPaint) {
|
|
20
|
-
applyEmphasisStyle(tp)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
private fun applyEmphasisStyle(tp: TextPaint) {
|
|
24
|
-
val currentTypeface = tp.typeface ?: Typeface.DEFAULT
|
|
25
|
-
val isBold = (currentTypeface.style) and Typeface.BOLD != 0
|
|
26
|
-
val style = if (isBold) Typeface.BOLD_ITALIC else Typeface.ITALIC
|
|
27
|
-
tp.typeface =
|
|
28
|
-
if (styleCache.emphasisFontFamily.isNotEmpty()) {
|
|
29
|
-
val resolvedStyle = if (styleCache.emphasisFontStyle == "normal") Typeface.NORMAL else style
|
|
30
|
-
styleCache.getTypeface(styleCache.emphasisFontFamily, resolvedStyle)
|
|
31
|
-
} else if (styleCache.emphasisFontStyle == "normal") {
|
|
32
|
-
currentTypeface
|
|
33
|
-
} else {
|
|
34
|
-
Typeface.create(currentTypeface, style)
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
private fun applyEmphasisColor(tp: TextPaint) {
|
|
39
|
-
val colorToUse = styleCache.getEmphasisColorFor(blockStyle.color, tp.color)
|
|
40
|
-
tp.applyColorPreserving(colorToUse, *styleCache.colorsToPreserve)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
1
|
+
package com.renderrichtext.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.MetricAffectingSpan
|
|
6
|
+
import com.renderrichtext.renderer.BlockStyle
|
|
7
|
+
import com.renderrichtext.renderer.SpanStyleCache
|
|
8
|
+
import com.renderrichtext.utils.text.extensions.applyColorPreserving
|
|
9
|
+
|
|
10
|
+
class EmphasisSpan(
|
|
11
|
+
private val styleCache: SpanStyleCache,
|
|
12
|
+
private val blockStyle: BlockStyle,
|
|
13
|
+
) : MetricAffectingSpan() {
|
|
14
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
15
|
+
applyEmphasisStyle(tp)
|
|
16
|
+
applyEmphasisColor(tp)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
override fun updateMeasureState(tp: TextPaint) {
|
|
20
|
+
applyEmphasisStyle(tp)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
private fun applyEmphasisStyle(tp: TextPaint) {
|
|
24
|
+
val currentTypeface = tp.typeface ?: Typeface.DEFAULT
|
|
25
|
+
val isBold = (currentTypeface.style) and Typeface.BOLD != 0
|
|
26
|
+
val style = if (isBold) Typeface.BOLD_ITALIC else Typeface.ITALIC
|
|
27
|
+
tp.typeface =
|
|
28
|
+
if (styleCache.emphasisFontFamily.isNotEmpty()) {
|
|
29
|
+
val resolvedStyle = if (styleCache.emphasisFontStyle == "normal") Typeface.NORMAL else style
|
|
30
|
+
styleCache.getTypeface(styleCache.emphasisFontFamily, resolvedStyle)
|
|
31
|
+
} else if (styleCache.emphasisFontStyle == "normal") {
|
|
32
|
+
currentTypeface
|
|
33
|
+
} else {
|
|
34
|
+
Typeface.create(currentTypeface, style)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private fun applyEmphasisColor(tp: TextPaint) {
|
|
39
|
+
val colorToUse = styleCache.getEmphasisColorFor(blockStyle.color, tp.color)
|
|
40
|
+
tp.applyColorPreserving(colorToUse, *styleCache.colorsToPreserve)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
package com.renderrichtext.spans
|
|
2
|
-
|
|
3
|
-
import android.os.Build
|
|
4
|
-
import android.text.TextPaint
|
|
5
|
-
import android.text.style.CharacterStyle
|
|
6
|
-
import androidx.annotation.FloatRange
|
|
7
|
-
|
|
8
|
-
class FadeInSpan : CharacterStyle() {
|
|
9
|
-
@setparam:FloatRange(from = 0.0, to = 1.0)
|
|
10
|
-
var alpha: Float = 0f
|
|
11
|
-
|
|
12
|
-
override fun updateDrawState(tp: TextPaint) {
|
|
13
|
-
tp.color = multiplyAlpha(tp.color, alpha)
|
|
14
|
-
// Public from API 29; below that, underlines are drawn in `color`, which is already faded.
|
|
15
|
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
16
|
-
tp.underlineColor = multiplyAlpha(tp.underlineColor, alpha)
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
private fun multiplyAlpha(
|
|
21
|
-
color: Int,
|
|
22
|
-
alpha: Float,
|
|
23
|
-
): Int {
|
|
24
|
-
if (alpha >= 1f) return color
|
|
25
|
-
if (alpha <= 0f) return color and 0x00FFFFFF
|
|
26
|
-
val a = ((color ushr 24) * alpha).toInt()
|
|
27
|
-
return (a shl 24) or (color and 0x00FFFFFF)
|
|
28
|
-
}
|
|
29
|
-
}
|
|
1
|
+
package com.renderrichtext.spans
|
|
2
|
+
|
|
3
|
+
import android.os.Build
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.CharacterStyle
|
|
6
|
+
import androidx.annotation.FloatRange
|
|
7
|
+
|
|
8
|
+
class FadeInSpan : CharacterStyle() {
|
|
9
|
+
@setparam:FloatRange(from = 0.0, to = 1.0)
|
|
10
|
+
var alpha: Float = 0f
|
|
11
|
+
|
|
12
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
13
|
+
tp.color = multiplyAlpha(tp.color, alpha)
|
|
14
|
+
// Public from API 29; below that, underlines are drawn in `color`, which is already faded.
|
|
15
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
16
|
+
tp.underlineColor = multiplyAlpha(tp.underlineColor, alpha)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
private fun multiplyAlpha(
|
|
21
|
+
color: Int,
|
|
22
|
+
alpha: Float,
|
|
23
|
+
): Int {
|
|
24
|
+
if (alpha >= 1f) return color
|
|
25
|
+
if (alpha <= 0f) return color and 0x00FFFFFF
|
|
26
|
+
val a = ((color ushr 24) * alpha).toInt()
|
|
27
|
+
return (a shl 24) or (color and 0x00FFFFFF)
|
|
28
|
+
}
|
|
29
|
+
}
|