@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,239 +1,239 @@
|
|
|
1
|
-
#import "ListMarkerDrawer.h"
|
|
2
|
-
#import "ENRMUIKit.h"
|
|
3
|
-
#import "ListItemRenderer.h"
|
|
4
|
-
#import "ParagraphStyleUtils.h"
|
|
5
|
-
#import "RenderContext.h"
|
|
6
|
-
#import "StyleConfig.h"
|
|
7
|
-
|
|
8
|
-
extern NSString *const ListItemMarkerStartAttribute;
|
|
9
|
-
|
|
10
|
-
static NSString *const kAppleColorEmojiFontName = @"AppleColorEmoji";
|
|
11
|
-
|
|
12
|
-
@implementation ListMarkerDrawer {
|
|
13
|
-
StyleConfig *_config;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
- (instancetype)initWithConfig:(StyleConfig *)config
|
|
17
|
-
{
|
|
18
|
-
if (self = [super init]) {
|
|
19
|
-
_config = config;
|
|
20
|
-
}
|
|
21
|
-
return self;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
- (void)drawMarkersForGlyphRange:(NSRange)glyphsToShow
|
|
25
|
-
layoutManager:(NSLayoutManager *)layoutManager
|
|
26
|
-
textContainer:(NSTextContainer *)textContainer
|
|
27
|
-
atPoint:(CGPoint)origin
|
|
28
|
-
{
|
|
29
|
-
NSTextStorage *storage = layoutManager.textStorage;
|
|
30
|
-
if (!storage || storage.length == 0)
|
|
31
|
-
return;
|
|
32
|
-
|
|
33
|
-
CGFloat gap = [_config effectiveListGapWidth];
|
|
34
|
-
NSMutableSet *drawnParagraphs = [NSMutableSet set];
|
|
35
|
-
|
|
36
|
-
[layoutManager
|
|
37
|
-
enumerateLineFragmentsForGlyphRange:glyphsToShow
|
|
38
|
-
usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer *container,
|
|
39
|
-
NSRange glyphRange, BOOL *stop) {
|
|
40
|
-
NSRange charRange = [layoutManager characterRangeForGlyphRange:glyphRange
|
|
41
|
-
actualGlyphRange:NULL];
|
|
42
|
-
if (charRange.location == NSNotFound)
|
|
43
|
-
return;
|
|
44
|
-
|
|
45
|
-
NSDictionary *attrs = [storage attributesAtIndex:charRange.location
|
|
46
|
-
effectiveRange:NULL];
|
|
47
|
-
NSArray *markers = attrs[ListItemMarkerStartAttribute];
|
|
48
|
-
if (![markers isKindOfClass:[NSArray class]] || markers.count == 0)
|
|
49
|
-
return;
|
|
50
|
-
|
|
51
|
-
// Identify the start of the paragraph
|
|
52
|
-
NSRange paraRange = [storage.string paragraphRangeForRange:charRange];
|
|
53
|
-
if (charRange.location != paraRange.location ||
|
|
54
|
-
[drawnParagraphs containsObject:@(paraRange.location)])
|
|
55
|
-
return;
|
|
56
|
-
[drawnParagraphs addObject:@(paraRange.location)];
|
|
57
|
-
|
|
58
|
-
BOOL isRTL = ENRMParagraphIsRTL(attrs[NSParagraphStyleAttributeName]);
|
|
59
|
-
|
|
60
|
-
CGPoint glyphLoc = [layoutManager locationForGlyphAtIndex:glyphRange.location];
|
|
61
|
-
CGFloat baselineY = origin.y + rect.origin.y + glyphLoc.y;
|
|
62
|
-
|
|
63
|
-
// TextKit places an attachment glyph at the bottom edge of its
|
|
64
|
-
// bounds, not on the baseline. An item that starts with a link
|
|
65
|
-
// pill, an inline image or inline math would otherwise push its
|
|
66
|
-
// marker down by however far the attachment hangs below the text.
|
|
67
|
-
NSTextAttachment *attachment = attrs[NSAttachmentAttributeName];
|
|
68
|
-
if ([attachment isKindOfClass:[NSTextAttachment class]]) {
|
|
69
|
-
baselineY += [attachment attachmentBoundsForTextContainer:container
|
|
70
|
-
proposedLineFragment:rect
|
|
71
|
-
glyphPosition:glyphLoc
|
|
72
|
-
characterIndex:charRange.location]
|
|
73
|
-
.origin.y;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// When the anchor character is an emoji, NSFontAttributeName
|
|
77
|
-
// returns AppleColorEmoji whose metrics (xHeight, capHeight)
|
|
78
|
-
// differ widely from the text font and would misplace the
|
|
79
|
-
// marker. Look past the first composed character sequence
|
|
80
|
-
// to find the actual text font used on the line.
|
|
81
|
-
UIFont *font = attrs[NSFontAttributeName];
|
|
82
|
-
if (charRange.length > 1) {
|
|
83
|
-
NSRange firstGrapheme =
|
|
84
|
-
[storage.string rangeOfComposedCharacterSequenceAtIndex:charRange.location];
|
|
85
|
-
NSUInteger afterFirst = NSMaxRange(firstGrapheme);
|
|
86
|
-
if (afterFirst < NSMaxRange(charRange)) {
|
|
87
|
-
UIFont *textFont = [storage attribute:NSFontAttributeName
|
|
88
|
-
atIndex:afterFirst
|
|
89
|
-
effectiveRange:NULL];
|
|
90
|
-
if (textFont) {
|
|
91
|
-
font = textFont;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (!font || [font.fontName isEqualToString:kAppleColorEmojiFontName]) {
|
|
96
|
-
font = [self defaultFont];
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
for (ENRMListMarkerDescriptor *marker in markers) {
|
|
100
|
-
CGFloat markerX = isRTL ? origin.x + container.size.width - marker.indent + gap
|
|
101
|
-
: origin.x + marker.indent - gap;
|
|
102
|
-
|
|
103
|
-
if (marker.isTask) {
|
|
104
|
-
const CGFloat size = [_config taskListCheckboxSize];
|
|
105
|
-
CGFloat checkboxX = isRTL ? markerX + size / 2.0 : markerX - size / 2.0;
|
|
106
|
-
[self drawCheckboxAtX:checkboxX
|
|
107
|
-
centerY:baselineY - (font.capHeight / 2.0)
|
|
108
|
-
checked:marker.isChecked];
|
|
109
|
-
} else if (marker.listType == ListTypeUnordered) {
|
|
110
|
-
// Right-align in the shared number column, same as the checkbox.
|
|
111
|
-
const CGFloat bulletSize = [_config listStyleBulletSize];
|
|
112
|
-
CGFloat bulletX = isRTL ? markerX + bulletSize / 2.0 : markerX - bulletSize / 2.0;
|
|
113
|
-
[self drawBulletAtX:bulletX
|
|
114
|
-
centerY:baselineY - (font.xHeight + font.capHeight) / 4.0
|
|
115
|
-
depth:marker.depth];
|
|
116
|
-
} else {
|
|
117
|
-
[self drawOrderedMarkerAtX:markerX
|
|
118
|
-
number:marker.number
|
|
119
|
-
baselineY:baselineY
|
|
120
|
-
isRTL:isRTL];
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}];
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
#pragma mark - Drawing Helpers
|
|
127
|
-
|
|
128
|
-
- (void)drawCheckboxAtX:(CGFloat)x centerY:(CGFloat)y checked:(BOOL)checked
|
|
129
|
-
{
|
|
130
|
-
const CGFloat size = [_config taskListCheckboxSize];
|
|
131
|
-
const CGFloat radius = [_config taskListCheckboxBorderRadius];
|
|
132
|
-
const CGRect rect = CGRectMake(x - size / 2.0, y - size / 2.0, size, size);
|
|
133
|
-
|
|
134
|
-
[self
|
|
135
|
-
executeDrawing:^(CGContextRef ctx) {
|
|
136
|
-
UIBezierPath *borderPath = UIBezierPathWithRoundedRect(rect, radius);
|
|
137
|
-
|
|
138
|
-
if (checked) {
|
|
139
|
-
[[_config taskListCheckedColor] setFill];
|
|
140
|
-
[borderPath fill];
|
|
141
|
-
|
|
142
|
-
[self drawCheckmarkInsideRect:rect size:size];
|
|
143
|
-
} else {
|
|
144
|
-
CGFloat lineWidth = MAX(1.0, size * 0.09);
|
|
145
|
-
CGRect insetRect = CGRectInset(rect, lineWidth / 2.0, lineWidth / 2.0);
|
|
146
|
-
UIBezierPath *insetPath = UIBezierPathWithRoundedRect(insetRect, radius);
|
|
147
|
-
insetPath.lineWidth = lineWidth;
|
|
148
|
-
[[_config taskListBorderColor] setStroke];
|
|
149
|
-
[insetPath stroke];
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
atX:x
|
|
153
|
-
y:y];
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
- (void)drawCheckmarkInsideRect:(CGRect)rect size:(CGFloat)size
|
|
157
|
-
{
|
|
158
|
-
const CGFloat inset = size * 0.22;
|
|
159
|
-
const CGFloat verticalMid = CGRectGetMidY(rect);
|
|
160
|
-
const CGFloat horizontalMidOffset = size * 0.05;
|
|
161
|
-
|
|
162
|
-
UIBezierPath *checkmark = [UIBezierPath bezierPath];
|
|
163
|
-
|
|
164
|
-
[checkmark moveToPoint:CGPointMake(rect.origin.x + inset, verticalMid)];
|
|
165
|
-
|
|
166
|
-
BezierPathAddLine(checkmark, CGPointMake(CGRectGetMidX(rect) - horizontalMidOffset, CGRectGetMaxY(rect) - inset));
|
|
167
|
-
BezierPathAddLine(checkmark, CGPointMake(CGRectGetMaxX(rect) - inset, rect.origin.y + inset));
|
|
168
|
-
|
|
169
|
-
checkmark.lineWidth = MAX(1.5, size * 0.12);
|
|
170
|
-
BezierPathSetRoundStyle(checkmark);
|
|
171
|
-
|
|
172
|
-
[[_config taskListCheckmarkColor] setStroke];
|
|
173
|
-
[checkmark stroke];
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
- (void)drawBulletAtX:(CGFloat)x centerY:(CGFloat)y depth:(NSInteger)depth
|
|
177
|
-
{
|
|
178
|
-
CGFloat size = [_config listStyleBulletSize];
|
|
179
|
-
CGRect rect = CGRectMake(x - size / 2.0, y - size / 2.0, size, size);
|
|
180
|
-
[self
|
|
181
|
-
executeDrawing:^(CGContextRef ctx) {
|
|
182
|
-
switch (depth) {
|
|
183
|
-
case 0:
|
|
184
|
-
[[_config listStyleBulletColor] setFill];
|
|
185
|
-
CGContextFillEllipseInRect(ctx, rect);
|
|
186
|
-
break;
|
|
187
|
-
case 1: {
|
|
188
|
-
CGFloat lineWidth = MAX(1.0, size * 0.15);
|
|
189
|
-
[[_config listStyleBulletColor] setStroke];
|
|
190
|
-
CGContextSetLineWidth(ctx, lineWidth);
|
|
191
|
-
CGContextStrokeEllipseInRect(ctx, CGRectInset(rect, lineWidth / 2.0, lineWidth / 2.0));
|
|
192
|
-
break;
|
|
193
|
-
}
|
|
194
|
-
default:
|
|
195
|
-
[[_config listStyleBulletColor] setFill];
|
|
196
|
-
CGContextFillRect(ctx, rect);
|
|
197
|
-
break;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
atX:x
|
|
201
|
-
y:y];
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
- (void)drawOrderedMarkerAtX:(CGFloat)boundaryX number:(NSInteger)number baselineY:(CGFloat)baselineY isRTL:(BOOL)isRTL
|
|
205
|
-
{
|
|
206
|
-
NSString *text =
|
|
207
|
-
isRTL ? [NSString stringWithFormat:@".%ld", (long)number] : [NSString stringWithFormat:@"%ld.", (long)number];
|
|
208
|
-
UIFont *font = [_config listMarkerFont] ?: [self defaultFont];
|
|
209
|
-
|
|
210
|
-
NSDictionary *mAttrs = @{NSFontAttributeName : font, NSForegroundColorAttributeName : [_config listStyleMarkerColor]};
|
|
211
|
-
CGSize size = [text sizeWithAttributes:mAttrs];
|
|
212
|
-
CGFloat drawX = isRTL ? boundaryX : boundaryX - size.width;
|
|
213
|
-
|
|
214
|
-
if ([self isValidX:drawX y:baselineY]) {
|
|
215
|
-
[text drawAtPoint:CGPointMake(drawX, baselineY - font.ascender) withAttributes:mAttrs];
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
- (void)executeDrawing:(void (^)(CGContextRef))block atX:(CGFloat)x y:(CGFloat)y
|
|
220
|
-
{
|
|
221
|
-
CGContextRef ctx = UIGraphicsGetCurrentContext();
|
|
222
|
-
if (ctx && [self isValidX:x y:y]) {
|
|
223
|
-
CGContextSaveGState(ctx);
|
|
224
|
-
block(ctx);
|
|
225
|
-
CGContextRestoreGState(ctx);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
- (UIFont *)defaultFont
|
|
230
|
-
{
|
|
231
|
-
return [UIFont systemFontOfSize:[_config listStyleFontSize]];
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
- (BOOL)isValidX:(CGFloat)x y:(CGFloat)y
|
|
235
|
-
{
|
|
236
|
-
return !isnan(x) && !isinf(x) && !isnan(y) && !isinf(y);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
@end
|
|
1
|
+
#import "ListMarkerDrawer.h"
|
|
2
|
+
#import "ENRMUIKit.h"
|
|
3
|
+
#import "ListItemRenderer.h"
|
|
4
|
+
#import "ParagraphStyleUtils.h"
|
|
5
|
+
#import "RenderContext.h"
|
|
6
|
+
#import "StyleConfig.h"
|
|
7
|
+
|
|
8
|
+
extern NSString *const ListItemMarkerStartAttribute;
|
|
9
|
+
|
|
10
|
+
static NSString *const kAppleColorEmojiFontName = @"AppleColorEmoji";
|
|
11
|
+
|
|
12
|
+
@implementation ListMarkerDrawer {
|
|
13
|
+
StyleConfig *_config;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
- (instancetype)initWithConfig:(StyleConfig *)config
|
|
17
|
+
{
|
|
18
|
+
if (self = [super init]) {
|
|
19
|
+
_config = config;
|
|
20
|
+
}
|
|
21
|
+
return self;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
- (void)drawMarkersForGlyphRange:(NSRange)glyphsToShow
|
|
25
|
+
layoutManager:(NSLayoutManager *)layoutManager
|
|
26
|
+
textContainer:(NSTextContainer *)textContainer
|
|
27
|
+
atPoint:(CGPoint)origin
|
|
28
|
+
{
|
|
29
|
+
NSTextStorage *storage = layoutManager.textStorage;
|
|
30
|
+
if (!storage || storage.length == 0)
|
|
31
|
+
return;
|
|
32
|
+
|
|
33
|
+
CGFloat gap = [_config effectiveListGapWidth];
|
|
34
|
+
NSMutableSet *drawnParagraphs = [NSMutableSet set];
|
|
35
|
+
|
|
36
|
+
[layoutManager
|
|
37
|
+
enumerateLineFragmentsForGlyphRange:glyphsToShow
|
|
38
|
+
usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer *container,
|
|
39
|
+
NSRange glyphRange, BOOL *stop) {
|
|
40
|
+
NSRange charRange = [layoutManager characterRangeForGlyphRange:glyphRange
|
|
41
|
+
actualGlyphRange:NULL];
|
|
42
|
+
if (charRange.location == NSNotFound)
|
|
43
|
+
return;
|
|
44
|
+
|
|
45
|
+
NSDictionary *attrs = [storage attributesAtIndex:charRange.location
|
|
46
|
+
effectiveRange:NULL];
|
|
47
|
+
NSArray *markers = attrs[ListItemMarkerStartAttribute];
|
|
48
|
+
if (![markers isKindOfClass:[NSArray class]] || markers.count == 0)
|
|
49
|
+
return;
|
|
50
|
+
|
|
51
|
+
// Identify the start of the paragraph
|
|
52
|
+
NSRange paraRange = [storage.string paragraphRangeForRange:charRange];
|
|
53
|
+
if (charRange.location != paraRange.location ||
|
|
54
|
+
[drawnParagraphs containsObject:@(paraRange.location)])
|
|
55
|
+
return;
|
|
56
|
+
[drawnParagraphs addObject:@(paraRange.location)];
|
|
57
|
+
|
|
58
|
+
BOOL isRTL = ENRMParagraphIsRTL(attrs[NSParagraphStyleAttributeName]);
|
|
59
|
+
|
|
60
|
+
CGPoint glyphLoc = [layoutManager locationForGlyphAtIndex:glyphRange.location];
|
|
61
|
+
CGFloat baselineY = origin.y + rect.origin.y + glyphLoc.y;
|
|
62
|
+
|
|
63
|
+
// TextKit places an attachment glyph at the bottom edge of its
|
|
64
|
+
// bounds, not on the baseline. An item that starts with a link
|
|
65
|
+
// pill, an inline image or inline math would otherwise push its
|
|
66
|
+
// marker down by however far the attachment hangs below the text.
|
|
67
|
+
NSTextAttachment *attachment = attrs[NSAttachmentAttributeName];
|
|
68
|
+
if ([attachment isKindOfClass:[NSTextAttachment class]]) {
|
|
69
|
+
baselineY += [attachment attachmentBoundsForTextContainer:container
|
|
70
|
+
proposedLineFragment:rect
|
|
71
|
+
glyphPosition:glyphLoc
|
|
72
|
+
characterIndex:charRange.location]
|
|
73
|
+
.origin.y;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// When the anchor character is an emoji, NSFontAttributeName
|
|
77
|
+
// returns AppleColorEmoji whose metrics (xHeight, capHeight)
|
|
78
|
+
// differ widely from the text font and would misplace the
|
|
79
|
+
// marker. Look past the first composed character sequence
|
|
80
|
+
// to find the actual text font used on the line.
|
|
81
|
+
UIFont *font = attrs[NSFontAttributeName];
|
|
82
|
+
if (charRange.length > 1) {
|
|
83
|
+
NSRange firstGrapheme =
|
|
84
|
+
[storage.string rangeOfComposedCharacterSequenceAtIndex:charRange.location];
|
|
85
|
+
NSUInteger afterFirst = NSMaxRange(firstGrapheme);
|
|
86
|
+
if (afterFirst < NSMaxRange(charRange)) {
|
|
87
|
+
UIFont *textFont = [storage attribute:NSFontAttributeName
|
|
88
|
+
atIndex:afterFirst
|
|
89
|
+
effectiveRange:NULL];
|
|
90
|
+
if (textFont) {
|
|
91
|
+
font = textFont;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (!font || [font.fontName isEqualToString:kAppleColorEmojiFontName]) {
|
|
96
|
+
font = [self defaultFont];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
for (ENRMListMarkerDescriptor *marker in markers) {
|
|
100
|
+
CGFloat markerX = isRTL ? origin.x + container.size.width - marker.indent + gap
|
|
101
|
+
: origin.x + marker.indent - gap;
|
|
102
|
+
|
|
103
|
+
if (marker.isTask) {
|
|
104
|
+
const CGFloat size = [_config taskListCheckboxSize];
|
|
105
|
+
CGFloat checkboxX = isRTL ? markerX + size / 2.0 : markerX - size / 2.0;
|
|
106
|
+
[self drawCheckboxAtX:checkboxX
|
|
107
|
+
centerY:baselineY - (font.capHeight / 2.0)
|
|
108
|
+
checked:marker.isChecked];
|
|
109
|
+
} else if (marker.listType == ListTypeUnordered) {
|
|
110
|
+
// Right-align in the shared number column, same as the checkbox.
|
|
111
|
+
const CGFloat bulletSize = [_config listStyleBulletSize];
|
|
112
|
+
CGFloat bulletX = isRTL ? markerX + bulletSize / 2.0 : markerX - bulletSize / 2.0;
|
|
113
|
+
[self drawBulletAtX:bulletX
|
|
114
|
+
centerY:baselineY - (font.xHeight + font.capHeight) / 4.0
|
|
115
|
+
depth:marker.depth];
|
|
116
|
+
} else {
|
|
117
|
+
[self drawOrderedMarkerAtX:markerX
|
|
118
|
+
number:marker.number
|
|
119
|
+
baselineY:baselineY
|
|
120
|
+
isRTL:isRTL];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
#pragma mark - Drawing Helpers
|
|
127
|
+
|
|
128
|
+
- (void)drawCheckboxAtX:(CGFloat)x centerY:(CGFloat)y checked:(BOOL)checked
|
|
129
|
+
{
|
|
130
|
+
const CGFloat size = [_config taskListCheckboxSize];
|
|
131
|
+
const CGFloat radius = [_config taskListCheckboxBorderRadius];
|
|
132
|
+
const CGRect rect = CGRectMake(x - size / 2.0, y - size / 2.0, size, size);
|
|
133
|
+
|
|
134
|
+
[self
|
|
135
|
+
executeDrawing:^(CGContextRef ctx) {
|
|
136
|
+
UIBezierPath *borderPath = UIBezierPathWithRoundedRect(rect, radius);
|
|
137
|
+
|
|
138
|
+
if (checked) {
|
|
139
|
+
[[_config taskListCheckedColor] setFill];
|
|
140
|
+
[borderPath fill];
|
|
141
|
+
|
|
142
|
+
[self drawCheckmarkInsideRect:rect size:size];
|
|
143
|
+
} else {
|
|
144
|
+
CGFloat lineWidth = MAX(1.0, size * 0.09);
|
|
145
|
+
CGRect insetRect = CGRectInset(rect, lineWidth / 2.0, lineWidth / 2.0);
|
|
146
|
+
UIBezierPath *insetPath = UIBezierPathWithRoundedRect(insetRect, radius);
|
|
147
|
+
insetPath.lineWidth = lineWidth;
|
|
148
|
+
[[_config taskListBorderColor] setStroke];
|
|
149
|
+
[insetPath stroke];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
atX:x
|
|
153
|
+
y:y];
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
- (void)drawCheckmarkInsideRect:(CGRect)rect size:(CGFloat)size
|
|
157
|
+
{
|
|
158
|
+
const CGFloat inset = size * 0.22;
|
|
159
|
+
const CGFloat verticalMid = CGRectGetMidY(rect);
|
|
160
|
+
const CGFloat horizontalMidOffset = size * 0.05;
|
|
161
|
+
|
|
162
|
+
UIBezierPath *checkmark = [UIBezierPath bezierPath];
|
|
163
|
+
|
|
164
|
+
[checkmark moveToPoint:CGPointMake(rect.origin.x + inset, verticalMid)];
|
|
165
|
+
|
|
166
|
+
BezierPathAddLine(checkmark, CGPointMake(CGRectGetMidX(rect) - horizontalMidOffset, CGRectGetMaxY(rect) - inset));
|
|
167
|
+
BezierPathAddLine(checkmark, CGPointMake(CGRectGetMaxX(rect) - inset, rect.origin.y + inset));
|
|
168
|
+
|
|
169
|
+
checkmark.lineWidth = MAX(1.5, size * 0.12);
|
|
170
|
+
BezierPathSetRoundStyle(checkmark);
|
|
171
|
+
|
|
172
|
+
[[_config taskListCheckmarkColor] setStroke];
|
|
173
|
+
[checkmark stroke];
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
- (void)drawBulletAtX:(CGFloat)x centerY:(CGFloat)y depth:(NSInteger)depth
|
|
177
|
+
{
|
|
178
|
+
CGFloat size = [_config listStyleBulletSize];
|
|
179
|
+
CGRect rect = CGRectMake(x - size / 2.0, y - size / 2.0, size, size);
|
|
180
|
+
[self
|
|
181
|
+
executeDrawing:^(CGContextRef ctx) {
|
|
182
|
+
switch (depth) {
|
|
183
|
+
case 0:
|
|
184
|
+
[[_config listStyleBulletColor] setFill];
|
|
185
|
+
CGContextFillEllipseInRect(ctx, rect);
|
|
186
|
+
break;
|
|
187
|
+
case 1: {
|
|
188
|
+
CGFloat lineWidth = MAX(1.0, size * 0.15);
|
|
189
|
+
[[_config listStyleBulletColor] setStroke];
|
|
190
|
+
CGContextSetLineWidth(ctx, lineWidth);
|
|
191
|
+
CGContextStrokeEllipseInRect(ctx, CGRectInset(rect, lineWidth / 2.0, lineWidth / 2.0));
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
default:
|
|
195
|
+
[[_config listStyleBulletColor] setFill];
|
|
196
|
+
CGContextFillRect(ctx, rect);
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
atX:x
|
|
201
|
+
y:y];
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
- (void)drawOrderedMarkerAtX:(CGFloat)boundaryX number:(NSInteger)number baselineY:(CGFloat)baselineY isRTL:(BOOL)isRTL
|
|
205
|
+
{
|
|
206
|
+
NSString *text =
|
|
207
|
+
isRTL ? [NSString stringWithFormat:@".%ld", (long)number] : [NSString stringWithFormat:@"%ld.", (long)number];
|
|
208
|
+
UIFont *font = [_config listMarkerFont] ?: [self defaultFont];
|
|
209
|
+
|
|
210
|
+
NSDictionary *mAttrs = @{NSFontAttributeName : font, NSForegroundColorAttributeName : [_config listStyleMarkerColor]};
|
|
211
|
+
CGSize size = [text sizeWithAttributes:mAttrs];
|
|
212
|
+
CGFloat drawX = isRTL ? boundaryX : boundaryX - size.width;
|
|
213
|
+
|
|
214
|
+
if ([self isValidX:drawX y:baselineY]) {
|
|
215
|
+
[text drawAtPoint:CGPointMake(drawX, baselineY - font.ascender) withAttributes:mAttrs];
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
- (void)executeDrawing:(void (^)(CGContextRef))block atX:(CGFloat)x y:(CGFloat)y
|
|
220
|
+
{
|
|
221
|
+
CGContextRef ctx = UIGraphicsGetCurrentContext();
|
|
222
|
+
if (ctx && [self isValidX:x y:y]) {
|
|
223
|
+
CGContextSaveGState(ctx);
|
|
224
|
+
block(ctx);
|
|
225
|
+
CGContextRestoreGState(ctx);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
- (UIFont *)defaultFont
|
|
230
|
+
{
|
|
231
|
+
return [UIFont systemFontOfSize:[_config listStyleFontSize]];
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
- (BOOL)isValidX:(CGFloat)x y:(CGFloat)y
|
|
235
|
+
{
|
|
236
|
+
return !isnan(x) && !isinf(x) && !isnan(y) && !isinf(y);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
@end
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
#import "ENRMUIKit.h"
|
|
3
|
-
|
|
4
|
-
NS_ASSUME_NONNULL_BEGIN
|
|
5
|
-
|
|
6
|
-
extern NSString *const MentionAttributeName;
|
|
7
|
-
extern NSString *const MentionIdAttributeName;
|
|
8
|
-
extern NSString *const MentionLabelAttributeName;
|
|
9
|
-
extern NSString *const MentionBackgroundColorAttributeName;
|
|
10
|
-
|
|
11
|
-
/// Horizontal room inside the chip, also added as kern so the fill does not
|
|
12
|
-
/// cover the neighboring glyphs.
|
|
13
|
-
extern const CGFloat ENRMMentionPaddingX;
|
|
14
|
-
/// Extra height above the glyphs. Small enough to stay inside the line box.
|
|
15
|
-
extern const CGFloat ENRMMentionPaddingY;
|
|
16
|
-
|
|
17
|
-
@interface MentionBackground : NSObject
|
|
18
|
-
|
|
19
|
-
- (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
|
|
20
|
-
layoutManager:(NSLayoutManager *)layoutManager
|
|
21
|
-
textContainer:(NSTextContainer *)textContainer
|
|
22
|
-
atPoint:(CGPoint)origin;
|
|
23
|
-
|
|
24
|
-
@end
|
|
25
|
-
|
|
26
|
-
NS_ASSUME_NONNULL_END
|
|
1
|
+
#pragma once
|
|
2
|
+
#import "ENRMUIKit.h"
|
|
3
|
+
|
|
4
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
5
|
+
|
|
6
|
+
extern NSString *const MentionAttributeName;
|
|
7
|
+
extern NSString *const MentionIdAttributeName;
|
|
8
|
+
extern NSString *const MentionLabelAttributeName;
|
|
9
|
+
extern NSString *const MentionBackgroundColorAttributeName;
|
|
10
|
+
|
|
11
|
+
/// Horizontal room inside the chip, also added as kern so the fill does not
|
|
12
|
+
/// cover the neighboring glyphs.
|
|
13
|
+
extern const CGFloat ENRMMentionPaddingX;
|
|
14
|
+
/// Extra height above the glyphs. Small enough to stay inside the line box.
|
|
15
|
+
extern const CGFloat ENRMMentionPaddingY;
|
|
16
|
+
|
|
17
|
+
@interface MentionBackground : NSObject
|
|
18
|
+
|
|
19
|
+
- (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
|
|
20
|
+
layoutManager:(NSLayoutManager *)layoutManager
|
|
21
|
+
textContainer:(NSTextContainer *)textContainer
|
|
22
|
+
atPoint:(CGPoint)origin;
|
|
23
|
+
|
|
24
|
+
@end
|
|
25
|
+
|
|
26
|
+
NS_ASSUME_NONNULL_END
|