@mathers101/react-native-render-rich-text 0.0.0-stage → 0.1.10
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 -0
- package/README.md +140 -3
- package/ReactNativeRenderRichText.podspec +23 -0
- package/android/build.gradle +86 -0
- package/android/consumer-rules.pro +3 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/cpp/jni-adapter.cpp +191 -0
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapText.kt +673 -0
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextLayoutManager.kt +24 -0
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextManager.kt +405 -0
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextPackage.kt +13 -0
- package/android/src/main/java/com/renderrichtext/MeasurementStore.kt +644 -0
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibilityLabels.kt +17 -0
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibleTiptapTextView.kt +112 -0
- package/android/src/main/java/com/renderrichtext/accessibility/TiptapAccessibilityHelper.kt +576 -0
- package/android/src/main/java/com/renderrichtext/events/CodeBlockPressEvent.kt +24 -0
- package/android/src/main/java/com/renderrichtext/events/ContextMenuItemPressEvent.kt +28 -0
- package/android/src/main/java/com/renderrichtext/events/CopyPressEvent.kt +24 -0
- package/android/src/main/java/com/renderrichtext/events/FactoidPressEvent.kt +23 -0
- package/android/src/main/java/com/renderrichtext/events/ImagePressEvent.kt +25 -0
- package/android/src/main/java/com/renderrichtext/events/LatexErrorEvent.kt +29 -0
- package/android/src/main/java/com/renderrichtext/events/LinkLongPressEvent.kt +23 -0
- package/android/src/main/java/com/renderrichtext/events/LinkPressEvent.kt +23 -0
- package/android/src/main/java/com/renderrichtext/events/MentionLongPressEvent.kt +25 -0
- package/android/src/main/java/com/renderrichtext/events/MentionPressEvent.kt +25 -0
- package/android/src/main/java/com/renderrichtext/events/TaskListItemPressEvent.kt +26 -0
- package/android/src/main/java/com/renderrichtext/math/LatexErrorReporter.kt +9 -0
- package/android/src/main/java/com/renderrichtext/parser/Parser.kt +59 -0
- package/android/src/main/java/com/renderrichtext/parser/TextLinkMatching.kt +35 -0
- package/android/src/main/java/com/renderrichtext/parser/TiptapASTNode.kt +69 -0
- package/android/src/main/java/com/renderrichtext/renderer/BaselineShiftRenderer.kt +45 -0
- package/android/src/main/java/com/renderrichtext/renderer/BlankLineRenderer.kt +39 -0
- package/android/src/main/java/com/renderrichtext/renderer/BlockStyleContext.kt +181 -0
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteRenderer.kt +243 -0
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteTextRenderer.kt +56 -0
- package/android/src/main/java/com/renderrichtext/renderer/CodeBlockRenderer.kt +135 -0
- package/android/src/main/java/com/renderrichtext/renderer/CodeRenderer.kt +37 -0
- package/android/src/main/java/com/renderrichtext/renderer/EmphasisRenderer.kt +28 -0
- package/android/src/main/java/com/renderrichtext/renderer/FactoidRenderer.kt +97 -0
- package/android/src/main/java/com/renderrichtext/renderer/HeadingRenderer.kt +81 -0
- package/android/src/main/java/com/renderrichtext/renderer/HighlightRenderer.kt +26 -0
- package/android/src/main/java/com/renderrichtext/renderer/LineBreakRenderer.kt +17 -0
- package/android/src/main/java/com/renderrichtext/renderer/LinkRenderer.kt +90 -0
- package/android/src/main/java/com/renderrichtext/renderer/ListContextManager.kt +109 -0
- package/android/src/main/java/com/renderrichtext/renderer/ListItemRenderer.kt +211 -0
- package/android/src/main/java/com/renderrichtext/renderer/ListRenderer.kt +133 -0
- package/android/src/main/java/com/renderrichtext/renderer/MentionRenderer.kt +85 -0
- package/android/src/main/java/com/renderrichtext/renderer/NodeRenderer.kt +207 -0
- package/android/src/main/java/com/renderrichtext/renderer/ParagraphRenderer.kt +91 -0
- package/android/src/main/java/com/renderrichtext/renderer/Renderer.kt +148 -0
- package/android/src/main/java/com/renderrichtext/renderer/SoftBreakRenderer.kt +17 -0
- package/android/src/main/java/com/renderrichtext/renderer/SpanStyleCache.kt +143 -0
- package/android/src/main/java/com/renderrichtext/renderer/StrikethroughRenderer.kt +28 -0
- package/android/src/main/java/com/renderrichtext/renderer/StrongRenderer.kt +28 -0
- package/android/src/main/java/com/renderrichtext/renderer/TextRenderer.kt +31 -0
- package/android/src/main/java/com/renderrichtext/renderer/ThematicBreakRenderer.kt +46 -0
- package/android/src/main/java/com/renderrichtext/renderer/UnderlineRenderer.kt +28 -0
- package/android/src/main/java/com/renderrichtext/spans/BaseListSpan.kt +164 -0
- package/android/src/main/java/com/renderrichtext/spans/BaselineShiftSpan.kt +27 -0
- package/android/src/main/java/com/renderrichtext/spans/BlockquoteSpan.kt +302 -0
- package/android/src/main/java/com/renderrichtext/spans/CodeBackgroundSpan.kt +205 -0
- package/android/src/main/java/com/renderrichtext/spans/CodeBlockSpan.kt +216 -0
- package/android/src/main/java/com/renderrichtext/spans/CodeSpan.kt +32 -0
- package/android/src/main/java/com/renderrichtext/spans/EmphasisSpan.kt +42 -0
- package/android/src/main/java/com/renderrichtext/spans/FactoidBackgroundSpan.kt +265 -0
- package/android/src/main/java/com/renderrichtext/spans/FactoidPaddingSpan.kt +258 -0
- package/android/src/main/java/com/renderrichtext/spans/FactoidSpan.kt +32 -0
- package/android/src/main/java/com/renderrichtext/spans/FadeInSpan.kt +29 -0
- package/android/src/main/java/com/renderrichtext/spans/HeadingSpan.kt +38 -0
- package/android/src/main/java/com/renderrichtext/spans/HighlightSpan.kt +80 -0
- package/android/src/main/java/com/renderrichtext/spans/ImageSpan.kt +481 -0
- package/android/src/main/java/com/renderrichtext/spans/InlineBackgroundGeometry.kt +42 -0
- package/android/src/main/java/com/renderrichtext/spans/LineHeightSpan.kt +39 -0
- package/android/src/main/java/com/renderrichtext/spans/LinkPillIconCache.kt +154 -0
- package/android/src/main/java/com/renderrichtext/spans/LinkPillSpan.kt +381 -0
- package/android/src/main/java/com/renderrichtext/spans/LinkSpan.kt +68 -0
- package/android/src/main/java/com/renderrichtext/spans/ListItemSpacingSpan.kt +33 -0
- package/android/src/main/java/com/renderrichtext/spans/ListMarkerAnchorSpan.kt +38 -0
- package/android/src/main/java/com/renderrichtext/spans/MarginBottomSpan.kt +76 -0
- package/android/src/main/java/com/renderrichtext/spans/MentionChipSpan.kt +132 -0
- package/android/src/main/java/com/renderrichtext/spans/MentionSpan.kt +46 -0
- package/android/src/main/java/com/renderrichtext/spans/OrderedListSpan.kt +127 -0
- package/android/src/main/java/com/renderrichtext/spans/SpoilerSpan.kt +33 -0
- package/android/src/main/java/com/renderrichtext/spans/StrikethroughSpan.kt +12 -0
- package/android/src/main/java/com/renderrichtext/spans/StrongSpan.kt +39 -0
- package/android/src/main/java/com/renderrichtext/spans/TaskListSpan.kt +143 -0
- package/android/src/main/java/com/renderrichtext/spans/TextSpan.kt +26 -0
- package/android/src/main/java/com/renderrichtext/spans/ThematicBreakSpan.kt +69 -0
- package/android/src/main/java/com/renderrichtext/spans/UnorderedListSpan.kt +96 -0
- package/android/src/main/java/com/renderrichtext/spoiler/SpoilerStubs.kt +46 -0
- package/android/src/main/java/com/renderrichtext/styles/BaseBlockStyle.kt +11 -0
- package/android/src/main/java/com/renderrichtext/styles/BlockquoteStyle.kt +83 -0
- package/android/src/main/java/com/renderrichtext/styles/CodeBlockStyle.kt +80 -0
- package/android/src/main/java/com/renderrichtext/styles/CodeStyle.kt +26 -0
- package/android/src/main/java/com/renderrichtext/styles/EmphasisStyle.kt +21 -0
- package/android/src/main/java/com/renderrichtext/styles/FactoidStyle.kt +21 -0
- package/android/src/main/java/com/renderrichtext/styles/HeadingStyle.kt +33 -0
- package/android/src/main/java/com/renderrichtext/styles/HighlightStyle.kt +19 -0
- package/android/src/main/java/com/renderrichtext/styles/ImageStyle.kt +29 -0
- package/android/src/main/java/com/renderrichtext/styles/InlineImageStyle.kt +17 -0
- package/android/src/main/java/com/renderrichtext/styles/InlineMathStyle.kt +17 -0
- package/android/src/main/java/com/renderrichtext/styles/LinkPillContent.kt +36 -0
- package/android/src/main/java/com/renderrichtext/styles/LinkPillStyle.kt +44 -0
- package/android/src/main/java/com/renderrichtext/styles/LinkStyle.kt +23 -0
- package/android/src/main/java/com/renderrichtext/styles/LinkVariantEntry.kt +34 -0
- package/android/src/main/java/com/renderrichtext/styles/ListStyle.kt +65 -0
- package/android/src/main/java/com/renderrichtext/styles/MathStyle.kt +29 -0
- package/android/src/main/java/com/renderrichtext/styles/MentionStyle.kt +19 -0
- package/android/src/main/java/com/renderrichtext/styles/ParagraphStyle.kt +33 -0
- package/android/src/main/java/com/renderrichtext/styles/SpoilerStyle.kt +27 -0
- package/android/src/main/java/com/renderrichtext/styles/StrikethroughStyle.kt +17 -0
- package/android/src/main/java/com/renderrichtext/styles/StrongStyle.kt +21 -0
- package/android/src/main/java/com/renderrichtext/styles/StyleConfig.kt +411 -0
- package/android/src/main/java/com/renderrichtext/styles/StyleParser.kt +92 -0
- package/android/src/main/java/com/renderrichtext/styles/SubscriptStyle.kt +16 -0
- package/android/src/main/java/com/renderrichtext/styles/SuperscriptStyle.kt +16 -0
- package/android/src/main/java/com/renderrichtext/styles/TableStyle.kt +75 -0
- package/android/src/main/java/com/renderrichtext/styles/TaskListStyle.kt +29 -0
- package/android/src/main/java/com/renderrichtext/styles/TextAlignment.kt +32 -0
- package/android/src/main/java/com/renderrichtext/styles/ThematicBreakStyle.kt +23 -0
- package/android/src/main/java/com/renderrichtext/styles/UnderlineStyle.kt +17 -0
- package/android/src/main/java/com/renderrichtext/styles/VideoStyle.kt +31 -0
- package/android/src/main/java/com/renderrichtext/utils/common/BorderStyleUtils.kt +86 -0
- package/android/src/main/java/com/renderrichtext/utils/common/BreakStrategyUtils.kt +32 -0
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockHighlighter.kt +36 -0
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockNode.kt +42 -0
- package/android/src/main/java/com/renderrichtext/utils/common/EllipsizeUtils.kt +27 -0
- package/android/src/main/java/com/renderrichtext/utils/common/EnrichedTiptapAncestorUtils.kt +10 -0
- package/android/src/main/java/com/renderrichtext/utils/common/FeatureFlags.kt +9 -0
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRecognitionProps.kt +31 -0
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRegexConfig.kt +56 -0
- package/android/src/main/java/com/renderrichtext/utils/common/MotionPreferences.kt +18 -0
- package/android/src/main/java/com/renderrichtext/utils/common/ReadableMapExtensions.kt +28 -0
- package/android/src/main/java/com/renderrichtext/utils/common/TiptapViewManagerUtils.kt +242 -0
- package/android/src/main/java/com/renderrichtext/utils/common/layout/RTLUtils.kt +6 -0
- package/android/src/main/java/com/renderrichtext/utils/common/serialization/TiptapASTSerializer.kt +368 -0
- package/android/src/main/java/com/renderrichtext/utils/text/ImageCache.kt +88 -0
- package/android/src/main/java/com/renderrichtext/utils/text/ImageDownloader.kt +203 -0
- package/android/src/main/java/com/renderrichtext/utils/text/LocalImageLoader.kt +167 -0
- package/android/src/main/java/com/renderrichtext/utils/text/TailFadeInAnimator.kt +84 -0
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/HTMLGenerator.kt +1105 -0
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/TiptapExtractor.kt +423 -0
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/ParagraphUtils.kt +9 -0
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/SpannableExtensions.kt +9 -0
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/TextPaintExtensions.kt +76 -0
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/CheckboxTouchHelper.kt +61 -0
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/TaskListTapUtils.kt +286 -0
- package/android/src/main/java/com/renderrichtext/utils/text/span/ApplyLineHeight.kt +39 -0
- package/android/src/main/java/com/renderrichtext/utils/text/span/BlockSpacing.kt +142 -0
- package/android/src/main/java/com/renderrichtext/utils/text/span/SpanFlags.kt +43 -0
- package/android/src/main/java/com/renderrichtext/utils/text/span/WidthAwareSpans.kt +30 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/CodeBlockPressHost.kt +15 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/ImagePressHost.kt +19 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/LinkEvents.kt +88 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/LinkLongPressMovementMethod.kt +449 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/SelectionActionMode.kt +235 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextSelectionColors.kt +48 -0
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextViewSetup.kt +119 -0
- package/android/src/main/java/com/renderrichtext/views/ContextMenuPopup.kt +217 -0
- package/android/src/main/java/com/renderrichtext/views/CopyGlyph.kt +101 -0
- package/android/src/main/java/com/renderrichtext/views/WrapGlyph.kt +40 -0
- package/android/src/main/jni/CMakeLists.txt +52 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/ComponentDescriptors.h +30 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextComponentDescriptor.h +29 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.cpp +45 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.h +21 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.cpp +38 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.h +53 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.cpp +9 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.h +24 -0
- package/android/src/main/jni/react/renderer/components/RichTextSpec/conversions.h +40 -0
- package/cpp/parser/TiptapASTNode.hpp +68 -0
- package/cpp/parser/TiptapParser.cpp +233 -0
- package/cpp/parser/TiptapParser.hpp +13 -0
- package/cpp/vendor/nlohmann/json.hpp +24765 -0
- package/ios/EnrichedTiptapText.h +27 -0
- package/ios/EnrichedTiptapText.mm +1222 -0
- package/ios/attachments/ENRMImageAttachment.h +51 -0
- package/ios/attachments/ENRMImageAttachment.m +398 -0
- package/ios/attachments/ENRMLinkPillAttachment.h +47 -0
- package/ios/attachments/ENRMLinkPillAttachment.m +324 -0
- package/ios/attachments/ENRMLinkPillIconCache.h +28 -0
- package/ios/attachments/ENRMLinkPillIconCache.m +181 -0
- package/ios/attachments/ENRMLinkPillText.h +27 -0
- package/ios/attachments/ENRMLinkPillText.m +118 -0
- package/ios/attachments/ENRMMathInlineAttachment.h +7 -0
- package/ios/attachments/ENRMMathInlineAttachment.m +4 -0
- package/ios/attachments/ThematicBreakAttachment.h +15 -0
- package/ios/attachments/ThematicBreakAttachment.m +33 -0
- package/ios/internals/ENRMViewFreeMeasurement.h +208 -0
- package/ios/internals/EnrichedTiptapTextComponentDescriptor.h +19 -0
- package/ios/internals/EnrichedTiptapTextShadowNode.h +43 -0
- package/ios/internals/EnrichedTiptapTextShadowNode.mm +69 -0
- package/ios/internals/EnrichedTiptapTextState.h +24 -0
- package/ios/internals/MeasurementCache.h +308 -0
- package/ios/internals/ShadowMeasurementUtils.h +145 -0
- package/ios/parser/ENRMTextLinkAttributes.h +7 -0
- package/ios/parser/ENRMTiptapParser.h +33 -0
- package/ios/parser/ENRMTiptapParser.mm +73 -0
- package/ios/parser/TiptapASTNode.h +57 -0
- package/ios/parser/TiptapASTNode.m +52 -0
- package/ios/parser/TiptapParserBridge.mm +179 -0
- package/ios/renderer/AttributedRenderer.h +23 -0
- package/ios/renderer/AttributedRenderer.m +229 -0
- package/ios/renderer/BaseRenderer.h +33 -0
- package/ios/renderer/BaseRenderer.m +46 -0
- package/ios/renderer/BaselineShiftTextAttributes.h +10 -0
- package/ios/renderer/BaselineShiftTextAttributes.m +26 -0
- package/ios/renderer/BlankLineRenderer.h +4 -0
- package/ios/renderer/BlankLineRenderer.m +51 -0
- package/ios/renderer/BlockquoteRenderer.h +6 -0
- package/ios/renderer/BlockquoteRenderer.m +258 -0
- package/ios/renderer/CodeBlockRenderer.h +9 -0
- package/ios/renderer/CodeBlockRenderer.m +99 -0
- package/ios/renderer/CodeRenderer.h +9 -0
- package/ios/renderer/CodeRenderer.m +69 -0
- package/ios/renderer/ENRMBlockquoteTextRenderer.h +25 -0
- package/ios/renderer/ENRMBlockquoteTextRenderer.m +48 -0
- package/ios/renderer/EmphasisRenderer.h +5 -0
- package/ios/renderer/EmphasisRenderer.m +100 -0
- package/ios/renderer/FactoidRenderer.h +9 -0
- package/ios/renderer/FactoidRenderer.m +130 -0
- package/ios/renderer/HeadingRenderer.h +6 -0
- package/ios/renderer/HeadingRenderer.m +103 -0
- package/ios/renderer/HighlightRenderer.h +7 -0
- package/ios/renderer/HighlightRenderer.m +33 -0
- package/ios/renderer/LinkRenderer.h +6 -0
- package/ios/renderer/LinkRenderer.m +158 -0
- package/ios/renderer/ListItemRenderer.h +24 -0
- package/ios/renderer/ListItemRenderer.m +283 -0
- package/ios/renderer/ListRenderer.h +13 -0
- package/ios/renderer/ListRenderer.m +126 -0
- package/ios/renderer/MentionRenderer.h +9 -0
- package/ios/renderer/MentionRenderer.m +96 -0
- package/ios/renderer/NodeRenderer.h +8 -0
- package/ios/renderer/ParagraphRenderer.h +6 -0
- package/ios/renderer/ParagraphRenderer.m +85 -0
- package/ios/renderer/RenderContext.h +145 -0
- package/ios/renderer/RenderContext.m +403 -0
- package/ios/renderer/RendererFactory.h +12 -0
- package/ios/renderer/RendererFactory.m +158 -0
- package/ios/renderer/StrikethroughRenderer.h +5 -0
- package/ios/renderer/StrikethroughRenderer.m +30 -0
- package/ios/renderer/StrongRenderer.h +5 -0
- package/ios/renderer/StrongRenderer.m +88 -0
- package/ios/renderer/TextRenderer.h +6 -0
- package/ios/renderer/TextRenderer.m +18 -0
- package/ios/renderer/ThematicBreakRenderer.h +4 -0
- package/ios/renderer/ThematicBreakRenderer.m +42 -0
- package/ios/renderer/UnderlineRenderer.h +4 -0
- package/ios/renderer/UnderlineRenderer.m +41 -0
- package/ios/styles/ENRMFontSlot.h +12 -0
- package/ios/styles/ENRMFontSlot.m +24 -0
- package/ios/styles/StyleConfig.h +488 -0
- package/ios/styles/StyleConfig.mm +2820 -0
- package/ios/utils/AccessibilityInfo.h +35 -0
- package/ios/utils/AccessibilityInfo.m +24 -0
- package/ios/utils/BlockquoteBorder.h +26 -0
- package/ios/utils/BlockquoteBorder.m +294 -0
- package/ios/utils/CodeBackground.h +19 -0
- package/ios/utils/CodeBackground.m +197 -0
- package/ios/utils/CodeBlockBackground.h +17 -0
- package/ios/utils/CodeBlockBackground.m +103 -0
- package/ios/utils/ContextMenuUtils.h +76 -0
- package/ios/utils/ContextMenuUtils.mm +75 -0
- package/ios/utils/ENRMAccessibilityLabels.h +40 -0
- package/ios/utils/ENRMAccessibilityLabels.m +5 -0
- package/ios/utils/ENRMAsyncRenderCoordinator.h +24 -0
- package/ios/utils/ENRMAsyncRenderCoordinator.m +37 -0
- package/ios/utils/ENRMAtomicSize.h +65 -0
- package/ios/utils/ENRMCodeBlockContent.h +37 -0
- package/ios/utils/ENRMCodeBlockContent.mm +89 -0
- package/ios/utils/ENRMFeatureFlags.h +25 -0
- package/ios/utils/ENRMImageDownloader.h +30 -0
- package/ios/utils/ENRMImageDownloader.m +168 -0
- package/ios/utils/ENRMLatexErrorCoordinator.h +27 -0
- package/ios/utils/ENRMLatexErrorCoordinator.mm +75 -0
- package/ios/utils/ENRMLatexErrorReporting.h +13 -0
- package/ios/utils/ENRMLinkContextMenus.h +93 -0
- package/ios/utils/ENRMLinkContextMenus.m +178 -0
- package/ios/utils/ENRMLinkRegexConfig.h +30 -0
- package/ios/utils/ENRMLinkRegexConfig.mm +104 -0
- package/ios/utils/ENRMLinkRegexProps.h +23 -0
- package/ios/utils/ENRMLocalImageLoader.h +35 -0
- package/ios/utils/ENRMLocalImageLoader.m +111 -0
- package/ios/utils/ENRMMenuAction.h +27 -0
- package/ios/utils/ENRMMenuAction.m +33 -0
- package/ios/utils/ENRMSpoilerOverlayManager.h +15 -0
- package/ios/utils/ENRMSpoilerOverlayManager.m +19 -0
- package/ios/utils/ENRMSpoilerTapUtils.h +6 -0
- package/ios/utils/ENRMSpoilerTapUtils.m +11 -0
- package/ios/utils/ENRMTailFadeInAnimator.h +16 -0
- package/ios/utils/ENRMTailFadeInAnimator.m +161 -0
- package/ios/utils/ENRMTextHitTest.h +23 -0
- package/ios/utils/ENRMTextHitTest.m +20 -0
- package/ios/utils/ENRMTextInteractionUtils.h +20 -0
- package/ios/utils/ENRMTextInteractionUtils.m +15 -0
- package/ios/utils/ENRMTextRenderer.h +38 -0
- package/ios/utils/ENRMTextRenderer.m +54 -0
- package/ios/utils/ENRMTextViewSetup.h +132 -0
- package/ios/utils/ENRMUIKit.h +429 -0
- package/ios/utils/EditMenuUtils.h +105 -0
- package/ios/utils/EditMenuUtils.m +143 -0
- package/ios/utils/FactoidBackground.h +20 -0
- package/ios/utils/FactoidBackground.m +161 -0
- package/ios/utils/FontScaleObserver.h +10 -0
- package/ios/utils/FontScaleObserver.m +55 -0
- package/ios/utils/FontUtils.h +31 -0
- package/ios/utils/FontUtils.m +63 -0
- package/ios/utils/HTMLGenerator.h +25 -0
- package/ios/utils/HTMLGenerator.m +1041 -0
- package/ios/utils/HeightUpdateUtils.h +25 -0
- package/ios/utils/ImageRequestHeaderUtils.h +35 -0
- package/ios/utils/LastElementUtils.h +97 -0
- package/ios/utils/LinkContextMenuUtils.h +55 -0
- package/ios/utils/LinkPillContentUtils.h +46 -0
- package/ios/utils/LinkTapUtils.h +56 -0
- package/ios/utils/LinkTapUtils.m +139 -0
- package/ios/utils/ListMarkerDrawer.h +15 -0
- package/ios/utils/ListMarkerDrawer.m +239 -0
- package/ios/utils/MentionBackground.h +26 -0
- package/ios/utils/MentionBackground.m +86 -0
- package/ios/utils/ParagraphStyleUtils.h +87 -0
- package/ios/utils/ParagraphStyleUtils.m +484 -0
- package/ios/utils/PasteboardUtils.h +48 -0
- package/ios/utils/PasteboardUtils.m +166 -0
- package/ios/utils/RTFExportUtils.h +24 -0
- package/ios/utils/RTFExportUtils.m +299 -0
- package/ios/utils/RuntimeKeys.h +44 -0
- package/ios/utils/RuntimeKeys.m +13 -0
- package/ios/utils/SelectionColorUtils.h +14 -0
- package/ios/utils/StylePropsUtils.h +1340 -0
- package/ios/utils/TaskListTapUtils.h +6 -0
- package/ios/utils/TaskListTapUtils.m +14 -0
- package/ios/utils/TextViewLayoutManager.h +14 -0
- package/ios/utils/TextViewLayoutManager.mm +198 -0
- package/ios/utils/TiptapAccessibilityElementBuilder.h +43 -0
- package/ios/utils/TiptapAccessibilityElementBuilder.m +432 -0
- package/ios/utils/TiptapExtractor.h +17 -0
- package/ios/utils/TiptapExtractor.m +367 -0
- package/ios/views/ENRMTiptapTextView.h +25 -0
- package/ios/views/ENRMTiptapTextView.m +247 -0
- package/package.json +70 -6
- package/react-native.config.js +10 -0
- package/src/EnrichedTiptapTextNativeComponent.ts +739 -0
- package/src/RichText.tsx +164 -0
- package/src/admonitionDefaults.ts +58 -0
- package/src/darkModeTextStyle.ts +99 -0
- package/src/headingDefaults.ts +21 -0
- package/src/index.tsx +4 -0
- package/src/linkVariantUtils.ts +120 -0
- package/src/normalizeTiptapStyle.ts +397 -0
- package/src/rn-globals.d.ts +1 -0
- package/src/styleUtils.ts +107 -0
- package/src/types/TiptapStyle.ts +532 -0
- package/src/types/TiptapStyleInternal.ts +299 -0
- package/src/types/linkPill.ts +9 -0
- package/src/utils/isDev.ts +4 -0
|
@@ -0,0 +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
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
+
import com.renderrichtext.spans.StrikethroughSpan
|
|
6
|
+
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
+
|
|
8
|
+
class StrikethroughRenderer(
|
|
9
|
+
private val config: RendererConfig,
|
|
10
|
+
) : NodeRenderer {
|
|
11
|
+
override fun render(
|
|
12
|
+
node: TiptapASTNode,
|
|
13
|
+
builder: SpannableStringBuilder,
|
|
14
|
+
onLinkPress: ((String) -> Unit)?,
|
|
15
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
16
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
17
|
+
factory: RendererFactory,
|
|
18
|
+
) {
|
|
19
|
+
factory.renderWithSpan(builder, { factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress) }) { start, end, blockStyle ->
|
|
20
|
+
builder.setSpan(
|
|
21
|
+
StrikethroughSpan(factory.styleCache.strikethroughColor),
|
|
22
|
+
start,
|
|
23
|
+
end,
|
|
24
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
+
import com.renderrichtext.spans.StrongSpan
|
|
6
|
+
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
+
|
|
8
|
+
class StrongRenderer(
|
|
9
|
+
private val config: RendererConfig,
|
|
10
|
+
) : NodeRenderer {
|
|
11
|
+
override fun render(
|
|
12
|
+
node: TiptapASTNode,
|
|
13
|
+
builder: SpannableStringBuilder,
|
|
14
|
+
onLinkPress: ((String) -> Unit)?,
|
|
15
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
16
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
17
|
+
factory: RendererFactory,
|
|
18
|
+
) {
|
|
19
|
+
factory.renderWithSpan(builder, { factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress) }) { start, end, blockStyle ->
|
|
20
|
+
builder.setSpan(
|
|
21
|
+
StrongSpan(factory.styleCache, blockStyle),
|
|
22
|
+
start,
|
|
23
|
+
end,
|
|
24
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
+
import com.renderrichtext.spans.TextSpan
|
|
6
|
+
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
+
|
|
8
|
+
class TextRenderer : NodeRenderer {
|
|
9
|
+
override fun render(
|
|
10
|
+
node: TiptapASTNode,
|
|
11
|
+
builder: SpannableStringBuilder,
|
|
12
|
+
onLinkPress: ((String) -> Unit)?,
|
|
13
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
14
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
15
|
+
factory: RendererFactory,
|
|
16
|
+
) {
|
|
17
|
+
val content = node.content
|
|
18
|
+
if (content.isEmpty()) return
|
|
19
|
+
|
|
20
|
+
val blockType = factory.blockStyleContext.currentBlockType
|
|
21
|
+
|
|
22
|
+
factory.renderWithSpan(builder, { builder.append(content) }) { start, end, blockStyle ->
|
|
23
|
+
builder.setSpan(
|
|
24
|
+
TextSpan(blockStyle, factory.context),
|
|
25
|
+
start,
|
|
26
|
+
end,
|
|
27
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
5
|
+
import com.renderrichtext.spans.ThematicBreakSpan
|
|
6
|
+
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
+
|
|
8
|
+
class ThematicBreakRenderer(
|
|
9
|
+
private val config: RendererConfig,
|
|
10
|
+
) : NodeRenderer {
|
|
11
|
+
override fun render(
|
|
12
|
+
node: TiptapASTNode,
|
|
13
|
+
builder: SpannableStringBuilder,
|
|
14
|
+
onLinkPress: ((String) -> Unit)?,
|
|
15
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
16
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
17
|
+
factory: RendererFactory,
|
|
18
|
+
) {
|
|
19
|
+
builder.ensureNewline()
|
|
20
|
+
|
|
21
|
+
val start = builder.length
|
|
22
|
+
|
|
23
|
+
builder.append(" \n")
|
|
24
|
+
val end = builder.length
|
|
25
|
+
|
|
26
|
+
val style = config.style.thematicBreakStyle
|
|
27
|
+
|
|
28
|
+
builder.setSpan(
|
|
29
|
+
ThematicBreakSpan(
|
|
30
|
+
style.color,
|
|
31
|
+
style.height,
|
|
32
|
+
style.marginTop,
|
|
33
|
+
style.marginBottom,
|
|
34
|
+
),
|
|
35
|
+
start,
|
|
36
|
+
end,
|
|
37
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private fun SpannableStringBuilder.ensureNewline() {
|
|
42
|
+
if (isNotEmpty() && this[length - 1] != '\n') {
|
|
43
|
+
append('\n')
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
package com.renderrichtext.renderer
|
|
2
|
+
|
|
3
|
+
import android.text.SpannableStringBuilder
|
|
4
|
+
import android.text.style.UnderlineSpan
|
|
5
|
+
import com.renderrichtext.parser.TiptapASTNode
|
|
6
|
+
import com.renderrichtext.utils.text.span.SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE
|
|
7
|
+
|
|
8
|
+
class UnderlineRenderer(
|
|
9
|
+
private val config: RendererConfig,
|
|
10
|
+
) : NodeRenderer {
|
|
11
|
+
override fun render(
|
|
12
|
+
node: TiptapASTNode,
|
|
13
|
+
builder: SpannableStringBuilder,
|
|
14
|
+
onLinkPress: ((String) -> Unit)?,
|
|
15
|
+
onLinkLongPress: ((String) -> Unit)?,
|
|
16
|
+
onFactoidPress: ((String) -> Unit)?,
|
|
17
|
+
factory: RendererFactory,
|
|
18
|
+
) {
|
|
19
|
+
factory.renderWithSpan(builder, { factory.renderChildren(node, builder, onLinkPress, onLinkLongPress, onFactoidPress) }) { start, end, _ ->
|
|
20
|
+
builder.setSpan(
|
|
21
|
+
UnderlineSpan(),
|
|
22
|
+
start,
|
|
23
|
+
end,
|
|
24
|
+
SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE,
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
package com.renderrichtext.spans
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint
|
|
4
|
+
import android.content.Context
|
|
5
|
+
import android.graphics.Canvas
|
|
6
|
+
import android.graphics.Paint
|
|
7
|
+
import android.graphics.Typeface
|
|
8
|
+
import android.text.Layout
|
|
9
|
+
import android.text.Spanned
|
|
10
|
+
import android.text.TextPaint
|
|
11
|
+
import android.text.style.LeadingMarginSpan
|
|
12
|
+
import android.text.style.MetricAffectingSpan
|
|
13
|
+
import com.renderrichtext.renderer.BlockStyle
|
|
14
|
+
import com.renderrichtext.renderer.SpanStyleCache
|
|
15
|
+
import com.renderrichtext.utils.text.extensions.applyBlockStyleFont
|
|
16
|
+
import com.renderrichtext.utils.text.extensions.applyColorPreserving
|
|
17
|
+
|
|
18
|
+
abstract class BaseListSpan(
|
|
19
|
+
val depth: Int,
|
|
20
|
+
protected val context: Context,
|
|
21
|
+
protected val styleCache: SpanStyleCache,
|
|
22
|
+
protected val blockStyle: BlockStyle,
|
|
23
|
+
protected val marginLeft: Float,
|
|
24
|
+
protected val gapWidth: Float,
|
|
25
|
+
internal val drawsMarker: Boolean = true,
|
|
26
|
+
internal val ancestorMarkerOffset: Float = 0f,
|
|
27
|
+
internal val parentMarkerWidth: Float? = null,
|
|
28
|
+
) : MetricAffectingSpan(),
|
|
29
|
+
LeadingMarginSpan {
|
|
30
|
+
private var cachedText: CharSequence? = null
|
|
31
|
+
private var cachedHasDeeperSpanByPosition = mutableMapOf<Int, Boolean>()
|
|
32
|
+
|
|
33
|
+
val markerFontMetrics: Paint.FontMetrics by lazy {
|
|
34
|
+
TextPaint()
|
|
35
|
+
.apply {
|
|
36
|
+
applyBlockStyleFont(blockStyle, context)
|
|
37
|
+
textSize = blockStyle.fontSize
|
|
38
|
+
}.fontMetrics
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
protected abstract fun getMarkerWidth(): Float
|
|
42
|
+
|
|
43
|
+
/** How far an ordered list widened this item's column past the one short lists reserve. */
|
|
44
|
+
internal open val markerExtraWidth: Float = 0f
|
|
45
|
+
|
|
46
|
+
/** This item's marker column without [markerExtraWidth]; a nested item measures its indent against it. */
|
|
47
|
+
internal open val baselineMarkerWidth: Float get() = getMarkerWidth()
|
|
48
|
+
|
|
49
|
+
override fun updateMeasureState(textPaint: TextPaint) = applyTextStyle(textPaint)
|
|
50
|
+
|
|
51
|
+
override fun updateDrawState(textPaint: TextPaint) = applyTextStyle(textPaint)
|
|
52
|
+
|
|
53
|
+
override fun getLeadingMargin(first: Boolean): Int {
|
|
54
|
+
val effectiveGap = gapWidth.coerceAtLeast(DEFAULT_MIN_GAP)
|
|
55
|
+
if (depth == 0) return (getMarkerWidth() + effectiveGap).toInt()
|
|
56
|
+
|
|
57
|
+
// Subtract truncated absolute indents, each measured from its own item's column, so neither mixed
|
|
58
|
+
// columns nor fractional margins accumulate rounding. The widenings are whole pixels and add unchanged.
|
|
59
|
+
val markerWidth = baselineMarkerWidth
|
|
60
|
+
val parentWidth = parentMarkerWidth ?: markerWidth
|
|
61
|
+
val indent = (depth * marginLeft + markerWidth + effectiveGap).toInt()
|
|
62
|
+
val parentIndent = ((depth - 1) * marginLeft + parentWidth + effectiveGap).toInt()
|
|
63
|
+
return indent - parentIndent + markerExtraWidth.toInt()
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
override fun drawLeadingMargin(
|
|
67
|
+
canvas: Canvas,
|
|
68
|
+
paint: Paint,
|
|
69
|
+
x: Int,
|
|
70
|
+
dir: Int,
|
|
71
|
+
top: Int,
|
|
72
|
+
baseline: Int,
|
|
73
|
+
bottom: Int,
|
|
74
|
+
text: CharSequence?,
|
|
75
|
+
start: Int,
|
|
76
|
+
end: Int,
|
|
77
|
+
first: Boolean,
|
|
78
|
+
layout: Layout?,
|
|
79
|
+
) {
|
|
80
|
+
if (!drawsMarker) return
|
|
81
|
+
if (!first || shouldSkipDrawing(text, start) || !hasContent(text, start, end)) return
|
|
82
|
+
|
|
83
|
+
// Only draw the marker on the true first line of this span.
|
|
84
|
+
// \n inside list item content creates inner paragraphs, each with first=true,
|
|
85
|
+
// but only the line at the span start should get a bullet/number.
|
|
86
|
+
if (text is Spanned && text.getSpanStart(this) != start) return
|
|
87
|
+
|
|
88
|
+
drawMarkerAt(canvas, paint, x, dir, top, baseline, bottom, layout, start)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
fun drawMarkerAt(
|
|
92
|
+
canvas: Canvas,
|
|
93
|
+
paint: Paint,
|
|
94
|
+
x: Int,
|
|
95
|
+
dir: Int,
|
|
96
|
+
top: Int,
|
|
97
|
+
baseline: Int,
|
|
98
|
+
bottom: Int,
|
|
99
|
+
layout: Layout?,
|
|
100
|
+
start: Int,
|
|
101
|
+
) {
|
|
102
|
+
val originalStyle = paint.style
|
|
103
|
+
val originalColor = paint.color
|
|
104
|
+
drawMarker(canvas, paint, x, dir, top, baseline, bottom, layout, start)
|
|
105
|
+
paint.style = originalStyle
|
|
106
|
+
paint.color = originalColor
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
protected abstract fun drawMarker(
|
|
110
|
+
canvas: Canvas,
|
|
111
|
+
paint: Paint,
|
|
112
|
+
x: Int,
|
|
113
|
+
dir: Int,
|
|
114
|
+
top: Int,
|
|
115
|
+
baseline: Int,
|
|
116
|
+
bottom: Int,
|
|
117
|
+
layout: Layout?,
|
|
118
|
+
start: Int,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
@SuppressLint("WrongConstant")
|
|
122
|
+
private fun applyTextStyle(textPaint: TextPaint) {
|
|
123
|
+
textPaint.textSize = blockStyle.fontSize
|
|
124
|
+
|
|
125
|
+
val preservedStyle = (textPaint.typeface?.style ?: 0) and BOLD_ITALIC_MASK
|
|
126
|
+
textPaint.applyBlockStyleFont(blockStyle, context)
|
|
127
|
+
if (preservedStyle != 0) {
|
|
128
|
+
textPaint.typeface?.let { base -> textPaint.typeface = Typeface.create(base, preservedStyle) }
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
textPaint.applyColorPreserving(blockStyle.color, *styleCache.colorsToPreserve)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
companion object {
|
|
135
|
+
private const val BOLD_ITALIC_MASK = Typeface.BOLD or Typeface.ITALIC
|
|
136
|
+
private const val DEFAULT_MIN_GAP = 4f
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private fun hasContent(
|
|
140
|
+
text: CharSequence?,
|
|
141
|
+
start: Int,
|
|
142
|
+
end: Int,
|
|
143
|
+
): Boolean {
|
|
144
|
+
if (text == null || end <= start) return false
|
|
145
|
+
return (start until end).any { !text[it].isWhitespace() }
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
private fun shouldSkipDrawing(
|
|
149
|
+
text: CharSequence?,
|
|
150
|
+
start: Int,
|
|
151
|
+
): Boolean {
|
|
152
|
+
if (text !is Spanned) return false
|
|
153
|
+
|
|
154
|
+
if (cachedText !== text) {
|
|
155
|
+
cachedText = text
|
|
156
|
+
cachedHasDeeperSpanByPosition.clear()
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return cachedHasDeeperSpanByPosition.getOrPut(start) {
|
|
160
|
+
val spans = text.getSpans(start, start + 1, BaseListSpan::class.java)
|
|
161
|
+
spans.any { it.depth > depth }
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
package com.renderrichtext.spans
|
|
2
|
+
|
|
3
|
+
import android.text.TextPaint
|
|
4
|
+
import android.text.style.MetricAffectingSpan
|
|
5
|
+
import kotlin.math.roundToInt
|
|
6
|
+
|
|
7
|
+
class BaselineShiftSpan(
|
|
8
|
+
private val fontScale: Float,
|
|
9
|
+
private val baselineOffsetScale: Float,
|
|
10
|
+
val spanType: SpanType,
|
|
11
|
+
) : MetricAffectingSpan() {
|
|
12
|
+
enum class SpanType { SUPERSCRIPT, SUBSCRIPT }
|
|
13
|
+
|
|
14
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
15
|
+
applyShift(tp)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
override fun updateMeasureState(tp: TextPaint) {
|
|
19
|
+
applyShift(tp)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private fun applyShift(tp: TextPaint) {
|
|
23
|
+
val originalTextSize = tp.textSize
|
|
24
|
+
tp.textSize = originalTextSize * fontScale
|
|
25
|
+
tp.baselineShift -= (originalTextSize * baselineOffsetScale).roundToInt()
|
|
26
|
+
}
|
|
27
|
+
}
|