@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,34 @@
|
|
|
1
|
+
package com.renderrichtext.styles
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Resolved style for a single URL-pattern variant.
|
|
7
|
+
* The `pattern` field is a regex tested against the full URL in normalized order.
|
|
8
|
+
* Fields are pre-merged with the base link style by the JS normalizer — native code
|
|
9
|
+
* uses them directly without any additional fallback logic.
|
|
10
|
+
*/
|
|
11
|
+
data class LinkVariantEntry(
|
|
12
|
+
val pattern: String,
|
|
13
|
+
val color: Int,
|
|
14
|
+
val underline: Boolean,
|
|
15
|
+
val backgroundColor: Int,
|
|
16
|
+
val fontFamily: String = "",
|
|
17
|
+
/** Pill presentation for links matching this variant; null renders an ordinary link. */
|
|
18
|
+
val pill: LinkPillStyle? = null,
|
|
19
|
+
) {
|
|
20
|
+
companion object {
|
|
21
|
+
fun fromReadableMap(
|
|
22
|
+
map: ReadableMap,
|
|
23
|
+
parser: StyleParser,
|
|
24
|
+
): LinkVariantEntry =
|
|
25
|
+
LinkVariantEntry(
|
|
26
|
+
pattern = map.getString("pattern") ?: "",
|
|
27
|
+
color = parser.parseColor(map, "color"),
|
|
28
|
+
underline = parser.parseBoolean(map, "underline"),
|
|
29
|
+
backgroundColor = parser.parseColor(map, "backgroundColor"),
|
|
30
|
+
fontFamily = parser.parseString(map, "fontFamily"),
|
|
31
|
+
pill = map.getMap("pill")?.let { LinkPillStyle.fromReadableMap(it, parser) },
|
|
32
|
+
)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
package com.renderrichtext.styles
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
|
|
5
|
+
data class ListStyle(
|
|
6
|
+
override val fontSize: Float,
|
|
7
|
+
override val fontFamily: String,
|
|
8
|
+
override val fontWeight: String,
|
|
9
|
+
override val color: Int,
|
|
10
|
+
override val marginTop: Float,
|
|
11
|
+
override val marginBottom: Float,
|
|
12
|
+
override val lineHeight: Float,
|
|
13
|
+
val bulletColor: Int,
|
|
14
|
+
val bulletSize: Float,
|
|
15
|
+
val markerMinWidth: Float,
|
|
16
|
+
val markerColor: Int,
|
|
17
|
+
val markerFontWeight: String,
|
|
18
|
+
val gapWidth: Float,
|
|
19
|
+
val marginLeft: Float,
|
|
20
|
+
val itemSpacing: Float,
|
|
21
|
+
) : BaseBlockStyle {
|
|
22
|
+
fun effectiveMarkerWidth(naturalWidth: Float): Float = naturalWidth.coerceAtLeast(markerMinWidth)
|
|
23
|
+
|
|
24
|
+
companion object {
|
|
25
|
+
fun fromReadableMap(
|
|
26
|
+
map: ReadableMap,
|
|
27
|
+
parser: StyleParser,
|
|
28
|
+
): ListStyle {
|
|
29
|
+
val fontSize = parser.toPixelFromSP(map.getDouble("fontSize").toFloat())
|
|
30
|
+
val fontFamily = parser.parseString(map, "fontFamily")
|
|
31
|
+
val fontWeight = parser.parseString(map, "fontWeight", "normal")
|
|
32
|
+
val color = parser.parseColor(map, "color")
|
|
33
|
+
val marginTop = parser.toPixelFromDIP(map.getDouble("marginTop").toFloat())
|
|
34
|
+
val marginBottom = parser.toPixelFromDIP(map.getDouble("marginBottom").toFloat())
|
|
35
|
+
val lineHeightRaw = map.getDouble("lineHeight").toFloat()
|
|
36
|
+
val lineHeight = parser.toPixelFromSP(lineHeightRaw)
|
|
37
|
+
val bulletColor = parser.parseColor(map, "bulletColor")
|
|
38
|
+
val bulletSize = parser.toPixelFromSP(map.getDouble("bulletSize").toFloat())
|
|
39
|
+
val markerMinWidth = parser.toPixelFromDIP(map.getDouble("markerMinWidth").toFloat().coerceAtLeast(0f))
|
|
40
|
+
val markerColor = parser.parseColor(map, "markerColor")
|
|
41
|
+
val markerFontWeight = parser.parseString(map, "markerFontWeight", "normal")
|
|
42
|
+
val gapWidth = parser.toPixelFromDIP(map.getDouble("gapWidth").toFloat())
|
|
43
|
+
val marginLeft = parser.toPixelFromDIP(map.getDouble("marginLeft").toFloat())
|
|
44
|
+
val itemSpacing = parser.toPixelFromDIP(map.getDouble("itemSpacing").toFloat().coerceAtLeast(0f))
|
|
45
|
+
|
|
46
|
+
return ListStyle(
|
|
47
|
+
fontSize,
|
|
48
|
+
fontFamily,
|
|
49
|
+
fontWeight,
|
|
50
|
+
color,
|
|
51
|
+
marginTop,
|
|
52
|
+
marginBottom,
|
|
53
|
+
lineHeight,
|
|
54
|
+
bulletColor,
|
|
55
|
+
bulletSize,
|
|
56
|
+
markerMinWidth,
|
|
57
|
+
markerColor,
|
|
58
|
+
markerFontWeight,
|
|
59
|
+
gapWidth,
|
|
60
|
+
marginLeft,
|
|
61
|
+
itemSpacing,
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
package com.renderrichtext.styles
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
|
|
5
|
+
data class MathStyle(
|
|
6
|
+
val fontSize: Float,
|
|
7
|
+
val color: Int,
|
|
8
|
+
val backgroundColor: Int,
|
|
9
|
+
val padding: Float,
|
|
10
|
+
val marginTop: Float,
|
|
11
|
+
val marginBottom: Float,
|
|
12
|
+
val textAlign: String,
|
|
13
|
+
) {
|
|
14
|
+
companion object {
|
|
15
|
+
fun fromReadableMap(
|
|
16
|
+
map: ReadableMap,
|
|
17
|
+
parser: StyleParser,
|
|
18
|
+
): MathStyle {
|
|
19
|
+
val fontSize = parser.toPixelFromSP(map.getDouble("fontSize").toFloat())
|
|
20
|
+
val color = parser.parseColor(map, "color")
|
|
21
|
+
val backgroundColor = parser.parseColor(map, "backgroundColor")
|
|
22
|
+
val padding = parser.toPixelFromDIP(map.getDouble("padding").toFloat())
|
|
23
|
+
val marginTop = parser.toPixelFromDIP(map.getDouble("marginTop").toFloat())
|
|
24
|
+
val marginBottom = parser.toPixelFromDIP(map.getDouble("marginBottom").toFloat())
|
|
25
|
+
val textAlign = parser.parseString(map, "textAlign", "center")
|
|
26
|
+
return MathStyle(fontSize, color, backgroundColor, padding, marginTop, marginBottom, textAlign)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
package com.renderrichtext.styles
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
|
|
5
|
+
data class MentionStyle(
|
|
6
|
+
val color: Int,
|
|
7
|
+
val backgroundColor: Int,
|
|
8
|
+
) {
|
|
9
|
+
companion object {
|
|
10
|
+
fun fromReadableMap(
|
|
11
|
+
map: ReadableMap,
|
|
12
|
+
parser: StyleParser,
|
|
13
|
+
): MentionStyle {
|
|
14
|
+
val color = parser.parseColor(map, "color")
|
|
15
|
+
val backgroundColor = parser.parseColor(map, "backgroundColor")
|
|
16
|
+
return MentionStyle(color, backgroundColor)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
package com.renderrichtext.styles
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
|
|
5
|
+
data class ParagraphStyle(
|
|
6
|
+
override val fontSize: Float,
|
|
7
|
+
override val fontFamily: String,
|
|
8
|
+
override val fontWeight: String,
|
|
9
|
+
override val color: Int,
|
|
10
|
+
override val marginTop: Float,
|
|
11
|
+
override val marginBottom: Float,
|
|
12
|
+
override val lineHeight: Float,
|
|
13
|
+
val textAlign: TextAlignment,
|
|
14
|
+
) : BaseBlockStyle {
|
|
15
|
+
companion object {
|
|
16
|
+
fun fromReadableMap(
|
|
17
|
+
map: ReadableMap,
|
|
18
|
+
parser: StyleParser,
|
|
19
|
+
): ParagraphStyle {
|
|
20
|
+
val fontSize = parser.toPixelFromSP(map.getDouble("fontSize").toFloat())
|
|
21
|
+
val fontFamily = parser.parseString(map, "fontFamily")
|
|
22
|
+
val fontWeight = parser.parseString(map, "fontWeight", "normal")
|
|
23
|
+
val color = parser.parseColor(map, "color")
|
|
24
|
+
val marginTop = parser.toPixelFromDIP(map.getDouble("marginTop").toFloat())
|
|
25
|
+
val marginBottom = parser.toPixelFromDIP(map.getDouble("marginBottom").toFloat())
|
|
26
|
+
val lineHeightRaw = map.getDouble("lineHeight").toFloat()
|
|
27
|
+
val lineHeight = parser.toPixelFromSP(lineHeightRaw)
|
|
28
|
+
val textAlign = parser.parseTextAlign(map, "textAlign")
|
|
29
|
+
|
|
30
|
+
return ParagraphStyle(fontSize, fontFamily, fontWeight, color, marginTop, marginBottom, lineHeight, textAlign)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
package com.renderrichtext.styles
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
|
|
5
|
+
data class SpoilerStyle(
|
|
6
|
+
val color: Int,
|
|
7
|
+
val particleDensity: Float,
|
|
8
|
+
val particleSpeed: Float,
|
|
9
|
+
val solidBorderRadius: Float,
|
|
10
|
+
) {
|
|
11
|
+
companion object {
|
|
12
|
+
fun fromReadableMap(
|
|
13
|
+
map: ReadableMap,
|
|
14
|
+
parser: StyleParser,
|
|
15
|
+
): SpoilerStyle {
|
|
16
|
+
val color = parser.parseColor(map, "color")
|
|
17
|
+
val particlesMap = map.getMap("particles")!!
|
|
18
|
+
val solidMap = map.getMap("solid")!!
|
|
19
|
+
return SpoilerStyle(
|
|
20
|
+
color = color,
|
|
21
|
+
particleDensity = particlesMap.getDouble("density").toFloat(),
|
|
22
|
+
particleSpeed = particlesMap.getDouble("speed").toFloat(),
|
|
23
|
+
solidBorderRadius = solidMap.getDouble("borderRadius").toFloat(),
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package com.renderrichtext.styles
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
|
|
5
|
+
data class StrikethroughStyle(
|
|
6
|
+
val color: Int,
|
|
7
|
+
) {
|
|
8
|
+
companion object {
|
|
9
|
+
fun fromReadableMap(
|
|
10
|
+
map: ReadableMap,
|
|
11
|
+
parser: StyleParser,
|
|
12
|
+
): StrikethroughStyle {
|
|
13
|
+
val color = parser.parseColor(map, "color")
|
|
14
|
+
return StrikethroughStyle(color)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
package com.renderrichtext.styles
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReadableMap
|
|
4
|
+
|
|
5
|
+
data class StrongStyle(
|
|
6
|
+
val fontFamily: String,
|
|
7
|
+
val fontWeight: String,
|
|
8
|
+
val color: Int?,
|
|
9
|
+
) {
|
|
10
|
+
companion object {
|
|
11
|
+
fun fromReadableMap(
|
|
12
|
+
map: ReadableMap,
|
|
13
|
+
parser: StyleParser,
|
|
14
|
+
): StrongStyle {
|
|
15
|
+
val fontFamily = parser.parseString(map, "fontFamily")
|
|
16
|
+
val fontWeight = parser.parseString(map, "fontWeight")
|
|
17
|
+
val color = parser.parseOptionalColor(map, "color")
|
|
18
|
+
return StrongStyle(fontFamily, fontWeight, color)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
package com.renderrichtext.styles
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.content.res.AssetManager
|
|
5
|
+
import android.graphics.Typeface
|
|
6
|
+
import com.facebook.react.bridge.ReadableMap
|
|
7
|
+
import com.facebook.react.common.ReactConstants
|
|
8
|
+
import com.facebook.react.views.text.ReactTypefaceUtils.applyStyles
|
|
9
|
+
import com.facebook.react.views.text.ReactTypefaceUtils.parseFontWeight
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Main style configuration class that parses and caches all tiptap element styles.
|
|
13
|
+
* Uses lazy initialization to defer parsing until styles are actually needed,
|
|
14
|
+
* improving startup time for documents that don't use all tiptap features.
|
|
15
|
+
*/
|
|
16
|
+
class StyleConfig(
|
|
17
|
+
private val style: ReadableMap,
|
|
18
|
+
context: Context,
|
|
19
|
+
allowFontScaling: Boolean,
|
|
20
|
+
maxFontSizeMultiplier: Float,
|
|
21
|
+
) {
|
|
22
|
+
private val styleParser = StyleParser(context, allowFontScaling, maxFontSizeMultiplier)
|
|
23
|
+
internal val assetManager: AssetManager = context.assets
|
|
24
|
+
private val assets: AssetManager get() = assetManager
|
|
25
|
+
|
|
26
|
+
private var paragraphStyleOverride: ParagraphStyle? = null
|
|
27
|
+
|
|
28
|
+
val paragraphStyle: ParagraphStyle
|
|
29
|
+
get() = paragraphStyleOverride ?: paragraphStyleDefault
|
|
30
|
+
|
|
31
|
+
private val paragraphStyleDefault: ParagraphStyle by lazy {
|
|
32
|
+
val map =
|
|
33
|
+
requireNotNull(style.getMap("paragraph")) {
|
|
34
|
+
"Paragraph style not found. JS should always provide defaults."
|
|
35
|
+
}
|
|
36
|
+
ParagraphStyle.fromReadableMap(map, styleParser)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Runs block with a temporary paragraph style override for table cell rendering. */
|
|
40
|
+
fun <T> withParagraphOverride(
|
|
41
|
+
override: ParagraphStyle,
|
|
42
|
+
block: () -> T,
|
|
43
|
+
): T {
|
|
44
|
+
paragraphStyleOverride = override
|
|
45
|
+
try {
|
|
46
|
+
return block()
|
|
47
|
+
} finally {
|
|
48
|
+
paragraphStyleOverride = null
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
fun tableCellParagraphStyle(
|
|
53
|
+
tableStyle: TableStyle,
|
|
54
|
+
isHeader: Boolean,
|
|
55
|
+
): ParagraphStyle =
|
|
56
|
+
paragraphStyleDefault.copy(
|
|
57
|
+
fontSize = tableStyle.fontSize,
|
|
58
|
+
fontFamily = if (isHeader && tableStyle.headerFontFamily.isNotEmpty()) tableStyle.headerFontFamily else tableStyle.fontFamily,
|
|
59
|
+
fontWeight = if (isHeader) "bold" else tableStyle.fontWeight,
|
|
60
|
+
color = if (isHeader) tableStyle.headerTextColor else tableStyle.color,
|
|
61
|
+
lineHeight = tableStyle.lineHeight,
|
|
62
|
+
marginTop = 0f,
|
|
63
|
+
marginBottom = 0f,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
val headingStyles: Array<HeadingStyle?> by lazy {
|
|
67
|
+
Array(7) { index ->
|
|
68
|
+
if (index == 0) {
|
|
69
|
+
null
|
|
70
|
+
} else {
|
|
71
|
+
val levelKey = "h$index"
|
|
72
|
+
val map =
|
|
73
|
+
requireNotNull(style.getMap(levelKey)) {
|
|
74
|
+
"Style for $levelKey not found. JS should always provide defaults."
|
|
75
|
+
}
|
|
76
|
+
HeadingStyle.fromReadableMap(map, styleParser)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Cache typefaces for heading levels (1-6) - lazily initialized after headingStyles
|
|
82
|
+
// Uses React Native's applyStyles to properly load custom fonts from assets
|
|
83
|
+
val headingTypefaces: Array<Typeface?> by lazy {
|
|
84
|
+
Array(7) { level ->
|
|
85
|
+
if (level == 0) {
|
|
86
|
+
null
|
|
87
|
+
} else {
|
|
88
|
+
val headingStyle = headingStyles[level]
|
|
89
|
+
val fontFamily = headingStyle?.fontFamily?.takeIf { it.isNotEmpty() }
|
|
90
|
+
val fontWeight = parseFontWeight(headingStyle?.fontWeight)
|
|
91
|
+
|
|
92
|
+
if (fontFamily != null) {
|
|
93
|
+
// Load the base font at NORMAL so the assets/fonts file resolves, then apply the
|
|
94
|
+
// weight on the real typeface. Requesting the weight up front makes ReactFontManager
|
|
95
|
+
// look for a `_bold` asset variant that single-file custom fonts lack and silently
|
|
96
|
+
// fall back to a default system face. See SpanStyleCache.getTypeface.
|
|
97
|
+
val base = applyStyles(null, ReactConstants.UNSET, ReactConstants.UNSET, fontFamily, assets)
|
|
98
|
+
applyStyles(base, ReactConstants.UNSET, fontWeight, null, assets)
|
|
99
|
+
} else {
|
|
100
|
+
null
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
val linkStyle: LinkStyle by lazy {
|
|
107
|
+
val map =
|
|
108
|
+
requireNotNull(style.getMap("link")) {
|
|
109
|
+
"Link style not found. JS should always provide defaults."
|
|
110
|
+
}
|
|
111
|
+
LinkStyle.fromReadableMap(map, styleParser)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
val linkVariants: List<LinkVariantEntry> by lazy {
|
|
115
|
+
val array = style.getArray("linkVariants") ?: return@lazy emptyList()
|
|
116
|
+
(0 until array.size()).mapNotNull { i ->
|
|
117
|
+
array.getMap(i)?.let { LinkVariantEntry.fromReadableMap(it, styleParser) }
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Whether any variant can produce a pill; lets per-draw code skip pill lookups. */
|
|
122
|
+
val hasLinkPills: Boolean by lazy { linkVariants.any { it.pill != null } }
|
|
123
|
+
|
|
124
|
+
val strongStyle: StrongStyle by lazy {
|
|
125
|
+
val map =
|
|
126
|
+
requireNotNull(style.getMap("strong")) {
|
|
127
|
+
"Strong style not found. JS should always provide defaults."
|
|
128
|
+
}
|
|
129
|
+
StrongStyle.fromReadableMap(map, styleParser)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
val emphasisStyle: EmphasisStyle by lazy {
|
|
133
|
+
val map =
|
|
134
|
+
requireNotNull(style.getMap("em")) {
|
|
135
|
+
"Emphasis style not found. JS should always provide defaults."
|
|
136
|
+
}
|
|
137
|
+
EmphasisStyle.fromReadableMap(map, styleParser)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
val strikethroughStyle: StrikethroughStyle by lazy {
|
|
141
|
+
val map =
|
|
142
|
+
requireNotNull(style.getMap("strikethrough")) {
|
|
143
|
+
"Strikethrough style not found. JS should always provide defaults."
|
|
144
|
+
}
|
|
145
|
+
StrikethroughStyle.fromReadableMap(map, styleParser)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
val underlineStyle: UnderlineStyle by lazy {
|
|
149
|
+
val map =
|
|
150
|
+
requireNotNull(style.getMap("underline")) {
|
|
151
|
+
"Underline style not found. JS should always provide defaults."
|
|
152
|
+
}
|
|
153
|
+
UnderlineStyle.fromReadableMap(map, styleParser)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
val codeStyle: CodeStyle by lazy {
|
|
157
|
+
val map =
|
|
158
|
+
requireNotNull(style.getMap("code")) {
|
|
159
|
+
"Code style not found. JS should always provide defaults."
|
|
160
|
+
}
|
|
161
|
+
CodeStyle.fromReadableMap(map, styleParser)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
val mentionStyle: MentionStyle by lazy {
|
|
165
|
+
val map =
|
|
166
|
+
requireNotNull(style.getMap("mention")) {
|
|
167
|
+
"Mention style not found. JS should always provide defaults."
|
|
168
|
+
}
|
|
169
|
+
MentionStyle.fromReadableMap(map, styleParser)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
val factoidStyle: FactoidStyle by lazy {
|
|
173
|
+
val map =
|
|
174
|
+
requireNotNull(style.getMap("factoid")) {
|
|
175
|
+
"Factoid style not found. JS should always provide defaults."
|
|
176
|
+
}
|
|
177
|
+
FactoidStyle.fromReadableMap(map, styleParser)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
val imageStyle: ImageStyle by lazy {
|
|
181
|
+
val map =
|
|
182
|
+
requireNotNull(style.getMap("image")) {
|
|
183
|
+
"Image style not found. JS should always provide defaults."
|
|
184
|
+
}
|
|
185
|
+
ImageStyle.fromReadableMap(map, styleParser)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
var imageRequestHeaders: Map<String, String> = emptyMap()
|
|
189
|
+
|
|
190
|
+
/** Per-link pill content keyed by exact URL; content, so it lives outside the style map. */
|
|
191
|
+
var linkPillContent: Map<String, LinkPillContent> = emptyMap()
|
|
192
|
+
|
|
193
|
+
val videoStyle: VideoStyle by lazy {
|
|
194
|
+
val map =
|
|
195
|
+
requireNotNull(style.getMap("video")) {
|
|
196
|
+
"Video style not found. JS should always provide defaults."
|
|
197
|
+
}
|
|
198
|
+
VideoStyle.fromReadableMap(map, styleParser)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
val inlineImageStyle: InlineImageStyle by lazy {
|
|
202
|
+
val map =
|
|
203
|
+
requireNotNull(style.getMap("inlineImage")) {
|
|
204
|
+
"InlineImage style not found. JS should always provide defaults."
|
|
205
|
+
}
|
|
206
|
+
InlineImageStyle.fromReadableMap(map, styleParser)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
val blockquoteStyle: BlockquoteStyle by lazy {
|
|
210
|
+
val map =
|
|
211
|
+
requireNotNull(style.getMap("blockquote")) {
|
|
212
|
+
"Blockquote style not found. JS should always provide defaults."
|
|
213
|
+
}
|
|
214
|
+
BlockquoteStyle.fromReadableMap(map, styleParser)
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
val listStyle: ListStyle by lazy {
|
|
218
|
+
val map =
|
|
219
|
+
requireNotNull(style.getMap("list")) {
|
|
220
|
+
"List style not found. JS should always provide defaults."
|
|
221
|
+
}
|
|
222
|
+
ListStyle.fromReadableMap(map, styleParser)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
val codeBlockStyle: CodeBlockStyle by lazy {
|
|
226
|
+
val map =
|
|
227
|
+
requireNotNull(style.getMap("codeBlock")) {
|
|
228
|
+
"CodeBlock style not found. JS should always provide defaults."
|
|
229
|
+
}
|
|
230
|
+
CodeBlockStyle.fromReadableMap(map, styleParser)
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
val thematicBreakStyle: ThematicBreakStyle by lazy {
|
|
234
|
+
val map =
|
|
235
|
+
requireNotNull(style.getMap("thematicBreak")) {
|
|
236
|
+
"ThematicBreak style not found. JS should always provide defaults."
|
|
237
|
+
}
|
|
238
|
+
ThematicBreakStyle.fromReadableMap(map, styleParser)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
val tableStyle: TableStyle by lazy {
|
|
242
|
+
val map =
|
|
243
|
+
requireNotNull(style.getMap("table")) {
|
|
244
|
+
"Table style not found. JS should always provide defaults."
|
|
245
|
+
}
|
|
246
|
+
TableStyle.fromReadableMap(map, styleParser)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
val taskListStyle: TaskListStyle by lazy {
|
|
250
|
+
val map =
|
|
251
|
+
requireNotNull(style.getMap("taskList")) {
|
|
252
|
+
"TaskList style not found. JS should always provide defaults."
|
|
253
|
+
}
|
|
254
|
+
TaskListStyle.fromReadableMap(map, styleParser)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
val mathStyle: MathStyle by lazy {
|
|
258
|
+
val map =
|
|
259
|
+
requireNotNull(style.getMap("math")) {
|
|
260
|
+
"Math style not found. JS should always provide defaults."
|
|
261
|
+
}
|
|
262
|
+
MathStyle.fromReadableMap(map, styleParser)
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
val inlineMathStyle: InlineMathStyle by lazy {
|
|
266
|
+
val map =
|
|
267
|
+
requireNotNull(style.getMap("inlineMath")) {
|
|
268
|
+
"InlineMath style not found. JS should always provide defaults."
|
|
269
|
+
}
|
|
270
|
+
InlineMathStyle.fromReadableMap(map, styleParser)
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
val spoilerStyle: SpoilerStyle by lazy {
|
|
274
|
+
val map =
|
|
275
|
+
requireNotNull(style.getMap("spoiler")) {
|
|
276
|
+
"Spoiler style not found. JS should always provide defaults."
|
|
277
|
+
}
|
|
278
|
+
SpoilerStyle.fromReadableMap(map, styleParser)
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
val superscriptStyle: SuperscriptStyle by lazy {
|
|
282
|
+
val map =
|
|
283
|
+
requireNotNull(style.getMap("superscript")) {
|
|
284
|
+
"Superscript style not found. JS should always provide defaults."
|
|
285
|
+
}
|
|
286
|
+
SuperscriptStyle.fromReadableMap(map)
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
val subscriptStyle: SubscriptStyle by lazy {
|
|
290
|
+
val map =
|
|
291
|
+
requireNotNull(style.getMap("subscript")) {
|
|
292
|
+
"Subscript style not found. JS should always provide defaults."
|
|
293
|
+
}
|
|
294
|
+
SubscriptStyle.fromReadableMap(map)
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
val highlightStyle: HighlightStyle by lazy {
|
|
298
|
+
val map =
|
|
299
|
+
requireNotNull(style.getMap("highlight")) {
|
|
300
|
+
"Highlight style not found. JS should always provide defaults."
|
|
301
|
+
}
|
|
302
|
+
HighlightStyle.fromReadableMap(map, styleParser)
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
val tableTypeface: Typeface? by lazy {
|
|
306
|
+
val fontFamily = tableStyle.fontFamily.takeIf { it.isNotEmpty() }
|
|
307
|
+
val fontWeight = parseFontWeight(tableStyle.fontWeight)
|
|
308
|
+
if (fontFamily != null) {
|
|
309
|
+
applyStyles(null, ReactConstants.UNSET, fontWeight, fontFamily, assets)
|
|
310
|
+
} else {
|
|
311
|
+
null
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
val tableHeaderTypeface: Typeface? by lazy {
|
|
316
|
+
val headerFamily = tableStyle.headerFontFamily.takeIf { it.isNotEmpty() }
|
|
317
|
+
val baseFamily = tableStyle.fontFamily.takeIf { it.isNotEmpty() }
|
|
318
|
+
|
|
319
|
+
when {
|
|
320
|
+
// 1. Try Header font (specific variant)
|
|
321
|
+
headerFamily != null -> {
|
|
322
|
+
applyStyles(null, ReactConstants.UNSET, parseFontWeight("normal"), headerFamily, assets)
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// 2. Try Table font (forced to bold)
|
|
326
|
+
baseFamily != null -> {
|
|
327
|
+
applyStyles(null, ReactConstants.UNSET, parseFontWeight("bold"), baseFamily, assets)
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// 3. System Fallback
|
|
331
|
+
else -> {
|
|
332
|
+
Typeface.DEFAULT_BOLD
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Returns true if any paragraph or heading style uses justify alignment.
|
|
339
|
+
* Used to enable justification mode on the TextView (API 26+).
|
|
340
|
+
*/
|
|
341
|
+
val needsJustify: Boolean by lazy {
|
|
342
|
+
paragraphStyle.textAlign.needsJustify ||
|
|
343
|
+
headingStyles.filterNotNull().any { it.textAlign.needsJustify }
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
override fun equals(other: Any?): Boolean {
|
|
347
|
+
if (this === other) return true
|
|
348
|
+
if (other !is StyleConfig) return false
|
|
349
|
+
|
|
350
|
+
return paragraphStyle == other.paragraphStyle &&
|
|
351
|
+
headingStyles.contentEquals(other.headingStyles) &&
|
|
352
|
+
linkStyle == other.linkStyle &&
|
|
353
|
+
linkVariants == other.linkVariants &&
|
|
354
|
+
strongStyle == other.strongStyle &&
|
|
355
|
+
emphasisStyle == other.emphasisStyle &&
|
|
356
|
+
strikethroughStyle == other.strikethroughStyle &&
|
|
357
|
+
underlineStyle == other.underlineStyle &&
|
|
358
|
+
codeStyle == other.codeStyle &&
|
|
359
|
+
mentionStyle == other.mentionStyle &&
|
|
360
|
+
factoidStyle == other.factoidStyle &&
|
|
361
|
+
imageStyle == other.imageStyle &&
|
|
362
|
+
videoStyle == other.videoStyle &&
|
|
363
|
+
inlineImageStyle == other.inlineImageStyle &&
|
|
364
|
+
blockquoteStyle == other.blockquoteStyle &&
|
|
365
|
+
listStyle == other.listStyle &&
|
|
366
|
+
codeBlockStyle == other.codeBlockStyle &&
|
|
367
|
+
thematicBreakStyle == other.thematicBreakStyle &&
|
|
368
|
+
tableStyle == other.tableStyle &&
|
|
369
|
+
taskListStyle == other.taskListStyle &&
|
|
370
|
+
mathStyle == other.mathStyle &&
|
|
371
|
+
inlineMathStyle == other.inlineMathStyle &&
|
|
372
|
+
spoilerStyle == other.spoilerStyle &&
|
|
373
|
+
superscriptStyle == other.superscriptStyle &&
|
|
374
|
+
subscriptStyle == other.subscriptStyle &&
|
|
375
|
+
highlightStyle == other.highlightStyle &&
|
|
376
|
+
imageRequestHeaders == other.imageRequestHeaders &&
|
|
377
|
+
linkPillContent == other.linkPillContent
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
override fun hashCode(): Int {
|
|
381
|
+
var result = paragraphStyle.hashCode()
|
|
382
|
+
result = 31 * result + headingStyles.contentHashCode()
|
|
383
|
+
result = 31 * result + linkStyle.hashCode()
|
|
384
|
+
result = 31 * result + linkVariants.hashCode()
|
|
385
|
+
result = 31 * result + strongStyle.hashCode()
|
|
386
|
+
result = 31 * result + emphasisStyle.hashCode()
|
|
387
|
+
result = 31 * result + strikethroughStyle.hashCode()
|
|
388
|
+
result = 31 * result + underlineStyle.hashCode()
|
|
389
|
+
result = 31 * result + codeStyle.hashCode()
|
|
390
|
+
result = 31 * result + mentionStyle.hashCode()
|
|
391
|
+
result = 31 * result + factoidStyle.hashCode()
|
|
392
|
+
result = 31 * result + imageStyle.hashCode()
|
|
393
|
+
result = 31 * result + videoStyle.hashCode()
|
|
394
|
+
result = 31 * result + inlineImageStyle.hashCode()
|
|
395
|
+
result = 31 * result + blockquoteStyle.hashCode()
|
|
396
|
+
result = 31 * result + listStyle.hashCode()
|
|
397
|
+
result = 31 * result + codeBlockStyle.hashCode()
|
|
398
|
+
result = 31 * result + thematicBreakStyle.hashCode()
|
|
399
|
+
result = 31 * result + tableStyle.hashCode()
|
|
400
|
+
result = 31 * result + taskListStyle.hashCode()
|
|
401
|
+
result = 31 * result + mathStyle.hashCode()
|
|
402
|
+
result = 31 * result + inlineMathStyle.hashCode()
|
|
403
|
+
result = 31 * result + spoilerStyle.hashCode()
|
|
404
|
+
result = 31 * result + superscriptStyle.hashCode()
|
|
405
|
+
result = 31 * result + subscriptStyle.hashCode()
|
|
406
|
+
result = 31 * result + highlightStyle.hashCode()
|
|
407
|
+
result = 31 * result + imageRequestHeaders.hashCode()
|
|
408
|
+
result = 31 * result + linkPillContent.hashCode()
|
|
409
|
+
return result
|
|
410
|
+
}
|
|
411
|
+
}
|