react-native-enriched-markdown-scaffold 0.7.4-scaffold.9 → 1.0.2-scaffold.10
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/README.md +54 -8
- package/ReactNativeEnrichedMarkdown.podspec +82 -73
- package/android/build.gradle +188 -1
- package/android/consumer-rules.pro +1 -1
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerDelegate.java +27 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerInterface.java +7 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerDelegate.java +24 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerInterface.java +8 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +27 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +7 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +223 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +183 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +65 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +1086 -61
- package/android/src/main/baseline-prof.txt +1 -1
- package/android/src/main/cpp/jni-adapter.cpp +74 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt +351 -13
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownInternalText.kt +62 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownManager.kt +85 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +160 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager.kt +10 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +76 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +126 -10
- package/android/src/main/java/com/swmansion/enriched/markdown/events/CopyPressEvent.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/events/CopyRequestEvent.kt +28 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkLayoutEvent.kt +36 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/events/SelectionChangeEvent.kt +43 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager.kt +54 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +923 -462
- package/android/src/main/java/com/swmansion/enriched/markdown/input/MarkdownClipboard.kt +42 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/BlockEditCoordinator.kt +196 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/ClipboardCoordinator.kt +73 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditContext.kt +19 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditPipeline.kt +248 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditSession.kt +52 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/InputConnectionWrapper.kt +108 -7
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/LinkCoordinator.kt +69 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownTextWatcher.kt +3 -3
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MentionCoordinator.kt +118 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnChangeStateEvent.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnContextMenuItemPressEvent.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnInputKeyPressEvent.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnPasteEvent.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/BlockStore.kt +254 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/FormattingStore.kt +80 -87
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputFormatter.kt +109 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputParser.kt +116 -22
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/MarkdownSerializer.kt +167 -38
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/RangeEditAdjustment.kt +149 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt +66 -5
- package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputMeasurementStore.kt +4 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockRange.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockType.kt +48 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/FormattingRange.kt +9 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/InputFormatterStyle.kt +39 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathAtom.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathChipStyle.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MutableRangeBounds.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputBulletSpan.kt +82 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputHeadingSpan.kt +58 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputListItemSpacingSpan.kt +37 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputOrderedListMarkerSpan.kt +63 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/BlockHandler.kt +54 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/HeadingBlockHandler.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/OrderedListBlockHandler.kt +38 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/UnorderedListBlockHandler.kt +37 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt +8 -26
- package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +9 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +100 -12
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +16 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +4 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LinkRenderer.kt +37 -7
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +2 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +74 -18
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +43 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +9 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SoftBreakRenderer.kt +16 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +35 -28
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +174 -24
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +20 -82
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +13 -16
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +182 -46
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/InlineChipPainter.kt +140 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkChipSpans.kt +177 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkSpan.kt +1 -6
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListItemSpacingSpan.kt +33 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListMarkerAnchorSpan.kt +38 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +2 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/TaskListSpan.kt +3 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +3 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +6 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +7 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/InlineMathStyle.kt +16 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkStyle.kt +36 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkVariantEntry.kt +7 -3
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +4 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/MathStyle.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +13 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/TableStyle.kt +6 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockHighlighter.kt +90 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockNode.kt +57 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/FeatureFlags.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownSegment.kt +9 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownViewManagerUtils.kt +84 -7
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/ReadableMapExtensions.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/RenderedSegment.kt +10 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/SegmentSignature.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/StreamingMarkdownFilter.kt +83 -5
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/serialization/MarkdownASTSerializer.kt +4 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/MarkdownStyleParser.kt +74 -44
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/PasteTextUtils.kt +52 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageCache.kt +26 -3
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageDownloader.kt +22 -9
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/LocalImageLoader.kt +161 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/conversion/HTMLGenerator.kt +2 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/conversion/MarkdownExtractor.kt +6 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/extensions/TextPaintExtensions.kt +23 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/CheckboxTouchHelper.kt +7 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/TaskListTapUtils.kt +41 -21
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/span/BlockSpacing.kt +15 -8
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/HeadlessActionMode.kt +88 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLayoutCollector.kt +100 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLongPressMovementMethod.kt +58 -27
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionActionMode.kt +72 -16
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionChangeReporter.kt +232 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/views/BlockMenuOptions.kt +64 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +414 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/views/ContextMenuPopup.kt +9 -6
- package/android/src/main/java/com/swmansion/enriched/markdown/views/CopyGlyph.kt +101 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/views/TableContainerView.kt +61 -11
- package/android/src/main/jni/CMakeLists.txt +53 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp +10 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h +11 -2
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +10 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +12 -2
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.cpp +9 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.h +24 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +16 -0
- package/android/src/math/java/com/swmansion/enriched/markdown/input/math/MathChipControllerImpl.kt +21 -4
- package/android/src/math/java/com/swmansion/enriched/markdown/renderer/MathInlineRenderer.kt +8 -2
- package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathChipSpan.kt +1 -1
- package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathInlineSpan.kt +13 -6
- package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathMeasureHelper.kt +2 -1
- package/android/src/math/java/com/swmansion/enriched/markdown/views/MathContainerView.kt +26 -8
- package/cpp/highlight/CodeBlockHighlighter.cpp +284 -0
- package/cpp/highlight/CodeBlockHighlighter.hpp +66 -0
- package/cpp/highlight/CodeBlockLanguages.cpp +138 -0
- package/cpp/highlight/CodeBlockLanguages.hpp +25 -0
- package/cpp/highlight/HighlightGrammars.hpp +28 -0
- package/cpp/highlight/code_highlight_podspec.rb +211 -0
- package/cpp/highlight/gen-registry.mjs +155 -0
- package/cpp/highlight/grammar-versions.json +159 -0
- package/cpp/highlight/vendor/generated/generated_queries.h +1665 -0
- package/cpp/highlight/vendor/generated/generated_registry.cpp +59 -0
- package/cpp/parser/MD4CParser.cpp +173 -61
- package/cpp/parser/MD4CParser.hpp +1 -0
- package/cpp/parser/MarkdownASTNode.hpp +2 -1
- package/cpp/wasm/ASTSerializer.cpp +2 -0
- package/cpp/wasm/build.sh +1 -0
- package/cpp/wasm/md4c_wasm.cpp +3 -1
- package/docs/ACCESSIBILITY.md +14 -2
- package/docs/API_REFERENCE.md +405 -12
- package/docs/BREAKING_CHANGES.md +129 -0
- package/docs/CODE_HIGHLIGHT.md +133 -0
- package/docs/COPY_OPTIONS.md +61 -3
- package/docs/ELEMENTS_STRUCTURE.md +52 -4
- package/docs/IMAGE_CACHING.md +30 -0
- package/docs/INPUT.md +110 -11
- package/docs/LATEX_MATH.md +87 -45
- package/docs/MACOS.md +1 -1
- package/docs/MARKDOWN_STREAMING.md +27 -1
- package/docs/MENTIONS.md +8 -1
- package/docs/NATIVE_ASSETS.md +127 -0
- package/docs/RTL.md +1 -1
- package/docs/STYLES.md +73 -6
- package/docs/TESTING.md +112 -0
- package/docs/TEXT.md +18 -6
- package/docs/WEB.md +4 -1
- package/ios/EnrichedMarkdown.h +7 -0
- package/ios/EnrichedMarkdown.mm +583 -76
- package/ios/EnrichedMarkdownText.h +7 -0
- package/ios/EnrichedMarkdownText.mm +299 -73
- package/ios/attachments/ENRMImageAttachment.h +9 -0
- package/ios/attachments/ENRMImageAttachment.m +143 -40
- package/ios/attachments/ENRMMathInlineAttachment+macOS.m +2 -1
- package/ios/attachments/ENRMMathInlineAttachment.h +5 -0
- package/ios/attachments/ENRMMathInlineAttachment.m +50 -82
- package/ios/attachments/ENRMMathInlineAttachmentShared.h +2 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.cpp +223 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.h +183 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.cpp +65 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +1086 -61
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +181 -2
- package/ios/input/ENRMAutoLinkDetector.h +2 -1
- package/ios/input/ENRMAutoLinkDetector.mm +79 -41
- package/ios/input/ENRMBlockEditCoordinator.h +71 -0
- package/ios/input/ENRMBlockEditCoordinator.mm +195 -0
- package/ios/input/ENRMBlockRange.h +28 -0
- package/ios/input/ENRMBlockRange.mm +30 -0
- package/ios/input/ENRMBlockStore.h +56 -0
- package/ios/input/ENRMBlockStore.mm +275 -0
- package/ios/input/ENRMClipboardCoordinator.h +45 -0
- package/ios/input/ENRMClipboardCoordinator.mm +120 -0
- package/ios/input/ENRMDetectorPipeline.h +2 -1
- package/ios/input/ENRMEditPipeline.h +76 -0
- package/ios/input/ENRMEditPipeline.mm +228 -0
- package/ios/input/ENRMEditSession.h +36 -0
- package/ios/input/ENRMEditSession.mm +63 -0
- package/ios/input/ENRMFormattingStore.h +17 -0
- package/ios/input/ENRMFormattingStore.mm +95 -105
- package/ios/input/ENRMInputBlockType.h +91 -0
- package/ios/input/ENRMInputBlockType.mm +5 -0
- package/ios/input/ENRMInputDecorationDrawer.h +18 -0
- package/ios/input/ENRMInputEventEmitter.h +56 -0
- package/ios/input/ENRMInputEventEmitter.mm +308 -0
- package/ios/input/ENRMInputFormatter.h +29 -69
- package/ios/input/ENRMInputFormatter.mm +216 -124
- package/ios/input/ENRMInputFormatterStyle.h +99 -0
- package/ios/input/ENRMInputFormatterStyle.mm +188 -0
- package/ios/input/ENRMInputLayoutManager.h +9 -0
- package/ios/input/ENRMInputLayoutManager.mm +30 -0
- package/ios/input/ENRMInputListMarkerDrawer.h +32 -0
- package/ios/input/ENRMInputListMarkerDrawer.mm +426 -0
- package/ios/input/ENRMInputParser.h +5 -6
- package/ios/input/ENRMInputParser.mm +461 -178
- package/ios/input/ENRMInputRemend.mm +2 -2
- package/ios/input/ENRMInputStyleStateBuilder.h +40 -0
- package/ios/input/ENRMInputStyleStateBuilder.mm +60 -0
- package/ios/input/ENRMInputTextView.mm +103 -8
- package/ios/input/ENRMInputTypingAttributesController.h +42 -0
- package/ios/input/ENRMInputTypingAttributesController.mm +203 -0
- package/ios/input/ENRMLinkCoordinator.h +41 -0
- package/ios/input/ENRMLinkCoordinator.mm +89 -0
- package/ios/input/ENRMMarkdownSerializer.h +29 -5
- package/ios/input/ENRMMarkdownSerializer.mm +170 -48
- package/ios/input/ENRMMathAtom.h +26 -0
- package/ios/input/ENRMMathAtom.mm +12 -0
- package/ios/input/ENRMMentionCoordinator.h +45 -0
- package/ios/input/ENRMMentionCoordinator.mm +167 -0
- package/ios/input/ENRMRangeEditAdjustment.h +38 -0
- package/ios/input/ENRMRangeEditAdjustment.mm +91 -0
- package/ios/input/ENRMRangeStoreUtils.h +39 -0
- package/ios/input/EnrichedMarkdownTextInput+ContextMenu.mm +6 -6
- package/ios/input/EnrichedMarkdownTextInput+Internal.h +11 -3
- package/ios/input/EnrichedMarkdownTextInput.h +7 -1
- package/ios/input/EnrichedMarkdownTextInput.mm +1089 -1023
- package/ios/input/InputStylePropsUtils.h +109 -68
- package/ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm +2 -1
- package/ios/input/styles/ENRMBlockHandler.h +46 -0
- package/ios/input/styles/ENRMHeadingBlockHandler.h +15 -0
- package/ios/input/styles/ENRMHeadingBlockHandler.mm +38 -0
- package/ios/input/styles/ENRMOrderedListBlockHandler.h +14 -0
- package/ios/input/styles/ENRMOrderedListBlockHandler.mm +48 -0
- package/ios/input/styles/ENRMUnorderedListBlockHandler.h +15 -0
- package/ios/input/styles/ENRMUnorderedListBlockHandler.mm +51 -0
- package/ios/internals/ENRMViewFreeMeasurement.h +331 -0
- package/ios/internals/EnrichedMarkdownShadowNode.h +1 -3
- package/ios/internals/EnrichedMarkdownShadowNode.mm +16 -20
- package/ios/internals/EnrichedMarkdownTextShadowNode.h +1 -3
- package/ios/internals/EnrichedMarkdownTextShadowNode.mm +15 -20
- package/ios/internals/MeasurementCache.h +41 -9
- package/ios/internals/ShadowMeasurementUtils.h +63 -58
- package/ios/math/ENRMMathChipController.h +74 -0
- package/ios/math/ENRMMathChipController.mm +476 -0
- package/ios/math/ENRMRaTeXBridge.swift +27 -6
- package/ios/parser/ENRMMarkdownParser.h +1 -8
- package/ios/parser/ENRMMarkdownParser.mm +2 -11
- package/ios/parser/MarkdownASTNode.h +2 -1
- package/ios/parser/MarkdownParserBridge.mm +4 -0
- package/ios/renderer/AttributedRenderer.m +20 -2
- package/ios/renderer/BaseRenderer.h +17 -2
- package/ios/renderer/BaseRenderer.m +30 -0
- package/ios/renderer/BlockquoteRenderer.h +1 -1
- package/ios/renderer/BlockquoteRenderer.m +144 -35
- package/ios/renderer/CodeBlockRenderer.h +1 -1
- package/ios/renderer/CodeBlockRenderer.m +27 -23
- package/ios/renderer/CodeRenderer.h +1 -1
- package/ios/renderer/CodeRenderer.m +3 -1
- package/ios/renderer/ENRMImageRenderer.h +1 -1
- package/ios/renderer/ENRMImageRenderer.m +5 -1
- package/ios/renderer/ENRMMathInlineRenderer.h +1 -1
- package/ios/renderer/ENRMMathInlineRenderer.m +6 -1
- package/ios/renderer/ENRMSpoilerRenderer.h +1 -1
- package/ios/renderer/ENRMSpoilerRenderer.m +3 -1
- package/ios/renderer/EmphasisRenderer.h +1 -1
- package/ios/renderer/EmphasisRenderer.m +3 -1
- package/ios/renderer/HeadingRenderer.h +1 -1
- package/ios/renderer/HeadingRenderer.m +13 -6
- package/ios/renderer/HighlightRenderer.h +1 -1
- package/ios/renderer/HighlightRenderer.m +3 -1
- package/ios/renderer/LinkRenderer.h +1 -1
- package/ios/renderer/LinkRenderer.m +50 -16
- package/ios/renderer/ListItemRenderer.h +13 -1
- package/ios/renderer/ListItemRenderer.m +102 -44
- package/ios/renderer/ListRenderer.h +2 -2
- package/ios/renderer/ListRenderer.m +63 -25
- package/ios/renderer/ParagraphRenderer.h +1 -1
- package/ios/renderer/ParagraphRenderer.m +16 -8
- package/ios/renderer/RenderContext.h +10 -0
- package/ios/renderer/RenderContext.m +44 -0
- package/ios/renderer/RendererFactory.m +14 -0
- package/ios/renderer/StrikethroughRenderer.h +1 -1
- package/ios/renderer/StrikethroughRenderer.m +3 -1
- package/ios/renderer/StrongRenderer.h +1 -1
- package/ios/renderer/StrongRenderer.m +3 -1
- package/ios/renderer/SubscriptRenderer.h +1 -1
- package/ios/renderer/SubscriptRenderer.m +3 -1
- package/ios/renderer/SuperscriptRenderer.h +1 -1
- package/ios/renderer/SuperscriptRenderer.m +3 -1
- package/ios/renderer/TextRenderer.h +2 -2
- package/ios/renderer/TextRenderer.m +3 -1
- package/ios/renderer/ThematicBreakRenderer.h +1 -1
- package/ios/renderer/ThematicBreakRenderer.m +3 -1
- package/ios/renderer/UnderlineRenderer.h +1 -1
- package/ios/renderer/UnderlineRenderer.m +3 -1
- package/ios/styles/StyleConfig.h +42 -0
- package/ios/styles/StyleConfig.mm +216 -0
- package/ios/utils/BlockquoteBorder.h +6 -0
- package/ios/utils/BlockquoteBorder.m +249 -52
- package/ios/utils/CodeBackground.m +3 -65
- package/ios/utils/CodeBlockBackground.m +16 -2
- package/ios/utils/ENRMAtomicSize.h +65 -0
- package/ios/utils/ENRMBlockMenu.h +66 -0
- package/ios/utils/ENRMChipDrawing.h +24 -0
- package/ios/utils/ENRMChipDrawing.m +83 -0
- package/ios/utils/ENRMCodeBlockContent.h +37 -0
- package/ios/utils/ENRMCodeBlockContent.mm +79 -0
- package/ios/utils/ENRMCodeBlockHighlighter.h +37 -0
- package/ios/utils/ENRMCodeBlockHighlighter.mm +51 -0
- package/ios/utils/ENRMFeatureFlags.h +7 -0
- package/ios/utils/ENRMImageDownloader.h +11 -1
- package/ios/utils/ENRMImageDownloader.m +60 -16
- package/ios/utils/ENRMLinkChip.h +70 -0
- package/ios/utils/ENRMLinkChip.m +213 -0
- package/ios/utils/ENRMLinkLayout.h +50 -0
- package/ios/utils/ENRMLinkLayout.m +45 -0
- package/ios/utils/ENRMLocalImageLoader.h +31 -0
- package/ios/utils/ENRMLocalImageLoader.m +68 -0
- package/ios/utils/ENRMMathFallback.h +26 -0
- package/ios/utils/ENRMMathFallback.m +18 -0
- package/ios/utils/ENRMSelectionChange.h +120 -0
- package/ios/utils/ENRMSelectionChange.m +282 -0
- package/ios/utils/ENRMTextViewSetup.h +35 -17
- package/ios/utils/EditMenuUtils+macOS.m +4 -1
- package/ios/utils/EditMenuUtils.h +35 -6
- package/ios/utils/EditMenuUtils.m +188 -11
- package/ios/utils/HTMLGenerator.m +2 -1
- package/ios/utils/ImageRequestHeaderUtils.h +35 -0
- package/ios/utils/LastElementUtils.h +1 -0
- package/ios/utils/ListMarkerDrawer.m +29 -42
- package/ios/utils/MarkdownASTSerializer.m +4 -0
- package/ios/utils/MarkdownAccessibilityElementBuilder.m +3 -1
- package/ios/utils/MarkdownExtractor.m +2 -1
- package/ios/utils/ParagraphStyleUtils.h +5 -0
- package/ios/utils/ParagraphStyleUtils.m +77 -17
- package/ios/utils/RTFExportUtils.m +2 -0
- package/ios/utils/RenderedMarkdownSegment.h +13 -1
- package/ios/utils/RenderedMarkdownSegment.m +20 -0
- package/ios/utils/SegmentRenderer.m +17 -4
- package/ios/utils/StreamingMarkdownFilter.h +11 -1
- package/ios/utils/StreamingMarkdownFilter.m +98 -2
- package/ios/utils/StylePropsUtils.h +110 -1
- package/ios/utils/TaskListTapUtils.m +24 -0
- package/ios/utils/TextViewLayoutManager.mm +3 -0
- package/ios/views/ENRMCodeBlockContainerView.h +60 -0
- package/ios/views/ENRMCodeBlockContainerView.m +569 -0
- package/ios/views/ENRMMathContainerView.h +23 -0
- package/ios/views/ENRMMathContainerView.m +87 -20
- package/ios/views/TableContainerView.h +32 -0
- package/ios/views/TableContainerView.m +291 -175
- package/jest.d.ts +1 -0
- package/jest.js +5 -0
- package/lib/module/EnrichedMarkdownNativeComponent.ts +203 -1
- package/lib/module/EnrichedMarkdownTextInput.js +84 -5
- package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
- package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
- package/lib/module/EnrichedMarkdownTextNativeComponent.ts +204 -1
- package/lib/module/headingDefaults.js +34 -0
- package/lib/module/headingDefaults.js.map +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/jest/index.js +205 -0
- package/lib/module/jest/index.js.map +1 -0
- package/lib/module/native/EnrichedMarkdownText.js +199 -15
- package/lib/module/native/EnrichedMarkdownText.js.map +1 -1
- package/lib/module/normalizeMarkdownStyle.js +98 -23
- package/lib/module/normalizeMarkdownStyle.js.map +1 -1
- package/lib/module/normalizeMarkdownStyle.web.js +73 -22
- package/lib/module/normalizeMarkdownStyle.web.js.map +1 -1
- package/lib/module/normalizeMarkdownTextInputStyle.js +62 -15
- package/lib/module/normalizeMarkdownTextInputStyle.js.map +1 -1
- package/lib/module/normalizeMenuItem.js +1 -1
- package/lib/module/utils/textInputState.js +26 -0
- package/lib/module/utils/textInputState.js.map +1 -0
- package/lib/module/web/EnrichedMarkdownText.js +15 -8
- package/lib/module/web/EnrichedMarkdownText.js.map +1 -1
- package/lib/module/web/parseMarkdown.js +4 -3
- package/lib/module/web/parseMarkdown.js.map +1 -1
- package/lib/module/web/renderers/InlineRenderers.js +102 -3
- package/lib/module/web/renderers/InlineRenderers.js.map +1 -1
- package/lib/module/web/renderers/ListRenderers.js +7 -2
- package/lib/module/web/renderers/ListRenderers.js.map +1 -1
- package/lib/module/web/renderers/index.js +7 -4
- package/lib/module/web/renderers/index.js.map +1 -1
- package/lib/module/web/styles.js +101 -6
- package/lib/module/web/styles.js.map +1 -1
- package/lib/module/web/utils.js +14 -0
- package/lib/module/web/utils.js.map +1 -1
- package/lib/module/web/wasm/md4c.js +0 -0
- package/lib/module/web/wasm/md4c.js.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts +185 -2
- package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +94 -9
- package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +69 -5
- package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +185 -2
- package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/headingDefaults.d.ts +9 -0
- package/lib/typescript/src/headingDefaults.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +3 -3
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/index.web.d.ts +2 -2
- package/lib/typescript/src/index.web.d.ts.map +1 -1
- package/lib/typescript/src/jest/index.d.ts +6 -0
- package/lib/typescript/src/jest/index.d.ts.map +1 -0
- package/lib/typescript/src/native/EnrichedMarkdownText.d.ts +5 -5
- package/lib/typescript/src/native/EnrichedMarkdownText.d.ts.map +1 -1
- package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -1
- package/lib/typescript/src/normalizeMarkdownStyle.web.d.ts.map +1 -1
- package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts +19 -5
- package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownStyle.d.ts +122 -5
- package/lib/typescript/src/types/MarkdownStyle.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownStyleInternal.d.ts +39 -0
- package/lib/typescript/src/types/MarkdownStyleInternal.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownTextProps.d.ts +207 -10
- package/lib/typescript/src/types/MarkdownTextProps.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownTextProps.web.d.ts +60 -1
- package/lib/typescript/src/types/MarkdownTextProps.web.d.ts.map +1 -1
- package/lib/typescript/src/types/events.d.ts +85 -0
- package/lib/typescript/src/types/events.d.ts.map +1 -1
- package/lib/typescript/src/utils/textInputState.d.ts +24 -0
- package/lib/typescript/src/utils/textInputState.d.ts.map +1 -0
- package/lib/typescript/src/web/EnrichedMarkdownText.d.ts +1 -1
- package/lib/typescript/src/web/EnrichedMarkdownText.d.ts.map +1 -1
- package/lib/typescript/src/web/parseMarkdown.d.ts +1 -1
- package/lib/typescript/src/web/parseMarkdown.d.ts.map +1 -1
- package/lib/typescript/src/web/renderers/InlineRenderers.d.ts.map +1 -1
- package/lib/typescript/src/web/renderers/ListRenderers.d.ts.map +1 -1
- package/lib/typescript/src/web/renderers/index.d.ts +2 -1
- package/lib/typescript/src/web/renderers/index.d.ts.map +1 -1
- package/lib/typescript/src/web/styles.d.ts +2 -1
- package/lib/typescript/src/web/styles.d.ts.map +1 -1
- package/lib/typescript/src/web/types.d.ts +10 -2
- package/lib/typescript/src/web/types.d.ts.map +1 -1
- package/lib/typescript/src/web/utils.d.ts +4 -0
- package/lib/typescript/src/web/utils.d.ts.map +1 -1
- package/package.json +36 -9
- package/postinstall.mjs +131 -0
- package/ratex-version.json +21 -0
- package/src/EnrichedMarkdownNativeComponent.ts +203 -1
- package/src/EnrichedMarkdownTextInput.tsx +159 -8
- package/src/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
- package/src/EnrichedMarkdownTextNativeComponent.ts +204 -1
- package/src/headingDefaults.ts +21 -0
- package/src/index.tsx +15 -0
- package/src/index.web.tsx +6 -1
- package/src/jest/index.tsx +236 -0
- package/src/native/EnrichedMarkdownText.tsx +260 -11
- package/src/normalizeMarkdownStyle.ts +117 -16
- package/src/normalizeMarkdownStyle.web.ts +76 -15
- package/src/normalizeMarkdownTextInputStyle.ts +110 -35
- package/src/normalizeMenuItem.ts +1 -1
- package/src/types/MarkdownStyle.ts +125 -5
- package/src/types/MarkdownStyleInternal.ts +51 -0
- package/src/types/MarkdownTextProps.ts +215 -10
- package/src/types/MarkdownTextProps.web.ts +62 -1
- package/src/types/events.ts +90 -0
- package/src/utils/textInputState.ts +35 -0
- package/src/web/EnrichedMarkdownText.tsx +26 -5
- package/src/web/parseMarkdown.ts +6 -2
- package/src/web/renderers/InlineRenderers.tsx +116 -3
- package/src/web/renderers/ListRenderers.tsx +14 -2
- package/src/web/renderers/index.tsx +6 -2
- package/src/web/styles.ts +114 -5
- package/src/web/types.ts +10 -1
- package/src/web/utils.ts +9 -0
- package/src/web/wasm/md4c.js +0 -0
- package/vendor-grammars.mjs +511 -0
- package/vendor-ratex.mjs +173 -0
- package/app.plugin.js +0 -2
- package/plugin/build/withAndroidMath.js +0 -19
- package/plugin/build/withIosMath.js +0 -28
- package/plugin/build/withReactNativeEnrichedMarkdown.js +0 -11
- package/plugin/src/withAndroidMath.ts +0 -24
- package/plugin/src/withIosMath.ts +0 -35
- package/plugin/src/withReactNativeEnrichedMarkdown.ts +0 -17
- package/plugin/tsconfig.build.json +0 -16
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
#import "ENRMSelectionChange.h"
|
|
2
|
+
#import "ENRMLinkChip.h"
|
|
3
|
+
|
|
4
|
+
NSString *const ENRMSelectionActiveKey = @"active";
|
|
5
|
+
NSString *const ENRMSelectionSourceKey = @"source";
|
|
6
|
+
NSString *const ENRMSelectionTextKey = @"text";
|
|
7
|
+
NSString *const ENRMSelectionMarkdownKey = @"markdown";
|
|
8
|
+
NSString *const ENRMSelectionWholeKey = @"whole";
|
|
9
|
+
NSString *const ENRMSelectionRectKey = @"rect";
|
|
10
|
+
NSString *const ENRMSelectionStartRectKey = @"startRect";
|
|
11
|
+
NSString *const ENRMSelectionEndRectKey = @"endRect";
|
|
12
|
+
NSString *const ENRMSelectionAdjustingKey = @"adjusting";
|
|
13
|
+
NSString *const ENRMSelectionFullKey = @"full";
|
|
14
|
+
|
|
15
|
+
static NSValue *ENRMRectValue(CGRect rect)
|
|
16
|
+
{
|
|
17
|
+
#if TARGET_OS_OSX
|
|
18
|
+
return [NSValue valueWithRect:NSRectFromCGRect(rect)];
|
|
19
|
+
#else
|
|
20
|
+
return [NSValue valueWithCGRect:rect];
|
|
21
|
+
#endif
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
NSDictionary *ENRMInactiveSelectionPayload(void)
|
|
25
|
+
{
|
|
26
|
+
static NSDictionary *payload;
|
|
27
|
+
static dispatch_once_t onceToken;
|
|
28
|
+
dispatch_once(&onceToken, ^{
|
|
29
|
+
NSValue *zero = ENRMRectValue(CGRectZero);
|
|
30
|
+
payload = @{
|
|
31
|
+
ENRMSelectionActiveKey : @NO,
|
|
32
|
+
ENRMSelectionSourceKey : @"selection",
|
|
33
|
+
ENRMSelectionTextKey : @"",
|
|
34
|
+
ENRMSelectionMarkdownKey : @"",
|
|
35
|
+
ENRMSelectionWholeKey : @NO,
|
|
36
|
+
ENRMSelectionRectKey : zero,
|
|
37
|
+
ENRMSelectionStartRectKey : zero,
|
|
38
|
+
ENRMSelectionEndRectKey : zero,
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
return payload;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
NSDictionary *ENRMBlockSelectionPayload(NSString *source, NSString *markdown, NSString *text, CGRect frame)
|
|
45
|
+
{
|
|
46
|
+
NSValue *rect = ENRMRectValue(frame);
|
|
47
|
+
return @{
|
|
48
|
+
ENRMSelectionActiveKey : @YES,
|
|
49
|
+
ENRMSelectionSourceKey : source,
|
|
50
|
+
ENRMSelectionTextKey : text ?: @"",
|
|
51
|
+
ENRMSelectionMarkdownKey : markdown ?: @"",
|
|
52
|
+
ENRMSelectionWholeKey : @YES,
|
|
53
|
+
ENRMSelectionRectKey : rect,
|
|
54
|
+
ENRMSelectionStartRectKey : rect,
|
|
55
|
+
ENRMSelectionEndRectKey : rect,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
#if !TARGET_OS_OSX
|
|
60
|
+
NSDictionary *ENRMTextSelectionInTextView(UITextView *textView, UIView *targetView)
|
|
61
|
+
{
|
|
62
|
+
NSRange range = textView.selectedRange;
|
|
63
|
+
UITextRange *textRange = textView.selectedTextRange;
|
|
64
|
+
if (range.location == NSNotFound || range.length == 0 || textRange == nil || textRange.isEmpty) {
|
|
65
|
+
return nil;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
NSAttributedString *attributedText = textView.attributedText;
|
|
69
|
+
if (NSMaxRange(range) > attributedText.length) {
|
|
70
|
+
return nil;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
CGRect unionRect = CGRectNull;
|
|
74
|
+
CGRect startRect = CGRectNull;
|
|
75
|
+
CGRect endRect = CGRectNull;
|
|
76
|
+
CGRect firstRect = CGRectNull;
|
|
77
|
+
CGRect lastRect = CGRectNull;
|
|
78
|
+
for (UITextSelectionRect *selectionRect in [textView selectionRectsForRange:textRange]) {
|
|
79
|
+
CGRect rect = selectionRect.rect;
|
|
80
|
+
if (CGRectIsNull(rect) || CGRectIsInfinite(rect) || CGRectIsEmpty(rect)) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
unionRect = CGRectUnion(unionRect, rect);
|
|
84
|
+
if (CGRectIsNull(firstRect)) {
|
|
85
|
+
firstRect = rect;
|
|
86
|
+
}
|
|
87
|
+
lastRect = rect;
|
|
88
|
+
if (selectionRect.containsStart && CGRectIsNull(startRect)) {
|
|
89
|
+
startRect = rect;
|
|
90
|
+
}
|
|
91
|
+
if (selectionRect.containsEnd) {
|
|
92
|
+
endRect = rect;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Not laid out yet: report once layout gives the range a position.
|
|
96
|
+
if (CGRectIsNull(unionRect)) {
|
|
97
|
+
return nil;
|
|
98
|
+
}
|
|
99
|
+
if (CGRectIsNull(startRect)) {
|
|
100
|
+
startRect = firstRect;
|
|
101
|
+
}
|
|
102
|
+
if (CGRectIsNull(endRect)) {
|
|
103
|
+
endRect = lastRect;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return @{
|
|
107
|
+
ENRMSelectionTextKey : ENRMPlainTextByRemovingLinkSpacers(attributedText, range),
|
|
108
|
+
ENRMSelectionFullKey : @(range.location == 0 && range.length >= attributedText.length - 1),
|
|
109
|
+
ENRMSelectionRectKey : ENRMRectValue([textView convertRect:unionRect toView:targetView]),
|
|
110
|
+
ENRMSelectionStartRectKey : ENRMRectValue([textView convertRect:startRect toView:targetView]),
|
|
111
|
+
ENRMSelectionEndRectKey : ENRMRectValue([textView convertRect:endRect toView:targetView]),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
#endif
|
|
115
|
+
|
|
116
|
+
@implementation ENRMSelectionChangeReporter {
|
|
117
|
+
NSDictionary * (^_snapshot)(void);
|
|
118
|
+
void (^_emit)(NSDictionary *);
|
|
119
|
+
NSDictionary *_lastReported;
|
|
120
|
+
BOOL _pending;
|
|
121
|
+
// Bumped on cancel so a scheduled block that already left the queue is a no-op.
|
|
122
|
+
NSUInteger _generation;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
- (instancetype)initWithSnapshot:(NSDictionary * (^)(void))snapshot emit:(void (^)(NSDictionary *))emit
|
|
126
|
+
{
|
|
127
|
+
if (self = [super init]) {
|
|
128
|
+
_snapshot = [snapshot copy];
|
|
129
|
+
_emit = [emit copy];
|
|
130
|
+
_lastReported = ENRMInactiveSelectionPayload();
|
|
131
|
+
}
|
|
132
|
+
return self;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
- (void)setEnabled:(BOOL)enabled
|
|
136
|
+
{
|
|
137
|
+
if (_enabled == enabled) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
_enabled = enabled;
|
|
141
|
+
[self cancel];
|
|
142
|
+
_lastReported = ENRMInactiveSelectionPayload();
|
|
143
|
+
if (enabled) {
|
|
144
|
+
[self schedule];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
- (void)schedule
|
|
149
|
+
{
|
|
150
|
+
if (!_enabled || _pending) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
_pending = YES;
|
|
154
|
+
NSUInteger generation = _generation;
|
|
155
|
+
__weak ENRMSelectionChangeReporter *weakSelf = self;
|
|
156
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
157
|
+
ENRMSelectionChangeReporter *strongSelf = weakSelf;
|
|
158
|
+
if (!strongSelf || !strongSelf->_pending || strongSelf->_generation != generation) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
strongSelf->_pending = NO;
|
|
162
|
+
[strongSelf report];
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
- (void)selectionChanged:(BOOL)hasSelection
|
|
167
|
+
{
|
|
168
|
+
if (hasSelection) {
|
|
169
|
+
[self schedule];
|
|
170
|
+
} else {
|
|
171
|
+
[self flushNow];
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
- (void)flushNow
|
|
176
|
+
{
|
|
177
|
+
[self cancel];
|
|
178
|
+
[self report];
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
- (void)forgetLastReported
|
|
182
|
+
{
|
|
183
|
+
_lastReported = ENRMInactiveSelectionPayload();
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
- (void)cancel
|
|
187
|
+
{
|
|
188
|
+
_pending = NO;
|
|
189
|
+
_generation++;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
- (void)report
|
|
193
|
+
{
|
|
194
|
+
if (!_enabled) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
NSDictionary *current = _snapshot();
|
|
198
|
+
if ([current isEqualToDictionary:_lastReported]) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
_lastReported = current;
|
|
202
|
+
_emit(current);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
@end
|
|
206
|
+
|
|
207
|
+
#if !TARGET_OS_OSX
|
|
208
|
+
static void ENRMCollectGestures(UIView *view, NSMutableArray<UIGestureRecognizer *> *into)
|
|
209
|
+
{
|
|
210
|
+
for (UIGestureRecognizer *recognizer in view.gestureRecognizers) {
|
|
211
|
+
[into addObject:recognizer];
|
|
212
|
+
}
|
|
213
|
+
for (UIView *subview in view.subviews) {
|
|
214
|
+
ENRMCollectGestures(subview, into);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
@implementation ENRMSelectionGestureTracker {
|
|
219
|
+
void (^_change)(void);
|
|
220
|
+
NSHashTable<UIGestureRecognizer *> *_gestures;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
- (instancetype)initWithChange:(void (^)(void))change
|
|
224
|
+
{
|
|
225
|
+
if (self = [super init]) {
|
|
226
|
+
_change = [change copy];
|
|
227
|
+
_gestures = [NSHashTable weakObjectsHashTable];
|
|
228
|
+
}
|
|
229
|
+
return self;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
- (void)dealloc
|
|
233
|
+
{
|
|
234
|
+
// Recognizers don't retain their targets.
|
|
235
|
+
for (UIGestureRecognizer *recognizer in _gestures) {
|
|
236
|
+
[recognizer removeTarget:self action:@selector(gestureChanged:)];
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
- (void)trackTextView:(UITextView *)textView
|
|
241
|
+
{
|
|
242
|
+
NSMutableArray<UIGestureRecognizer *> *all = [NSMutableArray array];
|
|
243
|
+
ENRMCollectGestures(textView, all);
|
|
244
|
+
for (UIGestureRecognizer *recognizer in all) {
|
|
245
|
+
if ([_gestures containsObject:recognizer]) {
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
if (recognizer == textView.panGestureRecognizer || recognizer == textView.pinchGestureRecognizer) {
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if ([recognizer isKindOfClass:[UITapGestureRecognizer class]]) {
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
[_gestures addObject:recognizer];
|
|
255
|
+
[recognizer addTarget:self action:@selector(gestureChanged:)];
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
- (void)reset
|
|
260
|
+
{
|
|
261
|
+
_adjusting = NO;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
- (void)gestureChanged:(UIGestureRecognizer *)recognizer
|
|
265
|
+
{
|
|
266
|
+
BOOL adjusting = NO;
|
|
267
|
+
for (UIGestureRecognizer *tracked in _gestures) {
|
|
268
|
+
UIGestureRecognizerState state = tracked.state;
|
|
269
|
+
if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged) {
|
|
270
|
+
adjusting = YES;
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (adjusting == _adjusting) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
_adjusting = adjusting;
|
|
278
|
+
_change();
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
@end
|
|
282
|
+
#endif
|
|
@@ -30,26 +30,32 @@ static inline void ENRMDetachLayoutManager(ENRMPlatformTextView *textView)
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
/// Turns a raw TextKit layout pass into the final measured size. Shared by
|
|
34
|
+
/// the view-backed path (`ENRMMeasureMarkdownText`) and the view-free path
|
|
35
|
+
/// (`ENRMMeasureMarkdownViewFree`) so both measure with one algorithm.
|
|
36
|
+
///
|
|
37
|
+
/// Steps, in order:
|
|
38
|
+
/// - Multiline pin: if the first line fragment doesn't span all glyphs the
|
|
39
|
+
/// text wrapped, and returning the tight usedRect width would let flexShrink
|
|
40
|
+
/// narrow the view below maxWidth, re-wrapping at the narrower width and
|
|
41
|
+
/// mismatching the measured height — so multiline content reports maxWidth,
|
|
42
|
+
/// while single-line content keeps its tight width for shrink-to-fit.
|
|
43
|
+
/// - Subtract the extra line fragment (iOS counts a trailing newline's empty
|
|
44
|
+
/// line fragment into usedRect).
|
|
45
|
+
/// - Add code-block padding when the last element is a code block, and the
|
|
46
|
+
/// trailing margin when enabled.
|
|
47
|
+
/// - Round up to the pixel grid of `scale` (pass `RCTScreenScale()` on main;
|
|
48
|
+
/// off-main callers must pass `LayoutContext::pointScaleFactor` instead —
|
|
49
|
+
/// `RCTScreenScale()` dispatch_syncs to main on first use, which the
|
|
50
|
+
/// measure path must never do, see issue #550).
|
|
51
|
+
static inline CGSize ENRMFinalizeMeasuredTextSize(ENRMTextLayoutResult layout, NSLayoutManager *layoutManager,
|
|
52
|
+
NSAttributedString *text, CGFloat maxWidth, StyleConfig *config,
|
|
53
|
+
BOOL allowTrailingMargin, CGFloat lastElementMarginBottom,
|
|
54
|
+
CGFloat scale)
|
|
35
55
|
{
|
|
36
|
-
NSAttributedString *text = ENRMGetAttributedText(textView);
|
|
37
|
-
if (text.length == 0) {
|
|
38
|
-
return CGSizeZero;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
ENRMTextLayoutResult layout = ENRMMeasureTextLayout(textView, maxWidth);
|
|
42
|
-
|
|
43
56
|
CGFloat measuredWidth = layout.usedRect.size.width;
|
|
44
57
|
CGFloat measuredHeight = layout.usedRect.size.height;
|
|
45
58
|
|
|
46
|
-
// Detect multiline content by checking if the layout produced more than one
|
|
47
|
-
// line fragment. When text wraps, returning the tight usedRect width lets
|
|
48
|
-
// flexShrink narrow the view below maxWidth, causing re-wrap at the narrower
|
|
49
|
-
// width and a height mismatch. Pin to maxWidth for multiline content so Yoga
|
|
50
|
-
// assigns the width the text was actually measured at. Single-line content
|
|
51
|
-
// keeps its tight width for shrink-to-fit behavior.
|
|
52
|
-
NSLayoutManager *layoutManager = textView.layoutManager;
|
|
53
59
|
NSUInteger glyphCount = [layoutManager numberOfGlyphs];
|
|
54
60
|
if (glyphCount > 0) {
|
|
55
61
|
NSRange firstLineRange;
|
|
@@ -71,8 +77,20 @@ static inline CGSize ENRMMeasureMarkdownText(ENRMPlatformTextView *textView, CGF
|
|
|
71
77
|
measuredHeight += lastElementMarginBottom;
|
|
72
78
|
}
|
|
73
79
|
|
|
74
|
-
CGFloat scale = RCTScreenScale();
|
|
75
80
|
return CGSizeMake(ceil(measuredWidth * scale) / scale, ceil(measuredHeight * scale) / scale);
|
|
76
81
|
}
|
|
77
82
|
|
|
83
|
+
static inline CGSize ENRMMeasureMarkdownText(ENRMPlatformTextView *textView, CGFloat maxWidth, StyleConfig *config,
|
|
84
|
+
BOOL allowTrailingMargin, CGFloat lastElementMarginBottom)
|
|
85
|
+
{
|
|
86
|
+
NSAttributedString *text = ENRMGetAttributedText(textView);
|
|
87
|
+
if (text.length == 0) {
|
|
88
|
+
return CGSizeZero;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
ENRMTextLayoutResult layout = ENRMMeasureTextLayout(textView, maxWidth);
|
|
92
|
+
return ENRMFinalizeMeasuredTextSize(layout, textView.layoutManager, text, maxWidth, config, allowTrailingMargin,
|
|
93
|
+
lastElementMarginBottom, RCTScreenScale());
|
|
94
|
+
}
|
|
95
|
+
|
|
78
96
|
NS_ASSUME_NONNULL_END
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#import "ContextMenuUtils.h"
|
|
2
|
+
#import "ENRMLinkChip.h"
|
|
2
3
|
#import "ENRMMenuAction.h"
|
|
3
4
|
#import "EditMenuUtils.h"
|
|
4
5
|
#import "PasteboardUtils.h"
|
|
@@ -19,7 +20,9 @@ NSMenu *_Nullable buildEditMenuForSelection(NSAttributedString *attributedText,
|
|
|
19
20
|
return menu;
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
|
|
23
|
+
// Link spacers only reserve layout space; keep them out of every copied flavor.
|
|
24
|
+
NSAttributedString *selectedText =
|
|
25
|
+
ENRMAttributedStringByRemovingLinkSpacers([attributedText attributedSubstringFromRange:range]);
|
|
23
26
|
NSString *markdown = markdownForRange(attributedText, range, cachedMarkdown);
|
|
24
27
|
NSArray<NSString *> *imageURLs = imageURLsInRange(attributedText, range);
|
|
25
28
|
|
|
@@ -9,6 +9,15 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
9
9
|
typedef struct {
|
|
10
10
|
BOOL copyAsMarkdown;
|
|
11
11
|
BOOL copyImageURL;
|
|
12
|
+
BOOL copyEnabled;
|
|
13
|
+
// Copy writes Markdown as plain text instead of rich text.
|
|
14
|
+
BOOL copyFormatMarkdown;
|
|
15
|
+
// Drop every system-provided item from the text selection menu.
|
|
16
|
+
BOOL systemItemsNone;
|
|
17
|
+
BOOL codeBlockCopyButton;
|
|
18
|
+
// Copy hands the selection to the owner (JS `onCopy`) instead of writing the
|
|
19
|
+
// pasteboard.
|
|
20
|
+
BOOL interceptCopy;
|
|
12
21
|
// The owner must keep these strings alive for the duration of the call (the
|
|
13
22
|
// view holds them in strong ivars).
|
|
14
23
|
__unsafe_unretained NSString *_Nullable copyLabel;
|
|
@@ -18,6 +27,10 @@ typedef struct {
|
|
|
18
27
|
__unsafe_unretained NSArray<NSString *> *_Nullable copyImageUrlPluralTemplates;
|
|
19
28
|
} ENRMSelectionMenuConfig;
|
|
20
29
|
|
|
30
|
+
/// Receives an intercepted Copy. `fullSelection` is whether the range spans the
|
|
31
|
+
/// whole attributed text, in which case `markdown` is the cached markdown.
|
|
32
|
+
typedef void (^ENRMCopyRequestHandler)(NSString *markdown, NSString *text, BOOL fullSelection);
|
|
33
|
+
|
|
21
34
|
/// Resolves the "Copy Image URL(s)" menu title for a given image count.
|
|
22
35
|
/// Uses the precomputed plural templates (indexed by count, 0..100) when present;
|
|
23
36
|
/// counts > 100 use the "other" form (copyImageUrlsLabel). Otherwise the
|
|
@@ -36,6 +49,13 @@ static inline NSString *ENRMResolveImageURLsTitle(ENRMSelectionMenuConfig config
|
|
|
36
49
|
return [titleTemplate stringByReplacingOccurrencesOfString:@"{count}" withString:[@(count) stringValue]];
|
|
37
50
|
}
|
|
38
51
|
|
|
52
|
+
/// Defaults matching the JS-side defaults, used until the first props update.
|
|
53
|
+
static inline ENRMSelectionMenuConfig ENRMDefaultSelectionMenuConfig(void)
|
|
54
|
+
{
|
|
55
|
+
return (ENRMSelectionMenuConfig){
|
|
56
|
+
.copyAsMarkdown = YES, .copyImageURL = YES, .copyEnabled = YES, .codeBlockCopyButton = YES};
|
|
57
|
+
}
|
|
58
|
+
|
|
39
59
|
#ifdef __cplusplus
|
|
40
60
|
|
|
41
61
|
/// Strong owners for the label strings in ENRMSelectionMenuConfig.
|
|
@@ -63,13 +83,18 @@ template <typename T> static inline ENRMSelectionMenuLabels ENRMParseSelectionMe
|
|
|
63
83
|
};
|
|
64
84
|
}
|
|
65
85
|
|
|
66
|
-
/// Builds an ENRMSelectionMenuConfig from pre-parsed labels and
|
|
67
|
-
|
|
68
|
-
|
|
86
|
+
/// Builds an ENRMSelectionMenuConfig from pre-parsed labels and the codegen struct's flags.
|
|
87
|
+
template <typename T>
|
|
88
|
+
static inline ENRMSelectionMenuConfig ENRMBuildSelectionMenuConfig(const ENRMSelectionMenuLabels &labels, const T &src)
|
|
69
89
|
{
|
|
70
90
|
return (ENRMSelectionMenuConfig){
|
|
71
|
-
.copyAsMarkdown = copyAsMarkdown,
|
|
72
|
-
.copyImageURL = copyImageUrl,
|
|
91
|
+
.copyAsMarkdown = src.copyAsMarkdown,
|
|
92
|
+
.copyImageURL = src.copyImageUrl,
|
|
93
|
+
.copyEnabled = src.copyEnabled,
|
|
94
|
+
.copyFormatMarkdown = src.copyFormatMarkdown,
|
|
95
|
+
.systemItemsNone = src.systemItemsNone,
|
|
96
|
+
.codeBlockCopyButton = src.codeBlockCopyButton,
|
|
97
|
+
.interceptCopy = src.interceptCopy,
|
|
73
98
|
.copyLabel = labels.copyLabel,
|
|
74
99
|
.copyAsMarkdownLabel = labels.copyAsMarkdownLabel,
|
|
75
100
|
.copyImageUrlLabel = labels.copyImageUrlLabel,
|
|
@@ -90,7 +115,11 @@ extern "C" {
|
|
|
90
115
|
UIMenu *buildEditMenuForSelection(NSAttributedString *attributedText, NSRange range, NSString *_Nullable cachedMarkdown,
|
|
91
116
|
StyleConfig *styleConfig, NSArray<UIMenuElement *> *suggestedActions,
|
|
92
117
|
NSArray<UIAction *> *_Nullable customActions,
|
|
93
|
-
ENRMSelectionMenuConfig selectionMenuConfig
|
|
118
|
+
ENRMSelectionMenuConfig selectionMenuConfig,
|
|
119
|
+
ENRMCopyRequestHandler _Nullable onCopyRequest) API_AVAILABLE(ios(16.0));
|
|
120
|
+
|
|
121
|
+
void ENRMSelectRangeAndPresentEditMenu(UITextView *textView, NSRange range);
|
|
122
|
+
void ENRMDismissSelectionEditMenuIfMoved(UITextView *textView);
|
|
94
123
|
#else
|
|
95
124
|
NSMenu *_Nullable buildEditMenuForSelection(NSAttributedString *attributedText, NSRange range,
|
|
96
125
|
NSString *_Nullable cachedMarkdown, StyleConfig *styleConfig,
|