@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,132 +1,132 @@
|
|
|
1
|
-
package com.renderrichtext.spans
|
|
2
|
-
|
|
3
|
-
import android.graphics.Canvas
|
|
4
|
-
import android.graphics.Color
|
|
5
|
-
import android.graphics.Paint
|
|
6
|
-
import android.graphics.RectF
|
|
7
|
-
import android.graphics.Typeface
|
|
8
|
-
import android.os.Build
|
|
9
|
-
import android.text.style.ReplacementSpan
|
|
10
|
-
import kotlin.math.ceil
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* One unbreakable chip for a mention. Material chips stay on a single line, so the
|
|
14
|
-
* whole `@name` is one replacement run: the line breaker wraps it as a unit, and the
|
|
15
|
-
* horizontal padding is part of that width rather than a separate gap that can be
|
|
16
|
-
* left behind on the previous line.
|
|
17
|
-
*
|
|
18
|
-
* Each line fragment of an iOS mention is its own rounded rect. Android does not
|
|
19
|
-
* split the chip, which is how inline people-chips behave in Material text.
|
|
20
|
-
*/
|
|
21
|
-
class MentionChipSpan(
|
|
22
|
-
private val backgroundColor: Int,
|
|
23
|
-
private val textColor: Int,
|
|
24
|
-
private val paddingX: Float,
|
|
25
|
-
private val paddingY: Float,
|
|
26
|
-
) : ReplacementSpan() {
|
|
27
|
-
/** True while a finger is down. The movement method sets this and re-sets the span so the new fill is recorded. */
|
|
28
|
-
var pressed: Boolean = false
|
|
29
|
-
|
|
30
|
-
private val fillPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { style = Paint.Style.FILL }
|
|
31
|
-
private val rect = RectF()
|
|
32
|
-
private var cachedSource: Typeface? = null
|
|
33
|
-
private var cachedMedium: Typeface? = null
|
|
34
|
-
|
|
35
|
-
override fun getSize(
|
|
36
|
-
paint: Paint,
|
|
37
|
-
text: CharSequence,
|
|
38
|
-
start: Int,
|
|
39
|
-
end: Int,
|
|
40
|
-
fm: Paint.FontMetricsInt?,
|
|
41
|
-
): Int {
|
|
42
|
-
var width = 0
|
|
43
|
-
paint.usingMedium {
|
|
44
|
-
if (fm != null) {
|
|
45
|
-
paint.getFontMetricsInt(fm)
|
|
46
|
-
val extra = ceil(paddingY).toInt()
|
|
47
|
-
fm.ascent -= extra
|
|
48
|
-
fm.top -= extra
|
|
49
|
-
fm.descent += extra
|
|
50
|
-
fm.bottom += extra
|
|
51
|
-
}
|
|
52
|
-
width = ceil(paint.measureText(text, start, end) + paddingX * 2f).toInt()
|
|
53
|
-
}
|
|
54
|
-
return width
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
override fun draw(
|
|
58
|
-
canvas: Canvas,
|
|
59
|
-
text: CharSequence,
|
|
60
|
-
start: Int,
|
|
61
|
-
end: Int,
|
|
62
|
-
x: Float,
|
|
63
|
-
top: Int,
|
|
64
|
-
y: Int,
|
|
65
|
-
bottom: Int,
|
|
66
|
-
paint: Paint,
|
|
67
|
-
) {
|
|
68
|
-
paint.usingMedium {
|
|
69
|
-
val textWidth = paint.measureText(text, start, end)
|
|
70
|
-
val metrics = paint.fontMetrics
|
|
71
|
-
rect.set(
|
|
72
|
-
x,
|
|
73
|
-
y + metrics.ascent - paddingY,
|
|
74
|
-
x + textWidth + paddingX * 2f,
|
|
75
|
-
y + metrics.descent + paddingY,
|
|
76
|
-
)
|
|
77
|
-
val radius = 10f
|
|
78
|
-
var fill = backgroundColor
|
|
79
|
-
if (pressed) fill = darken(fill)
|
|
80
|
-
if (Color.alpha(fill) > 0) {
|
|
81
|
-
fillPaint.color = fill
|
|
82
|
-
canvas.drawRoundRect(rect, radius, radius, fillPaint)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
val previousColor = paint.color
|
|
86
|
-
paint.color = textColor
|
|
87
|
-
canvas.drawText(text, start, end, x + paddingX, y.toFloat(), paint)
|
|
88
|
-
paint.color = previousColor
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
private fun darken(color: Int): Int =
|
|
93
|
-
Color.argb(
|
|
94
|
-
Color.alpha(color),
|
|
95
|
-
(Color.red(color) * PRESSED_DARKEN).toInt(),
|
|
96
|
-
(Color.green(color) * PRESSED_DARKEN).toInt(),
|
|
97
|
-
(Color.blue(color) * PRESSED_DARKEN).toInt(),
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Medium is the Android weight for a name in body text. API 28 keeps the surrounding
|
|
102
|
-
* family. Older releases have no weight axis, so the face becomes sans-serif-medium.
|
|
103
|
-
*/
|
|
104
|
-
private fun mediumTypeface(base: Typeface?): Typeface {
|
|
105
|
-
if (cachedMedium != null && cachedSource === base) return cachedMedium!!
|
|
106
|
-
val source = base ?: Typeface.SANS_SERIF
|
|
107
|
-
val italic = source.style and Typeface.ITALIC != 0
|
|
108
|
-
val created =
|
|
109
|
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
|
110
|
-
Typeface.create(source, 500, italic)
|
|
111
|
-
} else {
|
|
112
|
-
Typeface.create("sans-serif-medium", if (italic) Typeface.ITALIC else Typeface.NORMAL)
|
|
113
|
-
}
|
|
114
|
-
cachedSource = base
|
|
115
|
-
cachedMedium = created
|
|
116
|
-
return created
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
private inline fun Paint.usingMedium(block: () -> Unit) {
|
|
120
|
-
val original = typeface
|
|
121
|
-
typeface = mediumTypeface(original)
|
|
122
|
-
try {
|
|
123
|
-
block()
|
|
124
|
-
} finally {
|
|
125
|
-
typeface = original
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
companion object {
|
|
130
|
-
private const val PRESSED_DARKEN = 0.82f
|
|
131
|
-
}
|
|
132
|
-
}
|
|
1
|
+
package com.renderrichtext.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Canvas
|
|
4
|
+
import android.graphics.Color
|
|
5
|
+
import android.graphics.Paint
|
|
6
|
+
import android.graphics.RectF
|
|
7
|
+
import android.graphics.Typeface
|
|
8
|
+
import android.os.Build
|
|
9
|
+
import android.text.style.ReplacementSpan
|
|
10
|
+
import kotlin.math.ceil
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* One unbreakable chip for a mention. Material chips stay on a single line, so the
|
|
14
|
+
* whole `@name` is one replacement run: the line breaker wraps it as a unit, and the
|
|
15
|
+
* horizontal padding is part of that width rather than a separate gap that can be
|
|
16
|
+
* left behind on the previous line.
|
|
17
|
+
*
|
|
18
|
+
* Each line fragment of an iOS mention is its own rounded rect. Android does not
|
|
19
|
+
* split the chip, which is how inline people-chips behave in Material text.
|
|
20
|
+
*/
|
|
21
|
+
class MentionChipSpan(
|
|
22
|
+
private val backgroundColor: Int,
|
|
23
|
+
private val textColor: Int,
|
|
24
|
+
private val paddingX: Float,
|
|
25
|
+
private val paddingY: Float,
|
|
26
|
+
) : ReplacementSpan() {
|
|
27
|
+
/** True while a finger is down. The movement method sets this and re-sets the span so the new fill is recorded. */
|
|
28
|
+
var pressed: Boolean = false
|
|
29
|
+
|
|
30
|
+
private val fillPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { style = Paint.Style.FILL }
|
|
31
|
+
private val rect = RectF()
|
|
32
|
+
private var cachedSource: Typeface? = null
|
|
33
|
+
private var cachedMedium: Typeface? = null
|
|
34
|
+
|
|
35
|
+
override fun getSize(
|
|
36
|
+
paint: Paint,
|
|
37
|
+
text: CharSequence,
|
|
38
|
+
start: Int,
|
|
39
|
+
end: Int,
|
|
40
|
+
fm: Paint.FontMetricsInt?,
|
|
41
|
+
): Int {
|
|
42
|
+
var width = 0
|
|
43
|
+
paint.usingMedium {
|
|
44
|
+
if (fm != null) {
|
|
45
|
+
paint.getFontMetricsInt(fm)
|
|
46
|
+
val extra = ceil(paddingY).toInt()
|
|
47
|
+
fm.ascent -= extra
|
|
48
|
+
fm.top -= extra
|
|
49
|
+
fm.descent += extra
|
|
50
|
+
fm.bottom += extra
|
|
51
|
+
}
|
|
52
|
+
width = ceil(paint.measureText(text, start, end) + paddingX * 2f).toInt()
|
|
53
|
+
}
|
|
54
|
+
return width
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
override fun draw(
|
|
58
|
+
canvas: Canvas,
|
|
59
|
+
text: CharSequence,
|
|
60
|
+
start: Int,
|
|
61
|
+
end: Int,
|
|
62
|
+
x: Float,
|
|
63
|
+
top: Int,
|
|
64
|
+
y: Int,
|
|
65
|
+
bottom: Int,
|
|
66
|
+
paint: Paint,
|
|
67
|
+
) {
|
|
68
|
+
paint.usingMedium {
|
|
69
|
+
val textWidth = paint.measureText(text, start, end)
|
|
70
|
+
val metrics = paint.fontMetrics
|
|
71
|
+
rect.set(
|
|
72
|
+
x,
|
|
73
|
+
y + metrics.ascent - paddingY,
|
|
74
|
+
x + textWidth + paddingX * 2f,
|
|
75
|
+
y + metrics.descent + paddingY,
|
|
76
|
+
)
|
|
77
|
+
val radius = 10f
|
|
78
|
+
var fill = backgroundColor
|
|
79
|
+
if (pressed) fill = darken(fill)
|
|
80
|
+
if (Color.alpha(fill) > 0) {
|
|
81
|
+
fillPaint.color = fill
|
|
82
|
+
canvas.drawRoundRect(rect, radius, radius, fillPaint)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
val previousColor = paint.color
|
|
86
|
+
paint.color = textColor
|
|
87
|
+
canvas.drawText(text, start, end, x + paddingX, y.toFloat(), paint)
|
|
88
|
+
paint.color = previousColor
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private fun darken(color: Int): Int =
|
|
93
|
+
Color.argb(
|
|
94
|
+
Color.alpha(color),
|
|
95
|
+
(Color.red(color) * PRESSED_DARKEN).toInt(),
|
|
96
|
+
(Color.green(color) * PRESSED_DARKEN).toInt(),
|
|
97
|
+
(Color.blue(color) * PRESSED_DARKEN).toInt(),
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Medium is the Android weight for a name in body text. API 28 keeps the surrounding
|
|
102
|
+
* family. Older releases have no weight axis, so the face becomes sans-serif-medium.
|
|
103
|
+
*/
|
|
104
|
+
private fun mediumTypeface(base: Typeface?): Typeface {
|
|
105
|
+
if (cachedMedium != null && cachedSource === base) return cachedMedium!!
|
|
106
|
+
val source = base ?: Typeface.SANS_SERIF
|
|
107
|
+
val italic = source.style and Typeface.ITALIC != 0
|
|
108
|
+
val created =
|
|
109
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
|
110
|
+
Typeface.create(source, 500, italic)
|
|
111
|
+
} else {
|
|
112
|
+
Typeface.create("sans-serif-medium", if (italic) Typeface.ITALIC else Typeface.NORMAL)
|
|
113
|
+
}
|
|
114
|
+
cachedSource = base
|
|
115
|
+
cachedMedium = created
|
|
116
|
+
return created
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private inline fun Paint.usingMedium(block: () -> Unit) {
|
|
120
|
+
val original = typeface
|
|
121
|
+
typeface = mediumTypeface(original)
|
|
122
|
+
try {
|
|
123
|
+
block()
|
|
124
|
+
} finally {
|
|
125
|
+
typeface = original
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
companion object {
|
|
130
|
+
private const val PRESSED_DARKEN = 0.82f
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
package com.renderrichtext.spans
|
|
2
|
-
|
|
3
|
-
import android.text.TextPaint
|
|
4
|
-
import android.text.style.ClickableSpan
|
|
5
|
-
import android.view.View
|
|
6
|
-
import com.renderrichtext.EnrichedTiptapText
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Click and long-press target for a mention. The chip span draws the glyphs, so this
|
|
10
|
-
* only supplies the text color and the gestures. No underline: a mention is a chip,
|
|
11
|
-
* not a link.
|
|
12
|
-
*/
|
|
13
|
-
class MentionSpan(
|
|
14
|
-
val mentionId: String,
|
|
15
|
-
val label: String,
|
|
16
|
-
private val textColor: Int,
|
|
17
|
-
private val onMentionPress: ((String, String) -> Unit)?,
|
|
18
|
-
private val onMentionLongPress: ((String, String) -> Unit)?,
|
|
19
|
-
) : ClickableSpan() {
|
|
20
|
-
/** True while a finger is down on this mention. The chip's own flag is what it draws. */
|
|
21
|
-
var pressed: Boolean = false
|
|
22
|
-
|
|
23
|
-
@Volatile
|
|
24
|
-
private var longPressTriggered = false
|
|
25
|
-
|
|
26
|
-
override fun onClick(widget: View) {
|
|
27
|
-
if (longPressTriggered) {
|
|
28
|
-
longPressTriggered = false
|
|
29
|
-
return
|
|
30
|
-
}
|
|
31
|
-
onMentionPress?.invoke(mentionId, label)
|
|
32
|
-
?: (widget as? EnrichedTiptapText)?.emitOnMentionPress(mentionId, label)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
fun onLongClick(widget: View): Boolean {
|
|
36
|
-
longPressTriggered = true
|
|
37
|
-
onMentionLongPress?.invoke(mentionId, label)
|
|
38
|
-
?: (widget as? EnrichedTiptapText)?.emitOnMentionLongPress(mentionId, label)
|
|
39
|
-
return true
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
override fun updateDrawState(textPaint: TextPaint) {
|
|
43
|
-
textPaint.color = textColor
|
|
44
|
-
textPaint.isUnderlineText = false
|
|
45
|
-
}
|
|
46
|
-
}
|
|
1
|
+
package com.renderrichtext.spans
|
|
2
|
+
|
|
3
|
+
import android.text.TextPaint
|
|
4
|
+
import android.text.style.ClickableSpan
|
|
5
|
+
import android.view.View
|
|
6
|
+
import com.renderrichtext.EnrichedTiptapText
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Click and long-press target for a mention. The chip span draws the glyphs, so this
|
|
10
|
+
* only supplies the text color and the gestures. No underline: a mention is a chip,
|
|
11
|
+
* not a link.
|
|
12
|
+
*/
|
|
13
|
+
class MentionSpan(
|
|
14
|
+
val mentionId: String,
|
|
15
|
+
val label: String,
|
|
16
|
+
private val textColor: Int,
|
|
17
|
+
private val onMentionPress: ((String, String) -> Unit)?,
|
|
18
|
+
private val onMentionLongPress: ((String, String) -> Unit)?,
|
|
19
|
+
) : ClickableSpan() {
|
|
20
|
+
/** True while a finger is down on this mention. The chip's own flag is what it draws. */
|
|
21
|
+
var pressed: Boolean = false
|
|
22
|
+
|
|
23
|
+
@Volatile
|
|
24
|
+
private var longPressTriggered = false
|
|
25
|
+
|
|
26
|
+
override fun onClick(widget: View) {
|
|
27
|
+
if (longPressTriggered) {
|
|
28
|
+
longPressTriggered = false
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
onMentionPress?.invoke(mentionId, label)
|
|
32
|
+
?: (widget as? EnrichedTiptapText)?.emitOnMentionPress(mentionId, label)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
fun onLongClick(widget: View): Boolean {
|
|
36
|
+
longPressTriggered = true
|
|
37
|
+
onMentionLongPress?.invoke(mentionId, label)
|
|
38
|
+
?: (widget as? EnrichedTiptapText)?.emitOnMentionLongPress(mentionId, label)
|
|
39
|
+
return true
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
override fun updateDrawState(textPaint: TextPaint) {
|
|
43
|
+
textPaint.color = textColor
|
|
44
|
+
textPaint.isUnderlineText = false
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -1,127 +1,127 @@
|
|
|
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.Typeface
|
|
7
|
-
import android.text.Layout
|
|
8
|
-
import android.text.TextPaint
|
|
9
|
-
import com.facebook.react.common.ReactConstants
|
|
10
|
-
import com.facebook.react.views.text.ReactTypefaceUtils.applyStyles
|
|
11
|
-
import com.facebook.react.views.text.ReactTypefaceUtils.parseFontWeight
|
|
12
|
-
import com.renderrichtext.renderer.BlockStyle
|
|
13
|
-
import com.renderrichtext.renderer.SpanStyleCache
|
|
14
|
-
import com.renderrichtext.styles.ListStyle
|
|
15
|
-
import kotlin.math.ceil
|
|
16
|
-
|
|
17
|
-
class OrderedListSpan(
|
|
18
|
-
private val listStyle: ListStyle,
|
|
19
|
-
depth: Int,
|
|
20
|
-
context: Context,
|
|
21
|
-
styleCache: SpanStyleCache,
|
|
22
|
-
drawsMarker: Boolean = true,
|
|
23
|
-
override val markerExtraWidth: Float = 0f,
|
|
24
|
-
ancestorMarkerOffset: Float = 0f,
|
|
25
|
-
parentMarkerWidth: Float? = null,
|
|
26
|
-
) : BaseListSpan(
|
|
27
|
-
depth = depth,
|
|
28
|
-
context = context,
|
|
29
|
-
styleCache = styleCache,
|
|
30
|
-
blockStyle =
|
|
31
|
-
BlockStyle(
|
|
32
|
-
fontSize = listStyle.fontSize,
|
|
33
|
-
fontFamily = listStyle.fontFamily,
|
|
34
|
-
fontWeight = listStyle.fontWeight,
|
|
35
|
-
color = listStyle.color,
|
|
36
|
-
),
|
|
37
|
-
marginLeft = listStyle.marginLeft,
|
|
38
|
-
gapWidth = listStyle.gapWidth,
|
|
39
|
-
drawsMarker = drawsMarker,
|
|
40
|
-
ancestorMarkerOffset = ancestorMarkerOffset,
|
|
41
|
-
parentMarkerWidth = parentMarkerWidth,
|
|
42
|
-
) {
|
|
43
|
-
companion object {
|
|
44
|
-
private val sharedMarkerPaint = TextPaint().apply { isAntiAlias = true }
|
|
45
|
-
|
|
46
|
-
/** Column every bullet and numbered list reserves, wide enough for `99.`. */
|
|
47
|
-
fun defaultMarkerColumnWidth(
|
|
48
|
-
listStyle: ListStyle,
|
|
49
|
-
context: Context,
|
|
50
|
-
): Float {
|
|
51
|
-
val paint = markerPaint(listStyle, markerTypeface(listStyle, context))
|
|
52
|
-
return listStyle.effectiveMarkerWidth(paint.measureText("99."))
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* How far the `99.` column every ordered list reserves must grow to fit each of [numbers].
|
|
57
|
-
* Whole pixels, so the Int leading margins and the float marker positions agree at every depth.
|
|
58
|
-
*/
|
|
59
|
-
fun measureExtraWidth(
|
|
60
|
-
listStyle: ListStyle,
|
|
61
|
-
context: Context,
|
|
62
|
-
numbers: Iterable<Int>,
|
|
63
|
-
): Float {
|
|
64
|
-
val paint = markerPaint(listStyle, markerTypeface(listStyle, context))
|
|
65
|
-
val default = paint.measureText("99.")
|
|
66
|
-
val widest = numbers.fold(default) { width, number -> maxOf(width, paint.measureText("$number.")) }
|
|
67
|
-
return ceil(listStyle.effectiveMarkerWidth(widest) - listStyle.effectiveMarkerWidth(default))
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
private fun markerTypeface(
|
|
71
|
-
listStyle: ListStyle,
|
|
72
|
-
context: Context,
|
|
73
|
-
): Typeface =
|
|
74
|
-
applyStyles(
|
|
75
|
-
null,
|
|
76
|
-
ReactConstants.UNSET,
|
|
77
|
-
parseFontWeight(listStyle.markerFontWeight),
|
|
78
|
-
listStyle.fontFamily.takeIf { it.isNotEmpty() },
|
|
79
|
-
context.assets,
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
private fun markerPaint(
|
|
83
|
-
listStyle: ListStyle,
|
|
84
|
-
typeface: Typeface,
|
|
85
|
-
): TextPaint =
|
|
86
|
-
sharedMarkerPaint.apply {
|
|
87
|
-
textSize = listStyle.fontSize
|
|
88
|
-
color = listStyle.markerColor
|
|
89
|
-
this.typeface = typeface
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
private val markerTypeface = markerTypeface(listStyle, context)
|
|
94
|
-
private val defaultMarkerWidth = defaultMarkerColumnWidth(listStyle, context)
|
|
95
|
-
|
|
96
|
-
override fun getMarkerWidth(): Float = defaultMarkerWidth + markerExtraWidth
|
|
97
|
-
|
|
98
|
-
override val baselineMarkerWidth: Float get() = defaultMarkerWidth
|
|
99
|
-
|
|
100
|
-
var itemNumber: Int = 1
|
|
101
|
-
private set
|
|
102
|
-
|
|
103
|
-
override fun drawMarker(
|
|
104
|
-
canvas: Canvas,
|
|
105
|
-
paint: Paint,
|
|
106
|
-
x: Int,
|
|
107
|
-
dir: Int,
|
|
108
|
-
top: Int,
|
|
109
|
-
baseline: Int,
|
|
110
|
-
bottom: Int,
|
|
111
|
-
layout: Layout?,
|
|
112
|
-
start: Int,
|
|
113
|
-
) {
|
|
114
|
-
val markerPaint = markerPaint(listStyle, markerTypeface)
|
|
115
|
-
val text = if (dir < 0) ".$itemNumber" else "$itemNumber."
|
|
116
|
-
val textWidth = markerPaint.measureText(text)
|
|
117
|
-
|
|
118
|
-
val markerRightEdge = x + (depth * marginLeft + ancestorMarkerOffset + getMarkerWidth()) * dir
|
|
119
|
-
val markerX = if (dir > 0) markerRightEdge - textWidth else markerRightEdge
|
|
120
|
-
|
|
121
|
-
canvas.drawText(text, markerX, baseline.toFloat(), markerPaint)
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
fun setItemNumber(number: Int) {
|
|
125
|
-
itemNumber = number
|
|
126
|
-
}
|
|
127
|
-
}
|
|
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.Typeface
|
|
7
|
+
import android.text.Layout
|
|
8
|
+
import android.text.TextPaint
|
|
9
|
+
import com.facebook.react.common.ReactConstants
|
|
10
|
+
import com.facebook.react.views.text.ReactTypefaceUtils.applyStyles
|
|
11
|
+
import com.facebook.react.views.text.ReactTypefaceUtils.parseFontWeight
|
|
12
|
+
import com.renderrichtext.renderer.BlockStyle
|
|
13
|
+
import com.renderrichtext.renderer.SpanStyleCache
|
|
14
|
+
import com.renderrichtext.styles.ListStyle
|
|
15
|
+
import kotlin.math.ceil
|
|
16
|
+
|
|
17
|
+
class OrderedListSpan(
|
|
18
|
+
private val listStyle: ListStyle,
|
|
19
|
+
depth: Int,
|
|
20
|
+
context: Context,
|
|
21
|
+
styleCache: SpanStyleCache,
|
|
22
|
+
drawsMarker: Boolean = true,
|
|
23
|
+
override val markerExtraWidth: Float = 0f,
|
|
24
|
+
ancestorMarkerOffset: Float = 0f,
|
|
25
|
+
parentMarkerWidth: Float? = null,
|
|
26
|
+
) : BaseListSpan(
|
|
27
|
+
depth = depth,
|
|
28
|
+
context = context,
|
|
29
|
+
styleCache = styleCache,
|
|
30
|
+
blockStyle =
|
|
31
|
+
BlockStyle(
|
|
32
|
+
fontSize = listStyle.fontSize,
|
|
33
|
+
fontFamily = listStyle.fontFamily,
|
|
34
|
+
fontWeight = listStyle.fontWeight,
|
|
35
|
+
color = listStyle.color,
|
|
36
|
+
),
|
|
37
|
+
marginLeft = listStyle.marginLeft,
|
|
38
|
+
gapWidth = listStyle.gapWidth,
|
|
39
|
+
drawsMarker = drawsMarker,
|
|
40
|
+
ancestorMarkerOffset = ancestorMarkerOffset,
|
|
41
|
+
parentMarkerWidth = parentMarkerWidth,
|
|
42
|
+
) {
|
|
43
|
+
companion object {
|
|
44
|
+
private val sharedMarkerPaint = TextPaint().apply { isAntiAlias = true }
|
|
45
|
+
|
|
46
|
+
/** Column every bullet and numbered list reserves, wide enough for `99.`. */
|
|
47
|
+
fun defaultMarkerColumnWidth(
|
|
48
|
+
listStyle: ListStyle,
|
|
49
|
+
context: Context,
|
|
50
|
+
): Float {
|
|
51
|
+
val paint = markerPaint(listStyle, markerTypeface(listStyle, context))
|
|
52
|
+
return listStyle.effectiveMarkerWidth(paint.measureText("99."))
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* How far the `99.` column every ordered list reserves must grow to fit each of [numbers].
|
|
57
|
+
* Whole pixels, so the Int leading margins and the float marker positions agree at every depth.
|
|
58
|
+
*/
|
|
59
|
+
fun measureExtraWidth(
|
|
60
|
+
listStyle: ListStyle,
|
|
61
|
+
context: Context,
|
|
62
|
+
numbers: Iterable<Int>,
|
|
63
|
+
): Float {
|
|
64
|
+
val paint = markerPaint(listStyle, markerTypeface(listStyle, context))
|
|
65
|
+
val default = paint.measureText("99.")
|
|
66
|
+
val widest = numbers.fold(default) { width, number -> maxOf(width, paint.measureText("$number.")) }
|
|
67
|
+
return ceil(listStyle.effectiveMarkerWidth(widest) - listStyle.effectiveMarkerWidth(default))
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private fun markerTypeface(
|
|
71
|
+
listStyle: ListStyle,
|
|
72
|
+
context: Context,
|
|
73
|
+
): Typeface =
|
|
74
|
+
applyStyles(
|
|
75
|
+
null,
|
|
76
|
+
ReactConstants.UNSET,
|
|
77
|
+
parseFontWeight(listStyle.markerFontWeight),
|
|
78
|
+
listStyle.fontFamily.takeIf { it.isNotEmpty() },
|
|
79
|
+
context.assets,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
private fun markerPaint(
|
|
83
|
+
listStyle: ListStyle,
|
|
84
|
+
typeface: Typeface,
|
|
85
|
+
): TextPaint =
|
|
86
|
+
sharedMarkerPaint.apply {
|
|
87
|
+
textSize = listStyle.fontSize
|
|
88
|
+
color = listStyle.markerColor
|
|
89
|
+
this.typeface = typeface
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private val markerTypeface = markerTypeface(listStyle, context)
|
|
94
|
+
private val defaultMarkerWidth = defaultMarkerColumnWidth(listStyle, context)
|
|
95
|
+
|
|
96
|
+
override fun getMarkerWidth(): Float = defaultMarkerWidth + markerExtraWidth
|
|
97
|
+
|
|
98
|
+
override val baselineMarkerWidth: Float get() = defaultMarkerWidth
|
|
99
|
+
|
|
100
|
+
var itemNumber: Int = 1
|
|
101
|
+
private set
|
|
102
|
+
|
|
103
|
+
override fun drawMarker(
|
|
104
|
+
canvas: Canvas,
|
|
105
|
+
paint: Paint,
|
|
106
|
+
x: Int,
|
|
107
|
+
dir: Int,
|
|
108
|
+
top: Int,
|
|
109
|
+
baseline: Int,
|
|
110
|
+
bottom: Int,
|
|
111
|
+
layout: Layout?,
|
|
112
|
+
start: Int,
|
|
113
|
+
) {
|
|
114
|
+
val markerPaint = markerPaint(listStyle, markerTypeface)
|
|
115
|
+
val text = if (dir < 0) ".$itemNumber" else "$itemNumber."
|
|
116
|
+
val textWidth = markerPaint.measureText(text)
|
|
117
|
+
|
|
118
|
+
val markerRightEdge = x + (depth * marginLeft + ancestorMarkerOffset + getMarkerWidth()) * dir
|
|
119
|
+
val markerX = if (dir > 0) markerRightEdge - textWidth else markerRightEdge
|
|
120
|
+
|
|
121
|
+
canvas.drawText(text, markerX, baseline.toFloat(), markerPaint)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
fun setItemNumber(number: Int) {
|
|
125
|
+
itemNumber = number
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
package com.renderrichtext.spans
|
|
2
|
-
|
|
3
|
-
import android.text.TextPaint
|
|
4
|
-
import android.text.style.MetricAffectingSpan
|
|
5
|
-
import com.renderrichtext.renderer.BlockStyle
|
|
6
|
-
import com.renderrichtext.renderer.SpanStyleCache
|
|
7
|
-
|
|
8
|
-
class SpoilerSpan(
|
|
9
|
-
val styleCache: SpanStyleCache,
|
|
10
|
-
val blockStyle: BlockStyle,
|
|
11
|
-
) : MetricAffectingSpan() {
|
|
12
|
-
var revealed = false
|
|
13
|
-
private set
|
|
14
|
-
var revealing = false
|
|
15
|
-
private set
|
|
16
|
-
|
|
17
|
-
fun markRevealing() {
|
|
18
|
-
revealing = true
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
fun markRevealed() {
|
|
22
|
-
revealed = true
|
|
23
|
-
revealing = false
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
override fun updateDrawState(tp: TextPaint) {
|
|
27
|
-
tp.textSize = blockStyle.fontSize
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
override fun updateMeasureState(tp: TextPaint) {
|
|
31
|
-
tp.textSize = blockStyle.fontSize
|
|
32
|
-
}
|
|
33
|
-
}
|
|
1
|
+
package com.renderrichtext.spans
|
|
2
|
+
|
|
3
|
+
import android.text.TextPaint
|
|
4
|
+
import android.text.style.MetricAffectingSpan
|
|
5
|
+
import com.renderrichtext.renderer.BlockStyle
|
|
6
|
+
import com.renderrichtext.renderer.SpanStyleCache
|
|
7
|
+
|
|
8
|
+
class SpoilerSpan(
|
|
9
|
+
val styleCache: SpanStyleCache,
|
|
10
|
+
val blockStyle: BlockStyle,
|
|
11
|
+
) : MetricAffectingSpan() {
|
|
12
|
+
var revealed = false
|
|
13
|
+
private set
|
|
14
|
+
var revealing = false
|
|
15
|
+
private set
|
|
16
|
+
|
|
17
|
+
fun markRevealing() {
|
|
18
|
+
revealing = true
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
fun markRevealed() {
|
|
22
|
+
revealed = true
|
|
23
|
+
revealing = false
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
27
|
+
tp.textSize = blockStyle.fontSize
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
override fun updateMeasureState(tp: TextPaint) {
|
|
31
|
+
tp.textSize = blockStyle.fontSize
|
|
32
|
+
}
|
|
33
|
+
}
|