@mathers101/react-native-render-rich-text 0.1.10 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -20
- package/README.md +140 -140
- package/ReactNativeRenderRichText.podspec +23 -23
- package/android/build.gradle +86 -86
- package/android/consumer-rules.pro +3 -3
- package/android/src/main/AndroidManifest.xml +2 -2
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextLayoutManager.kt +24 -24
- package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextPackage.kt +13 -13
- package/android/src/main/java/com/renderrichtext/MeasurementStore.kt +644 -644
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibilityLabels.kt +17 -17
- package/android/src/main/java/com/renderrichtext/accessibility/AccessibleTiptapTextView.kt +112 -112
- package/android/src/main/java/com/renderrichtext/accessibility/TiptapAccessibilityHelper.kt +576 -576
- package/android/src/main/java/com/renderrichtext/events/CodeBlockPressEvent.kt +24 -24
- package/android/src/main/java/com/renderrichtext/events/ContextMenuItemPressEvent.kt +28 -28
- package/android/src/main/java/com/renderrichtext/events/CopyPressEvent.kt +24 -24
- package/android/src/main/java/com/renderrichtext/events/ImagePressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/LatexErrorEvent.kt +29 -29
- package/android/src/main/java/com/renderrichtext/events/LinkLongPressEvent.kt +23 -23
- package/android/src/main/java/com/renderrichtext/events/LinkPressEvent.kt +23 -23
- package/android/src/main/java/com/renderrichtext/events/MentionLongPressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/MentionPressEvent.kt +25 -25
- package/android/src/main/java/com/renderrichtext/events/TaskListItemPressEvent.kt +26 -26
- package/android/src/main/java/com/renderrichtext/math/LatexErrorReporter.kt +9 -9
- package/android/src/main/java/com/renderrichtext/parser/Parser.kt +59 -59
- package/android/src/main/java/com/renderrichtext/parser/TextLinkMatching.kt +35 -35
- package/android/src/main/java/com/renderrichtext/renderer/BaselineShiftRenderer.kt +45 -45
- package/android/src/main/java/com/renderrichtext/renderer/BlankLineRenderer.kt +39 -39
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteRenderer.kt +243 -243
- package/android/src/main/java/com/renderrichtext/renderer/BlockquoteTextRenderer.kt +56 -56
- package/android/src/main/java/com/renderrichtext/renderer/CodeBlockRenderer.kt +135 -135
- package/android/src/main/java/com/renderrichtext/renderer/CodeRenderer.kt +37 -37
- package/android/src/main/java/com/renderrichtext/renderer/EmphasisRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/HeadingRenderer.kt +81 -81
- package/android/src/main/java/com/renderrichtext/renderer/HighlightRenderer.kt +26 -26
- package/android/src/main/java/com/renderrichtext/renderer/LineBreakRenderer.kt +17 -17
- package/android/src/main/java/com/renderrichtext/renderer/LinkRenderer.kt +90 -90
- package/android/src/main/java/com/renderrichtext/renderer/ListContextManager.kt +109 -109
- package/android/src/main/java/com/renderrichtext/renderer/ListItemRenderer.kt +211 -211
- package/android/src/main/java/com/renderrichtext/renderer/ListRenderer.kt +133 -133
- package/android/src/main/java/com/renderrichtext/renderer/MentionRenderer.kt +85 -85
- package/android/src/main/java/com/renderrichtext/renderer/ParagraphRenderer.kt +91 -91
- package/android/src/main/java/com/renderrichtext/renderer/Renderer.kt +148 -148
- package/android/src/main/java/com/renderrichtext/renderer/SoftBreakRenderer.kt +17 -17
- package/android/src/main/java/com/renderrichtext/renderer/SpanStyleCache.kt +143 -143
- package/android/src/main/java/com/renderrichtext/renderer/StrikethroughRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/StrongRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/renderer/TextRenderer.kt +31 -31
- package/android/src/main/java/com/renderrichtext/renderer/ThematicBreakRenderer.kt +46 -46
- package/android/src/main/java/com/renderrichtext/renderer/UnderlineRenderer.kt +28 -28
- package/android/src/main/java/com/renderrichtext/spans/BaseListSpan.kt +164 -164
- package/android/src/main/java/com/renderrichtext/spans/BaselineShiftSpan.kt +27 -27
- package/android/src/main/java/com/renderrichtext/spans/BlockquoteSpan.kt +302 -302
- package/android/src/main/java/com/renderrichtext/spans/CodeBackgroundSpan.kt +205 -205
- package/android/src/main/java/com/renderrichtext/spans/CodeBlockSpan.kt +216 -216
- package/android/src/main/java/com/renderrichtext/spans/CodeSpan.kt +32 -32
- package/android/src/main/java/com/renderrichtext/spans/EmphasisSpan.kt +42 -42
- package/android/src/main/java/com/renderrichtext/spans/FadeInSpan.kt +29 -29
- package/android/src/main/java/com/renderrichtext/spans/HeadingSpan.kt +38 -38
- package/android/src/main/java/com/renderrichtext/spans/HighlightSpan.kt +80 -80
- package/android/src/main/java/com/renderrichtext/spans/ImageSpan.kt +481 -481
- package/android/src/main/java/com/renderrichtext/spans/InlineBackgroundGeometry.kt +42 -42
- package/android/src/main/java/com/renderrichtext/spans/LineHeightSpan.kt +39 -39
- package/android/src/main/java/com/renderrichtext/spans/LinkPillIconCache.kt +154 -154
- package/android/src/main/java/com/renderrichtext/spans/LinkPillSpan.kt +381 -381
- package/android/src/main/java/com/renderrichtext/spans/LinkSpan.kt +68 -68
- package/android/src/main/java/com/renderrichtext/spans/ListItemSpacingSpan.kt +33 -33
- package/android/src/main/java/com/renderrichtext/spans/ListMarkerAnchorSpan.kt +38 -38
- package/android/src/main/java/com/renderrichtext/spans/MarginBottomSpan.kt +76 -76
- package/android/src/main/java/com/renderrichtext/spans/MentionChipSpan.kt +132 -132
- package/android/src/main/java/com/renderrichtext/spans/MentionSpan.kt +46 -46
- package/android/src/main/java/com/renderrichtext/spans/OrderedListSpan.kt +127 -127
- package/android/src/main/java/com/renderrichtext/spans/SpoilerSpan.kt +33 -33
- package/android/src/main/java/com/renderrichtext/spans/StrikethroughSpan.kt +12 -12
- package/android/src/main/java/com/renderrichtext/spans/StrongSpan.kt +39 -39
- package/android/src/main/java/com/renderrichtext/spans/TaskListSpan.kt +143 -143
- package/android/src/main/java/com/renderrichtext/spans/TextSpan.kt +26 -26
- package/android/src/main/java/com/renderrichtext/spans/ThematicBreakSpan.kt +69 -69
- package/android/src/main/java/com/renderrichtext/spans/UnorderedListSpan.kt +96 -96
- package/android/src/main/java/com/renderrichtext/spoiler/SpoilerStubs.kt +46 -46
- package/android/src/main/java/com/renderrichtext/styles/BaseBlockStyle.kt +11 -11
- package/android/src/main/java/com/renderrichtext/styles/BlockquoteStyle.kt +83 -83
- package/android/src/main/java/com/renderrichtext/styles/CodeBlockStyle.kt +80 -80
- package/android/src/main/java/com/renderrichtext/styles/CodeStyle.kt +26 -26
- package/android/src/main/java/com/renderrichtext/styles/EmphasisStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/FactoidStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/HeadingStyle.kt +33 -33
- package/android/src/main/java/com/renderrichtext/styles/HighlightStyle.kt +19 -19
- package/android/src/main/java/com/renderrichtext/styles/ImageStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/InlineImageStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/InlineMathStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/LinkPillContent.kt +36 -36
- package/android/src/main/java/com/renderrichtext/styles/LinkPillStyle.kt +44 -44
- package/android/src/main/java/com/renderrichtext/styles/LinkStyle.kt +23 -23
- package/android/src/main/java/com/renderrichtext/styles/LinkVariantEntry.kt +34 -34
- package/android/src/main/java/com/renderrichtext/styles/ListStyle.kt +65 -65
- package/android/src/main/java/com/renderrichtext/styles/MathStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/MentionStyle.kt +19 -19
- package/android/src/main/java/com/renderrichtext/styles/ParagraphStyle.kt +33 -33
- package/android/src/main/java/com/renderrichtext/styles/SpoilerStyle.kt +27 -27
- package/android/src/main/java/com/renderrichtext/styles/StrikethroughStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/StrongStyle.kt +21 -21
- package/android/src/main/java/com/renderrichtext/styles/StyleConfig.kt +411 -411
- package/android/src/main/java/com/renderrichtext/styles/StyleParser.kt +92 -92
- package/android/src/main/java/com/renderrichtext/styles/SubscriptStyle.kt +16 -16
- package/android/src/main/java/com/renderrichtext/styles/SuperscriptStyle.kt +16 -16
- package/android/src/main/java/com/renderrichtext/styles/TableStyle.kt +75 -75
- package/android/src/main/java/com/renderrichtext/styles/TaskListStyle.kt +29 -29
- package/android/src/main/java/com/renderrichtext/styles/TextAlignment.kt +32 -32
- package/android/src/main/java/com/renderrichtext/styles/ThematicBreakStyle.kt +23 -23
- package/android/src/main/java/com/renderrichtext/styles/UnderlineStyle.kt +17 -17
- package/android/src/main/java/com/renderrichtext/styles/VideoStyle.kt +31 -31
- package/android/src/main/java/com/renderrichtext/utils/common/BorderStyleUtils.kt +86 -86
- package/android/src/main/java/com/renderrichtext/utils/common/BreakStrategyUtils.kt +32 -32
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockHighlighter.kt +36 -36
- package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockNode.kt +42 -42
- package/android/src/main/java/com/renderrichtext/utils/common/EllipsizeUtils.kt +27 -27
- package/android/src/main/java/com/renderrichtext/utils/common/EnrichedTiptapAncestorUtils.kt +10 -10
- package/android/src/main/java/com/renderrichtext/utils/common/FeatureFlags.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRecognitionProps.kt +31 -31
- package/android/src/main/java/com/renderrichtext/utils/common/LinkRegexConfig.kt +56 -56
- package/android/src/main/java/com/renderrichtext/utils/common/MotionPreferences.kt +18 -18
- package/android/src/main/java/com/renderrichtext/utils/common/ReadableMapExtensions.kt +28 -28
- package/android/src/main/java/com/renderrichtext/utils/common/layout/RTLUtils.kt +6 -6
- package/android/src/main/java/com/renderrichtext/utils/common/serialization/TiptapASTSerializer.kt +368 -368
- package/android/src/main/java/com/renderrichtext/utils/text/ImageCache.kt +88 -88
- package/android/src/main/java/com/renderrichtext/utils/text/ImageDownloader.kt +203 -203
- package/android/src/main/java/com/renderrichtext/utils/text/LocalImageLoader.kt +167 -167
- package/android/src/main/java/com/renderrichtext/utils/text/TailFadeInAnimator.kt +84 -84
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/HTMLGenerator.kt +1105 -1105
- package/android/src/main/java/com/renderrichtext/utils/text/conversion/TiptapExtractor.kt +423 -423
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/ParagraphUtils.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/SpannableExtensions.kt +9 -9
- package/android/src/main/java/com/renderrichtext/utils/text/extensions/TextPaintExtensions.kt +76 -76
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/CheckboxTouchHelper.kt +61 -61
- package/android/src/main/java/com/renderrichtext/utils/text/interaction/TaskListTapUtils.kt +286 -286
- package/android/src/main/java/com/renderrichtext/utils/text/span/ApplyLineHeight.kt +39 -39
- package/android/src/main/java/com/renderrichtext/utils/text/span/BlockSpacing.kt +142 -142
- package/android/src/main/java/com/renderrichtext/utils/text/span/SpanFlags.kt +43 -43
- package/android/src/main/java/com/renderrichtext/utils/text/span/WidthAwareSpans.kt +30 -30
- package/android/src/main/java/com/renderrichtext/utils/text/view/CodeBlockPressHost.kt +15 -15
- package/android/src/main/java/com/renderrichtext/utils/text/view/ImagePressHost.kt +19 -19
- package/android/src/main/java/com/renderrichtext/utils/text/view/SelectionActionMode.kt +235 -235
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextSelectionColors.kt +48 -48
- package/android/src/main/java/com/renderrichtext/utils/text/view/TextViewSetup.kt +119 -119
- package/android/src/main/java/com/renderrichtext/views/ContextMenuPopup.kt +217 -217
- package/android/src/main/java/com/renderrichtext/views/CopyGlyph.kt +101 -101
- package/android/src/main/java/com/renderrichtext/views/WrapGlyph.kt +40 -40
- package/android/src/main/jni/CMakeLists.txt +52 -52
- package/android/src/main/jni/react/renderer/components/RichTextSpec/ComponentDescriptors.h +30 -30
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextComponentDescriptor.h +29 -29
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.cpp +45 -45
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.h +21 -21
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.cpp +38 -38
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.h +53 -53
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.cpp +9 -9
- package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.h +24 -24
- package/android/src/main/jni/react/renderer/components/RichTextSpec/conversions.h +40 -40
- package/cpp/parser/TiptapParser.hpp +13 -13
- package/cpp/vendor/nlohmann/json.hpp +24765 -24765
- package/ios/EnrichedTiptapText.h +27 -27
- package/ios/attachments/ENRMImageAttachment.h +51 -51
- package/ios/attachments/ENRMImageAttachment.m +398 -398
- package/ios/attachments/ENRMLinkPillAttachment.h +47 -47
- package/ios/attachments/ENRMLinkPillAttachment.m +324 -324
- package/ios/attachments/ENRMLinkPillIconCache.h +28 -28
- package/ios/attachments/ENRMLinkPillIconCache.m +181 -181
- package/ios/attachments/ENRMLinkPillText.h +27 -27
- package/ios/attachments/ENRMLinkPillText.m +118 -118
- package/ios/attachments/ENRMMathInlineAttachment.h +7 -7
- package/ios/attachments/ENRMMathInlineAttachment.m +4 -4
- package/ios/attachments/ThematicBreakAttachment.h +15 -15
- package/ios/attachments/ThematicBreakAttachment.m +33 -33
- package/ios/internals/ENRMViewFreeMeasurement.h +208 -208
- package/ios/internals/EnrichedTiptapTextComponentDescriptor.h +19 -19
- package/ios/internals/EnrichedTiptapTextShadowNode.h +43 -43
- package/ios/internals/EnrichedTiptapTextShadowNode.mm +69 -69
- package/ios/internals/EnrichedTiptapTextState.h +24 -24
- package/ios/internals/MeasurementCache.h +308 -308
- package/ios/internals/ShadowMeasurementUtils.h +145 -145
- package/ios/parser/ENRMTextLinkAttributes.h +7 -7
- package/ios/parser/ENRMTiptapParser.h +33 -33
- package/ios/parser/ENRMTiptapParser.mm +73 -73
- package/ios/parser/TiptapASTNode.m +52 -52
- package/ios/renderer/AttributedRenderer.h +23 -23
- package/ios/renderer/AttributedRenderer.m +229 -229
- package/ios/renderer/BaseRenderer.h +33 -33
- package/ios/renderer/BaseRenderer.m +46 -46
- package/ios/renderer/BaselineShiftTextAttributes.h +10 -10
- package/ios/renderer/BaselineShiftTextAttributes.m +26 -26
- package/ios/renderer/BlankLineRenderer.h +4 -4
- package/ios/renderer/BlankLineRenderer.m +51 -51
- package/ios/renderer/BlockquoteRenderer.h +6 -6
- package/ios/renderer/BlockquoteRenderer.m +258 -258
- package/ios/renderer/CodeBlockRenderer.h +9 -9
- package/ios/renderer/CodeBlockRenderer.m +99 -99
- package/ios/renderer/CodeRenderer.h +9 -9
- package/ios/renderer/CodeRenderer.m +69 -69
- package/ios/renderer/ENRMBlockquoteTextRenderer.h +25 -25
- package/ios/renderer/ENRMBlockquoteTextRenderer.m +48 -48
- package/ios/renderer/EmphasisRenderer.h +5 -5
- package/ios/renderer/EmphasisRenderer.m +99 -99
- package/ios/renderer/HeadingRenderer.h +6 -6
- package/ios/renderer/HeadingRenderer.m +102 -102
- package/ios/renderer/HighlightRenderer.h +7 -7
- package/ios/renderer/HighlightRenderer.m +33 -33
- package/ios/renderer/LinkRenderer.h +6 -6
- package/ios/renderer/LinkRenderer.m +157 -157
- package/ios/renderer/ListItemRenderer.h +24 -24
- package/ios/renderer/ListItemRenderer.m +283 -283
- package/ios/renderer/ListRenderer.h +13 -13
- package/ios/renderer/ListRenderer.m +126 -126
- package/ios/renderer/MentionRenderer.h +9 -9
- package/ios/renderer/MentionRenderer.m +96 -96
- package/ios/renderer/NodeRenderer.h +8 -8
- package/ios/renderer/ParagraphRenderer.h +6 -6
- package/ios/renderer/ParagraphRenderer.m +85 -85
- package/ios/renderer/RenderContext.h +145 -145
- package/ios/renderer/RenderContext.m +402 -402
- package/ios/renderer/RendererFactory.h +12 -12
- package/ios/renderer/StrikethroughRenderer.h +5 -5
- package/ios/renderer/StrikethroughRenderer.m +30 -30
- package/ios/renderer/StrongRenderer.h +5 -5
- package/ios/renderer/StrongRenderer.m +87 -87
- package/ios/renderer/TextRenderer.h +6 -6
- package/ios/renderer/TextRenderer.m +18 -18
- package/ios/renderer/ThematicBreakRenderer.h +4 -4
- package/ios/renderer/ThematicBreakRenderer.m +41 -41
- package/ios/renderer/UnderlineRenderer.h +4 -4
- package/ios/renderer/UnderlineRenderer.m +41 -41
- package/ios/styles/ENRMFontSlot.h +12 -12
- package/ios/styles/ENRMFontSlot.m +24 -24
- package/ios/styles/StyleConfig.h +488 -488
- package/ios/styles/StyleConfig.mm +2820 -2820
- package/ios/utils/AccessibilityInfo.h +35 -35
- package/ios/utils/AccessibilityInfo.m +24 -24
- package/ios/utils/BlockquoteBorder.h +26 -26
- package/ios/utils/BlockquoteBorder.m +294 -294
- package/ios/utils/CodeBackground.h +19 -19
- package/ios/utils/CodeBackground.m +196 -196
- package/ios/utils/CodeBlockBackground.h +17 -17
- package/ios/utils/CodeBlockBackground.m +102 -102
- package/ios/utils/ContextMenuUtils.h +76 -76
- package/ios/utils/ContextMenuUtils.mm +75 -75
- package/ios/utils/ENRMAccessibilityLabels.h +40 -40
- package/ios/utils/ENRMAccessibilityLabels.m +5 -5
- package/ios/utils/ENRMAsyncRenderCoordinator.h +24 -24
- package/ios/utils/ENRMAsyncRenderCoordinator.m +37 -37
- package/ios/utils/ENRMAtomicSize.h +65 -65
- package/ios/utils/ENRMCodeBlockContent.h +37 -37
- package/ios/utils/ENRMCodeBlockContent.mm +89 -89
- package/ios/utils/ENRMFeatureFlags.h +25 -25
- package/ios/utils/ENRMImageDownloader.h +30 -30
- package/ios/utils/ENRMImageDownloader.m +168 -168
- package/ios/utils/ENRMLatexErrorCoordinator.h +27 -27
- package/ios/utils/ENRMLatexErrorCoordinator.mm +75 -75
- package/ios/utils/ENRMLatexErrorReporting.h +13 -13
- package/ios/utils/ENRMLinkContextMenus.h +93 -93
- package/ios/utils/ENRMLinkContextMenus.m +178 -178
- package/ios/utils/ENRMLinkRegexConfig.h +30 -30
- package/ios/utils/ENRMLinkRegexConfig.mm +104 -104
- package/ios/utils/ENRMLinkRegexProps.h +23 -23
- package/ios/utils/ENRMLocalImageLoader.h +35 -35
- package/ios/utils/ENRMLocalImageLoader.m +111 -111
- package/ios/utils/ENRMMenuAction.h +27 -27
- package/ios/utils/ENRMMenuAction.m +33 -33
- package/ios/utils/ENRMSpoilerOverlayManager.h +15 -15
- package/ios/utils/ENRMSpoilerOverlayManager.m +19 -19
- package/ios/utils/ENRMSpoilerTapUtils.h +6 -6
- package/ios/utils/ENRMSpoilerTapUtils.m +11 -11
- package/ios/utils/ENRMTailFadeInAnimator.h +16 -16
- package/ios/utils/ENRMTailFadeInAnimator.m +161 -161
- package/ios/utils/ENRMTextHitTest.h +23 -23
- package/ios/utils/ENRMTextHitTest.m +20 -20
- package/ios/utils/ENRMTextInteractionUtils.h +20 -20
- package/ios/utils/ENRMTextInteractionUtils.m +15 -15
- package/ios/utils/ENRMTextRenderer.h +38 -38
- package/ios/utils/ENRMTextRenderer.m +54 -54
- package/ios/utils/ENRMTextViewSetup.h +132 -132
- package/ios/utils/ENRMUIKit.h +429 -429
- package/ios/utils/EditMenuUtils.h +105 -105
- package/ios/utils/EditMenuUtils.m +143 -143
- package/ios/utils/FontScaleObserver.h +10 -10
- package/ios/utils/FontScaleObserver.m +55 -55
- package/ios/utils/FontUtils.h +31 -31
- package/ios/utils/FontUtils.m +63 -63
- package/ios/utils/HTMLGenerator.h +25 -25
- package/ios/utils/HTMLGenerator.m +1041 -1041
- package/ios/utils/HeightUpdateUtils.h +25 -25
- package/ios/utils/ImageRequestHeaderUtils.h +35 -35
- package/ios/utils/LastElementUtils.h +97 -97
- package/ios/utils/LinkContextMenuUtils.h +55 -55
- package/ios/utils/LinkPillContentUtils.h +46 -46
- package/ios/utils/ListMarkerDrawer.h +15 -15
- package/ios/utils/ListMarkerDrawer.m +239 -239
- package/ios/utils/MentionBackground.h +26 -26
- package/ios/utils/MentionBackground.m +86 -86
- package/ios/utils/ParagraphStyleUtils.h +87 -87
- package/ios/utils/ParagraphStyleUtils.m +484 -484
- package/ios/utils/PasteboardUtils.h +48 -48
- package/ios/utils/PasteboardUtils.m +166 -166
- package/ios/utils/RTFExportUtils.h +24 -24
- package/ios/utils/RTFExportUtils.m +299 -299
- package/ios/utils/SelectionColorUtils.h +14 -14
- package/ios/utils/StylePropsUtils.h +1340 -1340
- package/ios/utils/TaskListTapUtils.h +6 -6
- package/ios/utils/TaskListTapUtils.m +14 -14
- package/ios/utils/TextViewLayoutManager.h +14 -14
- package/ios/utils/TiptapAccessibilityElementBuilder.h +43 -43
- package/ios/utils/TiptapAccessibilityElementBuilder.m +432 -432
- package/ios/utils/TiptapExtractor.h +17 -17
- package/ios/utils/TiptapExtractor.m +367 -367
- package/ios/views/ENRMTiptapTextView.h +25 -25
- package/ios/views/ENRMTiptapTextView.m +247 -247
- package/package.json +65 -70
- package/react-native.config.js +10 -10
- package/src/admonitionDefaults.ts +58 -58
- package/src/darkModeTextStyle.ts +99 -99
- package/src/headingDefaults.ts +21 -21
- package/src/index.tsx +4 -4
- package/src/linkVariantUtils.ts +120 -120
- package/src/normalizeTiptapStyle.ts +397 -397
- package/src/rn-globals.d.ts +1 -1
- package/src/styleUtils.ts +107 -107
- package/src/types/TiptapStyle.ts +532 -532
- package/src/types/TiptapStyleInternal.ts +299 -299
- package/src/types/linkPill.ts +9 -9
- package/src/utils/isDev.ts +4 -4
|
@@ -1,145 +1,145 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#include "MeasurementCache.h"
|
|
4
|
-
#import <Foundation/Foundation.h>
|
|
5
|
-
#import <React/RCTUtils.h>
|
|
6
|
-
#include <algorithm>
|
|
7
|
-
#include <cmath>
|
|
8
|
-
#include <react/renderer/core/LayoutConstraints.h>
|
|
9
|
-
#include <react/renderer/core/LayoutContext.h>
|
|
10
|
-
#include <react/utils/ManagedObjectWrapper.h>
|
|
11
|
-
|
|
12
|
-
namespace facebook::react {
|
|
13
|
-
|
|
14
|
-
// Threading contract (issue #550): measureContent may run on any thread while
|
|
15
|
-
// RN holds commit locks that main-thread committers (e.g. Reanimated) also
|
|
16
|
-
// acquire — with `preventShadowTreeCommitExhaustion`, the JS thread re-runs
|
|
17
|
-
// layout under `revisionMutexRecursive_` after 3 failed optimistic commits.
|
|
18
|
-
// Any dispatch_sync to main from this path can therefore deadlock: JS waits
|
|
19
|
-
// for main, main waits for the mutex JS holds (watchdog kill 0x8BADF00D).
|
|
20
|
-
// Nothing in the measurement path may wait on the main thread.
|
|
21
|
-
// EnrichedTiptapText and EnrichedTiptap both measure view-free
|
|
22
|
-
// (ENRMViewFreeMeasurement.h) and comply fully. The one known remaining
|
|
23
|
-
// violation is the text input's own measureContent
|
|
24
|
-
// (EnrichedTiptapTextInputShadowNode.mm), which measures live editable
|
|
25
|
-
// UITextView state and needs its own strategy.
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Font scale (Dynamic Type multiplier) for measurement, without touching the
|
|
29
|
-
* main thread.
|
|
30
|
-
*
|
|
31
|
-
* Reads `LayoutContext::fontSizeMultiplier` instead of calling
|
|
32
|
-
* `RCTFontSizeMultiplier()` (a UIKit read that previously forced a
|
|
33
|
-
* dispatch_sync to main on every measure — a deadlock window under the locked
|
|
34
|
-
* commit fallback, see the contract above). RN maintains the multiplier for
|
|
35
|
-
* us: `RCTFabricSurface::_updateLayoutContext` sets it on main from
|
|
36
|
-
* `RCTFontSizeMultiplier()` and re-runs `constraintLayout` whenever
|
|
37
|
-
* `UIContentSizeCategoryDidChangeNotification` fires, so every Dynamic Type
|
|
38
|
-
* change re-measures with the fresh value. This is the same source
|
|
39
|
-
* `ParagraphShadowNode` uses for core text. A measure racing a Dynamic Type
|
|
40
|
-
* change at worst caches under the outgoing scale, which is never read again
|
|
41
|
-
* once the re-layout lands.
|
|
42
|
-
*/
|
|
43
|
-
static inline CGFloat ENRMFontScaleForMeasurement(bool allowFontScaling, const LayoutContext &layoutContext)
|
|
44
|
-
{
|
|
45
|
-
return allowFontScaling ? layoutContext.fontSizeMultiplier : 1.0;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
static inline Size ENRMClampMeasuredSize(CGSize size, const LayoutConstraints &layoutConstraints)
|
|
49
|
-
{
|
|
50
|
-
Float clampedWidth = std::max((Float)size.width, layoutConstraints.minimumSize.width);
|
|
51
|
-
clampedWidth = std::min(clampedWidth, layoutConstraints.maximumSize.width);
|
|
52
|
-
Float clampedHeight = std::max((Float)size.height, layoutConstraints.minimumSize.height);
|
|
53
|
-
if (std::isfinite(layoutConstraints.maximumSize.height)) {
|
|
54
|
-
clampedHeight = std::min(clampedHeight, layoutConstraints.maximumSize.height);
|
|
55
|
-
}
|
|
56
|
-
return {clampedWidth, clampedHeight};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
template <typename PropsT>
|
|
60
|
-
static inline bool ENRMPropsNeedExactStreamingMeasurement(const PropsT &oldProps, const PropsT &newProps)
|
|
61
|
-
{
|
|
62
|
-
return oldProps.streamingAnimation != newProps.streamingAnimation ||
|
|
63
|
-
oldProps.allowFontScaling != newProps.allowFontScaling ||
|
|
64
|
-
oldProps.maxFontSizeMultiplier != newProps.maxFontSizeMultiplier ||
|
|
65
|
-
oldProps.allowTrailingMargin != newProps.allowTrailingMargin ||
|
|
66
|
-
oldProps.md4cFlags.underline != newProps.md4cFlags.underline ||
|
|
67
|
-
oldProps.md4cFlags.superscript != newProps.md4cFlags.superscript ||
|
|
68
|
-
oldProps.md4cFlags.subscript != newProps.md4cFlags.subscript ||
|
|
69
|
-
oldProps.md4cFlags.latexMath != newProps.md4cFlags.latexMath ||
|
|
70
|
-
oldProps.md4cFlags.highlight != newProps.md4cFlags.highlight ||
|
|
71
|
-
oldProps.md4cFlags.hardSoftBreaks != newProps.md4cFlags.hardSoftBreaks ||
|
|
72
|
-
oldProps.md4cFlags.preserveBlankLines != newProps.md4cFlags.preserveBlankLines ||
|
|
73
|
-
oldProps.isGFM != newProps.isGFM || oldProps.md4cFlags.admonitions != newProps.md4cFlags.admonitions ||
|
|
74
|
-
computeStyleFingerprint(oldProps.tiptapStyle) != computeStyleFingerprint(newProps.tiptapStyle);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Shared measureContent implementation for the tiptap component views.
|
|
79
|
-
*
|
|
80
|
-
* Owns the thread-safe layers — the streaming fast path (lock-free
|
|
81
|
-
* `ENRMAtomicSize` mailbox published by `updateLayoutMetrics:`), the
|
|
82
|
-
* LRU measurement cache, and the `layoutContext`-sourced font scale — then
|
|
83
|
-
* delegates cache misses to `measureUncached`, through which both components
|
|
84
|
-
* plug their view-free pipeline (`ENRMMeasureTiptapViewFree` /
|
|
85
|
-
* `ENRMMeasureSegmentedTiptapViewFree`); the resolved view is still handed
|
|
86
|
-
* to the block for strategies that can use it. `fontScale` handed to the
|
|
87
|
-
* block is the real multiplier even when streaming skips the cache —
|
|
88
|
-
* rendering must always use it. `wrappedCodeBlocksFingerprint` folds view
|
|
89
|
-
* state outside the props that changes the size (code blocks the user wrapped)
|
|
90
|
-
* into the cache key.
|
|
91
|
-
*/
|
|
92
|
-
template <typename PropsT, typename ViewT>
|
|
93
|
-
static inline Size
|
|
94
|
-
ENRMMeasureTiptapContent(const PropsT &typedProps, const std::shared_ptr<void> &componentViewRef, int receivedCounter,
|
|
95
|
-
int &lastExactMeasurementCounter, CGSize &lastExactMeasurementSize, TiptapFlavor flavor,
|
|
96
|
-
const LayoutContext &layoutContext, const LayoutConstraints &layoutConstraints,
|
|
97
|
-
CGSize (^measureUncached)(ViewT *view, CGFloat maxWidth, CGFloat fontScale),
|
|
98
|
-
size_t wrappedCodeBlocksFingerprint = 0)
|
|
99
|
-
{
|
|
100
|
-
CGFloat maxWidth = layoutConstraints.maximumSize.width;
|
|
101
|
-
|
|
102
|
-
RCTInternalGenericWeakWrapper *weakWrapper = (RCTInternalGenericWeakWrapper *)unwrapManagedObject(componentViewRef);
|
|
103
|
-
ViewT *view = weakWrapper ? (ViewT *)weakWrapper.object : nil;
|
|
104
|
-
|
|
105
|
-
// Streaming fast path. Yoga re-measures several times per pass; the first call
|
|
106
|
-
// bumps lastExactMeasurementCounter, the rest land here. Return the freshly
|
|
107
|
-
// measured size, not the view's mailbox — mid-pass the frame isn't committed,
|
|
108
|
-
// so the mailbox is a generation stale and would freeze the height.
|
|
109
|
-
if (typedProps.streamingAnimation && view && receivedCounter <= lastExactMeasurementCounter) {
|
|
110
|
-
if (lastExactMeasurementSize.width > 0 && lastExactMeasurementSize.height > 0) {
|
|
111
|
-
return ENRMClampMeasuredSize(lastExactMeasurementSize, layoutConstraints);
|
|
112
|
-
}
|
|
113
|
-
CGSize currentSize = [view lastCommittedLayoutSize];
|
|
114
|
-
if (currentSize.width > 0 && currentSize.height > 0) {
|
|
115
|
-
return ENRMClampMeasuredSize(currentSize, layoutConstraints);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const bool shouldUseMeasurementCache = !typedProps.streamingAnimation;
|
|
120
|
-
CGFloat fontScale = ENRMFontScaleForMeasurement(typedProps.allowFontScaling, layoutContext);
|
|
121
|
-
|
|
122
|
-
if (shouldUseMeasurementCache && !typedProps.document.empty()) {
|
|
123
|
-
auto cacheKey = buildMeasurementCacheKey(typedProps, maxWidth, fontScale, flavor, wrappedCodeBlocksFingerprint);
|
|
124
|
-
CachedSize cached;
|
|
125
|
-
if (MeasurementCache::shared().get(cacheKey, cached)) {
|
|
126
|
-
return ENRMClampMeasuredSize(CGSizeMake(cached.width, cached.height), layoutConstraints);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
CGSize size = measureUncached(view, maxWidth, fontScale);
|
|
131
|
-
|
|
132
|
-
if (shouldUseMeasurementCache && !typedProps.document.empty()) {
|
|
133
|
-
auto cacheKey = buildMeasurementCacheKey(typedProps, maxWidth, fontScale, flavor, wrappedCodeBlocksFingerprint);
|
|
134
|
-
MeasurementCache::shared().set(cacheKey, {size.width, size.height});
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (typedProps.streamingAnimation) {
|
|
138
|
-
lastExactMeasurementCounter = receivedCounter;
|
|
139
|
-
lastExactMeasurementSize = size;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
return ENRMClampMeasuredSize(size, layoutConstraints);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
} // namespace facebook::react
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "MeasurementCache.h"
|
|
4
|
+
#import <Foundation/Foundation.h>
|
|
5
|
+
#import <React/RCTUtils.h>
|
|
6
|
+
#include <algorithm>
|
|
7
|
+
#include <cmath>
|
|
8
|
+
#include <react/renderer/core/LayoutConstraints.h>
|
|
9
|
+
#include <react/renderer/core/LayoutContext.h>
|
|
10
|
+
#include <react/utils/ManagedObjectWrapper.h>
|
|
11
|
+
|
|
12
|
+
namespace facebook::react {
|
|
13
|
+
|
|
14
|
+
// Threading contract (issue #550): measureContent may run on any thread while
|
|
15
|
+
// RN holds commit locks that main-thread committers (e.g. Reanimated) also
|
|
16
|
+
// acquire — with `preventShadowTreeCommitExhaustion`, the JS thread re-runs
|
|
17
|
+
// layout under `revisionMutexRecursive_` after 3 failed optimistic commits.
|
|
18
|
+
// Any dispatch_sync to main from this path can therefore deadlock: JS waits
|
|
19
|
+
// for main, main waits for the mutex JS holds (watchdog kill 0x8BADF00D).
|
|
20
|
+
// Nothing in the measurement path may wait on the main thread.
|
|
21
|
+
// EnrichedTiptapText and EnrichedTiptap both measure view-free
|
|
22
|
+
// (ENRMViewFreeMeasurement.h) and comply fully. The one known remaining
|
|
23
|
+
// violation is the text input's own measureContent
|
|
24
|
+
// (EnrichedTiptapTextInputShadowNode.mm), which measures live editable
|
|
25
|
+
// UITextView state and needs its own strategy.
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Font scale (Dynamic Type multiplier) for measurement, without touching the
|
|
29
|
+
* main thread.
|
|
30
|
+
*
|
|
31
|
+
* Reads `LayoutContext::fontSizeMultiplier` instead of calling
|
|
32
|
+
* `RCTFontSizeMultiplier()` (a UIKit read that previously forced a
|
|
33
|
+
* dispatch_sync to main on every measure — a deadlock window under the locked
|
|
34
|
+
* commit fallback, see the contract above). RN maintains the multiplier for
|
|
35
|
+
* us: `RCTFabricSurface::_updateLayoutContext` sets it on main from
|
|
36
|
+
* `RCTFontSizeMultiplier()` and re-runs `constraintLayout` whenever
|
|
37
|
+
* `UIContentSizeCategoryDidChangeNotification` fires, so every Dynamic Type
|
|
38
|
+
* change re-measures with the fresh value. This is the same source
|
|
39
|
+
* `ParagraphShadowNode` uses for core text. A measure racing a Dynamic Type
|
|
40
|
+
* change at worst caches under the outgoing scale, which is never read again
|
|
41
|
+
* once the re-layout lands.
|
|
42
|
+
*/
|
|
43
|
+
static inline CGFloat ENRMFontScaleForMeasurement(bool allowFontScaling, const LayoutContext &layoutContext)
|
|
44
|
+
{
|
|
45
|
+
return allowFontScaling ? layoutContext.fontSizeMultiplier : 1.0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
static inline Size ENRMClampMeasuredSize(CGSize size, const LayoutConstraints &layoutConstraints)
|
|
49
|
+
{
|
|
50
|
+
Float clampedWidth = std::max((Float)size.width, layoutConstraints.minimumSize.width);
|
|
51
|
+
clampedWidth = std::min(clampedWidth, layoutConstraints.maximumSize.width);
|
|
52
|
+
Float clampedHeight = std::max((Float)size.height, layoutConstraints.minimumSize.height);
|
|
53
|
+
if (std::isfinite(layoutConstraints.maximumSize.height)) {
|
|
54
|
+
clampedHeight = std::min(clampedHeight, layoutConstraints.maximumSize.height);
|
|
55
|
+
}
|
|
56
|
+
return {clampedWidth, clampedHeight};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
template <typename PropsT>
|
|
60
|
+
static inline bool ENRMPropsNeedExactStreamingMeasurement(const PropsT &oldProps, const PropsT &newProps)
|
|
61
|
+
{
|
|
62
|
+
return oldProps.streamingAnimation != newProps.streamingAnimation ||
|
|
63
|
+
oldProps.allowFontScaling != newProps.allowFontScaling ||
|
|
64
|
+
oldProps.maxFontSizeMultiplier != newProps.maxFontSizeMultiplier ||
|
|
65
|
+
oldProps.allowTrailingMargin != newProps.allowTrailingMargin ||
|
|
66
|
+
oldProps.md4cFlags.underline != newProps.md4cFlags.underline ||
|
|
67
|
+
oldProps.md4cFlags.superscript != newProps.md4cFlags.superscript ||
|
|
68
|
+
oldProps.md4cFlags.subscript != newProps.md4cFlags.subscript ||
|
|
69
|
+
oldProps.md4cFlags.latexMath != newProps.md4cFlags.latexMath ||
|
|
70
|
+
oldProps.md4cFlags.highlight != newProps.md4cFlags.highlight ||
|
|
71
|
+
oldProps.md4cFlags.hardSoftBreaks != newProps.md4cFlags.hardSoftBreaks ||
|
|
72
|
+
oldProps.md4cFlags.preserveBlankLines != newProps.md4cFlags.preserveBlankLines ||
|
|
73
|
+
oldProps.isGFM != newProps.isGFM || oldProps.md4cFlags.admonitions != newProps.md4cFlags.admonitions ||
|
|
74
|
+
computeStyleFingerprint(oldProps.tiptapStyle) != computeStyleFingerprint(newProps.tiptapStyle);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Shared measureContent implementation for the tiptap component views.
|
|
79
|
+
*
|
|
80
|
+
* Owns the thread-safe layers — the streaming fast path (lock-free
|
|
81
|
+
* `ENRMAtomicSize` mailbox published by `updateLayoutMetrics:`), the
|
|
82
|
+
* LRU measurement cache, and the `layoutContext`-sourced font scale — then
|
|
83
|
+
* delegates cache misses to `measureUncached`, through which both components
|
|
84
|
+
* plug their view-free pipeline (`ENRMMeasureTiptapViewFree` /
|
|
85
|
+
* `ENRMMeasureSegmentedTiptapViewFree`); the resolved view is still handed
|
|
86
|
+
* to the block for strategies that can use it. `fontScale` handed to the
|
|
87
|
+
* block is the real multiplier even when streaming skips the cache —
|
|
88
|
+
* rendering must always use it. `wrappedCodeBlocksFingerprint` folds view
|
|
89
|
+
* state outside the props that changes the size (code blocks the user wrapped)
|
|
90
|
+
* into the cache key.
|
|
91
|
+
*/
|
|
92
|
+
template <typename PropsT, typename ViewT>
|
|
93
|
+
static inline Size
|
|
94
|
+
ENRMMeasureTiptapContent(const PropsT &typedProps, const std::shared_ptr<void> &componentViewRef, int receivedCounter,
|
|
95
|
+
int &lastExactMeasurementCounter, CGSize &lastExactMeasurementSize, TiptapFlavor flavor,
|
|
96
|
+
const LayoutContext &layoutContext, const LayoutConstraints &layoutConstraints,
|
|
97
|
+
CGSize (^measureUncached)(ViewT *view, CGFloat maxWidth, CGFloat fontScale),
|
|
98
|
+
size_t wrappedCodeBlocksFingerprint = 0)
|
|
99
|
+
{
|
|
100
|
+
CGFloat maxWidth = layoutConstraints.maximumSize.width;
|
|
101
|
+
|
|
102
|
+
RCTInternalGenericWeakWrapper *weakWrapper = (RCTInternalGenericWeakWrapper *)unwrapManagedObject(componentViewRef);
|
|
103
|
+
ViewT *view = weakWrapper ? (ViewT *)weakWrapper.object : nil;
|
|
104
|
+
|
|
105
|
+
// Streaming fast path. Yoga re-measures several times per pass; the first call
|
|
106
|
+
// bumps lastExactMeasurementCounter, the rest land here. Return the freshly
|
|
107
|
+
// measured size, not the view's mailbox — mid-pass the frame isn't committed,
|
|
108
|
+
// so the mailbox is a generation stale and would freeze the height.
|
|
109
|
+
if (typedProps.streamingAnimation && view && receivedCounter <= lastExactMeasurementCounter) {
|
|
110
|
+
if (lastExactMeasurementSize.width > 0 && lastExactMeasurementSize.height > 0) {
|
|
111
|
+
return ENRMClampMeasuredSize(lastExactMeasurementSize, layoutConstraints);
|
|
112
|
+
}
|
|
113
|
+
CGSize currentSize = [view lastCommittedLayoutSize];
|
|
114
|
+
if (currentSize.width > 0 && currentSize.height > 0) {
|
|
115
|
+
return ENRMClampMeasuredSize(currentSize, layoutConstraints);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const bool shouldUseMeasurementCache = !typedProps.streamingAnimation;
|
|
120
|
+
CGFloat fontScale = ENRMFontScaleForMeasurement(typedProps.allowFontScaling, layoutContext);
|
|
121
|
+
|
|
122
|
+
if (shouldUseMeasurementCache && !typedProps.document.empty()) {
|
|
123
|
+
auto cacheKey = buildMeasurementCacheKey(typedProps, maxWidth, fontScale, flavor, wrappedCodeBlocksFingerprint);
|
|
124
|
+
CachedSize cached;
|
|
125
|
+
if (MeasurementCache::shared().get(cacheKey, cached)) {
|
|
126
|
+
return ENRMClampMeasuredSize(CGSizeMake(cached.width, cached.height), layoutConstraints);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
CGSize size = measureUncached(view, maxWidth, fontScale);
|
|
131
|
+
|
|
132
|
+
if (shouldUseMeasurementCache && !typedProps.document.empty()) {
|
|
133
|
+
auto cacheKey = buildMeasurementCacheKey(typedProps, maxWidth, fontScale, flavor, wrappedCodeBlocksFingerprint);
|
|
134
|
+
MeasurementCache::shared().set(cacheKey, {size.width, size.height});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (typedProps.streamingAnimation) {
|
|
138
|
+
lastExactMeasurementCounter = receivedCounter;
|
|
139
|
+
lastExactMeasurementSize = size;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return ENRMClampMeasuredSize(size, layoutConstraints);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
} // namespace facebook::react
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
#import <Foundation/Foundation.h>
|
|
4
|
-
|
|
5
|
-
// Rendering metadata only. Copy reconstruction retains the source semantics.
|
|
6
|
-
static NSString *const ENRMRecognizedLinkAttributeName = @"ENRMRecognizedLink";
|
|
7
|
-
static NSString *const ENRMRecognizedLinkOriginalUnderlineAttributeName = @"ENRMRecognizedLinkOriginalUnderline";
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#import <Foundation/Foundation.h>
|
|
4
|
+
|
|
5
|
+
// Rendering metadata only. Copy reconstruction retains the source semantics.
|
|
6
|
+
static NSString *const ENRMRecognizedLinkAttributeName = @"ENRMRecognizedLink";
|
|
7
|
+
static NSString *const ENRMRecognizedLinkOriginalUnderlineAttributeName = @"ENRMRecognizedLinkOriginalUnderline";
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
#import "TiptapASTNode.h"
|
|
2
|
-
#import <Foundation/Foundation.h>
|
|
3
|
-
|
|
4
|
-
@interface ENRMMd4cFlags : NSObject <NSCopying>
|
|
5
|
-
|
|
6
|
-
@property (nonatomic, assign) BOOL underline;
|
|
7
|
-
@property (nonatomic, assign) BOOL latexMath;
|
|
8
|
-
@property (nonatomic, assign) BOOL superscript;
|
|
9
|
-
@property (nonatomic, assign) BOOL subscript;
|
|
10
|
-
@property (nonatomic, assign) BOOL highlight;
|
|
11
|
-
@property (nonatomic, assign) BOOL hardSoftBreaks;
|
|
12
|
-
@property (nonatomic, assign) BOOL preserveBlankLines;
|
|
13
|
-
@property (nonatomic, assign) BOOL admonitions;
|
|
14
|
-
|
|
15
|
-
+ (instancetype)defaultFlags;
|
|
16
|
-
|
|
17
|
-
@end
|
|
18
|
-
|
|
19
|
-
@class ENRMLinkRegexConfig;
|
|
20
|
-
|
|
21
|
-
@interface ENRMTiptapParser : NSObject
|
|
22
|
-
|
|
23
|
-
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap;
|
|
24
|
-
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap flags:(ENRMMd4cFlags *)flags;
|
|
25
|
-
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap flags:(ENRMMd4cFlags *)flags isGFM:(BOOL)isGFM;
|
|
26
|
-
// Recognition runs before returning the AST to renderers and measurement.
|
|
27
|
-
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap
|
|
28
|
-
flags:(ENRMMd4cFlags *)flags
|
|
29
|
-
isGFM:(BOOL)isGFM
|
|
30
|
-
linkRegex:(ENRMLinkRegexConfig *)linkRegex
|
|
31
|
-
inlineCodeLinkRegex:(ENRMLinkRegexConfig *)inlineCodeLinkRegex;
|
|
32
|
-
|
|
33
|
-
@end
|
|
1
|
+
#import "TiptapASTNode.h"
|
|
2
|
+
#import <Foundation/Foundation.h>
|
|
3
|
+
|
|
4
|
+
@interface ENRMMd4cFlags : NSObject <NSCopying>
|
|
5
|
+
|
|
6
|
+
@property (nonatomic, assign) BOOL underline;
|
|
7
|
+
@property (nonatomic, assign) BOOL latexMath;
|
|
8
|
+
@property (nonatomic, assign) BOOL superscript;
|
|
9
|
+
@property (nonatomic, assign) BOOL subscript;
|
|
10
|
+
@property (nonatomic, assign) BOOL highlight;
|
|
11
|
+
@property (nonatomic, assign) BOOL hardSoftBreaks;
|
|
12
|
+
@property (nonatomic, assign) BOOL preserveBlankLines;
|
|
13
|
+
@property (nonatomic, assign) BOOL admonitions;
|
|
14
|
+
|
|
15
|
+
+ (instancetype)defaultFlags;
|
|
16
|
+
|
|
17
|
+
@end
|
|
18
|
+
|
|
19
|
+
@class ENRMLinkRegexConfig;
|
|
20
|
+
|
|
21
|
+
@interface ENRMTiptapParser : NSObject
|
|
22
|
+
|
|
23
|
+
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap;
|
|
24
|
+
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap flags:(ENRMMd4cFlags *)flags;
|
|
25
|
+
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap flags:(ENRMMd4cFlags *)flags isGFM:(BOOL)isGFM;
|
|
26
|
+
// Recognition runs before returning the AST to renderers and measurement.
|
|
27
|
+
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap
|
|
28
|
+
flags:(ENRMMd4cFlags *)flags
|
|
29
|
+
isGFM:(BOOL)isGFM
|
|
30
|
+
linkRegex:(ENRMLinkRegexConfig *)linkRegex
|
|
31
|
+
inlineCodeLinkRegex:(ENRMLinkRegexConfig *)inlineCodeLinkRegex;
|
|
32
|
+
|
|
33
|
+
@end
|
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
#import "ENRMTiptapParser.h"
|
|
2
|
-
#import "ENRMLinkRegexConfig.h"
|
|
3
|
-
#import "TiptapASTNode.h"
|
|
4
|
-
|
|
5
|
-
extern TiptapASTNode *parseTiptapWithCppParser(NSString *tiptap, ENRMMd4cFlags *flags, BOOL isGFM);
|
|
6
|
-
extern TiptapASTNode *parseTiptapWithCppParser(NSString *tiptap, ENRMMd4cFlags *flags, BOOL isGFM,
|
|
7
|
-
ENRMLinkRegexConfig *textRegex, ENRMLinkRegexConfig *codeRegex);
|
|
8
|
-
|
|
9
|
-
@implementation ENRMMd4cFlags
|
|
10
|
-
|
|
11
|
-
- (instancetype)init
|
|
12
|
-
{
|
|
13
|
-
if (self = [super init]) {
|
|
14
|
-
_underline = NO;
|
|
15
|
-
_latexMath = YES;
|
|
16
|
-
_superscript = NO;
|
|
17
|
-
_subscript = NO;
|
|
18
|
-
_highlight = NO;
|
|
19
|
-
_hardSoftBreaks = NO;
|
|
20
|
-
_preserveBlankLines = NO;
|
|
21
|
-
_admonitions = YES;
|
|
22
|
-
}
|
|
23
|
-
return self;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
+ (instancetype)defaultFlags
|
|
27
|
-
{
|
|
28
|
-
return [[ENRMMd4cFlags alloc] init];
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
- (id)copyWithZone:(NSZone *)zone
|
|
32
|
-
{
|
|
33
|
-
ENRMMd4cFlags *copy = [[ENRMMd4cFlags allocWithZone:zone] init];
|
|
34
|
-
copy.underline = self.underline;
|
|
35
|
-
copy.latexMath = self.latexMath;
|
|
36
|
-
copy.superscript = self.superscript;
|
|
37
|
-
copy.subscript = self.subscript;
|
|
38
|
-
copy.highlight = self.highlight;
|
|
39
|
-
copy.hardSoftBreaks = self.hardSoftBreaks;
|
|
40
|
-
copy.preserveBlankLines = self.preserveBlankLines;
|
|
41
|
-
copy.admonitions = self.admonitions;
|
|
42
|
-
return copy;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
@end
|
|
46
|
-
|
|
47
|
-
@implementation ENRMTiptapParser
|
|
48
|
-
|
|
49
|
-
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap
|
|
50
|
-
{
|
|
51
|
-
return [self parseTiptap:tiptap flags:[ENRMMd4cFlags defaultFlags]];
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap flags:(ENRMMd4cFlags *)flags
|
|
55
|
-
{
|
|
56
|
-
return [self parseTiptap:tiptap flags:flags isGFM:YES];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap flags:(ENRMMd4cFlags *)flags isGFM:(BOOL)isGFM
|
|
60
|
-
{
|
|
61
|
-
return parseTiptapWithCppParser(tiptap, flags, isGFM);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap
|
|
65
|
-
flags:(ENRMMd4cFlags *)flags
|
|
66
|
-
isGFM:(BOOL)isGFM
|
|
67
|
-
linkRegex:(ENRMLinkRegexConfig *)linkRegex
|
|
68
|
-
inlineCodeLinkRegex:(ENRMLinkRegexConfig *)inlineCodeLinkRegex
|
|
69
|
-
{
|
|
70
|
-
return parseTiptapWithCppParser(tiptap, flags, isGFM, linkRegex, inlineCodeLinkRegex);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
@end
|
|
1
|
+
#import "ENRMTiptapParser.h"
|
|
2
|
+
#import "ENRMLinkRegexConfig.h"
|
|
3
|
+
#import "TiptapASTNode.h"
|
|
4
|
+
|
|
5
|
+
extern TiptapASTNode *parseTiptapWithCppParser(NSString *tiptap, ENRMMd4cFlags *flags, BOOL isGFM);
|
|
6
|
+
extern TiptapASTNode *parseTiptapWithCppParser(NSString *tiptap, ENRMMd4cFlags *flags, BOOL isGFM,
|
|
7
|
+
ENRMLinkRegexConfig *textRegex, ENRMLinkRegexConfig *codeRegex);
|
|
8
|
+
|
|
9
|
+
@implementation ENRMMd4cFlags
|
|
10
|
+
|
|
11
|
+
- (instancetype)init
|
|
12
|
+
{
|
|
13
|
+
if (self = [super init]) {
|
|
14
|
+
_underline = NO;
|
|
15
|
+
_latexMath = YES;
|
|
16
|
+
_superscript = NO;
|
|
17
|
+
_subscript = NO;
|
|
18
|
+
_highlight = NO;
|
|
19
|
+
_hardSoftBreaks = NO;
|
|
20
|
+
_preserveBlankLines = NO;
|
|
21
|
+
_admonitions = YES;
|
|
22
|
+
}
|
|
23
|
+
return self;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
+ (instancetype)defaultFlags
|
|
27
|
+
{
|
|
28
|
+
return [[ENRMMd4cFlags alloc] init];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
- (id)copyWithZone:(NSZone *)zone
|
|
32
|
+
{
|
|
33
|
+
ENRMMd4cFlags *copy = [[ENRMMd4cFlags allocWithZone:zone] init];
|
|
34
|
+
copy.underline = self.underline;
|
|
35
|
+
copy.latexMath = self.latexMath;
|
|
36
|
+
copy.superscript = self.superscript;
|
|
37
|
+
copy.subscript = self.subscript;
|
|
38
|
+
copy.highlight = self.highlight;
|
|
39
|
+
copy.hardSoftBreaks = self.hardSoftBreaks;
|
|
40
|
+
copy.preserveBlankLines = self.preserveBlankLines;
|
|
41
|
+
copy.admonitions = self.admonitions;
|
|
42
|
+
return copy;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@end
|
|
46
|
+
|
|
47
|
+
@implementation ENRMTiptapParser
|
|
48
|
+
|
|
49
|
+
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap
|
|
50
|
+
{
|
|
51
|
+
return [self parseTiptap:tiptap flags:[ENRMMd4cFlags defaultFlags]];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap flags:(ENRMMd4cFlags *)flags
|
|
55
|
+
{
|
|
56
|
+
return [self parseTiptap:tiptap flags:flags isGFM:YES];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap flags:(ENRMMd4cFlags *)flags isGFM:(BOOL)isGFM
|
|
60
|
+
{
|
|
61
|
+
return parseTiptapWithCppParser(tiptap, flags, isGFM);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
- (TiptapASTNode *)parseTiptap:(NSString *)tiptap
|
|
65
|
+
flags:(ENRMMd4cFlags *)flags
|
|
66
|
+
isGFM:(BOOL)isGFM
|
|
67
|
+
linkRegex:(ENRMLinkRegexConfig *)linkRegex
|
|
68
|
+
inlineCodeLinkRegex:(ENRMLinkRegexConfig *)inlineCodeLinkRegex
|
|
69
|
+
{
|
|
70
|
+
return parseTiptapWithCppParser(tiptap, flags, isGFM, linkRegex, inlineCodeLinkRegex);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@end
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
#import "TiptapASTNode.h"
|
|
2
|
-
|
|
3
|
-
@implementation TiptapASTNode
|
|
4
|
-
|
|
5
|
-
- (instancetype)initWithType:(TiptapNodeType)type
|
|
6
|
-
{
|
|
7
|
-
if (self = [super init]) {
|
|
8
|
-
_type = type;
|
|
9
|
-
_content = nil;
|
|
10
|
-
_attributes = [[NSMutableDictionary alloc] init];
|
|
11
|
-
_children = [[NSMutableArray alloc] init];
|
|
12
|
-
}
|
|
13
|
-
return self;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
- (void)addChild:(TiptapASTNode *)child
|
|
17
|
-
{
|
|
18
|
-
[_children addObject:child];
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
- (void)setAttribute:(NSString *)key value:(NSString *)value
|
|
22
|
-
{
|
|
23
|
-
_attributes[key] = value;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
- (NSString *)description
|
|
27
|
-
{
|
|
28
|
-
return [NSString stringWithFormat:@"TiptapASTNode(type=%ld, content=%@, children=%lu)", (long)_type, _content,
|
|
29
|
-
(unsigned long)_children.count];
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
@end
|
|
33
|
-
|
|
34
|
-
BOOL ENRMIsTopLevelBlockType(TiptapNodeType type)
|
|
35
|
-
{
|
|
36
|
-
switch (type) {
|
|
37
|
-
case TiptapNodeTypeParagraph:
|
|
38
|
-
case TiptapNodeTypeHeading:
|
|
39
|
-
case TiptapNodeTypeCodeBlock:
|
|
40
|
-
case TiptapNodeTypeBlockquote:
|
|
41
|
-
case TiptapNodeTypeAdmonition:
|
|
42
|
-
case TiptapNodeTypeTable:
|
|
43
|
-
case TiptapNodeTypeUnorderedList:
|
|
44
|
-
case TiptapNodeTypeOrderedList:
|
|
45
|
-
case TiptapNodeTypeThematicBreak:
|
|
46
|
-
case TiptapNodeTypeBlankLine:
|
|
47
|
-
case TiptapNodeTypeLatexMathDisplay:
|
|
48
|
-
return YES;
|
|
49
|
-
default:
|
|
50
|
-
return NO;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
1
|
+
#import "TiptapASTNode.h"
|
|
2
|
+
|
|
3
|
+
@implementation TiptapASTNode
|
|
4
|
+
|
|
5
|
+
- (instancetype)initWithType:(TiptapNodeType)type
|
|
6
|
+
{
|
|
7
|
+
if (self = [super init]) {
|
|
8
|
+
_type = type;
|
|
9
|
+
_content = nil;
|
|
10
|
+
_attributes = [[NSMutableDictionary alloc] init];
|
|
11
|
+
_children = [[NSMutableArray alloc] init];
|
|
12
|
+
}
|
|
13
|
+
return self;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
- (void)addChild:(TiptapASTNode *)child
|
|
17
|
+
{
|
|
18
|
+
[_children addObject:child];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
- (void)setAttribute:(NSString *)key value:(NSString *)value
|
|
22
|
+
{
|
|
23
|
+
_attributes[key] = value;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
- (NSString *)description
|
|
27
|
+
{
|
|
28
|
+
return [NSString stringWithFormat:@"TiptapASTNode(type=%ld, content=%@, children=%lu)", (long)_type, _content,
|
|
29
|
+
(unsigned long)_children.count];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@end
|
|
33
|
+
|
|
34
|
+
BOOL ENRMIsTopLevelBlockType(TiptapNodeType type)
|
|
35
|
+
{
|
|
36
|
+
switch (type) {
|
|
37
|
+
case TiptapNodeTypeParagraph:
|
|
38
|
+
case TiptapNodeTypeHeading:
|
|
39
|
+
case TiptapNodeTypeCodeBlock:
|
|
40
|
+
case TiptapNodeTypeBlockquote:
|
|
41
|
+
case TiptapNodeTypeAdmonition:
|
|
42
|
+
case TiptapNodeTypeTable:
|
|
43
|
+
case TiptapNodeTypeUnorderedList:
|
|
44
|
+
case TiptapNodeTypeOrderedList:
|
|
45
|
+
case TiptapNodeTypeThematicBreak:
|
|
46
|
+
case TiptapNodeTypeBlankLine:
|
|
47
|
+
case TiptapNodeTypeLatexMathDisplay:
|
|
48
|
+
return YES;
|
|
49
|
+
default:
|
|
50
|
+
return NO;
|
|
51
|
+
}
|
|
52
|
+
}
|