@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
|
@@ -1,197 +1,197 @@
|
|
|
1
|
-
#import "CodeBackground.h"
|
|
2
|
-
#import "ENRMUIKit.h"
|
|
3
|
-
#import "RenderContext.h"
|
|
4
|
-
|
|
5
|
-
NSString *const CodeAttributeName = @"Code";
|
|
6
|
-
|
|
7
|
-
static const CGFloat kCodeBackgroundCornerRadius = 2.0;
|
|
8
|
-
static const CGFloat kCodeBackgroundBorderWidth = 0.5;
|
|
9
|
-
|
|
10
|
-
@implementation CodeBackground {
|
|
11
|
-
StyleConfig *_config;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
- (instancetype)initWithConfig:(StyleConfig *)config
|
|
15
|
-
{
|
|
16
|
-
self = [super init];
|
|
17
|
-
if (self) {
|
|
18
|
-
_config = config;
|
|
19
|
-
}
|
|
20
|
-
return self;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
- (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
|
|
24
|
-
layoutManager:(NSLayoutManager *)layoutManager
|
|
25
|
-
textContainer:(NSTextContainer *)textContainer
|
|
26
|
-
atPoint:(CGPoint)origin
|
|
27
|
-
{
|
|
28
|
-
RCTUIColor *backgroundColor = _config.codeBackgroundColor;
|
|
29
|
-
if (!backgroundColor)
|
|
30
|
-
return;
|
|
31
|
-
|
|
32
|
-
NSTextStorage *textStorage = layoutManager.textStorage;
|
|
33
|
-
NSRange charRange = [layoutManager characterRangeForGlyphRange:glyphsToShow actualGlyphRange:NULL];
|
|
34
|
-
if (charRange.location == NSNotFound || charRange.length == 0)
|
|
35
|
-
return;
|
|
36
|
-
|
|
37
|
-
[textStorage enumerateAttribute:CodeAttributeName
|
|
38
|
-
inRange:NSMakeRange(0, textStorage.length)
|
|
39
|
-
options:0
|
|
40
|
-
usingBlock:^(id value, NSRange range, BOOL *stop) {
|
|
41
|
-
if (!value || range.length == 0)
|
|
42
|
-
return;
|
|
43
|
-
if (NSIntersectionRange(range, charRange).length == 0)
|
|
44
|
-
return;
|
|
45
|
-
|
|
46
|
-
[self drawCodeBackgroundForRange:range
|
|
47
|
-
layoutManager:layoutManager
|
|
48
|
-
textContainer:textContainer
|
|
49
|
-
atPoint:origin
|
|
50
|
-
backgroundColor:backgroundColor
|
|
51
|
-
borderColor:self->_config.codeBorderColor];
|
|
52
|
-
}];
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
- (void)drawCodeBackgroundForRange:(NSRange)range
|
|
56
|
-
layoutManager:(NSLayoutManager *)layoutManager
|
|
57
|
-
textContainer:(NSTextContainer *)textContainer
|
|
58
|
-
atPoint:(CGPoint)origin
|
|
59
|
-
backgroundColor:(RCTUIColor *)backgroundColor
|
|
60
|
-
borderColor:(RCTUIColor *)borderColor
|
|
61
|
-
{
|
|
62
|
-
NSRange glyphRange = [layoutManager glyphRangeForCharacterRange:range actualCharacterRange:NULL];
|
|
63
|
-
if (glyphRange.location == NSNotFound || glyphRange.length == 0)
|
|
64
|
-
return;
|
|
65
|
-
|
|
66
|
-
CGFloat referenceHeight = [self findReferenceHeightForRange:range textStorage:layoutManager.textStorage];
|
|
67
|
-
|
|
68
|
-
[layoutManager
|
|
69
|
-
enumerateLineFragmentsForGlyphRange:glyphRange
|
|
70
|
-
usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer *tc, NSRange lineRange,
|
|
71
|
-
BOOL *stop) {
|
|
72
|
-
NSRange intersect = NSIntersectionRange(lineRange, glyphRange);
|
|
73
|
-
if (intersect.length == 0)
|
|
74
|
-
return;
|
|
75
|
-
|
|
76
|
-
BOOL isFirst = (intersect.location == glyphRange.location);
|
|
77
|
-
BOOL isLast = (NSMaxRange(intersect) == NSMaxRange(glyphRange));
|
|
78
|
-
|
|
79
|
-
CGRect finalRect;
|
|
80
|
-
if (isFirst || isLast) {
|
|
81
|
-
// Precise bounds are only required for the start and end of the span
|
|
82
|
-
CGRect textRect = [layoutManager boundingRectForGlyphRange:intersect
|
|
83
|
-
inTextContainer:textContainer];
|
|
84
|
-
finalRect = CGRectMake(textRect.origin.x + origin.x, textRect.origin.y + origin.y,
|
|
85
|
-
textRect.size.width, textRect.size.height);
|
|
86
|
-
|
|
87
|
-
// For multi-line, extend the first line to the right edge of the fragment
|
|
88
|
-
if (isFirst && !isLast) {
|
|
89
|
-
finalRect.size.width =
|
|
90
|
-
(usedRect.origin.x + usedRect.size.width + origin.x) - finalRect.origin.x;
|
|
91
|
-
}
|
|
92
|
-
} else {
|
|
93
|
-
// OPTIMIZATION: Middle lines use the usedRect of the fragment directly
|
|
94
|
-
finalRect = CGRectMake(usedRect.origin.x + origin.x, usedRect.origin.y + origin.y,
|
|
95
|
-
usedRect.size.width, usedRect.size.height);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Ensure consistent height and no gaps
|
|
99
|
-
if (finalRect.size.height < referenceHeight) {
|
|
100
|
-
finalRect.size.height = referenceHeight;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
[self drawBackgroundAndBorders:finalRect
|
|
104
|
-
backgroundColor:backgroundColor
|
|
105
|
-
borderColor:borderColor
|
|
106
|
-
isFirst:isFirst
|
|
107
|
-
isLast:isLast];
|
|
108
|
-
}];
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
#pragma mark - Drawing Logic
|
|
112
|
-
|
|
113
|
-
- (void)drawBackgroundAndBorders:(CGRect)rect
|
|
114
|
-
backgroundColor:(RCTUIColor *)backgroundColor
|
|
115
|
-
borderColor:(RCTUIColor *)borderColor
|
|
116
|
-
isFirst:(BOOL)isFirst
|
|
117
|
-
isLast:(BOOL)isLast
|
|
118
|
-
{
|
|
119
|
-
UIBezierPath *path = [self pathForRect:rect isFirst:isFirst isLast:isLast];
|
|
120
|
-
[backgroundColor setFill];
|
|
121
|
-
[path fill];
|
|
122
|
-
|
|
123
|
-
if (borderColor) {
|
|
124
|
-
[borderColor setStroke];
|
|
125
|
-
UIBezierPath *strokePath =
|
|
126
|
-
(isFirst && isLast) ? path : [self openBorderPathForRect:rect isFirst:isFirst isLast:isLast];
|
|
127
|
-
strokePath.lineWidth = kCodeBackgroundBorderWidth;
|
|
128
|
-
BezierPathSetRoundStyle(strokePath);
|
|
129
|
-
[strokePath stroke];
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
- (UIBezierPath *)pathForRect:(CGRect)rect isFirst:(BOOL)isFirst isLast:(BOOL)isLast
|
|
134
|
-
{
|
|
135
|
-
#if !TARGET_OS_OSX
|
|
136
|
-
UIRectCorner corners = 0;
|
|
137
|
-
if (isFirst)
|
|
138
|
-
corners |= (UIRectCornerTopLeft | UIRectCornerBottomLeft);
|
|
139
|
-
if (isLast)
|
|
140
|
-
corners |= (UIRectCornerTopRight | UIRectCornerBottomRight);
|
|
141
|
-
|
|
142
|
-
return [UIBezierPath bezierPathWithRoundedRect:rect
|
|
143
|
-
byRoundingCorners:corners
|
|
144
|
-
cornerRadii:CGSizeMake(kCodeBackgroundCornerRadius, kCodeBackgroundCornerRadius)];
|
|
145
|
-
#else
|
|
146
|
-
// NSBezierPath doesn't support per-corner rounding — use uniform corner radius
|
|
147
|
-
CGFloat cornerRadius = (isFirst || isLast) ? kCodeBackgroundCornerRadius : 0;
|
|
148
|
-
return UIBezierPathWithRoundedRect(rect, cornerRadius);
|
|
149
|
-
#endif
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
- (UIBezierPath *)openBorderPathForRect:(CGRect)rect isFirst:(BOOL)isFirst isLast:(BOOL)isLast
|
|
153
|
-
{
|
|
154
|
-
UIBezierPath *path = [UIBezierPath bezierPath];
|
|
155
|
-
CGFloat r = kCodeBackgroundCornerRadius;
|
|
156
|
-
CGFloat inset = kCodeBackgroundBorderWidth / 2.0;
|
|
157
|
-
CGRect insetRect = CGRectInset(rect, inset, inset);
|
|
158
|
-
|
|
159
|
-
if (isFirst) {
|
|
160
|
-
[path moveToPoint:CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y)];
|
|
161
|
-
BezierPathAddLine(path, CGPointMake(insetRect.origin.x + r, insetRect.origin.y));
|
|
162
|
-
BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x, insetRect.origin.y + r),
|
|
163
|
-
CGPointMake(insetRect.origin.x, insetRect.origin.y));
|
|
164
|
-
BezierPathAddLine(path, CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect) - r));
|
|
165
|
-
BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x + r, CGRectGetMaxY(insetRect)),
|
|
166
|
-
CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect)));
|
|
167
|
-
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
|
|
168
|
-
} else if (isLast) {
|
|
169
|
-
[path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
|
|
170
|
-
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect) - r, insetRect.origin.y));
|
|
171
|
-
BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y + r),
|
|
172
|
-
CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y));
|
|
173
|
-
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect) - r));
|
|
174
|
-
BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect) - r, CGRectGetMaxY(insetRect)),
|
|
175
|
-
CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect)));
|
|
176
|
-
BezierPathAddLine(path, CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect)));
|
|
177
|
-
} else {
|
|
178
|
-
[path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
|
|
179
|
-
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y));
|
|
180
|
-
[path moveToPoint:CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect))];
|
|
181
|
-
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
|
|
182
|
-
}
|
|
183
|
-
return path;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
#pragma mark - Helpers
|
|
187
|
-
|
|
188
|
-
- (CGFloat)findReferenceHeightForRange:(NSRange)range textStorage:(NSTextStorage *)textStorage
|
|
189
|
-
{
|
|
190
|
-
if (range.location == NSNotFound || range.length == 0 || !textStorage) {
|
|
191
|
-
return [_config paragraphFontSize] * 1.2;
|
|
192
|
-
}
|
|
193
|
-
NSNumber *lineHeightValue = [textStorage attribute:@"BlockLineHeight" atIndex:range.location effectiveRange:NULL];
|
|
194
|
-
return lineHeightValue ? [lineHeightValue doubleValue] : ([_config paragraphFontSize] * 1.2);
|
|
195
|
-
}
|
|
196
|
-
|
|
1
|
+
#import "CodeBackground.h"
|
|
2
|
+
#import "ENRMUIKit.h"
|
|
3
|
+
#import "RenderContext.h"
|
|
4
|
+
|
|
5
|
+
NSString *const CodeAttributeName = @"Code";
|
|
6
|
+
|
|
7
|
+
static const CGFloat kCodeBackgroundCornerRadius = 2.0;
|
|
8
|
+
static const CGFloat kCodeBackgroundBorderWidth = 0.5;
|
|
9
|
+
|
|
10
|
+
@implementation CodeBackground {
|
|
11
|
+
StyleConfig *_config;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
- (instancetype)initWithConfig:(StyleConfig *)config
|
|
15
|
+
{
|
|
16
|
+
self = [super init];
|
|
17
|
+
if (self) {
|
|
18
|
+
_config = config;
|
|
19
|
+
}
|
|
20
|
+
return self;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
- (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
|
|
24
|
+
layoutManager:(NSLayoutManager *)layoutManager
|
|
25
|
+
textContainer:(NSTextContainer *)textContainer
|
|
26
|
+
atPoint:(CGPoint)origin
|
|
27
|
+
{
|
|
28
|
+
RCTUIColor *backgroundColor = _config.codeBackgroundColor;
|
|
29
|
+
if (!backgroundColor)
|
|
30
|
+
return;
|
|
31
|
+
|
|
32
|
+
NSTextStorage *textStorage = layoutManager.textStorage;
|
|
33
|
+
NSRange charRange = [layoutManager characterRangeForGlyphRange:glyphsToShow actualGlyphRange:NULL];
|
|
34
|
+
if (charRange.location == NSNotFound || charRange.length == 0)
|
|
35
|
+
return;
|
|
36
|
+
|
|
37
|
+
[textStorage enumerateAttribute:CodeAttributeName
|
|
38
|
+
inRange:NSMakeRange(0, textStorage.length)
|
|
39
|
+
options:0
|
|
40
|
+
usingBlock:^(id value, NSRange range, BOOL *stop) {
|
|
41
|
+
if (!value || range.length == 0)
|
|
42
|
+
return;
|
|
43
|
+
if (NSIntersectionRange(range, charRange).length == 0)
|
|
44
|
+
return;
|
|
45
|
+
|
|
46
|
+
[self drawCodeBackgroundForRange:range
|
|
47
|
+
layoutManager:layoutManager
|
|
48
|
+
textContainer:textContainer
|
|
49
|
+
atPoint:origin
|
|
50
|
+
backgroundColor:backgroundColor
|
|
51
|
+
borderColor:self->_config.codeBorderColor];
|
|
52
|
+
}];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
- (void)drawCodeBackgroundForRange:(NSRange)range
|
|
56
|
+
layoutManager:(NSLayoutManager *)layoutManager
|
|
57
|
+
textContainer:(NSTextContainer *)textContainer
|
|
58
|
+
atPoint:(CGPoint)origin
|
|
59
|
+
backgroundColor:(RCTUIColor *)backgroundColor
|
|
60
|
+
borderColor:(RCTUIColor *)borderColor
|
|
61
|
+
{
|
|
62
|
+
NSRange glyphRange = [layoutManager glyphRangeForCharacterRange:range actualCharacterRange:NULL];
|
|
63
|
+
if (glyphRange.location == NSNotFound || glyphRange.length == 0)
|
|
64
|
+
return;
|
|
65
|
+
|
|
66
|
+
CGFloat referenceHeight = [self findReferenceHeightForRange:range textStorage:layoutManager.textStorage];
|
|
67
|
+
|
|
68
|
+
[layoutManager
|
|
69
|
+
enumerateLineFragmentsForGlyphRange:glyphRange
|
|
70
|
+
usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer *tc, NSRange lineRange,
|
|
71
|
+
BOOL *stop) {
|
|
72
|
+
NSRange intersect = NSIntersectionRange(lineRange, glyphRange);
|
|
73
|
+
if (intersect.length == 0)
|
|
74
|
+
return;
|
|
75
|
+
|
|
76
|
+
BOOL isFirst = (intersect.location == glyphRange.location);
|
|
77
|
+
BOOL isLast = (NSMaxRange(intersect) == NSMaxRange(glyphRange));
|
|
78
|
+
|
|
79
|
+
CGRect finalRect;
|
|
80
|
+
if (isFirst || isLast) {
|
|
81
|
+
// Precise bounds are only required for the start and end of the span
|
|
82
|
+
CGRect textRect = [layoutManager boundingRectForGlyphRange:intersect
|
|
83
|
+
inTextContainer:textContainer];
|
|
84
|
+
finalRect = CGRectMake(textRect.origin.x + origin.x, textRect.origin.y + origin.y,
|
|
85
|
+
textRect.size.width, textRect.size.height);
|
|
86
|
+
|
|
87
|
+
// For multi-line, extend the first line to the right edge of the fragment
|
|
88
|
+
if (isFirst && !isLast) {
|
|
89
|
+
finalRect.size.width =
|
|
90
|
+
(usedRect.origin.x + usedRect.size.width + origin.x) - finalRect.origin.x;
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
// OPTIMIZATION: Middle lines use the usedRect of the fragment directly
|
|
94
|
+
finalRect = CGRectMake(usedRect.origin.x + origin.x, usedRect.origin.y + origin.y,
|
|
95
|
+
usedRect.size.width, usedRect.size.height);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Ensure consistent height and no gaps
|
|
99
|
+
if (finalRect.size.height < referenceHeight) {
|
|
100
|
+
finalRect.size.height = referenceHeight;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
[self drawBackgroundAndBorders:finalRect
|
|
104
|
+
backgroundColor:backgroundColor
|
|
105
|
+
borderColor:borderColor
|
|
106
|
+
isFirst:isFirst
|
|
107
|
+
isLast:isLast];
|
|
108
|
+
}];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
#pragma mark - Drawing Logic
|
|
112
|
+
|
|
113
|
+
- (void)drawBackgroundAndBorders:(CGRect)rect
|
|
114
|
+
backgroundColor:(RCTUIColor *)backgroundColor
|
|
115
|
+
borderColor:(RCTUIColor *)borderColor
|
|
116
|
+
isFirst:(BOOL)isFirst
|
|
117
|
+
isLast:(BOOL)isLast
|
|
118
|
+
{
|
|
119
|
+
UIBezierPath *path = [self pathForRect:rect isFirst:isFirst isLast:isLast];
|
|
120
|
+
[backgroundColor setFill];
|
|
121
|
+
[path fill];
|
|
122
|
+
|
|
123
|
+
if (borderColor) {
|
|
124
|
+
[borderColor setStroke];
|
|
125
|
+
UIBezierPath *strokePath =
|
|
126
|
+
(isFirst && isLast) ? path : [self openBorderPathForRect:rect isFirst:isFirst isLast:isLast];
|
|
127
|
+
strokePath.lineWidth = kCodeBackgroundBorderWidth;
|
|
128
|
+
BezierPathSetRoundStyle(strokePath);
|
|
129
|
+
[strokePath stroke];
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
- (UIBezierPath *)pathForRect:(CGRect)rect isFirst:(BOOL)isFirst isLast:(BOOL)isLast
|
|
134
|
+
{
|
|
135
|
+
#if !TARGET_OS_OSX
|
|
136
|
+
UIRectCorner corners = 0;
|
|
137
|
+
if (isFirst)
|
|
138
|
+
corners |= (UIRectCornerTopLeft | UIRectCornerBottomLeft);
|
|
139
|
+
if (isLast)
|
|
140
|
+
corners |= (UIRectCornerTopRight | UIRectCornerBottomRight);
|
|
141
|
+
|
|
142
|
+
return [UIBezierPath bezierPathWithRoundedRect:rect
|
|
143
|
+
byRoundingCorners:corners
|
|
144
|
+
cornerRadii:CGSizeMake(kCodeBackgroundCornerRadius, kCodeBackgroundCornerRadius)];
|
|
145
|
+
#else
|
|
146
|
+
// NSBezierPath doesn't support per-corner rounding — use uniform corner radius
|
|
147
|
+
CGFloat cornerRadius = (isFirst || isLast) ? kCodeBackgroundCornerRadius : 0;
|
|
148
|
+
return UIBezierPathWithRoundedRect(rect, cornerRadius);
|
|
149
|
+
#endif
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
- (UIBezierPath *)openBorderPathForRect:(CGRect)rect isFirst:(BOOL)isFirst isLast:(BOOL)isLast
|
|
153
|
+
{
|
|
154
|
+
UIBezierPath *path = [UIBezierPath bezierPath];
|
|
155
|
+
CGFloat r = kCodeBackgroundCornerRadius;
|
|
156
|
+
CGFloat inset = kCodeBackgroundBorderWidth / 2.0;
|
|
157
|
+
CGRect insetRect = CGRectInset(rect, inset, inset);
|
|
158
|
+
|
|
159
|
+
if (isFirst) {
|
|
160
|
+
[path moveToPoint:CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y)];
|
|
161
|
+
BezierPathAddLine(path, CGPointMake(insetRect.origin.x + r, insetRect.origin.y));
|
|
162
|
+
BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x, insetRect.origin.y + r),
|
|
163
|
+
CGPointMake(insetRect.origin.x, insetRect.origin.y));
|
|
164
|
+
BezierPathAddLine(path, CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect) - r));
|
|
165
|
+
BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x + r, CGRectGetMaxY(insetRect)),
|
|
166
|
+
CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect)));
|
|
167
|
+
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
|
|
168
|
+
} else if (isLast) {
|
|
169
|
+
[path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
|
|
170
|
+
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect) - r, insetRect.origin.y));
|
|
171
|
+
BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y + r),
|
|
172
|
+
CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y));
|
|
173
|
+
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect) - r));
|
|
174
|
+
BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect) - r, CGRectGetMaxY(insetRect)),
|
|
175
|
+
CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect)));
|
|
176
|
+
BezierPathAddLine(path, CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect)));
|
|
177
|
+
} else {
|
|
178
|
+
[path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
|
|
179
|
+
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y));
|
|
180
|
+
[path moveToPoint:CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect))];
|
|
181
|
+
BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
|
|
182
|
+
}
|
|
183
|
+
return path;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
#pragma mark - Helpers
|
|
187
|
+
|
|
188
|
+
- (CGFloat)findReferenceHeightForRange:(NSRange)range textStorage:(NSTextStorage *)textStorage
|
|
189
|
+
{
|
|
190
|
+
if (range.location == NSNotFound || range.length == 0 || !textStorage) {
|
|
191
|
+
return [_config paragraphFontSize] * 1.2;
|
|
192
|
+
}
|
|
193
|
+
NSNumber *lineHeightValue = [textStorage attribute:@"BlockLineHeight" atIndex:range.location effectiveRange:NULL];
|
|
194
|
+
return lineHeightValue ? [lineHeightValue doubleValue] : ([_config paragraphFontSize] * 1.2);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
197
|
@end
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
#import "ENRMUIKit.h"
|
|
3
|
-
#import "StyleConfig.h"
|
|
4
|
-
|
|
5
|
-
NS_ASSUME_NONNULL_BEGIN
|
|
6
|
-
|
|
7
|
-
@interface CodeBlockBackground : NSObject
|
|
8
|
-
|
|
9
|
-
- (instancetype)initWithConfig:(StyleConfig *)config;
|
|
10
|
-
- (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
|
|
11
|
-
layoutManager:(NSLayoutManager *)layoutManager
|
|
12
|
-
textContainer:(NSTextContainer *)textContainer
|
|
13
|
-
atPoint:(CGPoint)origin;
|
|
14
|
-
|
|
15
|
-
@end
|
|
16
|
-
|
|
17
|
-
NS_ASSUME_NONNULL_END
|
|
1
|
+
#pragma once
|
|
2
|
+
#import "ENRMUIKit.h"
|
|
3
|
+
#import "StyleConfig.h"
|
|
4
|
+
|
|
5
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
6
|
+
|
|
7
|
+
@interface CodeBlockBackground : NSObject
|
|
8
|
+
|
|
9
|
+
- (instancetype)initWithConfig:(StyleConfig *)config;
|
|
10
|
+
- (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
|
|
11
|
+
layoutManager:(NSLayoutManager *)layoutManager
|
|
12
|
+
textContainer:(NSTextContainer *)textContainer
|
|
13
|
+
atPoint:(CGPoint)origin;
|
|
14
|
+
|
|
15
|
+
@end
|
|
16
|
+
|
|
17
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -1,103 +1,103 @@
|
|
|
1
|
-
#import "CodeBlockBackground.h"
|
|
2
|
-
#import "ENRMUIKit.h"
|
|
3
|
-
#import "LastElementUtils.h"
|
|
4
|
-
#import "StyleConfig.h"
|
|
5
|
-
|
|
6
|
-
// Draws the commonmark-flavor code block box behind the text view's glyph
|
|
7
|
-
// runs. The visual conventions (half-stroke border inset, corner radius
|
|
8
|
-
// handling) must stay in sync with the whole-rect box the github flavor
|
|
9
|
-
// draws in ENRMCodeBlockContainerView's drawRect:.
|
|
10
|
-
|
|
11
|
-
@implementation CodeBlockBackground {
|
|
12
|
-
StyleConfig *_config;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
- (instancetype)initWithConfig:(StyleConfig *)config
|
|
16
|
-
{
|
|
17
|
-
if (self = [super init]) {
|
|
18
|
-
_config = config;
|
|
19
|
-
}
|
|
20
|
-
return self;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
- (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
|
|
24
|
-
layoutManager:(NSLayoutManager *)layoutManager
|
|
25
|
-
textContainer:(NSTextContainer *)textContainer
|
|
26
|
-
atPoint:(CGPoint)origin
|
|
27
|
-
{
|
|
28
|
-
NSTextStorage *textStorage = layoutManager.textStorage;
|
|
29
|
-
NSRange charRange = [layoutManager characterRangeForGlyphRange:glyphsToShow actualGlyphRange:NULL];
|
|
30
|
-
|
|
31
|
-
// Enumerate over the full storage range so each code block's full rect is drawn.
|
|
32
|
-
// Restricting to charRange causes partial rects per draw pass, which produces
|
|
33
|
-
// multiple stacked oval shapes when border radius is large.
|
|
34
|
-
// The graphics context clip ensures only the visible portion is painted.
|
|
35
|
-
[textStorage enumerateAttribute:CodeBlockAttributeName
|
|
36
|
-
inRange:NSMakeRange(0, textStorage.length)
|
|
37
|
-
options:0
|
|
38
|
-
usingBlock:^(id value, NSRange range, BOOL *stop) {
|
|
39
|
-
if (!value)
|
|
40
|
-
return;
|
|
41
|
-
if (NSIntersectionRange(range, charRange).length == 0)
|
|
42
|
-
return;
|
|
43
|
-
[self drawCodeBlockBackgroundForRange:range
|
|
44
|
-
layoutManager:layoutManager
|
|
45
|
-
textContainer:textContainer
|
|
46
|
-
atPoint:origin];
|
|
47
|
-
}];
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
- (void)drawCodeBlockBackgroundForRange:(NSRange)range
|
|
51
|
-
layoutManager:(NSLayoutManager *)layoutManager
|
|
52
|
-
textContainer:(NSTextContainer *)textContainer
|
|
53
|
-
atPoint:(CGPoint)origin
|
|
54
|
-
{
|
|
55
|
-
NSRange glyphRange = [layoutManager glyphRangeForCharacterRange:range actualCharacterRange:NULL];
|
|
56
|
-
CGRect blockRect = [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer];
|
|
57
|
-
|
|
58
|
-
if (CGRectIsEmpty(blockRect))
|
|
59
|
-
return;
|
|
60
|
-
|
|
61
|
-
NSNumber *indentAttr = [layoutManager.textStorage attribute:CodeBlockIndentAttributeName
|
|
62
|
-
atIndex:range.location
|
|
63
|
-
effectiveRange:NULL];
|
|
64
|
-
CGFloat indent = [indentAttr doubleValue];
|
|
65
|
-
|
|
66
|
-
CGFloat availableWidth = textContainer.size.width - indent;
|
|
67
|
-
if (availableWidth <= 0)
|
|
68
|
-
return;
|
|
69
|
-
|
|
70
|
-
blockRect.origin.x = origin.x + indent;
|
|
71
|
-
blockRect.origin.y += origin.y;
|
|
72
|
-
blockRect.size.width = availableWidth;
|
|
73
|
-
|
|
74
|
-
// We extend the background specifically to cover the bottom padding spacer,
|
|
75
|
-
// excluding any additional marginBottom applied via measurement.
|
|
76
|
-
BOOL isLastCodeBlock = (NSMaxRange(range) == layoutManager.textStorage.length);
|
|
77
|
-
if (isLastCodeBlock) {
|
|
78
|
-
blockRect.size.height += [_config codeBlockPadding];
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
CGFloat borderWidth = [_config codeBlockBorderWidth];
|
|
82
|
-
CGFloat borderRadius = [_config codeBlockBorderRadius];
|
|
83
|
-
CGFloat inset = borderWidth / 2.0;
|
|
84
|
-
|
|
85
|
-
CGRect insetRect = CGRectInset(blockRect, inset, inset);
|
|
86
|
-
UIBezierPath *path = UIBezierPathWithRoundedRect(insetRect, MAX(0, borderRadius - inset));
|
|
87
|
-
|
|
88
|
-
CGContextRef ctx = UIGraphicsGetCurrentContext();
|
|
89
|
-
CGContextSaveGState(ctx);
|
|
90
|
-
{
|
|
91
|
-
[[_config codeBlockBackgroundColor] setFill];
|
|
92
|
-
[path fill];
|
|
93
|
-
|
|
94
|
-
if (borderWidth > 0) {
|
|
95
|
-
[[_config codeBlockBorderColor] setStroke];
|
|
96
|
-
path.lineWidth = borderWidth;
|
|
97
|
-
BezierPathSetRoundStyle(path);
|
|
98
|
-
[path stroke];
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
CGContextRestoreGState(ctx);
|
|
102
|
-
}
|
|
1
|
+
#import "CodeBlockBackground.h"
|
|
2
|
+
#import "ENRMUIKit.h"
|
|
3
|
+
#import "LastElementUtils.h"
|
|
4
|
+
#import "StyleConfig.h"
|
|
5
|
+
|
|
6
|
+
// Draws the commonmark-flavor code block box behind the text view's glyph
|
|
7
|
+
// runs. The visual conventions (half-stroke border inset, corner radius
|
|
8
|
+
// handling) must stay in sync with the whole-rect box the github flavor
|
|
9
|
+
// draws in ENRMCodeBlockContainerView's drawRect:.
|
|
10
|
+
|
|
11
|
+
@implementation CodeBlockBackground {
|
|
12
|
+
StyleConfig *_config;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
- (instancetype)initWithConfig:(StyleConfig *)config
|
|
16
|
+
{
|
|
17
|
+
if (self = [super init]) {
|
|
18
|
+
_config = config;
|
|
19
|
+
}
|
|
20
|
+
return self;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
- (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
|
|
24
|
+
layoutManager:(NSLayoutManager *)layoutManager
|
|
25
|
+
textContainer:(NSTextContainer *)textContainer
|
|
26
|
+
atPoint:(CGPoint)origin
|
|
27
|
+
{
|
|
28
|
+
NSTextStorage *textStorage = layoutManager.textStorage;
|
|
29
|
+
NSRange charRange = [layoutManager characterRangeForGlyphRange:glyphsToShow actualGlyphRange:NULL];
|
|
30
|
+
|
|
31
|
+
// Enumerate over the full storage range so each code block's full rect is drawn.
|
|
32
|
+
// Restricting to charRange causes partial rects per draw pass, which produces
|
|
33
|
+
// multiple stacked oval shapes when border radius is large.
|
|
34
|
+
// The graphics context clip ensures only the visible portion is painted.
|
|
35
|
+
[textStorage enumerateAttribute:CodeBlockAttributeName
|
|
36
|
+
inRange:NSMakeRange(0, textStorage.length)
|
|
37
|
+
options:0
|
|
38
|
+
usingBlock:^(id value, NSRange range, BOOL *stop) {
|
|
39
|
+
if (!value)
|
|
40
|
+
return;
|
|
41
|
+
if (NSIntersectionRange(range, charRange).length == 0)
|
|
42
|
+
return;
|
|
43
|
+
[self drawCodeBlockBackgroundForRange:range
|
|
44
|
+
layoutManager:layoutManager
|
|
45
|
+
textContainer:textContainer
|
|
46
|
+
atPoint:origin];
|
|
47
|
+
}];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
- (void)drawCodeBlockBackgroundForRange:(NSRange)range
|
|
51
|
+
layoutManager:(NSLayoutManager *)layoutManager
|
|
52
|
+
textContainer:(NSTextContainer *)textContainer
|
|
53
|
+
atPoint:(CGPoint)origin
|
|
54
|
+
{
|
|
55
|
+
NSRange glyphRange = [layoutManager glyphRangeForCharacterRange:range actualCharacterRange:NULL];
|
|
56
|
+
CGRect blockRect = [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer];
|
|
57
|
+
|
|
58
|
+
if (CGRectIsEmpty(blockRect))
|
|
59
|
+
return;
|
|
60
|
+
|
|
61
|
+
NSNumber *indentAttr = [layoutManager.textStorage attribute:CodeBlockIndentAttributeName
|
|
62
|
+
atIndex:range.location
|
|
63
|
+
effectiveRange:NULL];
|
|
64
|
+
CGFloat indent = [indentAttr doubleValue];
|
|
65
|
+
|
|
66
|
+
CGFloat availableWidth = textContainer.size.width - indent;
|
|
67
|
+
if (availableWidth <= 0)
|
|
68
|
+
return;
|
|
69
|
+
|
|
70
|
+
blockRect.origin.x = origin.x + indent;
|
|
71
|
+
blockRect.origin.y += origin.y;
|
|
72
|
+
blockRect.size.width = availableWidth;
|
|
73
|
+
|
|
74
|
+
// We extend the background specifically to cover the bottom padding spacer,
|
|
75
|
+
// excluding any additional marginBottom applied via measurement.
|
|
76
|
+
BOOL isLastCodeBlock = (NSMaxRange(range) == layoutManager.textStorage.length);
|
|
77
|
+
if (isLastCodeBlock) {
|
|
78
|
+
blockRect.size.height += [_config codeBlockPadding];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
CGFloat borderWidth = [_config codeBlockBorderWidth];
|
|
82
|
+
CGFloat borderRadius = [_config codeBlockBorderRadius];
|
|
83
|
+
CGFloat inset = borderWidth / 2.0;
|
|
84
|
+
|
|
85
|
+
CGRect insetRect = CGRectInset(blockRect, inset, inset);
|
|
86
|
+
UIBezierPath *path = UIBezierPathWithRoundedRect(insetRect, MAX(0, borderRadius - inset));
|
|
87
|
+
|
|
88
|
+
CGContextRef ctx = UIGraphicsGetCurrentContext();
|
|
89
|
+
CGContextSaveGState(ctx);
|
|
90
|
+
{
|
|
91
|
+
[[_config codeBlockBackgroundColor] setFill];
|
|
92
|
+
[path fill];
|
|
93
|
+
|
|
94
|
+
if (borderWidth > 0) {
|
|
95
|
+
[[_config codeBlockBorderColor] setStroke];
|
|
96
|
+
path.lineWidth = borderWidth;
|
|
97
|
+
BezierPathSetRoundStyle(path);
|
|
98
|
+
[path stroke];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
CGContextRestoreGState(ctx);
|
|
102
|
+
}
|
|
103
103
|
@end
|