@mathers101/react-native-render-rich-text 0.1.10 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -20
- package/README.md +140 -140
- package/ReactNativeRenderRichText.podspec +23 -23
- package/android/build.gradle +86 -86
- package/android/consumer-rules.pro +3 -3
- package/android/src/main/AndroidManifest.xml +2 -2
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextLayoutManager.kt +24 -24
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextPackage.kt +13 -13
- package/android/src/main/java/com/renderrichtext/MeasurementStore.kt +644 -644
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibilityLabels.kt +17 -17
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibleTiptapTextView.kt +112 -112
- package/android/src/main/java/com/renderrichtext/accessibility/TiptapAccessibilityHelper.kt +576 -576
- package/android/src/main/java/com/renderrichtext/events/CodeBlockPressEvent.kt +24 -24
- package/android/src/main/java/com/renderrichtext/events/ContextMenuItemPressEvent.kt +28 -28
- package/android/src/main/java/com/renderrichtext/events/CopyPressEvent.kt +24 -24
- package/android/src/main/java/com/renderrichtext/events/ImagePressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/LatexErrorEvent.kt +29 -29
- package/android/src/main/java/com/renderrichtext/events/LinkLongPressEvent.kt +23 -23
- package/android/src/main/java/com/renderrichtext/events/LinkPressEvent.kt +23 -23
- package/android/src/main/java/com/renderrichtext/events/MentionLongPressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/MentionPressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/TaskListItemPressEvent.kt +26 -26
- package/android/src/main/java/com/renderrichtext/math/LatexErrorReporter.kt +9 -9
- package/android/src/main/java/com/renderrichtext/parser/Parser.kt +59 -59
- package/android/src/main/java/com/renderrichtext/parser/TextLinkMatching.kt +35 -35
- package/android/src/main/java/com/renderrichtext/renderer/BaselineShiftRenderer.kt +45 -45
- package/android/src/main/java/com/renderrichtext/renderer/BlankLineRenderer.kt +39 -39
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteRenderer.kt +243 -243
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteTextRenderer.kt +56 -56
- package/android/src/main/java/com/renderrichtext/renderer/CodeBlockRenderer.kt +135 -135
- package/android/src/main/java/com/renderrichtext/renderer/CodeRenderer.kt +37 -37
- package/android/src/main/java/com/renderrichtext/renderer/EmphasisRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/HeadingRenderer.kt +81 -81
- package/android/src/main/java/com/renderrichtext/renderer/HighlightRenderer.kt +26 -26
- package/android/src/main/java/com/renderrichtext/renderer/LineBreakRenderer.kt +17 -17
- package/android/src/main/java/com/renderrichtext/renderer/LinkRenderer.kt +90 -90
- package/android/src/main/java/com/renderrichtext/renderer/ListContextManager.kt +109 -109
- package/android/src/main/java/com/renderrichtext/renderer/ListItemRenderer.kt +211 -211
- package/android/src/main/java/com/renderrichtext/renderer/ListRenderer.kt +133 -133
- package/android/src/main/java/com/renderrichtext/renderer/MentionRenderer.kt +85 -85
- package/android/src/main/java/com/renderrichtext/renderer/ParagraphRenderer.kt +91 -91
- package/android/src/main/java/com/renderrichtext/renderer/Renderer.kt +148 -148
- package/android/src/main/java/com/renderrichtext/renderer/SoftBreakRenderer.kt +17 -17
- package/android/src/main/java/com/renderrichtext/renderer/SpanStyleCache.kt +143 -143
- package/android/src/main/java/com/renderrichtext/renderer/StrikethroughRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/StrongRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/TextRenderer.kt +31 -31
- package/android/src/main/java/com/renderrichtext/renderer/ThematicBreakRenderer.kt +46 -46
- package/android/src/main/java/com/renderrichtext/renderer/UnderlineRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/spans/BaseListSpan.kt +164 -164
- package/android/src/main/java/com/renderrichtext/spans/BaselineShiftSpan.kt +27 -27
- package/android/src/main/java/com/renderrichtext/spans/BlockquoteSpan.kt +302 -302
- package/android/src/main/java/com/renderrichtext/spans/CodeBackgroundSpan.kt +205 -205
- package/android/src/main/java/com/renderrichtext/spans/CodeBlockSpan.kt +216 -216
- package/android/src/main/java/com/renderrichtext/spans/CodeSpan.kt +32 -32
- package/android/src/main/java/com/renderrichtext/spans/EmphasisSpan.kt +42 -42
- package/android/src/main/java/com/renderrichtext/spans/FadeInSpan.kt +29 -29
- package/android/src/main/java/com/renderrichtext/spans/HeadingSpan.kt +38 -38
- package/android/src/main/java/com/renderrichtext/spans/HighlightSpan.kt +80 -80
- package/android/src/main/java/com/renderrichtext/spans/ImageSpan.kt +481 -481
- package/android/src/main/java/com/renderrichtext/spans/InlineBackgroundGeometry.kt +42 -42
- package/android/src/main/java/com/renderrichtext/spans/LineHeightSpan.kt +39 -39
- package/android/src/main/java/com/renderrichtext/spans/LinkPillIconCache.kt +154 -154
- package/android/src/main/java/com/renderrichtext/spans/LinkPillSpan.kt +381 -381
- package/android/src/main/java/com/renderrichtext/spans/LinkSpan.kt +68 -68
- package/android/src/main/java/com/renderrichtext/spans/ListItemSpacingSpan.kt +33 -33
- package/android/src/main/java/com/renderrichtext/spans/ListMarkerAnchorSpan.kt +38 -38
- package/android/src/main/java/com/renderrichtext/spans/MarginBottomSpan.kt +76 -76
- package/android/src/main/java/com/renderrichtext/spans/MentionChipSpan.kt +132 -132
- package/android/src/main/java/com/renderrichtext/spans/MentionSpan.kt +46 -46
- package/android/src/main/java/com/renderrichtext/spans/OrderedListSpan.kt +127 -127
- package/android/src/main/java/com/renderrichtext/spans/SpoilerSpan.kt +33 -33
- package/android/src/main/java/com/renderrichtext/spans/StrikethroughSpan.kt +12 -12
- package/android/src/main/java/com/renderrichtext/spans/StrongSpan.kt +39 -39
- package/android/src/main/java/com/renderrichtext/spans/TaskListSpan.kt +143 -143
- package/android/src/main/java/com/renderrichtext/spans/TextSpan.kt +26 -26
- package/android/src/main/java/com/renderrichtext/spans/ThematicBreakSpan.kt +69 -69
- package/android/src/main/java/com/renderrichtext/spans/UnorderedListSpan.kt +96 -96
- package/android/src/main/java/com/renderrichtext/spoiler/SpoilerStubs.kt +46 -46
- package/android/src/main/java/com/renderrichtext/styles/BaseBlockStyle.kt +11 -11
- package/android/src/main/java/com/renderrichtext/styles/BlockquoteStyle.kt +83 -83
- package/android/src/main/java/com/renderrichtext/styles/CodeBlockStyle.kt +80 -80
- package/android/src/main/java/com/renderrichtext/styles/CodeStyle.kt +26 -26
- package/android/src/main/java/com/renderrichtext/styles/EmphasisStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/FactoidStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/HeadingStyle.kt +33 -33
- package/android/src/main/java/com/renderrichtext/styles/HighlightStyle.kt +19 -19
- package/android/src/main/java/com/renderrichtext/styles/ImageStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/InlineImageStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/InlineMathStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/LinkPillContent.kt +36 -36
- package/android/src/main/java/com/renderrichtext/styles/LinkPillStyle.kt +44 -44
- package/android/src/main/java/com/renderrichtext/styles/LinkStyle.kt +23 -23
- package/android/src/main/java/com/renderrichtext/styles/LinkVariantEntry.kt +34 -34
- package/android/src/main/java/com/renderrichtext/styles/ListStyle.kt +65 -65
- package/android/src/main/java/com/renderrichtext/styles/MathStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/MentionStyle.kt +19 -19
- package/android/src/main/java/com/renderrichtext/styles/ParagraphStyle.kt +33 -33
- package/android/src/main/java/com/renderrichtext/styles/SpoilerStyle.kt +27 -27
- package/android/src/main/java/com/renderrichtext/styles/StrikethroughStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/StrongStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/StyleConfig.kt +411 -411
- package/android/src/main/java/com/renderrichtext/styles/StyleParser.kt +92 -92
- package/android/src/main/java/com/renderrichtext/styles/SubscriptStyle.kt +16 -16
- package/android/src/main/java/com/renderrichtext/styles/SuperscriptStyle.kt +16 -16
- package/android/src/main/java/com/renderrichtext/styles/TableStyle.kt +75 -75
- package/android/src/main/java/com/renderrichtext/styles/TaskListStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/TextAlignment.kt +32 -32
- package/android/src/main/java/com/renderrichtext/styles/ThematicBreakStyle.kt +23 -23
- package/android/src/main/java/com/renderrichtext/styles/UnderlineStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/VideoStyle.kt +31 -31
- package/android/src/main/java/com/renderrichtext/utils/common/BorderStyleUtils.kt +86 -86
- package/android/src/main/java/com/renderrichtext/utils/common/BreakStrategyUtils.kt +32 -32
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockHighlighter.kt +36 -36
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockNode.kt +42 -42
- package/android/src/main/java/com/renderrichtext/utils/common/EllipsizeUtils.kt +27 -27
- package/android/src/main/java/com/renderrichtext/utils/common/EnrichedTiptapAncestorUtils.kt +10 -10
- package/android/src/main/java/com/renderrichtext/utils/common/FeatureFlags.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRecognitionProps.kt +31 -31
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRegexConfig.kt +56 -56
- package/android/src/main/java/com/renderrichtext/utils/common/MotionPreferences.kt +18 -18
- package/android/src/main/java/com/renderrichtext/utils/common/ReadableMapExtensions.kt +28 -28
- package/android/src/main/java/com/renderrichtext/utils/common/layout/RTLUtils.kt +6 -6
- package/android/src/main/java/com/renderrichtext/utils/common/serialization/TiptapASTSerializer.kt +368 -368
- package/android/src/main/java/com/renderrichtext/utils/text/ImageCache.kt +88 -88
- package/android/src/main/java/com/renderrichtext/utils/text/ImageDownloader.kt +203 -203
- package/android/src/main/java/com/renderrichtext/utils/text/LocalImageLoader.kt +167 -167
- package/android/src/main/java/com/renderrichtext/utils/text/TailFadeInAnimator.kt +84 -84
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/HTMLGenerator.kt +1105 -1105
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/TiptapExtractor.kt +423 -423
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/ParagraphUtils.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/SpannableExtensions.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/TextPaintExtensions.kt +76 -76
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/CheckboxTouchHelper.kt +61 -61
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/TaskListTapUtils.kt +286 -286
- package/android/src/main/java/com/renderrichtext/utils/text/span/ApplyLineHeight.kt +39 -39
- package/android/src/main/java/com/renderrichtext/utils/text/span/BlockSpacing.kt +142 -142
- package/android/src/main/java/com/renderrichtext/utils/text/span/SpanFlags.kt +43 -43
- package/android/src/main/java/com/renderrichtext/utils/text/span/WidthAwareSpans.kt +30 -30
- package/android/src/main/java/com/renderrichtext/utils/text/view/CodeBlockPressHost.kt +15 -15
- package/android/src/main/java/com/renderrichtext/utils/text/view/ImagePressHost.kt +19 -19
- package/android/src/main/java/com/renderrichtext/utils/text/view/SelectionActionMode.kt +235 -235
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextSelectionColors.kt +48 -48
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextViewSetup.kt +119 -119
- package/android/src/main/java/com/renderrichtext/views/ContextMenuPopup.kt +217 -217
- package/android/src/main/java/com/renderrichtext/views/CopyGlyph.kt +101 -101
- package/android/src/main/java/com/renderrichtext/views/WrapGlyph.kt +40 -40
- package/android/src/main/jni/CMakeLists.txt +52 -52
- package/android/src/main/jni/react/renderer/components/RichTextSpec/ComponentDescriptors.h +30 -30
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextComponentDescriptor.h +29 -29
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.cpp +45 -45
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.h +21 -21
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.cpp +38 -38
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.h +53 -53
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.cpp +9 -9
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.h +24 -24
- package/android/src/main/jni/react/renderer/components/RichTextSpec/conversions.h +40 -40
- package/cpp/parser/TiptapParser.hpp +13 -13
- package/cpp/vendor/nlohmann/json.hpp +24765 -24765
- package/ios/EnrichedTiptapText.h +27 -27
- package/ios/attachments/ENRMImageAttachment.h +51 -51
- package/ios/attachments/ENRMImageAttachment.m +398 -398
- package/ios/attachments/ENRMLinkPillAttachment.h +47 -47
- package/ios/attachments/ENRMLinkPillAttachment.m +324 -324
- package/ios/attachments/ENRMLinkPillIconCache.h +28 -28
- package/ios/attachments/ENRMLinkPillIconCache.m +181 -181
- package/ios/attachments/ENRMLinkPillText.h +27 -27
- package/ios/attachments/ENRMLinkPillText.m +118 -118
- package/ios/attachments/ENRMMathInlineAttachment.h +7 -7
- package/ios/attachments/ENRMMathInlineAttachment.m +4 -4
- package/ios/attachments/ThematicBreakAttachment.h +15 -15
- package/ios/attachments/ThematicBreakAttachment.m +33 -33
- package/ios/internals/ENRMViewFreeMeasurement.h +208 -208
- package/ios/internals/EnrichedTiptapTextComponentDescriptor.h +19 -19
- package/ios/internals/EnrichedTiptapTextShadowNode.h +43 -43
- package/ios/internals/EnrichedTiptapTextShadowNode.mm +69 -69
- package/ios/internals/EnrichedTiptapTextState.h +24 -24
- package/ios/internals/MeasurementCache.h +308 -308
- package/ios/internals/ShadowMeasurementUtils.h +145 -145
- package/ios/parser/ENRMTextLinkAttributes.h +7 -7
- package/ios/parser/ENRMTiptapParser.h +33 -33
- package/ios/parser/ENRMTiptapParser.mm +73 -73
- package/ios/parser/TiptapASTNode.m +52 -52
- package/ios/renderer/AttributedRenderer.h +23 -23
- package/ios/renderer/AttributedRenderer.m +229 -229
- package/ios/renderer/BaseRenderer.h +33 -33
- package/ios/renderer/BaseRenderer.m +46 -46
- package/ios/renderer/BaselineShiftTextAttributes.h +10 -10
- package/ios/renderer/BaselineShiftTextAttributes.m +26 -26
- package/ios/renderer/BlankLineRenderer.h +4 -4
- package/ios/renderer/BlankLineRenderer.m +51 -51
- package/ios/renderer/BlockquoteRenderer.h +6 -6
- package/ios/renderer/BlockquoteRenderer.m +258 -258
- package/ios/renderer/CodeBlockRenderer.h +9 -9
- package/ios/renderer/CodeBlockRenderer.m +99 -99
- package/ios/renderer/CodeRenderer.h +9 -9
- package/ios/renderer/CodeRenderer.m +69 -69
- package/ios/renderer/ENRMBlockquoteTextRenderer.h +25 -25
- package/ios/renderer/ENRMBlockquoteTextRenderer.m +48 -48
- package/ios/renderer/EmphasisRenderer.h +5 -5
- package/ios/renderer/EmphasisRenderer.m +99 -99
- package/ios/renderer/HeadingRenderer.h +6 -6
- package/ios/renderer/HeadingRenderer.m +102 -102
- package/ios/renderer/HighlightRenderer.h +7 -7
- package/ios/renderer/HighlightRenderer.m +33 -33
- package/ios/renderer/LinkRenderer.h +6 -6
- package/ios/renderer/LinkRenderer.m +157 -157
- package/ios/renderer/ListItemRenderer.h +24 -24
- package/ios/renderer/ListItemRenderer.m +283 -283
- package/ios/renderer/ListRenderer.h +13 -13
- package/ios/renderer/ListRenderer.m +126 -126
- package/ios/renderer/MentionRenderer.h +9 -9
- package/ios/renderer/MentionRenderer.m +96 -96
- package/ios/renderer/NodeRenderer.h +8 -8
- package/ios/renderer/ParagraphRenderer.h +6 -6
- package/ios/renderer/ParagraphRenderer.m +85 -85
- package/ios/renderer/RenderContext.h +145 -145
- package/ios/renderer/RenderContext.m +402 -402
- package/ios/renderer/RendererFactory.h +12 -12
- package/ios/renderer/StrikethroughRenderer.h +5 -5
- package/ios/renderer/StrikethroughRenderer.m +30 -30
- package/ios/renderer/StrongRenderer.h +5 -5
- package/ios/renderer/StrongRenderer.m +87 -87
- package/ios/renderer/TextRenderer.h +6 -6
- package/ios/renderer/TextRenderer.m +18 -18
- package/ios/renderer/ThematicBreakRenderer.h +4 -4
- package/ios/renderer/ThematicBreakRenderer.m +41 -41
- package/ios/renderer/UnderlineRenderer.h +4 -4
- package/ios/renderer/UnderlineRenderer.m +41 -41
- package/ios/styles/ENRMFontSlot.h +12 -12
- package/ios/styles/ENRMFontSlot.m +24 -24
- package/ios/styles/StyleConfig.h +488 -488
- package/ios/styles/StyleConfig.mm +2820 -2820
- package/ios/utils/AccessibilityInfo.h +35 -35
- package/ios/utils/AccessibilityInfo.m +24 -24
- package/ios/utils/BlockquoteBorder.h +26 -26
- package/ios/utils/BlockquoteBorder.m +294 -294
- package/ios/utils/CodeBackground.h +19 -19
- package/ios/utils/CodeBackground.m +196 -196
- package/ios/utils/CodeBlockBackground.h +17 -17
- package/ios/utils/CodeBlockBackground.m +102 -102
- package/ios/utils/ContextMenuUtils.h +76 -76
- package/ios/utils/ContextMenuUtils.mm +75 -75
- package/ios/utils/ENRMAccessibilityLabels.h +40 -40
- package/ios/utils/ENRMAccessibilityLabels.m +5 -5
- package/ios/utils/ENRMAsyncRenderCoordinator.h +24 -24
- package/ios/utils/ENRMAsyncRenderCoordinator.m +37 -37
- package/ios/utils/ENRMAtomicSize.h +65 -65
- package/ios/utils/ENRMCodeBlockContent.h +37 -37
- package/ios/utils/ENRMCodeBlockContent.mm +89 -89
- package/ios/utils/ENRMFeatureFlags.h +25 -25
- package/ios/utils/ENRMImageDownloader.h +30 -30
- package/ios/utils/ENRMImageDownloader.m +168 -168
- package/ios/utils/ENRMLatexErrorCoordinator.h +27 -27
- package/ios/utils/ENRMLatexErrorCoordinator.mm +75 -75
- package/ios/utils/ENRMLatexErrorReporting.h +13 -13
- package/ios/utils/ENRMLinkContextMenus.h +93 -93
- package/ios/utils/ENRMLinkContextMenus.m +178 -178
- package/ios/utils/ENRMLinkRegexConfig.h +30 -30
- package/ios/utils/ENRMLinkRegexConfig.mm +104 -104
- package/ios/utils/ENRMLinkRegexProps.h +23 -23
- package/ios/utils/ENRMLocalImageLoader.h +35 -35
- package/ios/utils/ENRMLocalImageLoader.m +111 -111
- package/ios/utils/ENRMMenuAction.h +27 -27
- package/ios/utils/ENRMMenuAction.m +33 -33
- package/ios/utils/ENRMSpoilerOverlayManager.h +15 -15
- package/ios/utils/ENRMSpoilerOverlayManager.m +19 -19
- package/ios/utils/ENRMSpoilerTapUtils.h +6 -6
- package/ios/utils/ENRMSpoilerTapUtils.m +11 -11
- package/ios/utils/ENRMTailFadeInAnimator.h +16 -16
- package/ios/utils/ENRMTailFadeInAnimator.m +161 -161
- package/ios/utils/ENRMTextHitTest.h +23 -23
- package/ios/utils/ENRMTextHitTest.m +20 -20
- package/ios/utils/ENRMTextInteractionUtils.h +20 -20
- package/ios/utils/ENRMTextInteractionUtils.m +15 -15
- package/ios/utils/ENRMTextRenderer.h +38 -38
- package/ios/utils/ENRMTextRenderer.m +54 -54
- package/ios/utils/ENRMTextViewSetup.h +132 -132
- package/ios/utils/ENRMUIKit.h +429 -429
- package/ios/utils/EditMenuUtils.h +105 -105
- package/ios/utils/EditMenuUtils.m +143 -143
- package/ios/utils/FontScaleObserver.h +10 -10
- package/ios/utils/FontScaleObserver.m +55 -55
- package/ios/utils/FontUtils.h +31 -31
- package/ios/utils/FontUtils.m +63 -63
- package/ios/utils/HTMLGenerator.h +25 -25
- package/ios/utils/HTMLGenerator.m +1041 -1041
- package/ios/utils/HeightUpdateUtils.h +25 -25
- package/ios/utils/ImageRequestHeaderUtils.h +35 -35
- package/ios/utils/LastElementUtils.h +97 -97
- package/ios/utils/LinkContextMenuUtils.h +55 -55
- package/ios/utils/LinkPillContentUtils.h +46 -46
- package/ios/utils/ListMarkerDrawer.h +15 -15
- package/ios/utils/ListMarkerDrawer.m +239 -239
- package/ios/utils/MentionBackground.h +26 -26
- package/ios/utils/MentionBackground.m +86 -86
- package/ios/utils/ParagraphStyleUtils.h +87 -87
- package/ios/utils/ParagraphStyleUtils.m +484 -484
- package/ios/utils/PasteboardUtils.h +48 -48
- package/ios/utils/PasteboardUtils.m +166 -166
- package/ios/utils/RTFExportUtils.h +24 -24
- package/ios/utils/RTFExportUtils.m +299 -299
- package/ios/utils/SelectionColorUtils.h +14 -14
- package/ios/utils/StylePropsUtils.h +1340 -1340
- package/ios/utils/TaskListTapUtils.h +6 -6
- package/ios/utils/TaskListTapUtils.m +14 -14
- package/ios/utils/TextViewLayoutManager.h +14 -14
- package/ios/utils/TiptapAccessibilityElementBuilder.h +43 -43
- package/ios/utils/TiptapAccessibilityElementBuilder.m +432 -432
- package/ios/utils/TiptapExtractor.h +17 -17
- package/ios/utils/TiptapExtractor.m +367 -367
- package/ios/views/ENRMTiptapTextView.h +25 -25
- package/ios/views/ENRMTiptapTextView.m +247 -247
- package/package.json +65 -70
- package/react-native.config.js +10 -10
- package/src/admonitionDefaults.ts +58 -58
- package/src/darkModeTextStyle.ts +99 -99
- package/src/headingDefaults.ts +21 -21
- package/src/index.tsx +4 -4
- package/src/linkVariantUtils.ts +120 -120
- package/src/normalizeTiptapStyle.ts +397 -397
- package/src/rn-globals.d.ts +1 -1
- package/src/styleUtils.ts +107 -107
- package/src/types/TiptapStyle.ts +532 -532
- package/src/types/TiptapStyleInternal.ts +299 -299
- package/src/types/linkPill.ts +9 -9
- package/src/utils/isDev.ts +4 -4
|
@@ -1,148 +1,148 @@
|
|
|
1
|
-
package com.renderrichtext.renderer
|
|
2
|
-
|
|
3
|
-
import android.content.Context
|
|
4
|
-
import android.text.SpannableStringBuilder
|
|
5
|
-
import com.renderrichtext.math.LatexErrorReporter
|
|
6
|
-
import com.renderrichtext.parser.TiptapASTNode
|
|
7
|
-
import com.renderrichtext.spans.ImageSpan
|
|
8
|
-
import com.renderrichtext.spans.MarginBottomSpan
|
|
9
|
-
import com.renderrichtext.styles.StyleConfig
|
|
10
|
-
|
|
11
|
-
class Renderer {
|
|
12
|
-
private var cachedFactory: RendererFactory? = null
|
|
13
|
-
private var cachedStyle: StyleConfig? = null
|
|
14
|
-
private var cachedContext: Context? = null
|
|
15
|
-
private var cachedOnLatexError: LatexErrorReporter? = null
|
|
16
|
-
|
|
17
|
-
private val collectedImageSpans = mutableListOf<ImageSpan>()
|
|
18
|
-
private var lastElementMarginBottom: Float = 0f
|
|
19
|
-
|
|
20
|
-
fun configure(
|
|
21
|
-
style: StyleConfig,
|
|
22
|
-
context: Context,
|
|
23
|
-
onLatexError: LatexErrorReporter? = null,
|
|
24
|
-
) {
|
|
25
|
-
if (cachedStyle === style && cachedContext === context && cachedOnLatexError === onLatexError) return
|
|
26
|
-
|
|
27
|
-
cachedStyle = style
|
|
28
|
-
cachedContext = context
|
|
29
|
-
cachedOnLatexError = onLatexError
|
|
30
|
-
cachedFactory =
|
|
31
|
-
RendererFactory(
|
|
32
|
-
RendererConfig(style, onLatexError),
|
|
33
|
-
context,
|
|
34
|
-
) { span -> reportImageSpan(span) }
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
fun renderDocument(
|
|
38
|
-
document: TiptapASTNode,
|
|
39
|
-
onLinkPress: ((String) -> Unit)? = null,
|
|
40
|
-
onLinkLongPress: ((String) -> Unit)? = null,
|
|
41
|
-
onFactoidPress: ((String) -> Unit)? = null,
|
|
42
|
-
onMentionPress: ((String, String) -> Unit)? = null,
|
|
43
|
-
onMentionLongPress: ((String, String) -> Unit)? = null,
|
|
44
|
-
): SpannableStringBuilder =
|
|
45
|
-
renderContent(
|
|
46
|
-
document.children,
|
|
47
|
-
onLinkPress,
|
|
48
|
-
onLinkLongPress,
|
|
49
|
-
onFactoidPress,
|
|
50
|
-
onMentionPress,
|
|
51
|
-
onMentionLongPress,
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Renders a flat list of sibling nodes into a fresh buffer and hands over
|
|
56
|
-
* ownership of it. This is the generic envelope shared by the document and
|
|
57
|
-
* block-segment paths: reset the factory, build the spannable, trim the trailing
|
|
58
|
-
* margin, and flush deferred spans (e.g. BaselineShiftSpan) after all block-level
|
|
59
|
-
* spans are set - see BaselineShiftRenderer for the proper long-term fix.
|
|
60
|
-
*
|
|
61
|
-
* An optional [block] decorates the pass - it enters a block style before the
|
|
62
|
-
* nodes render and post-processes the finished builder - letting a caller render
|
|
63
|
-
* content as e.g. blockquote text without this class knowing anything
|
|
64
|
-
* block-specific. See [BlockquoteTextRenderer].
|
|
65
|
-
*
|
|
66
|
-
* The builder is returned as-is rather than frozen into a `SpannableString`:
|
|
67
|
-
* the tiptap text view adopts it verbatim (see `NoCopySpannableFactory`),
|
|
68
|
-
* and converting it would cost a quadratic span copy for no benefit. Each call
|
|
69
|
-
* builds its own buffer, so callers must not mutate one they have passed on.
|
|
70
|
-
*/
|
|
71
|
-
fun renderContent(
|
|
72
|
-
nodes: List<TiptapASTNode>,
|
|
73
|
-
onLinkPress: ((String) -> Unit)? = null,
|
|
74
|
-
onLinkLongPress: ((String) -> Unit)? = null,
|
|
75
|
-
onFactoidPress: ((String) -> Unit)? = null,
|
|
76
|
-
onMentionPress: ((String, String) -> Unit)? = null,
|
|
77
|
-
onMentionLongPress: ((String, String) -> Unit)? = null,
|
|
78
|
-
block: BlockquoteTextRenderer? = null,
|
|
79
|
-
): SpannableStringBuilder {
|
|
80
|
-
val factory =
|
|
81
|
-
requireNotNull(cachedFactory) {
|
|
82
|
-
"Renderer must be configured with a style before rendering."
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
factory.resetForNewRender()
|
|
86
|
-
factory.onMentionPress = onMentionPress
|
|
87
|
-
factory.onMentionLongPress = onMentionLongPress
|
|
88
|
-
collectedImageSpans.clear()
|
|
89
|
-
lastElementMarginBottom = 0f
|
|
90
|
-
|
|
91
|
-
val builder = SpannableStringBuilder()
|
|
92
|
-
|
|
93
|
-
block?.push(factory.blockStyleContext)
|
|
94
|
-
try {
|
|
95
|
-
factory.renderNodes(nodes, builder, onLinkPress, onLinkLongPress, onFactoidPress)
|
|
96
|
-
} finally {
|
|
97
|
-
block?.pop(factory.blockStyleContext)
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
removeTrailingMargin(builder)
|
|
101
|
-
block?.postProcess(builder)
|
|
102
|
-
factory.flushDeferredSpans(builder)
|
|
103
|
-
|
|
104
|
-
return builder
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/** Removes trailing newlines and captures the margin of the final element. */
|
|
108
|
-
private fun removeTrailingMargin(builder: SpannableStringBuilder) {
|
|
109
|
-
if (builder.isEmpty()) return
|
|
110
|
-
|
|
111
|
-
// Identify the last margin span and store its value
|
|
112
|
-
val lastSpan =
|
|
113
|
-
builder
|
|
114
|
-
.getSpans(0, builder.length, MarginBottomSpan::class.java)
|
|
115
|
-
.maxByOrNull { builder.getSpanEnd(it) }
|
|
116
|
-
|
|
117
|
-
lastElementMarginBottom = lastSpan?.marginBottom ?: 0f
|
|
118
|
-
|
|
119
|
-
// Trim trailing newlines
|
|
120
|
-
while (builder.endsWith('\n')) {
|
|
121
|
-
builder.delete(builder.length - 1, builder.length)
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Clean up the span if it no longer covers any text
|
|
125
|
-
if (lastSpan != null && builder.getSpanEnd(lastSpan) >= builder.length) {
|
|
126
|
-
builder.removeSpan(lastSpan)
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Returns the marginBottom value of the last element in the document.
|
|
132
|
-
* This is dynamically determined from the actual last element (paragraph, image, heading, etc.)
|
|
133
|
-
* and can be used in MeasurementStore to adjust the measured height.
|
|
134
|
-
*/
|
|
135
|
-
fun getLastElementMarginBottom(): Float = lastElementMarginBottom
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Internal helper used by the Factory's lambda to collect spans.
|
|
139
|
-
*/
|
|
140
|
-
private fun reportImageSpan(span: ImageSpan) {
|
|
141
|
-
collectedImageSpans.add(span)
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Provides the EnrichedTiptapText with the exact list of spans that need registration.
|
|
146
|
-
*/
|
|
147
|
-
fun getCollectedImageSpans(): List<ImageSpan> = collectedImageSpans
|
|
148
|
-
}
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.text.SpannableStringBuilder
|
|
5
|
+
import com.renderrichtext.math.LatexErrorReporter
|
|
6
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
7
|
+
import com.renderrichtext.spans.ImageSpan
|
|
8
|
+
import com.renderrichtext.spans.MarginBottomSpan
|
|
9
|
+
import com.renderrichtext.styles.StyleConfig
|
|
10
|
+
|
|
11
|
+
class Renderer {
|
|
12
|
+
private var cachedFactory: RendererFactory? = null
|
|
13
|
+
private var cachedStyle: StyleConfig? = null
|
|
14
|
+
private var cachedContext: Context? = null
|
|
15
|
+
private var cachedOnLatexError: LatexErrorReporter? = null
|
|
16
|
+
|
|
17
|
+
private val collectedImageSpans = mutableListOf<ImageSpan>()
|
|
18
|
+
private var lastElementMarginBottom: Float = 0f
|
|
19
|
+
|
|
20
|
+
fun configure(
|
|
21
|
+
style: StyleConfig,
|
|
22
|
+
context: Context,
|
|
23
|
+
onLatexError: LatexErrorReporter? = null,
|
|
24
|
+
) {
|
|
25
|
+
if (cachedStyle === style && cachedContext === context && cachedOnLatexError === onLatexError) return
|
|
26
|
+
|
|
27
|
+
cachedStyle = style
|
|
28
|
+
cachedContext = context
|
|
29
|
+
cachedOnLatexError = onLatexError
|
|
30
|
+
cachedFactory =
|
|
31
|
+
RendererFactory(
|
|
32
|
+
RendererConfig(style, onLatexError),
|
|
33
|
+
context,
|
|
34
|
+
) { span -> reportImageSpan(span) }
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
fun renderDocument(
|
|
38
|
+
document: TiptapASTNode,
|
|
39
|
+
onLinkPress: ((String) -> Unit)? = null,
|
|
40
|
+
onLinkLongPress: ((String) -> Unit)? = null,
|
|
41
|
+
onFactoidPress: ((String) -> Unit)? = null,
|
|
42
|
+
onMentionPress: ((String, String) -> Unit)? = null,
|
|
43
|
+
onMentionLongPress: ((String, String) -> Unit)? = null,
|
|
44
|
+
): SpannableStringBuilder =
|
|
45
|
+
renderContent(
|
|
46
|
+
document.children,
|
|
47
|
+
onLinkPress,
|
|
48
|
+
onLinkLongPress,
|
|
49
|
+
onFactoidPress,
|
|
50
|
+
onMentionPress,
|
|
51
|
+
onMentionLongPress,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Renders a flat list of sibling nodes into a fresh buffer and hands over
|
|
56
|
+
* ownership of it. This is the generic envelope shared by the document and
|
|
57
|
+
* block-segment paths: reset the factory, build the spannable, trim the trailing
|
|
58
|
+
* margin, and flush deferred spans (e.g. BaselineShiftSpan) after all block-level
|
|
59
|
+
* spans are set - see BaselineShiftRenderer for the proper long-term fix.
|
|
60
|
+
*
|
|
61
|
+
* An optional [block] decorates the pass - it enters a block style before the
|
|
62
|
+
* nodes render and post-processes the finished builder - letting a caller render
|
|
63
|
+
* content as e.g. blockquote text without this class knowing anything
|
|
64
|
+
* block-specific. See [BlockquoteTextRenderer].
|
|
65
|
+
*
|
|
66
|
+
* The builder is returned as-is rather than frozen into a `SpannableString`:
|
|
67
|
+
* the tiptap text view adopts it verbatim (see `NoCopySpannableFactory`),
|
|
68
|
+
* and converting it would cost a quadratic span copy for no benefit. Each call
|
|
69
|
+
* builds its own buffer, so callers must not mutate one they have passed on.
|
|
70
|
+
*/
|
|
71
|
+
fun renderContent(
|
|
72
|
+
nodes: List<TiptapASTNode>,
|
|
73
|
+
onLinkPress: ((String) -> Unit)? = null,
|
|
74
|
+
onLinkLongPress: ((String) -> Unit)? = null,
|
|
75
|
+
onFactoidPress: ((String) -> Unit)? = null,
|
|
76
|
+
onMentionPress: ((String, String) -> Unit)? = null,
|
|
77
|
+
onMentionLongPress: ((String, String) -> Unit)? = null,
|
|
78
|
+
block: BlockquoteTextRenderer? = null,
|
|
79
|
+
): SpannableStringBuilder {
|
|
80
|
+
val factory =
|
|
81
|
+
requireNotNull(cachedFactory) {
|
|
82
|
+
"Renderer must be configured with a style before rendering."
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
factory.resetForNewRender()
|
|
86
|
+
factory.onMentionPress = onMentionPress
|
|
87
|
+
factory.onMentionLongPress = onMentionLongPress
|
|
88
|
+
collectedImageSpans.clear()
|
|
89
|
+
lastElementMarginBottom = 0f
|
|
90
|
+
|
|
91
|
+
val builder = SpannableStringBuilder()
|
|
92
|
+
|
|
93
|
+
block?.push(factory.blockStyleContext)
|
|
94
|
+
try {
|
|
95
|
+
factory.renderNodes(nodes, builder, onLinkPress, onLinkLongPress, onFactoidPress)
|
|
96
|
+
} finally {
|
|
97
|
+
block?.pop(factory.blockStyleContext)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
removeTrailingMargin(builder)
|
|
101
|
+
block?.postProcess(builder)
|
|
102
|
+
factory.flushDeferredSpans(builder)
|
|
103
|
+
|
|
104
|
+
return builder
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Removes trailing newlines and captures the margin of the final element. */
|
|
108
|
+
private fun removeTrailingMargin(builder: SpannableStringBuilder) {
|
|
109
|
+
if (builder.isEmpty()) return
|
|
110
|
+
|
|
111
|
+
// Identify the last margin span and store its value
|
|
112
|
+
val lastSpan =
|
|
113
|
+
builder
|
|
114
|
+
.getSpans(0, builder.length, MarginBottomSpan::class.java)
|
|
115
|
+
.maxByOrNull { builder.getSpanEnd(it) }
|
|
116
|
+
|
|
117
|
+
lastElementMarginBottom = lastSpan?.marginBottom ?: 0f
|
|
118
|
+
|
|
119
|
+
// Trim trailing newlines
|
|
120
|
+
while (builder.endsWith('\n')) {
|
|
121
|
+
builder.delete(builder.length - 1, builder.length)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Clean up the span if it no longer covers any text
|
|
125
|
+
if (lastSpan != null && builder.getSpanEnd(lastSpan) >= builder.length) {
|
|
126
|
+
builder.removeSpan(lastSpan)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Returns the marginBottom value of the last element in the document.
|
|
132
|
+
* This is dynamically determined from the actual last element (paragraph, image, heading, etc.)
|
|
133
|
+
* and can be used in MeasurementStore to adjust the measured height.
|
|
134
|
+
*/
|
|
135
|
+
fun getLastElementMarginBottom(): Float = lastElementMarginBottom
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Internal helper used by the Factory's lambda to collect spans.
|
|
139
|
+
*/
|
|
140
|
+
private fun reportImageSpan(span: ImageSpan) {
|
|
141
|
+
collectedImageSpans.add(span)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Provides the EnrichedTiptapText with the exact list of spans that need registration.
|
|
146
|
+
*/
|
|
147
|
+
fun getCollectedImageSpans(): List<ImageSpan> = collectedImageSpans
|
|
148
|
+
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
package com.renderrichtext.renderer
|
|
2
|
-
|
|
3
|
-
import android.text.SpannableStringBuilder
|
|
4
|
-
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
-
|
|
6
|
-
class SoftBreakRenderer : NodeRenderer {
|
|
7
|
-
override fun render(
|
|
8
|
-
node: TiptapASTNode,
|
|
9
|
-
builder: SpannableStringBuilder,
|
|
10
|
-
onLinkPress: ((String) -> Unit)?,
|
|
11
|
-
onLinkLongPress: ((String) -> Unit)?,
|
|
12
|
-
onFactoidPress: ((String) -> Unit)?,
|
|
13
|
-
factory: RendererFactory,
|
|
14
|
-
) {
|
|
15
|
-
builder.append(" ")
|
|
16
|
-
}
|
|
17
|
-
}
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
+
|
|
6
|
+
class SoftBreakRenderer : NodeRenderer {
|
|
7
|
+
override fun render(
|
|
8
|
+
node: TiptapASTNode,
|
|
9
|
+
builder: SpannableStringBuilder,
|
|
10
|
+
onLinkPress: ((String) -> Unit)?,
|
|
11
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
12
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
13
|
+
factory: RendererFactory,
|
|
14
|
+
) {
|
|
15
|
+
builder.append(" ")
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -1,143 +1,143 @@
|
|
|
1
|
-
package com.renderrichtext.renderer
|
|
2
|
-
|
|
3
|
-
import android.content.res.AssetManager
|
|
4
|
-
import android.graphics.Typeface
|
|
5
|
-
import com.facebook.react.common.ReactConstants
|
|
6
|
-
import com.facebook.react.views.text.ReactTypefaceUtils.applyStyles
|
|
7
|
-
import com.renderrichtext.styles.LinkVariantEntry
|
|
8
|
-
import com.renderrichtext.styles.StyleConfig
|
|
9
|
-
|
|
10
|
-
/** Shared style cache for spans to avoid redundant calculations. */
|
|
11
|
-
class SpanStyleCache(
|
|
12
|
-
style: StyleConfig,
|
|
13
|
-
) {
|
|
14
|
-
private val assetManager: AssetManager = style.assetManager
|
|
15
|
-
|
|
16
|
-
// Colors to preserve when applying inline styles (links, code, strong, emphasis)
|
|
17
|
-
val colorsToPreserve: IntArray = buildColorsToPreserve(style)
|
|
18
|
-
|
|
19
|
-
val strongFontFamily: String = style.strongStyle.fontFamily
|
|
20
|
-
val strongFontWeight: String = style.strongStyle.fontWeight
|
|
21
|
-
val strongColor: Int? = style.strongStyle.color
|
|
22
|
-
val emphasisFontFamily: String = style.emphasisStyle.fontFamily
|
|
23
|
-
val emphasisFontStyle: String = style.emphasisStyle.fontStyle
|
|
24
|
-
val emphasisColor: Int? = style.emphasisStyle.color
|
|
25
|
-
val strikethroughColor: Int = style.strikethroughStyle.color
|
|
26
|
-
val linkFontFamily: String = style.linkStyle.fontFamily
|
|
27
|
-
val linkColor: Int = style.linkStyle.color
|
|
28
|
-
val linkUnderline: Boolean = style.linkStyle.underline
|
|
29
|
-
val linkBackgroundColor: Int = style.linkStyle.backgroundColor
|
|
30
|
-
val linkVariants: List<LinkVariantEntry> = style.linkVariants
|
|
31
|
-
|
|
32
|
-
private val compiledVariantPatterns: List<Pair<Regex, LinkVariantEntry>> =
|
|
33
|
-
linkVariants.mapNotNull { entry ->
|
|
34
|
-
try {
|
|
35
|
-
Regex(entry.pattern) to entry
|
|
36
|
-
} catch (_: Exception) {
|
|
37
|
-
null
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
val codeFontFamily: String = style.codeStyle.fontFamily
|
|
42
|
-
val codeFontSize: Float = style.codeStyle.fontSize
|
|
43
|
-
val codeColor: Int = style.codeStyle.color
|
|
44
|
-
val factoidColor: Int = style.factoidStyle.color
|
|
45
|
-
val factoidBackgroundColor: Int = style.factoidStyle.backgroundColor
|
|
46
|
-
val factoidBorderColor: Int = style.factoidStyle.borderColor
|
|
47
|
-
val spoilerColor: Int = style.spoilerStyle.color
|
|
48
|
-
val spoilerParticleDensity: Float = style.spoilerStyle.particleDensity
|
|
49
|
-
val spoilerParticleSpeed: Float = style.spoilerStyle.particleSpeed
|
|
50
|
-
val spoilerSolidBorderRadius: Float = style.spoilerStyle.solidBorderRadius
|
|
51
|
-
val superscriptFontScale: Float = style.superscriptStyle.fontScale
|
|
52
|
-
val superscriptBaselineOffsetScale: Float = style.superscriptStyle.baselineOffsetScale
|
|
53
|
-
val subscriptFontScale: Float = style.subscriptStyle.fontScale
|
|
54
|
-
val subscriptBaselineOffsetScale: Float = style.subscriptStyle.baselineOffsetScale
|
|
55
|
-
val highlightColor: Int = style.highlightStyle.color
|
|
56
|
-
val highlightBackgroundColor: Int = style.highlightStyle.backgroundColor
|
|
57
|
-
private val paragraphColor: Int = style.paragraphStyle.color
|
|
58
|
-
|
|
59
|
-
private fun buildColorsToPreserve(style: StyleConfig): IntArray {
|
|
60
|
-
val paragraphColor = style.paragraphStyle.color
|
|
61
|
-
return buildList {
|
|
62
|
-
style.strongStyle.color
|
|
63
|
-
?.takeIf { it != 0 && it != paragraphColor }
|
|
64
|
-
?.let { add(it) }
|
|
65
|
-
style.emphasisStyle.color
|
|
66
|
-
?.takeIf { it != 0 && it != paragraphColor }
|
|
67
|
-
?.let { add(it) }
|
|
68
|
-
style.linkStyle.color
|
|
69
|
-
.takeIf { it != 0 && it != paragraphColor }
|
|
70
|
-
?.let { add(it) }
|
|
71
|
-
style.linkVariants.forEach { variant ->
|
|
72
|
-
variant.color
|
|
73
|
-
.takeIf { it != 0 && it != paragraphColor }
|
|
74
|
-
?.let { add(it) }
|
|
75
|
-
}
|
|
76
|
-
style
|
|
77
|
-
.codeStyle
|
|
78
|
-
.color
|
|
79
|
-
.takeIf { it != 0 && it != paragraphColor }
|
|
80
|
-
?.let { add(it) }
|
|
81
|
-
style.factoidStyle.color
|
|
82
|
-
.takeIf { it != 0 && it != paragraphColor }
|
|
83
|
-
?.let { add(it) }
|
|
84
|
-
style.taskListStyle.checkedTextColor
|
|
85
|
-
.takeIf { it != 0 && it != paragraphColor }
|
|
86
|
-
?.let { add(it) }
|
|
87
|
-
}.toIntArray()
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
fun getStrongColorFor(blockColor: Int): Int = strongColor ?: blockColor
|
|
91
|
-
|
|
92
|
-
fun getHighlightColorFor(blockColor: Int): Int = if (highlightColor == paragraphColor) blockColor else highlightColor
|
|
93
|
-
|
|
94
|
-
fun getEmphasisColorFor(
|
|
95
|
-
blockColor: Int,
|
|
96
|
-
currentColor: Int,
|
|
97
|
-
): Int =
|
|
98
|
-
if (currentColor == blockColor) {
|
|
99
|
-
emphasisColor ?: blockColor
|
|
100
|
-
} else {
|
|
101
|
-
currentColor
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
fun resolvedVariantForUrl(url: String): LinkVariantEntry? {
|
|
105
|
-
if (compiledVariantPatterns.isEmpty()) return null
|
|
106
|
-
return compiledVariantPatterns.firstOrNull { (regex, _) -> regex.containsMatchIn(url) }?.second
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Cached typeface for font family + style (BOLD, ITALIC, BOLD_ITALIC).
|
|
111
|
-
*
|
|
112
|
-
* Loads the base custom font at its NORMAL weight (via applyStyles/ReactFontManager)
|
|
113
|
-
* so the bundled assets/fonts file resolves, then synthesizes bold/italic on that real
|
|
114
|
-
* typeface. Requesting bold/italic directly makes ReactFontManager look for `_bold`/
|
|
115
|
-
* `_italic` asset variants that single-file custom fonts don't have — and it then falls
|
|
116
|
-
* back to a default system face, dropping the custom font entirely.
|
|
117
|
-
*/
|
|
118
|
-
fun getTypeface(
|
|
119
|
-
fontFamily: String,
|
|
120
|
-
style: Int,
|
|
121
|
-
): Typeface =
|
|
122
|
-
typefaceCache.getOrPut("family|$fontFamily|$style") {
|
|
123
|
-
val base =
|
|
124
|
-
applyStyles(
|
|
125
|
-
null,
|
|
126
|
-
ReactConstants.UNSET,
|
|
127
|
-
ReactConstants.UNSET,
|
|
128
|
-
fontFamily.takeIf { it.isNotEmpty() },
|
|
129
|
-
assetManager,
|
|
130
|
-
)
|
|
131
|
-
if (style == Typeface.NORMAL) base else Typeface.create(base, style)
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
companion object {
|
|
135
|
-
private val typefaceCache = mutableMapOf<String, Typeface>()
|
|
136
|
-
|
|
137
|
-
/** Cached monospace typeface preserving bold/italic */
|
|
138
|
-
fun getMonospaceTypeface(currentStyle: Int): Typeface =
|
|
139
|
-
typefaceCache.getOrPut("monospace|$currentStyle") {
|
|
140
|
-
Typeface.create(Typeface.MONOSPACE, currentStyle)
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.content.res.AssetManager
|
|
4
|
+
import android.graphics.Typeface
|
|
5
|
+
import com.facebook.react.common.ReactConstants
|
|
6
|
+
import com.facebook.react.views.text.ReactTypefaceUtils.applyStyles
|
|
7
|
+
import com.renderrichtext.styles.LinkVariantEntry
|
|
8
|
+
import com.renderrichtext.styles.StyleConfig
|
|
9
|
+
|
|
10
|
+
/** Shared style cache for spans to avoid redundant calculations. */
|
|
11
|
+
class SpanStyleCache(
|
|
12
|
+
style: StyleConfig,
|
|
13
|
+
) {
|
|
14
|
+
private val assetManager: AssetManager = style.assetManager
|
|
15
|
+
|
|
16
|
+
// Colors to preserve when applying inline styles (links, code, strong, emphasis)
|
|
17
|
+
val colorsToPreserve: IntArray = buildColorsToPreserve(style)
|
|
18
|
+
|
|
19
|
+
val strongFontFamily: String = style.strongStyle.fontFamily
|
|
20
|
+
val strongFontWeight: String = style.strongStyle.fontWeight
|
|
21
|
+
val strongColor: Int? = style.strongStyle.color
|
|
22
|
+
val emphasisFontFamily: String = style.emphasisStyle.fontFamily
|
|
23
|
+
val emphasisFontStyle: String = style.emphasisStyle.fontStyle
|
|
24
|
+
val emphasisColor: Int? = style.emphasisStyle.color
|
|
25
|
+
val strikethroughColor: Int = style.strikethroughStyle.color
|
|
26
|
+
val linkFontFamily: String = style.linkStyle.fontFamily
|
|
27
|
+
val linkColor: Int = style.linkStyle.color
|
|
28
|
+
val linkUnderline: Boolean = style.linkStyle.underline
|
|
29
|
+
val linkBackgroundColor: Int = style.linkStyle.backgroundColor
|
|
30
|
+
val linkVariants: List<LinkVariantEntry> = style.linkVariants
|
|
31
|
+
|
|
32
|
+
private val compiledVariantPatterns: List<Pair<Regex, LinkVariantEntry>> =
|
|
33
|
+
linkVariants.mapNotNull { entry ->
|
|
34
|
+
try {
|
|
35
|
+
Regex(entry.pattern) to entry
|
|
36
|
+
} catch (_: Exception) {
|
|
37
|
+
null
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
val codeFontFamily: String = style.codeStyle.fontFamily
|
|
42
|
+
val codeFontSize: Float = style.codeStyle.fontSize
|
|
43
|
+
val codeColor: Int = style.codeStyle.color
|
|
44
|
+
val factoidColor: Int = style.factoidStyle.color
|
|
45
|
+
val factoidBackgroundColor: Int = style.factoidStyle.backgroundColor
|
|
46
|
+
val factoidBorderColor: Int = style.factoidStyle.borderColor
|
|
47
|
+
val spoilerColor: Int = style.spoilerStyle.color
|
|
48
|
+
val spoilerParticleDensity: Float = style.spoilerStyle.particleDensity
|
|
49
|
+
val spoilerParticleSpeed: Float = style.spoilerStyle.particleSpeed
|
|
50
|
+
val spoilerSolidBorderRadius: Float = style.spoilerStyle.solidBorderRadius
|
|
51
|
+
val superscriptFontScale: Float = style.superscriptStyle.fontScale
|
|
52
|
+
val superscriptBaselineOffsetScale: Float = style.superscriptStyle.baselineOffsetScale
|
|
53
|
+
val subscriptFontScale: Float = style.subscriptStyle.fontScale
|
|
54
|
+
val subscriptBaselineOffsetScale: Float = style.subscriptStyle.baselineOffsetScale
|
|
55
|
+
val highlightColor: Int = style.highlightStyle.color
|
|
56
|
+
val highlightBackgroundColor: Int = style.highlightStyle.backgroundColor
|
|
57
|
+
private val paragraphColor: Int = style.paragraphStyle.color
|
|
58
|
+
|
|
59
|
+
private fun buildColorsToPreserve(style: StyleConfig): IntArray {
|
|
60
|
+
val paragraphColor = style.paragraphStyle.color
|
|
61
|
+
return buildList {
|
|
62
|
+
style.strongStyle.color
|
|
63
|
+
?.takeIf { it != 0 && it != paragraphColor }
|
|
64
|
+
?.let { add(it) }
|
|
65
|
+
style.emphasisStyle.color
|
|
66
|
+
?.takeIf { it != 0 && it != paragraphColor }
|
|
67
|
+
?.let { add(it) }
|
|
68
|
+
style.linkStyle.color
|
|
69
|
+
.takeIf { it != 0 && it != paragraphColor }
|
|
70
|
+
?.let { add(it) }
|
|
71
|
+
style.linkVariants.forEach { variant ->
|
|
72
|
+
variant.color
|
|
73
|
+
.takeIf { it != 0 && it != paragraphColor }
|
|
74
|
+
?.let { add(it) }
|
|
75
|
+
}
|
|
76
|
+
style
|
|
77
|
+
.codeStyle
|
|
78
|
+
.color
|
|
79
|
+
.takeIf { it != 0 && it != paragraphColor }
|
|
80
|
+
?.let { add(it) }
|
|
81
|
+
style.factoidStyle.color
|
|
82
|
+
.takeIf { it != 0 && it != paragraphColor }
|
|
83
|
+
?.let { add(it) }
|
|
84
|
+
style.taskListStyle.checkedTextColor
|
|
85
|
+
.takeIf { it != 0 && it != paragraphColor }
|
|
86
|
+
?.let { add(it) }
|
|
87
|
+
}.toIntArray()
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
fun getStrongColorFor(blockColor: Int): Int = strongColor ?: blockColor
|
|
91
|
+
|
|
92
|
+
fun getHighlightColorFor(blockColor: Int): Int = if (highlightColor == paragraphColor) blockColor else highlightColor
|
|
93
|
+
|
|
94
|
+
fun getEmphasisColorFor(
|
|
95
|
+
blockColor: Int,
|
|
96
|
+
currentColor: Int,
|
|
97
|
+
): Int =
|
|
98
|
+
if (currentColor == blockColor) {
|
|
99
|
+
emphasisColor ?: blockColor
|
|
100
|
+
} else {
|
|
101
|
+
currentColor
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
fun resolvedVariantForUrl(url: String): LinkVariantEntry? {
|
|
105
|
+
if (compiledVariantPatterns.isEmpty()) return null
|
|
106
|
+
return compiledVariantPatterns.firstOrNull { (regex, _) -> regex.containsMatchIn(url) }?.second
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Cached typeface for font family + style (BOLD, ITALIC, BOLD_ITALIC).
|
|
111
|
+
*
|
|
112
|
+
* Loads the base custom font at its NORMAL weight (via applyStyles/ReactFontManager)
|
|
113
|
+
* so the bundled assets/fonts file resolves, then synthesizes bold/italic on that real
|
|
114
|
+
* typeface. Requesting bold/italic directly makes ReactFontManager look for `_bold`/
|
|
115
|
+
* `_italic` asset variants that single-file custom fonts don't have — and it then falls
|
|
116
|
+
* back to a default system face, dropping the custom font entirely.
|
|
117
|
+
*/
|
|
118
|
+
fun getTypeface(
|
|
119
|
+
fontFamily: String,
|
|
120
|
+
style: Int,
|
|
121
|
+
): Typeface =
|
|
122
|
+
typefaceCache.getOrPut("family|$fontFamily|$style") {
|
|
123
|
+
val base =
|
|
124
|
+
applyStyles(
|
|
125
|
+
null,
|
|
126
|
+
ReactConstants.UNSET,
|
|
127
|
+
ReactConstants.UNSET,
|
|
128
|
+
fontFamily.takeIf { it.isNotEmpty() },
|
|
129
|
+
assetManager,
|
|
130
|
+
)
|
|
131
|
+
if (style == Typeface.NORMAL) base else Typeface.create(base, style)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
companion object {
|
|
135
|
+
private val typefaceCache = mutableMapOf<String, Typeface>()
|
|
136
|
+
|
|
137
|
+
/** Cached monospace typeface preserving bold/italic */
|
|
138
|
+
fun getMonospaceTypeface(currentStyle: Int): Typeface =
|
|
139
|
+
typefaceCache.getOrPut("monospace|$currentStyle") {
|
|
140
|
+
Typeface.create(Typeface.MONOSPACE, currentStyle)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|