@mathers101/react-native-render-rich-text 0.1.9 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -20
- package/README.md +140 -140
- package/ReactNativeRenderRichText.podspec +23 -23
- package/android/build.gradle +86 -86
- package/android/consumer-rules.pro +3 -3
- package/android/src/main/AndroidManifest.xml +2 -2
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextLayoutManager.kt +24 -24
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextPackage.kt +13 -13
- package/android/src/main/java/com/renderrichtext/MeasurementStore.kt +644 -644
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibilityLabels.kt +17 -17
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibleTiptapTextView.kt +112 -112
- package/android/src/main/java/com/renderrichtext/accessibility/TiptapAccessibilityHelper.kt +576 -576
- package/android/src/main/java/com/renderrichtext/events/CodeBlockPressEvent.kt +24 -24
- package/android/src/main/java/com/renderrichtext/events/ContextMenuItemPressEvent.kt +28 -28
- package/android/src/main/java/com/renderrichtext/events/CopyPressEvent.kt +24 -24
- package/android/src/main/java/com/renderrichtext/events/ImagePressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/LatexErrorEvent.kt +29 -29
- package/android/src/main/java/com/renderrichtext/events/LinkLongPressEvent.kt +23 -23
- package/android/src/main/java/com/renderrichtext/events/LinkPressEvent.kt +23 -23
- package/android/src/main/java/com/renderrichtext/events/MentionLongPressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/MentionPressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/TaskListItemPressEvent.kt +26 -26
- package/android/src/main/java/com/renderrichtext/math/LatexErrorReporter.kt +9 -9
- package/android/src/main/java/com/renderrichtext/parser/Parser.kt +59 -59
- package/android/src/main/java/com/renderrichtext/parser/TextLinkMatching.kt +35 -35
- package/android/src/main/java/com/renderrichtext/renderer/BaselineShiftRenderer.kt +45 -45
- package/android/src/main/java/com/renderrichtext/renderer/BlankLineRenderer.kt +39 -39
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteRenderer.kt +243 -243
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteTextRenderer.kt +56 -56
- package/android/src/main/java/com/renderrichtext/renderer/CodeBlockRenderer.kt +135 -135
- package/android/src/main/java/com/renderrichtext/renderer/CodeRenderer.kt +37 -37
- package/android/src/main/java/com/renderrichtext/renderer/EmphasisRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/HeadingRenderer.kt +81 -81
- package/android/src/main/java/com/renderrichtext/renderer/HighlightRenderer.kt +26 -26
- package/android/src/main/java/com/renderrichtext/renderer/LineBreakRenderer.kt +17 -17
- package/android/src/main/java/com/renderrichtext/renderer/LinkRenderer.kt +90 -90
- package/android/src/main/java/com/renderrichtext/renderer/ListContextManager.kt +109 -109
- package/android/src/main/java/com/renderrichtext/renderer/ListItemRenderer.kt +211 -211
- package/android/src/main/java/com/renderrichtext/renderer/ListRenderer.kt +133 -133
- package/android/src/main/java/com/renderrichtext/renderer/MentionRenderer.kt +85 -85
- package/android/src/main/java/com/renderrichtext/renderer/ParagraphRenderer.kt +91 -91
- package/android/src/main/java/com/renderrichtext/renderer/Renderer.kt +148 -148
- package/android/src/main/java/com/renderrichtext/renderer/SoftBreakRenderer.kt +17 -17
- package/android/src/main/java/com/renderrichtext/renderer/SpanStyleCache.kt +143 -143
- package/android/src/main/java/com/renderrichtext/renderer/StrikethroughRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/StrongRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/TextRenderer.kt +31 -31
- package/android/src/main/java/com/renderrichtext/renderer/ThematicBreakRenderer.kt +46 -46
- package/android/src/main/java/com/renderrichtext/renderer/UnderlineRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/spans/BaseListSpan.kt +164 -164
- package/android/src/main/java/com/renderrichtext/spans/BaselineShiftSpan.kt +27 -27
- package/android/src/main/java/com/renderrichtext/spans/BlockquoteSpan.kt +302 -302
- package/android/src/main/java/com/renderrichtext/spans/CodeBackgroundSpan.kt +205 -205
- package/android/src/main/java/com/renderrichtext/spans/CodeBlockSpan.kt +216 -216
- package/android/src/main/java/com/renderrichtext/spans/CodeSpan.kt +32 -32
- package/android/src/main/java/com/renderrichtext/spans/EmphasisSpan.kt +42 -42
- package/android/src/main/java/com/renderrichtext/spans/FadeInSpan.kt +29 -29
- package/android/src/main/java/com/renderrichtext/spans/HeadingSpan.kt +38 -38
- package/android/src/main/java/com/renderrichtext/spans/HighlightSpan.kt +80 -80
- package/android/src/main/java/com/renderrichtext/spans/ImageSpan.kt +481 -481
- package/android/src/main/java/com/renderrichtext/spans/InlineBackgroundGeometry.kt +42 -42
- package/android/src/main/java/com/renderrichtext/spans/LineHeightSpan.kt +39 -39
- package/android/src/main/java/com/renderrichtext/spans/LinkPillIconCache.kt +154 -154
- package/android/src/main/java/com/renderrichtext/spans/LinkPillSpan.kt +381 -381
- package/android/src/main/java/com/renderrichtext/spans/LinkSpan.kt +68 -68
- package/android/src/main/java/com/renderrichtext/spans/ListItemSpacingSpan.kt +33 -33
- package/android/src/main/java/com/renderrichtext/spans/ListMarkerAnchorSpan.kt +38 -38
- package/android/src/main/java/com/renderrichtext/spans/MarginBottomSpan.kt +76 -76
- package/android/src/main/java/com/renderrichtext/spans/MentionChipSpan.kt +132 -132
- package/android/src/main/java/com/renderrichtext/spans/MentionSpan.kt +46 -46
- package/android/src/main/java/com/renderrichtext/spans/OrderedListSpan.kt +127 -127
- package/android/src/main/java/com/renderrichtext/spans/SpoilerSpan.kt +33 -33
- package/android/src/main/java/com/renderrichtext/spans/StrikethroughSpan.kt +12 -12
- package/android/src/main/java/com/renderrichtext/spans/StrongSpan.kt +39 -39
- package/android/src/main/java/com/renderrichtext/spans/TaskListSpan.kt +143 -143
- package/android/src/main/java/com/renderrichtext/spans/TextSpan.kt +26 -26
- package/android/src/main/java/com/renderrichtext/spans/ThematicBreakSpan.kt +69 -69
- package/android/src/main/java/com/renderrichtext/spans/UnorderedListSpan.kt +96 -96
- package/android/src/main/java/com/renderrichtext/spoiler/SpoilerStubs.kt +46 -46
- package/android/src/main/java/com/renderrichtext/styles/BaseBlockStyle.kt +11 -11
- package/android/src/main/java/com/renderrichtext/styles/BlockquoteStyle.kt +83 -83
- package/android/src/main/java/com/renderrichtext/styles/CodeBlockStyle.kt +80 -80
- package/android/src/main/java/com/renderrichtext/styles/CodeStyle.kt +26 -26
- package/android/src/main/java/com/renderrichtext/styles/EmphasisStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/FactoidStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/HeadingStyle.kt +33 -33
- package/android/src/main/java/com/renderrichtext/styles/HighlightStyle.kt +19 -19
- package/android/src/main/java/com/renderrichtext/styles/ImageStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/InlineImageStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/InlineMathStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/LinkPillContent.kt +36 -36
- package/android/src/main/java/com/renderrichtext/styles/LinkPillStyle.kt +44 -44
- package/android/src/main/java/com/renderrichtext/styles/LinkStyle.kt +23 -23
- package/android/src/main/java/com/renderrichtext/styles/LinkVariantEntry.kt +34 -34
- package/android/src/main/java/com/renderrichtext/styles/ListStyle.kt +65 -65
- package/android/src/main/java/com/renderrichtext/styles/MathStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/MentionStyle.kt +19 -19
- package/android/src/main/java/com/renderrichtext/styles/ParagraphStyle.kt +33 -33
- package/android/src/main/java/com/renderrichtext/styles/SpoilerStyle.kt +27 -27
- package/android/src/main/java/com/renderrichtext/styles/StrikethroughStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/StrongStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/StyleConfig.kt +411 -411
- package/android/src/main/java/com/renderrichtext/styles/StyleParser.kt +92 -92
- package/android/src/main/java/com/renderrichtext/styles/SubscriptStyle.kt +16 -16
- package/android/src/main/java/com/renderrichtext/styles/SuperscriptStyle.kt +16 -16
- package/android/src/main/java/com/renderrichtext/styles/TableStyle.kt +75 -75
- package/android/src/main/java/com/renderrichtext/styles/TaskListStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/TextAlignment.kt +32 -32
- package/android/src/main/java/com/renderrichtext/styles/ThematicBreakStyle.kt +23 -23
- package/android/src/main/java/com/renderrichtext/styles/UnderlineStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/VideoStyle.kt +31 -31
- package/android/src/main/java/com/renderrichtext/utils/common/BorderStyleUtils.kt +86 -86
- package/android/src/main/java/com/renderrichtext/utils/common/BreakStrategyUtils.kt +32 -32
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockHighlighter.kt +36 -36
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockNode.kt +42 -42
- package/android/src/main/java/com/renderrichtext/utils/common/EllipsizeUtils.kt +27 -27
- package/android/src/main/java/com/renderrichtext/utils/common/EnrichedTiptapAncestorUtils.kt +10 -10
- package/android/src/main/java/com/renderrichtext/utils/common/FeatureFlags.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRecognitionProps.kt +31 -31
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRegexConfig.kt +56 -56
- package/android/src/main/java/com/renderrichtext/utils/common/MotionPreferences.kt +18 -18
- package/android/src/main/java/com/renderrichtext/utils/common/ReadableMapExtensions.kt +28 -28
- package/android/src/main/java/com/renderrichtext/utils/common/layout/RTLUtils.kt +6 -6
- package/android/src/main/java/com/renderrichtext/utils/common/serialization/TiptapASTSerializer.kt +368 -368
- package/android/src/main/java/com/renderrichtext/utils/text/ImageCache.kt +88 -88
- package/android/src/main/java/com/renderrichtext/utils/text/ImageDownloader.kt +203 -203
- package/android/src/main/java/com/renderrichtext/utils/text/LocalImageLoader.kt +167 -167
- package/android/src/main/java/com/renderrichtext/utils/text/TailFadeInAnimator.kt +84 -84
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/HTMLGenerator.kt +1105 -1105
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/TiptapExtractor.kt +423 -423
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/ParagraphUtils.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/SpannableExtensions.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/TextPaintExtensions.kt +76 -76
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/CheckboxTouchHelper.kt +61 -61
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/TaskListTapUtils.kt +286 -286
- package/android/src/main/java/com/renderrichtext/utils/text/span/ApplyLineHeight.kt +39 -39
- package/android/src/main/java/com/renderrichtext/utils/text/span/BlockSpacing.kt +142 -142
- package/android/src/main/java/com/renderrichtext/utils/text/span/SpanFlags.kt +43 -43
- package/android/src/main/java/com/renderrichtext/utils/text/span/WidthAwareSpans.kt +30 -30
- package/android/src/main/java/com/renderrichtext/utils/text/view/CodeBlockPressHost.kt +15 -15
- package/android/src/main/java/com/renderrichtext/utils/text/view/ImagePressHost.kt +19 -19
- package/android/src/main/java/com/renderrichtext/utils/text/view/SelectionActionMode.kt +235 -235
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextSelectionColors.kt +48 -48
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextViewSetup.kt +119 -119
- package/android/src/main/java/com/renderrichtext/views/ContextMenuPopup.kt +217 -217
- package/android/src/main/java/com/renderrichtext/views/CopyGlyph.kt +101 -101
- package/android/src/main/java/com/renderrichtext/views/WrapGlyph.kt +40 -40
- package/android/src/main/jni/CMakeLists.txt +52 -52
- package/android/src/main/jni/react/renderer/components/RichTextSpec/ComponentDescriptors.h +30 -30
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextComponentDescriptor.h +29 -29
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.cpp +45 -45
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.h +21 -21
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.cpp +38 -38
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.h +53 -53
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.cpp +9 -9
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.h +24 -24
- package/android/src/main/jni/react/renderer/components/RichTextSpec/conversions.h +40 -40
- package/cpp/parser/TiptapParser.hpp +13 -13
- package/cpp/vendor/nlohmann/json.hpp +24765 -24765
- package/ios/EnrichedTiptapText.h +27 -27
- package/ios/attachments/ENRMImageAttachment.h +51 -51
- package/ios/attachments/ENRMImageAttachment.m +398 -398
- package/ios/attachments/ENRMLinkPillAttachment.h +47 -47
- package/ios/attachments/ENRMLinkPillAttachment.m +324 -324
- package/ios/attachments/ENRMLinkPillIconCache.h +28 -28
- package/ios/attachments/ENRMLinkPillIconCache.m +181 -181
- package/ios/attachments/ENRMLinkPillText.h +27 -27
- package/ios/attachments/ENRMLinkPillText.m +118 -118
- package/ios/attachments/ENRMMathInlineAttachment.h +7 -7
- package/ios/attachments/ENRMMathInlineAttachment.m +4 -4
- package/ios/attachments/ThematicBreakAttachment.h +15 -15
- package/ios/attachments/ThematicBreakAttachment.m +33 -33
- package/ios/internals/ENRMViewFreeMeasurement.h +208 -208
- package/ios/internals/EnrichedTiptapTextComponentDescriptor.h +19 -19
- package/ios/internals/EnrichedTiptapTextShadowNode.h +43 -43
- package/ios/internals/EnrichedTiptapTextShadowNode.mm +69 -69
- package/ios/internals/EnrichedTiptapTextState.h +24 -24
- package/ios/internals/MeasurementCache.h +308 -308
- package/ios/internals/ShadowMeasurementUtils.h +145 -145
- package/ios/parser/ENRMTextLinkAttributes.h +7 -7
- package/ios/parser/ENRMTiptapParser.h +33 -33
- package/ios/parser/ENRMTiptapParser.mm +73 -73
- package/ios/parser/TiptapASTNode.m +52 -52
- package/ios/renderer/AttributedRenderer.h +23 -23
- package/ios/renderer/AttributedRenderer.m +229 -229
- package/ios/renderer/BaseRenderer.h +33 -33
- package/ios/renderer/BaseRenderer.m +46 -46
- package/ios/renderer/BaselineShiftTextAttributes.h +10 -10
- package/ios/renderer/BaselineShiftTextAttributes.m +26 -26
- package/ios/renderer/BlankLineRenderer.h +4 -4
- package/ios/renderer/BlankLineRenderer.m +51 -51
- package/ios/renderer/BlockquoteRenderer.h +6 -6
- package/ios/renderer/BlockquoteRenderer.m +258 -258
- package/ios/renderer/CodeBlockRenderer.h +9 -9
- package/ios/renderer/CodeBlockRenderer.m +99 -99
- package/ios/renderer/CodeRenderer.h +9 -9
- package/ios/renderer/CodeRenderer.m +69 -69
- package/ios/renderer/ENRMBlockquoteTextRenderer.h +25 -25
- package/ios/renderer/ENRMBlockquoteTextRenderer.m +48 -48
- package/ios/renderer/EmphasisRenderer.h +5 -5
- package/ios/renderer/EmphasisRenderer.m +99 -99
- package/ios/renderer/HeadingRenderer.h +6 -6
- package/ios/renderer/HeadingRenderer.m +102 -102
- package/ios/renderer/HighlightRenderer.h +7 -7
- package/ios/renderer/HighlightRenderer.m +33 -33
- package/ios/renderer/LinkRenderer.h +6 -6
- package/ios/renderer/LinkRenderer.m +157 -157
- package/ios/renderer/ListItemRenderer.h +24 -24
- package/ios/renderer/ListItemRenderer.m +283 -283
- package/ios/renderer/ListRenderer.h +13 -13
- package/ios/renderer/ListRenderer.m +126 -126
- package/ios/renderer/MentionRenderer.h +9 -9
- package/ios/renderer/MentionRenderer.m +96 -96
- package/ios/renderer/NodeRenderer.h +8 -8
- package/ios/renderer/ParagraphRenderer.h +6 -6
- package/ios/renderer/ParagraphRenderer.m +85 -85
- package/ios/renderer/RenderContext.h +145 -145
- package/ios/renderer/RenderContext.m +402 -402
- package/ios/renderer/RendererFactory.h +12 -12
- package/ios/renderer/StrikethroughRenderer.h +5 -5
- package/ios/renderer/StrikethroughRenderer.m +30 -30
- package/ios/renderer/StrongRenderer.h +5 -5
- package/ios/renderer/StrongRenderer.m +87 -87
- package/ios/renderer/TextRenderer.h +6 -6
- package/ios/renderer/TextRenderer.m +18 -18
- package/ios/renderer/ThematicBreakRenderer.h +4 -4
- package/ios/renderer/ThematicBreakRenderer.m +41 -41
- package/ios/renderer/UnderlineRenderer.h +4 -4
- package/ios/renderer/UnderlineRenderer.m +41 -41
- package/ios/styles/ENRMFontSlot.h +12 -12
- package/ios/styles/ENRMFontSlot.m +24 -24
- package/ios/styles/StyleConfig.h +488 -488
- package/ios/styles/StyleConfig.mm +2820 -2820
- package/ios/utils/AccessibilityInfo.h +35 -35
- package/ios/utils/AccessibilityInfo.m +24 -24
- package/ios/utils/BlockquoteBorder.h +26 -26
- package/ios/utils/BlockquoteBorder.m +294 -294
- package/ios/utils/CodeBackground.h +19 -19
- package/ios/utils/CodeBackground.m +196 -196
- package/ios/utils/CodeBlockBackground.h +17 -17
- package/ios/utils/CodeBlockBackground.m +102 -102
- package/ios/utils/ContextMenuUtils.h +76 -76
- package/ios/utils/ContextMenuUtils.mm +75 -75
- package/ios/utils/ENRMAccessibilityLabels.h +40 -40
- package/ios/utils/ENRMAccessibilityLabels.m +5 -5
- package/ios/utils/ENRMAsyncRenderCoordinator.h +24 -24
- package/ios/utils/ENRMAsyncRenderCoordinator.m +37 -37
- package/ios/utils/ENRMAtomicSize.h +65 -65
- package/ios/utils/ENRMCodeBlockContent.h +37 -37
- package/ios/utils/ENRMCodeBlockContent.mm +89 -89
- package/ios/utils/ENRMFeatureFlags.h +25 -25
- package/ios/utils/ENRMImageDownloader.h +30 -30
- package/ios/utils/ENRMImageDownloader.m +168 -168
- package/ios/utils/ENRMLatexErrorCoordinator.h +27 -27
- package/ios/utils/ENRMLatexErrorCoordinator.mm +75 -75
- package/ios/utils/ENRMLatexErrorReporting.h +13 -13
- package/ios/utils/ENRMLinkContextMenus.h +93 -93
- package/ios/utils/ENRMLinkContextMenus.m +178 -178
- package/ios/utils/ENRMLinkRegexConfig.h +30 -30
- package/ios/utils/ENRMLinkRegexConfig.mm +104 -104
- package/ios/utils/ENRMLinkRegexProps.h +23 -23
- package/ios/utils/ENRMLocalImageLoader.h +35 -35
- package/ios/utils/ENRMLocalImageLoader.m +111 -111
- package/ios/utils/ENRMMenuAction.h +27 -27
- package/ios/utils/ENRMMenuAction.m +33 -33
- package/ios/utils/ENRMSpoilerOverlayManager.h +15 -15
- package/ios/utils/ENRMSpoilerOverlayManager.m +19 -19
- package/ios/utils/ENRMSpoilerTapUtils.h +6 -6
- package/ios/utils/ENRMSpoilerTapUtils.m +11 -11
- package/ios/utils/ENRMTailFadeInAnimator.h +16 -16
- package/ios/utils/ENRMTailFadeInAnimator.m +161 -161
- package/ios/utils/ENRMTextHitTest.h +23 -23
- package/ios/utils/ENRMTextHitTest.m +20 -20
- package/ios/utils/ENRMTextInteractionUtils.h +20 -20
- package/ios/utils/ENRMTextInteractionUtils.m +15 -15
- package/ios/utils/ENRMTextRenderer.h +38 -38
- package/ios/utils/ENRMTextRenderer.m +54 -54
- package/ios/utils/ENRMTextViewSetup.h +132 -132
- package/ios/utils/ENRMUIKit.h +429 -429
- package/ios/utils/EditMenuUtils.h +105 -105
- package/ios/utils/EditMenuUtils.m +143 -143
- package/ios/utils/FontScaleObserver.h +10 -10
- package/ios/utils/FontScaleObserver.m +55 -55
- package/ios/utils/FontUtils.h +31 -31
- package/ios/utils/FontUtils.m +63 -63
- package/ios/utils/HTMLGenerator.h +25 -25
- package/ios/utils/HTMLGenerator.m +1041 -1041
- package/ios/utils/HeightUpdateUtils.h +25 -25
- package/ios/utils/ImageRequestHeaderUtils.h +35 -35
- package/ios/utils/LastElementUtils.h +97 -97
- package/ios/utils/LinkContextMenuUtils.h +55 -55
- package/ios/utils/LinkPillContentUtils.h +46 -46
- package/ios/utils/ListMarkerDrawer.h +15 -15
- package/ios/utils/ListMarkerDrawer.m +239 -239
- package/ios/utils/MentionBackground.h +26 -26
- package/ios/utils/MentionBackground.m +86 -86
- package/ios/utils/ParagraphStyleUtils.h +87 -87
- package/ios/utils/ParagraphStyleUtils.m +484 -484
- package/ios/utils/PasteboardUtils.h +48 -48
- package/ios/utils/PasteboardUtils.m +166 -166
- package/ios/utils/RTFExportUtils.h +24 -24
- package/ios/utils/RTFExportUtils.m +299 -299
- package/ios/utils/SelectionColorUtils.h +14 -14
- package/ios/utils/StylePropsUtils.h +1340 -1340
- package/ios/utils/TaskListTapUtils.h +6 -6
- package/ios/utils/TaskListTapUtils.m +14 -14
- package/ios/utils/TextViewLayoutManager.h +14 -14
- package/ios/utils/TiptapAccessibilityElementBuilder.h +43 -43
- package/ios/utils/TiptapAccessibilityElementBuilder.m +432 -432
- package/ios/utils/TiptapExtractor.h +17 -17
- package/ios/utils/TiptapExtractor.m +367 -367
- package/ios/views/ENRMTiptapTextView.h +25 -25
- package/ios/views/ENRMTiptapTextView.m +247 -247
- package/package.json +65 -70
- package/react-native.config.js +10 -10
- package/src/admonitionDefaults.ts +58 -58
- package/src/darkModeTextStyle.ts +99 -99
- package/src/headingDefaults.ts +21 -21
- package/src/index.tsx +4 -4
- package/src/linkVariantUtils.ts +120 -120
- package/src/normalizeTiptapStyle.ts +397 -397
- package/src/rn-globals.d.ts +1 -1
- package/src/styleUtils.ts +107 -107
- package/src/types/TiptapStyle.ts +532 -532
- package/src/types/TiptapStyleInternal.ts +299 -299
- package/src/types/linkPill.ts +9 -9
- package/src/utils/isDev.ts +4 -4
package/LICENSE
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 Software Mansion
|
|
4
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
6
|
-
in the Software without restriction, including without limitation the rights
|
|
7
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
9
|
-
furnished to do so, subject to the following conditions:
|
|
10
|
-
|
|
11
|
-
The above copyright notice and this permission notice shall be included in all
|
|
12
|
-
copies or substantial portions of the Software.
|
|
13
|
-
|
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Software Mansion
|
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
in the Software without restriction, including without limitation the rights
|
|
7
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
furnished to do so, subject to the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be included in all
|
|
12
|
+
copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
20
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,140 +1,140 @@
|
|
|
1
|
-
# react-native-render-rich-text
|
|
2
|
-
|
|
3
|
-
A React Native Fabric library that renders a [Tiptap](https://tiptap.dev/) document on iOS and Android. The public component is `RichText`. Its `document` prop is a Tiptap JSON tree, or that tree already encoded as a string.
|
|
4
|
-
|
|
5
|
-
There is no web renderer and no text-input component. New Architecture is required (React Native 0.88).
|
|
6
|
-
|
|
7
|
-
The display renderers are adapted from Software Mansion. That copyright stays on the copied sources. See `LICENSE`.
|
|
8
|
-
|
|
9
|
-
## Install
|
|
10
|
-
|
|
11
|
-
```sh
|
|
12
|
-
npm install @mathers101/react-native-render-rich-text
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## What it draws
|
|
16
|
-
|
|
17
|
-
Nodes: `doc`, `paragraph`, `heading`, `bulletList`, `orderedList`, `listItem`, `blockquote`, `codeBlock`, `horizontalRule`, `hardBreak`, `factoid`, and `mention`. Marks: `bold` (or `strong`), `italic` (or `em`), `strike` (or `strikethrough`), `code`, `underline`, `highlight`, and `link`. A link's URL is `marks[].attrs.href`. A factoid is an inline node; its `id` is what `onFactoidPress` receives, and a factoid that contains a link emits `onLinkPress` instead. A mention is an inline atom with `id` and `label`. It draws as `@label` (or `@id` when `label` is blank). `onMentionPress` and `onMentionLongPress` receive both attributes.
|
|
18
|
-
|
|
19
|
-
Unknown nodes, including tables, images, and task lists, are skipped with their children so the rest of the document still renders. A code block keeps its `language` attribute. Syntax colors apply only when the optional highlighting module is compiled in; otherwise the block is plain monospace.
|
|
20
|
-
|
|
21
|
-
## Use it
|
|
22
|
-
|
|
23
|
-
```tsx
|
|
24
|
-
import { RichText } from "@mathers101/react-native-render-rich-text";
|
|
25
|
-
|
|
26
|
-
<RichText
|
|
27
|
-
document={document}
|
|
28
|
-
onLinkPress={(url) => {
|
|
29
|
-
// url comes from the link mark's href
|
|
30
|
-
}}
|
|
31
|
-
onFactoidPress={(factoidId) => {
|
|
32
|
-
// factoidId comes from the factoid node's id
|
|
33
|
-
}}
|
|
34
|
-
onMentionPress={(mention) => {
|
|
35
|
-
// mention.id and mention.label come from the mention node
|
|
36
|
-
}}
|
|
37
|
-
onMentionLongPress={(mention) => {
|
|
38
|
-
// same payload as onMentionPress
|
|
39
|
-
}}
|
|
40
|
-
/>;
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
`document` is either a `TiptapNode` or a JSON string. `selectable` defaults to true. `allowFontScaling` defaults to true, and `maxFontSizeMultiplier` caps that scale. `numberOfLines` and `ellipsizeMode` (`'head' | 'middle' | 'tail' | 'clip'`) truncate the view. `style` is a normal React Native view style for the container, not the text.
|
|
44
|
-
|
|
45
|
-
## Styling
|
|
46
|
-
|
|
47
|
-
Pass a partial `TiptapStyle` as `textStyle`. Omitted keys keep the built-in defaults. JavaScript fills in that complete style before it crosses the bridge; native does not invent colors of its own.
|
|
48
|
-
|
|
49
|
-
```tsx
|
|
50
|
-
<RichText
|
|
51
|
-
document={document}
|
|
52
|
-
textStyle={{
|
|
53
|
-
paragraph: { color: "#1c1917", fontSize: 17, lineHeight: 26 },
|
|
54
|
-
link: { color: "#9a3412" },
|
|
55
|
-
blockquote: { borderColor: "#c2410c", padding: 16 },
|
|
56
|
-
}}
|
|
57
|
-
/>
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
The type is exported as `TiptapStyle`. Each node has its own block: `paragraph`, `h1` through `h6`, `blockquote`, `list`, `code`, `codeBlock`, `link`, `linkVariants`, `strong`, `em`, `strikethrough`, `underline`, `mention`, `factoid`, `highlight`, `thematicBreak`, and the table, image, math, and task-list blocks the style object still carries. Color fields take any string `processColor` accepts.
|
|
61
|
-
|
|
62
|
-
With no `textStyle`, body text is `#1F2937`, headings are near-black, links are `#2563EB`, and inline code is pink on a light chip. Blockquotes use a gray bar, a light fill, and 10 points of padding. Bold and italic do not set a color, so they inherit the surrounding text. Fenced code blocks are the exception: they default to a dark background (`#1F2937`) and a GitHub-dark syntax palette.
|
|
63
|
-
|
|
64
|
-
A factoid's `color`, `backgroundColor`, and `borderColor` attributes replace that one channel of `textStyle.factoid`. The other channels stay on the style.
|
|
65
|
-
|
|
66
|
-
A mention uses `textStyle.mention`. `color` is the label and `backgroundColor` is the chip. Defaults are `#1D4ED8` on `#DBEAFE`. iOS draws semibold text in a rounded rect on each line the name wraps onto. Android draws one medium-weight chip and keeps it on a single line, and darkens the fill while a finger is down.
|
|
67
|
-
|
|
68
|
-
`linkVariants` maps a URL regex to a link override. Longer patterns win. Omitted `color` and `underline` inherit the base link style.
|
|
69
|
-
|
|
70
|
-
## Dark mode
|
|
71
|
-
|
|
72
|
-
The library does not follow the system appearance. Pass a dark `textStyle` yourself when the screen is dark. `darkModeTextStyle` is a ready-made palette for that: light text (`#E6EDF3`), brighter headings, blue links (`#58A6FF`), and dark surfaces for quotes, tables, and code. It sets colors only. Font sizes, spacing, and the rest of the geometry stay on the built-in defaults, including the 10-point blockquote padding. Bold and italic are left unset so they still inherit.
|
|
73
|
-
|
|
74
|
-
```tsx
|
|
75
|
-
import { darkModeTextStyle, RichText } from "@mathers101/react-native-render-rich-text";
|
|
76
|
-
|
|
77
|
-
<RichText document={document} textStyle={darkModeTextStyle} />;
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Spread it and override a few keys when the preset is close but not exact:
|
|
81
|
-
|
|
82
|
-
```tsx
|
|
83
|
-
textStyle={{
|
|
84
|
-
...darkModeTextStyle,
|
|
85
|
-
paragraph: { ...darkModeTextStyle.paragraph, fontSize: 17, lineHeight: 26 },
|
|
86
|
-
link: { color: '#93C5FD' },
|
|
87
|
-
}}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
The preset lives in `src/darkModeTextStyle.ts`. The light defaults live in `src/normalizeTiptapStyle.ts`.
|
|
91
|
-
|
|
92
|
-
## Run the example
|
|
93
|
-
|
|
94
|
-
The example app is a Yarn workspace of this package. Metro serves it on port 41873:
|
|
95
|
-
|
|
96
|
-
```sh
|
|
97
|
-
yarn example
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
One screen shows five fixtures: mixed document, lists, code, links, and a long tab of two documents that mix every node. The header button labeled **Dark** swaps the document to `darkModeTextStyle` and darkens the screen around it. It reads **Light** after the switch. Open a link, a factoid, or a mention and the footer shows what was pressed. Hold a mention and the footer says it was held.
|
|
101
|
-
|
|
102
|
-
iOS: from `example/ios`, run `bundle install` and `bundle exec pod install`, then `yarn example ios` (or `yarn workspace render-rich-text-example ios`). The pod is `ReactNativeRenderRichText`.
|
|
103
|
-
|
|
104
|
-
Android: from `example`, run `yarn android`. The native package is `com.renderrichtext`. The codegen spec name is `RichTextSpec`.
|
|
105
|
-
|
|
106
|
-
## Release
|
|
107
|
-
|
|
108
|
-
Pushing a `vX.Y.Z` tag publishes that version to the public npm registry. The tag has to match `version` in `package.json`. The workflow is `.github/workflows/publish.yml`. It typechecks, runs the parser tests, publishes, and opens a GitHub Release.
|
|
109
|
-
|
|
110
|
-
```sh
|
|
111
|
-
# commit the version bump first, then:
|
|
112
|
-
git tag v0.1.7
|
|
113
|
-
git push origin v0.1.7
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
## Build the library
|
|
119
|
-
|
|
120
|
-
Install dependencies from the repository root.
|
|
121
|
-
|
|
122
|
-
```sh
|
|
123
|
-
corepack enable
|
|
124
|
-
yarn install
|
|
125
|
-
yarn typecheck
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
## Parser tests
|
|
129
|
-
|
|
130
|
-
The C++ parser tests check mark nesting, lists, factoids, empty documents, and unknown nodes.
|
|
131
|
-
|
|
132
|
-
```sh
|
|
133
|
-
yarn test:parser
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
That compiles `cpp/parser/TiptapParser.cpp` with `cpp/tests/parser_tests.cpp` and runs the binary. A passing run prints `all parser tests passed`.
|
|
137
|
-
|
|
138
|
-
## What this environment cannot verify
|
|
139
|
-
|
|
140
|
-
iOS and Android rendering need a simulator or a device. Typecheck and the parser tests run here. Metro can serve the JavaScript bundle here. A device render does not.
|
|
1
|
+
# react-native-render-rich-text
|
|
2
|
+
|
|
3
|
+
A React Native Fabric library that renders a [Tiptap](https://tiptap.dev/) document on iOS and Android. The public component is `RichText`. Its `document` prop is a Tiptap JSON tree, or that tree already encoded as a string.
|
|
4
|
+
|
|
5
|
+
There is no web renderer and no text-input component. New Architecture is required (React Native 0.88).
|
|
6
|
+
|
|
7
|
+
The display renderers are adapted from Software Mansion. That copyright stays on the copied sources. See `LICENSE`.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install @mathers101/react-native-render-rich-text
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## What it draws
|
|
16
|
+
|
|
17
|
+
Nodes: `doc`, `paragraph`, `heading`, `bulletList`, `orderedList`, `listItem`, `blockquote`, `codeBlock`, `horizontalRule`, `hardBreak`, `factoid`, and `mention`. Marks: `bold` (or `strong`), `italic` (or `em`), `strike` (or `strikethrough`), `code`, `underline`, `highlight`, and `link`. A link's URL is `marks[].attrs.href`. A factoid is an inline node; its `id` is what `onFactoidPress` receives, and a factoid that contains a link emits `onLinkPress` instead. A mention is an inline atom with `id` and `label`. It draws as `@label` (or `@id` when `label` is blank). `onMentionPress` and `onMentionLongPress` receive both attributes.
|
|
18
|
+
|
|
19
|
+
Unknown nodes, including tables, images, and task lists, are skipped with their children so the rest of the document still renders. A code block keeps its `language` attribute. Syntax colors apply only when the optional highlighting module is compiled in; otherwise the block is plain monospace.
|
|
20
|
+
|
|
21
|
+
## Use it
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
import { RichText } from "@mathers101/react-native-render-rich-text";
|
|
25
|
+
|
|
26
|
+
<RichText
|
|
27
|
+
document={document}
|
|
28
|
+
onLinkPress={(url) => {
|
|
29
|
+
// url comes from the link mark's href
|
|
30
|
+
}}
|
|
31
|
+
onFactoidPress={(factoidId) => {
|
|
32
|
+
// factoidId comes from the factoid node's id
|
|
33
|
+
}}
|
|
34
|
+
onMentionPress={(mention) => {
|
|
35
|
+
// mention.id and mention.label come from the mention node
|
|
36
|
+
}}
|
|
37
|
+
onMentionLongPress={(mention) => {
|
|
38
|
+
// same payload as onMentionPress
|
|
39
|
+
}}
|
|
40
|
+
/>;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`document` is either a `TiptapNode` or a JSON string. `selectable` defaults to true. `allowFontScaling` defaults to true, and `maxFontSizeMultiplier` caps that scale. `numberOfLines` and `ellipsizeMode` (`'head' | 'middle' | 'tail' | 'clip'`) truncate the view. `style` is a normal React Native view style for the container, not the text.
|
|
44
|
+
|
|
45
|
+
## Styling
|
|
46
|
+
|
|
47
|
+
Pass a partial `TiptapStyle` as `textStyle`. Omitted keys keep the built-in defaults. JavaScript fills in that complete style before it crosses the bridge; native does not invent colors of its own.
|
|
48
|
+
|
|
49
|
+
```tsx
|
|
50
|
+
<RichText
|
|
51
|
+
document={document}
|
|
52
|
+
textStyle={{
|
|
53
|
+
paragraph: { color: "#1c1917", fontSize: 17, lineHeight: 26 },
|
|
54
|
+
link: { color: "#9a3412" },
|
|
55
|
+
blockquote: { borderColor: "#c2410c", padding: 16 },
|
|
56
|
+
}}
|
|
57
|
+
/>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The type is exported as `TiptapStyle`. Each node has its own block: `paragraph`, `h1` through `h6`, `blockquote`, `list`, `code`, `codeBlock`, `link`, `linkVariants`, `strong`, `em`, `strikethrough`, `underline`, `mention`, `factoid`, `highlight`, `thematicBreak`, and the table, image, math, and task-list blocks the style object still carries. Color fields take any string `processColor` accepts.
|
|
61
|
+
|
|
62
|
+
With no `textStyle`, body text is `#1F2937`, headings are near-black, links are `#2563EB`, and inline code is pink on a light chip. Blockquotes use a gray bar, a light fill, and 10 points of padding. Bold and italic do not set a color, so they inherit the surrounding text. Fenced code blocks are the exception: they default to a dark background (`#1F2937`) and a GitHub-dark syntax palette.
|
|
63
|
+
|
|
64
|
+
A factoid's `color`, `backgroundColor`, and `borderColor` attributes replace that one channel of `textStyle.factoid`. The other channels stay on the style.
|
|
65
|
+
|
|
66
|
+
A mention uses `textStyle.mention`. `color` is the label and `backgroundColor` is the chip. Defaults are `#1D4ED8` on `#DBEAFE`. iOS draws semibold text in a rounded rect on each line the name wraps onto. Android draws one medium-weight chip and keeps it on a single line, and darkens the fill while a finger is down.
|
|
67
|
+
|
|
68
|
+
`linkVariants` maps a URL regex to a link override. Longer patterns win. Omitted `color` and `underline` inherit the base link style.
|
|
69
|
+
|
|
70
|
+
## Dark mode
|
|
71
|
+
|
|
72
|
+
The library does not follow the system appearance. Pass a dark `textStyle` yourself when the screen is dark. `darkModeTextStyle` is a ready-made palette for that: light text (`#E6EDF3`), brighter headings, blue links (`#58A6FF`), and dark surfaces for quotes, tables, and code. It sets colors only. Font sizes, spacing, and the rest of the geometry stay on the built-in defaults, including the 10-point blockquote padding. Bold and italic are left unset so they still inherit.
|
|
73
|
+
|
|
74
|
+
```tsx
|
|
75
|
+
import { darkModeTextStyle, RichText } from "@mathers101/react-native-render-rich-text";
|
|
76
|
+
|
|
77
|
+
<RichText document={document} textStyle={darkModeTextStyle} />;
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Spread it and override a few keys when the preset is close but not exact:
|
|
81
|
+
|
|
82
|
+
```tsx
|
|
83
|
+
textStyle={{
|
|
84
|
+
...darkModeTextStyle,
|
|
85
|
+
paragraph: { ...darkModeTextStyle.paragraph, fontSize: 17, lineHeight: 26 },
|
|
86
|
+
link: { color: '#93C5FD' },
|
|
87
|
+
}}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The preset lives in `src/darkModeTextStyle.ts`. The light defaults live in `src/normalizeTiptapStyle.ts`.
|
|
91
|
+
|
|
92
|
+
## Run the example
|
|
93
|
+
|
|
94
|
+
The example app is a Yarn workspace of this package. Metro serves it on port 41873:
|
|
95
|
+
|
|
96
|
+
```sh
|
|
97
|
+
yarn example
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
One screen shows five fixtures: mixed document, lists, code, links, and a long tab of two documents that mix every node. The header button labeled **Dark** swaps the document to `darkModeTextStyle` and darkens the screen around it. It reads **Light** after the switch. Open a link, a factoid, or a mention and the footer shows what was pressed. Hold a mention and the footer says it was held.
|
|
101
|
+
|
|
102
|
+
iOS: from `example/ios`, run `bundle install` and `bundle exec pod install`, then `yarn example ios` (or `yarn workspace render-rich-text-example ios`). The pod is `ReactNativeRenderRichText`.
|
|
103
|
+
|
|
104
|
+
Android: from `example`, run `yarn android`. The native package is `com.renderrichtext`. The codegen spec name is `RichTextSpec`.
|
|
105
|
+
|
|
106
|
+
## Release
|
|
107
|
+
|
|
108
|
+
Pushing a `vX.Y.Z` tag publishes that version to the public npm registry. The tag has to match `version` in `package.json`. The workflow is `.github/workflows/publish.yml`. It typechecks, runs the parser tests, publishes, and opens a GitHub Release.
|
|
109
|
+
|
|
110
|
+
```sh
|
|
111
|
+
# commit the version bump first, then:
|
|
112
|
+
git tag v0.1.7
|
|
113
|
+
git push origin v0.1.7
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Publishing uses npm trusted publishing from `.github/workflows/publish.yml`. No npm token is stored in GitHub. The package is public, so Expo EAS and other installs do not need a token.
|
|
117
|
+
|
|
118
|
+
## Build the library
|
|
119
|
+
|
|
120
|
+
Install dependencies from the repository root.
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
corepack enable
|
|
124
|
+
yarn install
|
|
125
|
+
yarn typecheck
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Parser tests
|
|
129
|
+
|
|
130
|
+
The C++ parser tests check mark nesting, lists, factoids, empty documents, and unknown nodes.
|
|
131
|
+
|
|
132
|
+
```sh
|
|
133
|
+
yarn test:parser
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
That compiles `cpp/parser/TiptapParser.cpp` with `cpp/tests/parser_tests.cpp` and runs the binary. A passing run prints `all parser tests passed`.
|
|
137
|
+
|
|
138
|
+
## What this environment cannot verify
|
|
139
|
+
|
|
140
|
+
iOS and Android rendering need a simulator or a device. Typecheck and the parser tests run here. Metro can serve the JavaScript bundle here. A device render does not.
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
require "json"
|
|
2
|
-
|
|
3
|
-
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
4
|
-
|
|
5
|
-
Pod::Spec.new do |s|
|
|
6
|
-
s.name = "ReactNativeRenderRichText"
|
|
7
|
-
s.version = package["version"]
|
|
8
|
-
s.summary = package["description"]
|
|
9
|
-
s.homepage = package["homepage"]
|
|
10
|
-
s.license = package["license"]
|
|
11
|
-
s.authors = package["author"]
|
|
12
|
-
s.platforms = { :ios => min_ios_version_supported }
|
|
13
|
-
s.source = { :git => package["repository"]["url"], :tag => "#{s.version}" }
|
|
14
|
-
|
|
15
|
-
s.source_files = "ios/**/*.{h,m,mm}", "cpp/parser/*.{hpp,cpp}"
|
|
16
|
-
s.private_header_files = "ios/**/*.h", "cpp/parser/*.hpp"
|
|
17
|
-
s.pod_target_xcconfig = {
|
|
18
|
-
"CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
|
|
19
|
-
"HEADER_SEARCH_PATHS" => "$(inherited) \"$(PODS_TARGET_SRCROOT)/cpp/parser\" \"$(PODS_TARGET_SRCROOT)/cpp/vendor\""
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
install_modules_dependencies(s)
|
|
23
|
-
end
|
|
1
|
+
require "json"
|
|
2
|
+
|
|
3
|
+
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
|
4
|
+
|
|
5
|
+
Pod::Spec.new do |s|
|
|
6
|
+
s.name = "ReactNativeRenderRichText"
|
|
7
|
+
s.version = package["version"]
|
|
8
|
+
s.summary = package["description"]
|
|
9
|
+
s.homepage = package["homepage"]
|
|
10
|
+
s.license = package["license"]
|
|
11
|
+
s.authors = package["author"]
|
|
12
|
+
s.platforms = { :ios => min_ios_version_supported }
|
|
13
|
+
s.source = { :git => package["repository"]["url"], :tag => "#{s.version}" }
|
|
14
|
+
|
|
15
|
+
s.source_files = "ios/**/*.{h,m,mm}", "cpp/parser/*.{hpp,cpp}"
|
|
16
|
+
s.private_header_files = "ios/**/*.h", "cpp/parser/*.hpp"
|
|
17
|
+
s.pod_target_xcconfig = {
|
|
18
|
+
"CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
|
|
19
|
+
"HEADER_SEARCH_PATHS" => "$(inherited) \"$(PODS_TARGET_SRCROOT)/cpp/parser\" \"$(PODS_TARGET_SRCROOT)/cpp/vendor\""
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
install_modules_dependencies(s)
|
|
23
|
+
end
|
package/android/build.gradle
CHANGED
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
buildscript {
|
|
2
|
-
repositories {
|
|
3
|
-
google()
|
|
4
|
-
mavenCentral()
|
|
5
|
-
}
|
|
6
|
-
dependencies {
|
|
7
|
-
classpath "com.android.tools.build:gradle:8.12.0"
|
|
8
|
-
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.0"
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
apply plugin: "com.android.library"
|
|
13
|
-
|
|
14
|
-
def shouldApplyKotlinPlugin() {
|
|
15
|
-
def agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0].toInteger()
|
|
16
|
-
if (agpMajor <= 8) {
|
|
17
|
-
return true
|
|
18
|
-
}
|
|
19
|
-
if (agpMajor >= 10) {
|
|
20
|
-
return false
|
|
21
|
-
}
|
|
22
|
-
def propertyVal = providers.gradleProperty("android.builtInKotlin").orNull
|
|
23
|
-
def builtInKotlinEnabled = propertyVal != null ? propertyVal.toBoolean() : true
|
|
24
|
-
return !builtInKotlinEnabled
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
if (shouldApplyKotlinPlugin()) {
|
|
28
|
-
apply plugin: "kotlin-android"
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
apply plugin: "com.facebook.react"
|
|
32
|
-
|
|
33
|
-
def getExtOrDefault = { name, fallback ->
|
|
34
|
-
return rootProject.ext.has(name) ? rootProject.ext.get(name) : fallback
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
android {
|
|
38
|
-
namespace "com.renderrichtext"
|
|
39
|
-
compileSdkVersion getExtOrDefault("compileSdkVersion", 37)
|
|
40
|
-
|
|
41
|
-
defaultConfig {
|
|
42
|
-
minSdkVersion getExtOrDefault("minSdkVersion", 24)
|
|
43
|
-
targetSdkVersion getExtOrDefault("targetSdkVersion", 36)
|
|
44
|
-
consumerProguardFiles "consumer-rules.pro"
|
|
45
|
-
buildConfigField "boolean", "ENABLE_MATH", "false"
|
|
46
|
-
buildConfigField "boolean", "ENABLE_VIDEO", "false"
|
|
47
|
-
buildConfigField "boolean", "ENABLE_CODE_HIGHLIGHT", "false"
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
buildFeatures {
|
|
51
|
-
buildConfig true
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
buildTypes {
|
|
55
|
-
release {
|
|
56
|
-
minifyEnabled false
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
compileOptions {
|
|
61
|
-
sourceCompatibility JavaVersion.VERSION_17
|
|
62
|
-
targetCompatibility JavaVersion.VERSION_17
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
sourceSets {
|
|
66
|
-
main {
|
|
67
|
-
java.srcDirs += ["generated/java", "generated/jni"]
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
repositories {
|
|
73
|
-
mavenCentral()
|
|
74
|
-
google()
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
dependencies {
|
|
78
|
-
implementation "com.facebook.react:react-android"
|
|
79
|
-
implementation "org.jetbrains.kotlin:kotlin-stdlib:2.2.0"
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
react {
|
|
83
|
-
jsRootDir = file("../src/")
|
|
84
|
-
libraryName = "RichTextSpec"
|
|
85
|
-
codegenJavaPackageName = "com.renderrichtext"
|
|
86
|
-
}
|
|
1
|
+
buildscript {
|
|
2
|
+
repositories {
|
|
3
|
+
google()
|
|
4
|
+
mavenCentral()
|
|
5
|
+
}
|
|
6
|
+
dependencies {
|
|
7
|
+
classpath "com.android.tools.build:gradle:8.12.0"
|
|
8
|
+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.0"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
apply plugin: "com.android.library"
|
|
13
|
+
|
|
14
|
+
def shouldApplyKotlinPlugin() {
|
|
15
|
+
def agpMajor = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')[0].toInteger()
|
|
16
|
+
if (agpMajor <= 8) {
|
|
17
|
+
return true
|
|
18
|
+
}
|
|
19
|
+
if (agpMajor >= 10) {
|
|
20
|
+
return false
|
|
21
|
+
}
|
|
22
|
+
def propertyVal = providers.gradleProperty("android.builtInKotlin").orNull
|
|
23
|
+
def builtInKotlinEnabled = propertyVal != null ? propertyVal.toBoolean() : true
|
|
24
|
+
return !builtInKotlinEnabled
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (shouldApplyKotlinPlugin()) {
|
|
28
|
+
apply plugin: "kotlin-android"
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
apply plugin: "com.facebook.react"
|
|
32
|
+
|
|
33
|
+
def getExtOrDefault = { name, fallback ->
|
|
34
|
+
return rootProject.ext.has(name) ? rootProject.ext.get(name) : fallback
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
android {
|
|
38
|
+
namespace "com.renderrichtext"
|
|
39
|
+
compileSdkVersion getExtOrDefault("compileSdkVersion", 37)
|
|
40
|
+
|
|
41
|
+
defaultConfig {
|
|
42
|
+
minSdkVersion getExtOrDefault("minSdkVersion", 24)
|
|
43
|
+
targetSdkVersion getExtOrDefault("targetSdkVersion", 36)
|
|
44
|
+
consumerProguardFiles "consumer-rules.pro"
|
|
45
|
+
buildConfigField "boolean", "ENABLE_MATH", "false"
|
|
46
|
+
buildConfigField "boolean", "ENABLE_VIDEO", "false"
|
|
47
|
+
buildConfigField "boolean", "ENABLE_CODE_HIGHLIGHT", "false"
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
buildFeatures {
|
|
51
|
+
buildConfig true
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
buildTypes {
|
|
55
|
+
release {
|
|
56
|
+
minifyEnabled false
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
compileOptions {
|
|
61
|
+
sourceCompatibility JavaVersion.VERSION_17
|
|
62
|
+
targetCompatibility JavaVersion.VERSION_17
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
sourceSets {
|
|
66
|
+
main {
|
|
67
|
+
java.srcDirs += ["generated/java", "generated/jni"]
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
repositories {
|
|
73
|
+
mavenCentral()
|
|
74
|
+
google()
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
dependencies {
|
|
78
|
+
implementation "com.facebook.react:react-android"
|
|
79
|
+
implementation "org.jetbrains.kotlin:kotlin-stdlib:2.2.0"
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
react {
|
|
83
|
+
jsRootDir = file("../src/")
|
|
84
|
+
libraryName = "RichTextSpec"
|
|
85
|
+
codegenJavaPackageName = "com.renderrichtext"
|
|
86
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# JNI looks up these classes by name from jni-adapter.cpp.
|
|
2
|
-
-keep class com.renderrichtext.parser.TiptapASTNode { *; }
|
|
3
|
-
-keep class com.renderrichtext.parser.TiptapASTNode$NodeType { *; }
|
|
1
|
+
# JNI looks up these classes by name from jni-adapter.cpp.
|
|
2
|
+
-keep class com.renderrichtext.parser.TiptapASTNode { *; }
|
|
3
|
+
-keep class com.renderrichtext.parser.TiptapASTNode$NodeType { *; }
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
2
|
-
</manifest>
|
|
1
|
+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
2
|
+
</manifest>
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
package com.renderrichtext
|
|
2
|
-
|
|
3
|
-
import com.facebook.react.bridge.Arguments
|
|
4
|
-
|
|
5
|
-
class EnrichedTiptapTextLayoutManager(
|
|
6
|
-
private val view: EnrichedTiptapText,
|
|
7
|
-
) {
|
|
8
|
-
private var forceHeightRecalculationCounter = 0
|
|
9
|
-
|
|
10
|
-
fun invalidateLayout() {
|
|
11
|
-
val text = view.text
|
|
12
|
-
val paint = view.paint
|
|
13
|
-
val heightChanged = MeasurementStore.store(view.id, text, paint, view.trailingMarginBottomPx())
|
|
14
|
-
if (!heightChanged) return
|
|
15
|
-
val stateWrapper = view.stateWrapper ?: return
|
|
16
|
-
val state = Arguments.createMap()
|
|
17
|
-
state.putInt("forceHeightRecalculationCounter", ++forceHeightRecalculationCounter)
|
|
18
|
-
stateWrapper.updateState(state)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
fun releaseMeasurementStore() {
|
|
22
|
-
MeasurementStore.release(view.id)
|
|
23
|
-
}
|
|
24
|
-
}
|
|
1
|
+
package com.renderrichtext
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Arguments
|
|
4
|
+
|
|
5
|
+
class EnrichedTiptapTextLayoutManager(
|
|
6
|
+
private val view: EnrichedTiptapText,
|
|
7
|
+
) {
|
|
8
|
+
private var forceHeightRecalculationCounter = 0
|
|
9
|
+
|
|
10
|
+
fun invalidateLayout() {
|
|
11
|
+
val text = view.text
|
|
12
|
+
val paint = view.paint
|
|
13
|
+
val heightChanged = MeasurementStore.store(view.id, text, paint, view.trailingMarginBottomPx())
|
|
14
|
+
if (!heightChanged) return
|
|
15
|
+
val stateWrapper = view.stateWrapper ?: return
|
|
16
|
+
val state = Arguments.createMap()
|
|
17
|
+
state.putInt("forceHeightRecalculationCounter", ++forceHeightRecalculationCounter)
|
|
18
|
+
stateWrapper.updateState(state)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
fun releaseMeasurementStore() {
|
|
22
|
+
MeasurementStore.release(view.id)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
package com.renderrichtext
|
|
2
|
-
|
|
3
|
-
import com.facebook.react.ReactPackage
|
|
4
|
-
import com.facebook.react.bridge.NativeModule
|
|
5
|
-
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
-
import com.facebook.react.uimanager.ViewManager
|
|
7
|
-
|
|
8
|
-
class EnrichedTiptapTextPackage : ReactPackage {
|
|
9
|
-
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> =
|
|
10
|
-
listOf(EnrichedTiptapTextManager())
|
|
11
|
-
|
|
12
|
-
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> = emptyList()
|
|
13
|
-
}
|
|
1
|
+
package com.renderrichtext
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.ReactPackage
|
|
4
|
+
import com.facebook.react.bridge.NativeModule
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
+
import com.facebook.react.uimanager.ViewManager
|
|
7
|
+
|
|
8
|
+
class EnrichedTiptapTextPackage : ReactPackage {
|
|
9
|
+
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> =
|
|
10
|
+
listOf(EnrichedTiptapTextManager())
|
|
11
|
+
|
|
12
|
+
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> = emptyList()
|
|
13
|
+
}
|