@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,118 +1,118 @@
|
|
|
1
|
-
#import "ENRMLinkPillText.h"
|
|
2
|
-
#import "ENRMLinkPillAttachment.h"
|
|
3
|
-
|
|
4
|
-
#if !TARGET_OS_OSX
|
|
5
|
-
|
|
6
|
-
/// Inline parents (strong, emphasis) restyle the placeholder's font after the pill was created; carry that over.
|
|
7
|
-
static UIFont *ENRMFontAddingTraits(UIFont *font, UIFontDescriptorSymbolicTraits traits)
|
|
8
|
-
{
|
|
9
|
-
UIFontDescriptorSymbolicTraits current = font.fontDescriptor.symbolicTraits;
|
|
10
|
-
if ((current & traits) == traits)
|
|
11
|
-
return font;
|
|
12
|
-
UIFontDescriptor *descriptor = [font.fontDescriptor fontDescriptorWithSymbolicTraits:current | traits];
|
|
13
|
-
return descriptor ? [UIFont fontWithDescriptor:descriptor size:font.pointSize] : font;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
static NSAttributedString *ENRMExpandedLinkPill(ENRMLinkPillAttachment *pill, NSDictionary *placeholderAttributes)
|
|
17
|
-
{
|
|
18
|
-
NSMutableAttributedString *expanded = [pill.originalText mutableCopy];
|
|
19
|
-
NSRange all = NSMakeRange(0, expanded.length);
|
|
20
|
-
// The placeholder started with the font of the link's first character, so only traits it has
|
|
21
|
-
// gained since come from an enclosing parent.
|
|
22
|
-
UIFont *placeholderFont = placeholderAttributes[NSFontAttributeName];
|
|
23
|
-
UIFont *firstFont = all.length > 0 ? [expanded attribute:NSFontAttributeName atIndex:0 effectiveRange:NULL] : nil;
|
|
24
|
-
UIFontDescriptorSymbolicTraits inherited = placeholderFont.fontDescriptor.symbolicTraits &
|
|
25
|
-
~firstFont.fontDescriptor.symbolicTraits &
|
|
26
|
-
(UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic);
|
|
27
|
-
[placeholderAttributes enumerateKeysAndObjectsUsingBlock:^(NSAttributedStringKey key, id value, BOOL *stop) {
|
|
28
|
-
if ([key isEqualToString:NSAttachmentAttributeName])
|
|
29
|
-
return;
|
|
30
|
-
BOOL isFont = [key isEqualToString:NSFontAttributeName];
|
|
31
|
-
[pill.originalText enumerateAttribute:key
|
|
32
|
-
inRange:all
|
|
33
|
-
options:0
|
|
34
|
-
usingBlock:^(id existing, NSRange range, BOOL *innerStop) {
|
|
35
|
-
if (!existing) {
|
|
36
|
-
[expanded addAttribute:key value:value range:range];
|
|
37
|
-
} else if (isFont && inherited != 0) {
|
|
38
|
-
[expanded addAttribute:key
|
|
39
|
-
value:ENRMFontAddingTraits(existing, inherited)
|
|
40
|
-
range:range];
|
|
41
|
-
}
|
|
42
|
-
}];
|
|
43
|
-
}];
|
|
44
|
-
return expanded;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
#endif
|
|
48
|
-
|
|
49
|
-
void ENRMLinkPillsAdoptPlaceholderFonts(NSAttributedString *text)
|
|
50
|
-
{
|
|
51
|
-
#if !TARGET_OS_OSX
|
|
52
|
-
[text enumerateAttribute:NSAttachmentAttributeName
|
|
53
|
-
inRange:NSMakeRange(0, text.length)
|
|
54
|
-
options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
|
|
55
|
-
usingBlock:^(id value, NSRange range, BOOL *stop) {
|
|
56
|
-
if ([value isKindOfClass:ENRMLinkPillAttachment.class])
|
|
57
|
-
[(ENRMLinkPillAttachment *)value adoptFont:[text attribute:NSFontAttributeName
|
|
58
|
-
atIndex:range.location
|
|
59
|
-
effectiveRange:NULL]];
|
|
60
|
-
}];
|
|
61
|
-
#endif
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
NSAttributedString *ENRMAttributedStringByExpandingLinkPills(NSAttributedString *text, NSRange *ioRange)
|
|
65
|
-
{
|
|
66
|
-
#if TARGET_OS_OSX
|
|
67
|
-
return text;
|
|
68
|
-
#else
|
|
69
|
-
if (text.length == 0)
|
|
70
|
-
return text;
|
|
71
|
-
NSMutableArray<NSValue *> *ranges = nil;
|
|
72
|
-
NSMutableArray<ENRMLinkPillAttachment *> *pills = nil;
|
|
73
|
-
NSRange all = NSMakeRange(0, text.length);
|
|
74
|
-
NSRange cursor = NSMakeRange(0, 0);
|
|
75
|
-
while (NSMaxRange(cursor) < text.length) {
|
|
76
|
-
id value = [text attribute:NSAttachmentAttributeName
|
|
77
|
-
atIndex:NSMaxRange(cursor)
|
|
78
|
-
longestEffectiveRange:&cursor
|
|
79
|
-
inRange:all];
|
|
80
|
-
if (![value isKindOfClass:ENRMLinkPillAttachment.class])
|
|
81
|
-
continue;
|
|
82
|
-
if (!pills) {
|
|
83
|
-
ranges = [NSMutableArray new];
|
|
84
|
-
pills = [NSMutableArray new];
|
|
85
|
-
}
|
|
86
|
-
[ranges addObject:[NSValue valueWithRange:cursor]];
|
|
87
|
-
[pills addObject:value];
|
|
88
|
-
}
|
|
89
|
-
if (!pills)
|
|
90
|
-
return text;
|
|
91
|
-
|
|
92
|
-
NSMutableAttributedString *result = [text mutableCopy];
|
|
93
|
-
NSRange range = ioRange ? *ioRange : NSMakeRange(0, 0);
|
|
94
|
-
NSInteger locationDelta = 0;
|
|
95
|
-
NSInteger lengthDelta = 0;
|
|
96
|
-
// Back to front, so earlier ranges stay valid while the string grows.
|
|
97
|
-
for (NSInteger i = (NSInteger)pills.count - 1; i >= 0; i--) {
|
|
98
|
-
NSRange placeholder = ranges[i].rangeValue;
|
|
99
|
-
NSAttributedString *expanded = ENRMExpandedLinkPill(pills[i], [text attributesAtIndex:placeholder.location
|
|
100
|
-
effectiveRange:NULL]);
|
|
101
|
-
[result replaceCharactersInRange:placeholder withAttributedString:expanded];
|
|
102
|
-
NSInteger growth = (NSInteger)expanded.length - (NSInteger)placeholder.length;
|
|
103
|
-
if (NSMaxRange(placeholder) <= range.location) {
|
|
104
|
-
locationDelta += growth;
|
|
105
|
-
} else if (placeholder.location < NSMaxRange(range)) {
|
|
106
|
-
lengthDelta += growth;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
if (ioRange)
|
|
110
|
-
*ioRange = NSMakeRange(range.location + locationDelta, range.length + lengthDelta);
|
|
111
|
-
return result;
|
|
112
|
-
#endif
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
NSString *ENRMStringByExpandingLinkPills(NSAttributedString *text)
|
|
116
|
-
{
|
|
117
|
-
return ENRMAttributedStringByExpandingLinkPills(text, NULL).string;
|
|
118
|
-
}
|
|
1
|
+
#import "ENRMLinkPillText.h"
|
|
2
|
+
#import "ENRMLinkPillAttachment.h"
|
|
3
|
+
|
|
4
|
+
#if !TARGET_OS_OSX
|
|
5
|
+
|
|
6
|
+
/// Inline parents (strong, emphasis) restyle the placeholder's font after the pill was created; carry that over.
|
|
7
|
+
static UIFont *ENRMFontAddingTraits(UIFont *font, UIFontDescriptorSymbolicTraits traits)
|
|
8
|
+
{
|
|
9
|
+
UIFontDescriptorSymbolicTraits current = font.fontDescriptor.symbolicTraits;
|
|
10
|
+
if ((current & traits) == traits)
|
|
11
|
+
return font;
|
|
12
|
+
UIFontDescriptor *descriptor = [font.fontDescriptor fontDescriptorWithSymbolicTraits:current | traits];
|
|
13
|
+
return descriptor ? [UIFont fontWithDescriptor:descriptor size:font.pointSize] : font;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
static NSAttributedString *ENRMExpandedLinkPill(ENRMLinkPillAttachment *pill, NSDictionary *placeholderAttributes)
|
|
17
|
+
{
|
|
18
|
+
NSMutableAttributedString *expanded = [pill.originalText mutableCopy];
|
|
19
|
+
NSRange all = NSMakeRange(0, expanded.length);
|
|
20
|
+
// The placeholder started with the font of the link's first character, so only traits it has
|
|
21
|
+
// gained since come from an enclosing parent.
|
|
22
|
+
UIFont *placeholderFont = placeholderAttributes[NSFontAttributeName];
|
|
23
|
+
UIFont *firstFont = all.length > 0 ? [expanded attribute:NSFontAttributeName atIndex:0 effectiveRange:NULL] : nil;
|
|
24
|
+
UIFontDescriptorSymbolicTraits inherited = placeholderFont.fontDescriptor.symbolicTraits &
|
|
25
|
+
~firstFont.fontDescriptor.symbolicTraits &
|
|
26
|
+
(UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic);
|
|
27
|
+
[placeholderAttributes enumerateKeysAndObjectsUsingBlock:^(NSAttributedStringKey key, id value, BOOL *stop) {
|
|
28
|
+
if ([key isEqualToString:NSAttachmentAttributeName])
|
|
29
|
+
return;
|
|
30
|
+
BOOL isFont = [key isEqualToString:NSFontAttributeName];
|
|
31
|
+
[pill.originalText enumerateAttribute:key
|
|
32
|
+
inRange:all
|
|
33
|
+
options:0
|
|
34
|
+
usingBlock:^(id existing, NSRange range, BOOL *innerStop) {
|
|
35
|
+
if (!existing) {
|
|
36
|
+
[expanded addAttribute:key value:value range:range];
|
|
37
|
+
} else if (isFont && inherited != 0) {
|
|
38
|
+
[expanded addAttribute:key
|
|
39
|
+
value:ENRMFontAddingTraits(existing, inherited)
|
|
40
|
+
range:range];
|
|
41
|
+
}
|
|
42
|
+
}];
|
|
43
|
+
}];
|
|
44
|
+
return expanded;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#endif
|
|
48
|
+
|
|
49
|
+
void ENRMLinkPillsAdoptPlaceholderFonts(NSAttributedString *text)
|
|
50
|
+
{
|
|
51
|
+
#if !TARGET_OS_OSX
|
|
52
|
+
[text enumerateAttribute:NSAttachmentAttributeName
|
|
53
|
+
inRange:NSMakeRange(0, text.length)
|
|
54
|
+
options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
|
|
55
|
+
usingBlock:^(id value, NSRange range, BOOL *stop) {
|
|
56
|
+
if ([value isKindOfClass:ENRMLinkPillAttachment.class])
|
|
57
|
+
[(ENRMLinkPillAttachment *)value adoptFont:[text attribute:NSFontAttributeName
|
|
58
|
+
atIndex:range.location
|
|
59
|
+
effectiveRange:NULL]];
|
|
60
|
+
}];
|
|
61
|
+
#endif
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
NSAttributedString *ENRMAttributedStringByExpandingLinkPills(NSAttributedString *text, NSRange *ioRange)
|
|
65
|
+
{
|
|
66
|
+
#if TARGET_OS_OSX
|
|
67
|
+
return text;
|
|
68
|
+
#else
|
|
69
|
+
if (text.length == 0)
|
|
70
|
+
return text;
|
|
71
|
+
NSMutableArray<NSValue *> *ranges = nil;
|
|
72
|
+
NSMutableArray<ENRMLinkPillAttachment *> *pills = nil;
|
|
73
|
+
NSRange all = NSMakeRange(0, text.length);
|
|
74
|
+
NSRange cursor = NSMakeRange(0, 0);
|
|
75
|
+
while (NSMaxRange(cursor) < text.length) {
|
|
76
|
+
id value = [text attribute:NSAttachmentAttributeName
|
|
77
|
+
atIndex:NSMaxRange(cursor)
|
|
78
|
+
longestEffectiveRange:&cursor
|
|
79
|
+
inRange:all];
|
|
80
|
+
if (![value isKindOfClass:ENRMLinkPillAttachment.class])
|
|
81
|
+
continue;
|
|
82
|
+
if (!pills) {
|
|
83
|
+
ranges = [NSMutableArray new];
|
|
84
|
+
pills = [NSMutableArray new];
|
|
85
|
+
}
|
|
86
|
+
[ranges addObject:[NSValue valueWithRange:cursor]];
|
|
87
|
+
[pills addObject:value];
|
|
88
|
+
}
|
|
89
|
+
if (!pills)
|
|
90
|
+
return text;
|
|
91
|
+
|
|
92
|
+
NSMutableAttributedString *result = [text mutableCopy];
|
|
93
|
+
NSRange range = ioRange ? *ioRange : NSMakeRange(0, 0);
|
|
94
|
+
NSInteger locationDelta = 0;
|
|
95
|
+
NSInteger lengthDelta = 0;
|
|
96
|
+
// Back to front, so earlier ranges stay valid while the string grows.
|
|
97
|
+
for (NSInteger i = (NSInteger)pills.count - 1; i >= 0; i--) {
|
|
98
|
+
NSRange placeholder = ranges[i].rangeValue;
|
|
99
|
+
NSAttributedString *expanded = ENRMExpandedLinkPill(pills[i], [text attributesAtIndex:placeholder.location
|
|
100
|
+
effectiveRange:NULL]);
|
|
101
|
+
[result replaceCharactersInRange:placeholder withAttributedString:expanded];
|
|
102
|
+
NSInteger growth = (NSInteger)expanded.length - (NSInteger)placeholder.length;
|
|
103
|
+
if (NSMaxRange(placeholder) <= range.location) {
|
|
104
|
+
locationDelta += growth;
|
|
105
|
+
} else if (placeholder.location < NSMaxRange(range)) {
|
|
106
|
+
lengthDelta += growth;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (ioRange)
|
|
110
|
+
*ioRange = NSMakeRange(range.location + locationDelta, range.length + lengthDelta);
|
|
111
|
+
return result;
|
|
112
|
+
#endif
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
NSString *ENRMStringByExpandingLinkPills(NSAttributedString *text)
|
|
116
|
+
{
|
|
117
|
+
return ENRMAttributedStringByExpandingLinkPills(text, NULL).string;
|
|
118
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
#import <UIKit/UIKit.h>
|
|
2
|
-
|
|
3
|
-
// Math is not rendered. This empty attachment exists so copied measurement
|
|
4
|
-
// code that type-checks attachments still compiles.
|
|
5
|
-
@interface ENRMMathInlineAttachment : NSTextAttachment
|
|
6
|
-
@property (nonatomic, assign) CGFloat boxHeight;
|
|
7
|
-
@end
|
|
1
|
+
#import <UIKit/UIKit.h>
|
|
2
|
+
|
|
3
|
+
// Math is not rendered. This empty attachment exists so copied measurement
|
|
4
|
+
// code that type-checks attachments still compiles.
|
|
5
|
+
@interface ENRMMathInlineAttachment : NSTextAttachment
|
|
6
|
+
@property (nonatomic, assign) CGFloat boxHeight;
|
|
7
|
+
@end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#import "ENRMMathInlineAttachment.h"
|
|
2
|
-
|
|
3
|
-
@implementation ENRMMathInlineAttachment
|
|
4
|
-
@end
|
|
1
|
+
#import "ENRMMathInlineAttachment.h"
|
|
2
|
+
|
|
3
|
+
@implementation ENRMMathInlineAttachment
|
|
4
|
+
@end
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
#import "ENRMUIKit.h"
|
|
3
|
-
|
|
4
|
-
NS_ASSUME_NONNULL_BEGIN
|
|
5
|
-
|
|
6
|
-
@interface ThematicBreakAttachment : NSTextAttachment
|
|
7
|
-
|
|
8
|
-
@property (nonatomic, strong) RCTUIColor *lineColor;
|
|
9
|
-
@property (nonatomic, assign) CGFloat lineHeight;
|
|
10
|
-
@property (nonatomic, assign) CGFloat marginTop;
|
|
11
|
-
@property (nonatomic, assign) CGFloat marginBottom;
|
|
12
|
-
|
|
13
|
-
@end
|
|
14
|
-
|
|
15
|
-
NS_ASSUME_NONNULL_END
|
|
1
|
+
#pragma once
|
|
2
|
+
#import "ENRMUIKit.h"
|
|
3
|
+
|
|
4
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
5
|
+
|
|
6
|
+
@interface ThematicBreakAttachment : NSTextAttachment
|
|
7
|
+
|
|
8
|
+
@property (nonatomic, strong) RCTUIColor *lineColor;
|
|
9
|
+
@property (nonatomic, assign) CGFloat lineHeight;
|
|
10
|
+
@property (nonatomic, assign) CGFloat marginTop;
|
|
11
|
+
@property (nonatomic, assign) CGFloat marginBottom;
|
|
12
|
+
|
|
13
|
+
@end
|
|
14
|
+
|
|
15
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
#import "ThematicBreakAttachment.h"
|
|
2
|
-
|
|
3
|
-
@implementation ThematicBreakAttachment
|
|
4
|
-
|
|
5
|
-
- (CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer
|
|
6
|
-
proposedLineFragment:(CGRect)lineFrag
|
|
7
|
-
glyphPosition:(CGPoint)position
|
|
8
|
-
characterIndex:(NSUInteger)charIndex
|
|
9
|
-
{
|
|
10
|
-
CGFloat totalHeight = self.marginTop + self.lineHeight + self.marginBottom;
|
|
11
|
-
return CGRectMake(0, 0, CGRectGetWidth(lineFrag), totalHeight);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
- (RCTUIImage *)imageForBounds:(CGRect)imageBounds
|
|
15
|
-
textContainer:(NSTextContainer *)textContainer
|
|
16
|
-
characterIndex:(NSUInteger)charIndex
|
|
17
|
-
{
|
|
18
|
-
RCTUIGraphicsImageRenderer *renderer = [[RCTUIGraphicsImageRenderer alloc] initWithSize:imageBounds.size];
|
|
19
|
-
|
|
20
|
-
return [renderer imageWithActions:^(RCTUIGraphicsImageRendererContext *_Nonnull rendererContext) {
|
|
21
|
-
CGContextRef ctx = rendererContext.CGContext;
|
|
22
|
-
|
|
23
|
-
CGFloat lineY = self.marginTop + (self.lineHeight / 2.0);
|
|
24
|
-
|
|
25
|
-
[self.lineColor setStroke];
|
|
26
|
-
CGContextSetLineWidth(ctx, self.lineHeight);
|
|
27
|
-
CGContextMoveToPoint(ctx, 0, lineY);
|
|
28
|
-
CGContextAddLineToPoint(ctx, imageBounds.size.width, lineY);
|
|
29
|
-
CGContextStrokePath(ctx);
|
|
30
|
-
}];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
@end
|
|
1
|
+
#import "ThematicBreakAttachment.h"
|
|
2
|
+
|
|
3
|
+
@implementation ThematicBreakAttachment
|
|
4
|
+
|
|
5
|
+
- (CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer
|
|
6
|
+
proposedLineFragment:(CGRect)lineFrag
|
|
7
|
+
glyphPosition:(CGPoint)position
|
|
8
|
+
characterIndex:(NSUInteger)charIndex
|
|
9
|
+
{
|
|
10
|
+
CGFloat totalHeight = self.marginTop + self.lineHeight + self.marginBottom;
|
|
11
|
+
return CGRectMake(0, 0, CGRectGetWidth(lineFrag), totalHeight);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
- (RCTUIImage *)imageForBounds:(CGRect)imageBounds
|
|
15
|
+
textContainer:(NSTextContainer *)textContainer
|
|
16
|
+
characterIndex:(NSUInteger)charIndex
|
|
17
|
+
{
|
|
18
|
+
RCTUIGraphicsImageRenderer *renderer = [[RCTUIGraphicsImageRenderer alloc] initWithSize:imageBounds.size];
|
|
19
|
+
|
|
20
|
+
return [renderer imageWithActions:^(RCTUIGraphicsImageRendererContext *_Nonnull rendererContext) {
|
|
21
|
+
CGContextRef ctx = rendererContext.CGContext;
|
|
22
|
+
|
|
23
|
+
CGFloat lineY = self.marginTop + (self.lineHeight / 2.0);
|
|
24
|
+
|
|
25
|
+
[self.lineColor setStroke];
|
|
26
|
+
CGContextSetLineWidth(ctx, self.lineHeight);
|
|
27
|
+
CGContextMoveToPoint(ctx, 0, lineY);
|
|
28
|
+
CGContextAddLineToPoint(ctx, imageBounds.size.width, lineY);
|
|
29
|
+
CGContextStrokePath(ctx);
|
|
30
|
+
}];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@end
|