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
|
@@ -14,9 +14,33 @@
|
|
|
14
14
|
NS_ASSUME_NONNULL_BEGIN
|
|
15
15
|
|
|
16
16
|
@protocol RCTEnrichedMarkdownViewProtocol <NSObject>
|
|
17
|
-
|
|
17
|
+
- (void)clearSelection;
|
|
18
18
|
@end
|
|
19
19
|
|
|
20
|
+
RCT_EXTERN inline void RCTEnrichedMarkdownHandleCommand(
|
|
21
|
+
id<RCTEnrichedMarkdownViewProtocol> componentView,
|
|
22
|
+
NSString const *commandName,
|
|
23
|
+
NSArray const *args)
|
|
24
|
+
{
|
|
25
|
+
if ([commandName isEqualToString:@"clearSelection"]) {
|
|
26
|
+
#if RCT_DEBUG
|
|
27
|
+
if ([args count] != 0) {
|
|
28
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdown", commandName, (int)[args count], 0);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
#endif
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
[componentView clearSelection];
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
#if RCT_DEBUG
|
|
40
|
+
RCTLogError(@"%@ received command %@, which is not a supported command.", @"EnrichedMarkdown", commandName);
|
|
41
|
+
#endif
|
|
42
|
+
}
|
|
43
|
+
|
|
20
44
|
@protocol RCTEnrichedMarkdownTextInputViewProtocol <NSObject>
|
|
21
45
|
- (void)focus;
|
|
22
46
|
- (void)blur;
|
|
@@ -27,8 +51,14 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
27
51
|
- (void)toggleUnderline;
|
|
28
52
|
- (void)toggleStrikethrough;
|
|
29
53
|
- (void)toggleSpoiler;
|
|
54
|
+
- (void)toggleHeading:(NSInteger)level;
|
|
55
|
+
- (void)toggleUnorderedList;
|
|
56
|
+
- (void)toggleOrderedList;
|
|
57
|
+
- (void)indentList;
|
|
58
|
+
- (void)outdentList;
|
|
30
59
|
- (void)setLink:(NSString *)url;
|
|
31
60
|
- (void)insertLink:(NSString *)text url:(NSString *)url;
|
|
61
|
+
- (void)insertText:(NSString *)text;
|
|
32
62
|
- (void)insertMention:(NSString *)displayText url:(NSString *)url;
|
|
33
63
|
- (void)startMention:(NSString *)indicator;
|
|
34
64
|
- (void)removeLink;
|
|
@@ -36,6 +66,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
36
66
|
- (void)updateMath:(NSInteger)start latex:(NSString *)latex displayMode:(BOOL)displayMode;
|
|
37
67
|
- (void)removeMath:(NSInteger)start;
|
|
38
68
|
- (void)copyToClipboard;
|
|
69
|
+
- (void)resolvePaste:(NSString *)text markdown:(NSString *)markdown;
|
|
39
70
|
- (void)requestMarkdown:(NSInteger)requestId;
|
|
40
71
|
- (void)requestCaretRect:(NSInteger)requestId;
|
|
41
72
|
@end
|
|
@@ -191,6 +222,82 @@ if ([commandName isEqualToString:@"toggleSpoiler"]) {
|
|
|
191
222
|
return;
|
|
192
223
|
}
|
|
193
224
|
|
|
225
|
+
if ([commandName isEqualToString:@"toggleHeading"]) {
|
|
226
|
+
#if RCT_DEBUG
|
|
227
|
+
if ([args count] != 1) {
|
|
228
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 1);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
#endif
|
|
232
|
+
|
|
233
|
+
NSObject *arg0 = args[0];
|
|
234
|
+
#if RCT_DEBUG
|
|
235
|
+
if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSNumber class], @"number", @"EnrichedMarkdownTextInput", commandName, @"1st")) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
#endif
|
|
239
|
+
NSInteger level = [(NSNumber *)arg0 intValue];
|
|
240
|
+
|
|
241
|
+
[componentView toggleHeading:level];
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if ([commandName isEqualToString:@"toggleUnorderedList"]) {
|
|
246
|
+
#if RCT_DEBUG
|
|
247
|
+
if ([args count] != 0) {
|
|
248
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 0);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
#endif
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
[componentView toggleUnorderedList];
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
if ([commandName isEqualToString:@"toggleOrderedList"]) {
|
|
260
|
+
#if RCT_DEBUG
|
|
261
|
+
if ([args count] != 0) {
|
|
262
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 0);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
#endif
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
[componentView toggleOrderedList];
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if ([commandName isEqualToString:@"indentList"]) {
|
|
274
|
+
#if RCT_DEBUG
|
|
275
|
+
if ([args count] != 0) {
|
|
276
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 0);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
#endif
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
[componentView indentList];
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if ([commandName isEqualToString:@"outdentList"]) {
|
|
288
|
+
#if RCT_DEBUG
|
|
289
|
+
if ([args count] != 0) {
|
|
290
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 0);
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
#endif
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
[componentView outdentList];
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
|
|
194
301
|
if ([commandName isEqualToString:@"setLink"]) {
|
|
195
302
|
#if RCT_DEBUG
|
|
196
303
|
if ([args count] != 1) {
|
|
@@ -239,6 +346,26 @@ NSObject *arg1 = args[1];
|
|
|
239
346
|
return;
|
|
240
347
|
}
|
|
241
348
|
|
|
349
|
+
if ([commandName isEqualToString:@"insertText"]) {
|
|
350
|
+
#if RCT_DEBUG
|
|
351
|
+
if ([args count] != 1) {
|
|
352
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 1);
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
#endif
|
|
356
|
+
|
|
357
|
+
NSObject *arg0 = args[0];
|
|
358
|
+
#if RCT_DEBUG
|
|
359
|
+
if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSString class], @"string", @"EnrichedMarkdownTextInput", commandName, @"1st")) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
#endif
|
|
363
|
+
NSString * text = (NSString *)arg0;
|
|
364
|
+
|
|
365
|
+
[componentView insertText:text];
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
|
|
242
369
|
if ([commandName isEqualToString:@"insertMention"]) {
|
|
243
370
|
#if RCT_DEBUG
|
|
244
371
|
if ([args count] != 2) {
|
|
@@ -399,6 +526,34 @@ if ([commandName isEqualToString:@"copyToClipboard"]) {
|
|
|
399
526
|
return;
|
|
400
527
|
}
|
|
401
528
|
|
|
529
|
+
if ([commandName isEqualToString:@"resolvePaste"]) {
|
|
530
|
+
#if RCT_DEBUG
|
|
531
|
+
if ([args count] != 2) {
|
|
532
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 2);
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
#endif
|
|
536
|
+
|
|
537
|
+
NSObject *arg0 = args[0];
|
|
538
|
+
#if RCT_DEBUG
|
|
539
|
+
if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSString class], @"string", @"EnrichedMarkdownTextInput", commandName, @"1st")) {
|
|
540
|
+
return;
|
|
541
|
+
}
|
|
542
|
+
#endif
|
|
543
|
+
NSString * text = (NSString *)arg0;
|
|
544
|
+
|
|
545
|
+
NSObject *arg1 = args[1];
|
|
546
|
+
#if RCT_DEBUG
|
|
547
|
+
if (!RCTValidateTypeOfViewCommandArgument(arg1, [NSString class], @"string", @"EnrichedMarkdownTextInput", commandName, @"2nd")) {
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
#endif
|
|
551
|
+
NSString * markdown = (NSString *)arg1;
|
|
552
|
+
|
|
553
|
+
[componentView resolvePaste:text markdown:markdown];
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
|
|
402
557
|
if ([commandName isEqualToString:@"requestMarkdown"]) {
|
|
403
558
|
#if RCT_DEBUG
|
|
404
559
|
if ([args count] != 1) {
|
|
@@ -445,7 +600,31 @@ if ([commandName isEqualToString:@"requestCaretRect"]) {
|
|
|
445
600
|
}
|
|
446
601
|
|
|
447
602
|
@protocol RCTEnrichedMarkdownTextViewProtocol <NSObject>
|
|
448
|
-
|
|
603
|
+
- (void)clearSelection;
|
|
449
604
|
@end
|
|
450
605
|
|
|
606
|
+
RCT_EXTERN inline void RCTEnrichedMarkdownTextHandleCommand(
|
|
607
|
+
id<RCTEnrichedMarkdownTextViewProtocol> componentView,
|
|
608
|
+
NSString const *commandName,
|
|
609
|
+
NSArray const *args)
|
|
610
|
+
{
|
|
611
|
+
if ([commandName isEqualToString:@"clearSelection"]) {
|
|
612
|
+
#if RCT_DEBUG
|
|
613
|
+
if ([args count] != 0) {
|
|
614
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownText", commandName, (int)[args count], 0);
|
|
615
|
+
return;
|
|
616
|
+
}
|
|
617
|
+
#endif
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
[componentView clearSelection];
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
#if RCT_DEBUG
|
|
626
|
+
RCTLogError(@"%@ received command %@, which is not a supported command.", @"EnrichedMarkdownText", commandName);
|
|
627
|
+
#endif
|
|
628
|
+
}
|
|
629
|
+
|
|
451
630
|
NS_ASSUME_NONNULL_END
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#import "ENRMFormattingStore.h"
|
|
4
|
+
#import "ENRMLinkCoordinator.h"
|
|
4
5
|
#import "ENRMLinkRegexConfig.h"
|
|
5
6
|
#import "ENRMTextDetector.h"
|
|
6
7
|
#import <Foundation/Foundation.h>
|
|
@@ -11,7 +12,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
11
12
|
|
|
12
13
|
typedef void (^ENRMAutoLinkCallback)(NSString *text, NSString *url, NSRange range);
|
|
13
14
|
|
|
14
|
-
@interface ENRMAutoLinkDetector : NSObject <ENRMTextDetector>
|
|
15
|
+
@interface ENRMAutoLinkDetector : NSObject <ENRMTextDetector, ENRMAutoLinkDetecting>
|
|
15
16
|
|
|
16
17
|
- (instancetype)initWithTextStorage:(NSTextStorage *)textStorage
|
|
17
18
|
formattingStore:(ENRMFormattingStore *)store
|
|
@@ -34,9 +34,19 @@ static NSAttributedStringKey const ENRMAutomaticLinkAttributeName = @"ENRMAutoma
|
|
|
34
34
|
|
|
35
35
|
- (void)processWord:(ENRMWordResult *)wordResult
|
|
36
36
|
{
|
|
37
|
-
|
|
37
|
+
NSRange matchedRange = NSMakeRange(NSNotFound, 0);
|
|
38
|
+
NSString *detectedUrl = [self detectNewLinkAtRange:wordResult.range
|
|
39
|
+
inText:wordResult.word
|
|
40
|
+
matchedRange:&matchedRange];
|
|
38
41
|
if (detectedUrl != nil && _onLinkDetected != nil) {
|
|
39
|
-
|
|
42
|
+
// Emit the actual linked slice, not the whole whitespace token — surrounding
|
|
43
|
+
// punctuation is not part of the link.
|
|
44
|
+
BOOL hasSlice = matchedRange.location != NSNotFound;
|
|
45
|
+
NSString *matchedText = hasSlice ? [wordResult.word substringWithRange:matchedRange] : wordResult.word;
|
|
46
|
+
NSRange absoluteRange = hasSlice
|
|
47
|
+
? NSMakeRange(wordResult.range.location + matchedRange.location, matchedRange.length)
|
|
48
|
+
: wordResult.range;
|
|
49
|
+
_onLinkDetected(matchedText, detectedUrl, absoluteRange);
|
|
40
50
|
}
|
|
41
51
|
}
|
|
42
52
|
|
|
@@ -92,8 +102,14 @@ static NSAttributedStringKey const ENRMAutomaticLinkAttributeName = @"ENRMAutoma
|
|
|
92
102
|
|
|
93
103
|
#pragma mark - Link matching
|
|
94
104
|
|
|
95
|
-
- (nullable NSString *)detectNewLinkAtRange:(NSRange)wordRange
|
|
105
|
+
- (nullable NSString *)detectNewLinkAtRange:(NSRange)wordRange
|
|
106
|
+
inText:(NSString *)word
|
|
107
|
+
matchedRange:(NSRange *)outMatchedRange
|
|
96
108
|
{
|
|
109
|
+
if (outMatchedRange != NULL) {
|
|
110
|
+
*outMatchedRange = NSMakeRange(NSNotFound, 0);
|
|
111
|
+
}
|
|
112
|
+
|
|
97
113
|
if (_regexConfig != nil && _regexConfig.isDisabled) {
|
|
98
114
|
return nil;
|
|
99
115
|
}
|
|
@@ -107,61 +123,83 @@ static NSAttributedStringKey const ENRMAutomaticLinkAttributeName = @"ENRMAutoma
|
|
|
107
123
|
return nil;
|
|
108
124
|
}
|
|
109
125
|
|
|
126
|
+
// Tokens carrying markdown link syntax (e.g. "[label](url)") belong to the
|
|
127
|
+
// parser, not the auto-linker. Auto-linking them re-wraps the destination and
|
|
128
|
+
// yields a corrupted URL like "https://[label](url)" on serialize.
|
|
129
|
+
if ([word hasPrefix:@"["] || [word rangeOfString:@"]("].location != NSNotFound) {
|
|
130
|
+
[self clearAutoLinkInRange:wordRange];
|
|
131
|
+
return nil;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
NSRange localMatch = NSMakeRange(NSNotFound, 0);
|
|
135
|
+
NSString *matchedUrl = [self tryMatchWord:word matchedRange:&localMatch];
|
|
136
|
+
|
|
137
|
+
if (matchedUrl == nil || localMatch.location == NSNotFound) {
|
|
138
|
+
[self clearAutoLinkInRange:wordRange];
|
|
139
|
+
return nil;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
NSRange matchRange = NSMakeRange(wordRange.location + localMatch.location, localMatch.length);
|
|
143
|
+
|
|
144
|
+
// A manual link overlapping the matched slice takes precedence — test the
|
|
145
|
+
// whole slice, not just its first character.
|
|
110
146
|
ENRMFormattingStore *store = _formattingStore;
|
|
111
|
-
if (store != nil) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
return nil;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
NSString *matchedUrl = [self tryMatchWord:word];
|
|
119
|
-
|
|
120
|
-
if (matchedUrl != nil) {
|
|
121
|
-
NSRange effectiveRange;
|
|
122
|
-
id existing = [textStorage attribute:ENRMAutomaticLinkAttributeName
|
|
123
|
-
atIndex:wordRange.location
|
|
124
|
-
effectiveRange:&effectiveRange];
|
|
125
|
-
BOOL alreadyApplied = [matchedUrl isEqual:existing] && NSEqualRanges(effectiveRange, wordRange);
|
|
126
|
-
|
|
127
|
-
if (!alreadyApplied) {
|
|
128
|
-
[textStorage beginEditing];
|
|
129
|
-
[textStorage addAttribute:ENRMAutomaticLinkAttributeName value:matchedUrl range:wordRange];
|
|
130
|
-
[self applyVisualStylingToRange:wordRange];
|
|
131
|
-
[textStorage endEditing];
|
|
132
|
-
}
|
|
133
|
-
} else {
|
|
134
|
-
id existing = [textStorage attribute:ENRMAutomaticLinkAttributeName atIndex:wordRange.location effectiveRange:nil];
|
|
135
|
-
if (existing != nil) {
|
|
136
|
-
[textStorage beginEditing];
|
|
137
|
-
[textStorage removeAttribute:ENRMAutomaticLinkAttributeName range:wordRange];
|
|
138
|
-
[textStorage endEditing];
|
|
139
|
-
}
|
|
147
|
+
if (store != nil && [store isStyleActive:ENRMInputStyleTypeLink inRange:matchRange]) {
|
|
148
|
+
[self clearAutoLinkInRange:wordRange];
|
|
149
|
+
return nil;
|
|
140
150
|
}
|
|
141
151
|
|
|
152
|
+
NSRange effectiveRange;
|
|
153
|
+
id existing = [textStorage attribute:ENRMAutomaticLinkAttributeName
|
|
154
|
+
atIndex:matchRange.location
|
|
155
|
+
effectiveRange:&effectiveRange];
|
|
156
|
+
BOOL alreadyApplied = [matchedUrl isEqual:existing] && NSEqualRanges(effectiveRange, matchRange);
|
|
157
|
+
|
|
158
|
+
if (!alreadyApplied) {
|
|
159
|
+
[textStorage beginEditing];
|
|
160
|
+
[textStorage removeAttribute:ENRMAutomaticLinkAttributeName range:wordRange];
|
|
161
|
+
[textStorage addAttribute:ENRMAutomaticLinkAttributeName value:matchedUrl range:matchRange];
|
|
162
|
+
[self applyVisualStylingToRange:matchRange];
|
|
163
|
+
[textStorage endEditing];
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (outMatchedRange != NULL) {
|
|
167
|
+
*outMatchedRange = localMatch;
|
|
168
|
+
}
|
|
142
169
|
return matchedUrl;
|
|
143
170
|
}
|
|
144
171
|
|
|
145
|
-
- (nullable NSString *)tryMatchWord:(NSString *)word
|
|
172
|
+
- (nullable NSString *)tryMatchWord:(NSString *)word matchedRange:(NSRange *)outRange
|
|
146
173
|
{
|
|
174
|
+
if (outRange != NULL) {
|
|
175
|
+
*outRange = NSMakeRange(NSNotFound, 0);
|
|
176
|
+
}
|
|
177
|
+
|
|
147
178
|
if (word.length == 0) {
|
|
148
179
|
return nil;
|
|
149
180
|
}
|
|
150
181
|
|
|
151
|
-
NSRange
|
|
182
|
+
NSRange fullRange = NSMakeRange(0, word.length);
|
|
152
183
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
184
|
+
// A custom regex describes the whole-token contract, so keep whole-word
|
|
185
|
+
// semantics for it. The default detector extracts just the matched URL slice
|
|
186
|
+
// so surrounding punctuation isn't swallowed into the link.
|
|
187
|
+
BOOL customExact = _regexConfig != nil && !_regexConfig.isDefault && _regexConfig.parsedRegex != nil;
|
|
188
|
+
NSRegularExpression *regex = customExact ? _regexConfig.parsedRegex : [ENRMAutoLinkDetector defaultRegex];
|
|
189
|
+
if (regex == nil) {
|
|
157
190
|
return nil;
|
|
158
191
|
}
|
|
159
192
|
|
|
160
|
-
|
|
161
|
-
|
|
193
|
+
NSTextCheckingResult *match = [regex firstMatchInString:word options:0 range:fullRange];
|
|
194
|
+
if (match == nil || match.range.location == NSNotFound) {
|
|
195
|
+
return nil;
|
|
162
196
|
}
|
|
163
197
|
|
|
164
|
-
|
|
198
|
+
NSRange matchRange = customExact ? fullRange : match.range;
|
|
199
|
+
if (outRange != NULL) {
|
|
200
|
+
*outRange = matchRange;
|
|
201
|
+
}
|
|
202
|
+
return [ENRMAutoLinkDetector normalizeUrl:[word substringWithRange:matchRange]];
|
|
165
203
|
}
|
|
166
204
|
|
|
167
205
|
+ (NSString *)normalizeUrl:(NSString *)url
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#import "ENRMInputBlockType.h"
|
|
4
|
+
#import <Foundation/Foundation.h>
|
|
5
|
+
|
|
6
|
+
@class ENRMBlockStore;
|
|
7
|
+
@class ENRMBlockRange;
|
|
8
|
+
|
|
9
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
10
|
+
|
|
11
|
+
/// Result of a depth-change operation.
|
|
12
|
+
typedef NS_ENUM(NSInteger, ENRMDepthChangeResult) {
|
|
13
|
+
ENRMDepthChangeResultChanged,
|
|
14
|
+
ENRMDepthChangeResultStartedList,
|
|
15
|
+
ENRMDepthChangeResultExitedList,
|
|
16
|
+
ENRMDepthChangeResultNoOp,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/// Encapsulates block-editing operations: toggling block types, adjusting list
|
|
20
|
+
/// depth, and querying the block at a given position. The view delegates here
|
|
21
|
+
/// and applies UI-level consequences (formatting, anchor sync, typing
|
|
22
|
+
/// attributes) based on the returned result.
|
|
23
|
+
///
|
|
24
|
+
/// All mutating methods normalize stores to line bounds before returning, so the
|
|
25
|
+
/// caller can re-stamp block spans immediately.
|
|
26
|
+
@interface ENRMBlockEditCoordinator : NSObject
|
|
27
|
+
|
|
28
|
+
- (instancetype)initWithBlockStore:(ENRMBlockStore *)blockStore;
|
|
29
|
+
|
|
30
|
+
// ── Queries ──────────────────────────────────────────────────────────
|
|
31
|
+
|
|
32
|
+
/// The block owning the paragraph at `position`, or nil.
|
|
33
|
+
- (nullable ENRMBlockRange *)blockAtPosition:(NSUInteger)position inText:(NSString *)text;
|
|
34
|
+
|
|
35
|
+
/// The list-item block at `position`, or nil if the paragraph is not a list item.
|
|
36
|
+
- (nullable ENRMBlockRange *)listBlockAtPosition:(NSUInteger)position inText:(NSString *)text;
|
|
37
|
+
|
|
38
|
+
/// Heading level (1-6) at `position`, or 0 for non-heading paragraphs.
|
|
39
|
+
- (NSInteger)headingLevelAtPosition:(NSUInteger)position inText:(NSString *)text;
|
|
40
|
+
|
|
41
|
+
/// Whether the paragraph at `position` is a list item of `type`, and its depth.
|
|
42
|
+
- (BOOL)listStateOfType:(ENRMInputBlockType)type
|
|
43
|
+
atPosition:(NSUInteger)position
|
|
44
|
+
inText:(NSString *)text
|
|
45
|
+
depth:(nullable NSInteger *)outDepth;
|
|
46
|
+
|
|
47
|
+
// ── Mutations ────────────────────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
/// Toggles `type` at `level` on the paragraphs the selection touches.
|
|
50
|
+
/// Returns YES when the block was already active (i.e. it was turned off).
|
|
51
|
+
- (BOOL)toggleBlockType:(ENRMInputBlockType)type
|
|
52
|
+
level:(NSInteger)level
|
|
53
|
+
selectionRange:(NSRange)selection
|
|
54
|
+
inText:(NSString *)text;
|
|
55
|
+
|
|
56
|
+
/// Toggles a list of `type` on the selection.
|
|
57
|
+
/// Returns YES when the list was turned off.
|
|
58
|
+
- (BOOL)toggleListType:(ENRMInputBlockType)type
|
|
59
|
+
cursorPosition:(NSUInteger)cursorPos
|
|
60
|
+
selectionRange:(NSRange)selection
|
|
61
|
+
inText:(NSString *)text;
|
|
62
|
+
|
|
63
|
+
/// Adjusts list depth by `delta` on the selected lines.
|
|
64
|
+
- (ENRMDepthChangeResult)changeDepthBy:(NSInteger)delta
|
|
65
|
+
cursorPosition:(NSUInteger)cursorPos
|
|
66
|
+
selectionRange:(NSRange)selection
|
|
67
|
+
inText:(NSString *)text;
|
|
68
|
+
|
|
69
|
+
@end
|
|
70
|
+
|
|
71
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
#import "ENRMBlockEditCoordinator.h"
|
|
2
|
+
#import "ENRMBlockRange.h"
|
|
3
|
+
#import "ENRMBlockStore.h"
|
|
4
|
+
|
|
5
|
+
@implementation ENRMBlockEditCoordinator {
|
|
6
|
+
ENRMBlockStore *_blockStore;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
- (instancetype)initWithBlockStore:(ENRMBlockStore *)blockStore
|
|
10
|
+
{
|
|
11
|
+
self = [super init];
|
|
12
|
+
if (self) {
|
|
13
|
+
_blockStore = blockStore;
|
|
14
|
+
}
|
|
15
|
+
return self;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// ── Queries ──────────────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
- (nullable ENRMBlockRange *)blockAtPosition:(NSUInteger)position inText:(NSString *)text
|
|
21
|
+
{
|
|
22
|
+
if (position > text.length) {
|
|
23
|
+
return nil;
|
|
24
|
+
}
|
|
25
|
+
NSRange paragraph = [text paragraphRangeForRange:NSMakeRange(position, 0)];
|
|
26
|
+
return [_blockStore blockStartingAtLocation:paragraph.location];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
- (nullable ENRMBlockRange *)listBlockAtPosition:(NSUInteger)position inText:(NSString *)text
|
|
30
|
+
{
|
|
31
|
+
ENRMBlockRange *block = [self blockAtPosition:position inText:text];
|
|
32
|
+
return (block != nil && ENRMBlockTypeIsListItem(block.type)) ? block : nil;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
- (NSInteger)headingLevelAtPosition:(NSUInteger)position inText:(NSString *)text
|
|
36
|
+
{
|
|
37
|
+
ENRMBlockRange *block = [self blockAtPosition:position inText:text];
|
|
38
|
+
return block != nil ? ENRMHeadingLevelForBlockType(block.type) : 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
- (BOOL)listStateOfType:(ENRMInputBlockType)type
|
|
42
|
+
atPosition:(NSUInteger)position
|
|
43
|
+
inText:(NSString *)text
|
|
44
|
+
depth:(nullable NSInteger *)outDepth
|
|
45
|
+
{
|
|
46
|
+
ENRMBlockRange *block = [self listBlockAtPosition:position inText:text];
|
|
47
|
+
BOOL match = block != nil && block.type == type;
|
|
48
|
+
if (outDepth) {
|
|
49
|
+
*outDepth = match ? block.level : 0;
|
|
50
|
+
}
|
|
51
|
+
return match;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ── Mutations ────────────────────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
- (BOOL)toggleBlockType:(ENRMInputBlockType)type
|
|
57
|
+
level:(NSInteger)level
|
|
58
|
+
selectionRange:(NSRange)selection
|
|
59
|
+
inText:(NSString *)text
|
|
60
|
+
{
|
|
61
|
+
NSRange paragraphRange = [text paragraphRangeForRange:selection];
|
|
62
|
+
|
|
63
|
+
ENRMBlockRange *current = [_blockStore blockStartingAtLocation:paragraphRange.location];
|
|
64
|
+
BOOL alreadyActive = current != nil && current.type == type;
|
|
65
|
+
|
|
66
|
+
if (alreadyActive) {
|
|
67
|
+
[_blockStore removeBlockInParagraphRange:paragraphRange inText:text];
|
|
68
|
+
} else if (paragraphRange.length == 0) {
|
|
69
|
+
NSInteger resolvedLevel = level;
|
|
70
|
+
if (ENRMBlockTypeIsListItem(type) && current != nil && ENRMBlockTypeIsListItem(current.type)) {
|
|
71
|
+
resolvedLevel = current.level;
|
|
72
|
+
}
|
|
73
|
+
[_blockStore setBlockType:type level:resolvedLevel forParagraphRange:paragraphRange inText:text];
|
|
74
|
+
} else {
|
|
75
|
+
[text
|
|
76
|
+
enumerateSubstringsInRange:paragraphRange
|
|
77
|
+
options:NSStringEnumerationByParagraphs | NSStringEnumerationSubstringNotRequired
|
|
78
|
+
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
|
|
79
|
+
NSInteger paragraphLevel = level;
|
|
80
|
+
if (ENRMBlockTypeIsListItem(type)) {
|
|
81
|
+
ENRMBlockRange *existing = [self listBlockAtPosition:substringRange.location inText:text];
|
|
82
|
+
if (existing != nil) {
|
|
83
|
+
paragraphLevel = existing.level;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
[self->_blockStore setBlockType:type
|
|
87
|
+
level:paragraphLevel
|
|
88
|
+
forParagraphRange:substringRange
|
|
89
|
+
inText:text];
|
|
90
|
+
}];
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
[_blockStore normalizeToLineBoundsInText:text];
|
|
94
|
+
return alreadyActive;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
- (BOOL)toggleListType:(ENRMInputBlockType)type
|
|
98
|
+
cursorPosition:(NSUInteger)cursorPos
|
|
99
|
+
selectionRange:(NSRange)selection
|
|
100
|
+
inText:(NSString *)text
|
|
101
|
+
{
|
|
102
|
+
ENRMBlockRange *cursorBlock = [self listBlockAtPosition:cursorPos inText:text];
|
|
103
|
+
BOOL turningOff = cursorBlock != nil && cursorBlock.type == type;
|
|
104
|
+
NSRange paragraphRange = [text paragraphRangeForRange:selection];
|
|
105
|
+
|
|
106
|
+
if (turningOff) {
|
|
107
|
+
if (paragraphRange.length == 0) {
|
|
108
|
+
[_blockStore removeBlockInParagraphRange:paragraphRange inText:text];
|
|
109
|
+
} else {
|
|
110
|
+
[text enumerateSubstringsInRange:paragraphRange
|
|
111
|
+
options:NSStringEnumerationByParagraphs | NSStringEnumerationSubstringNotRequired
|
|
112
|
+
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange,
|
|
113
|
+
BOOL *stop) {
|
|
114
|
+
[self->_blockStore removeBlockInParagraphRange:substringRange inText:text];
|
|
115
|
+
}];
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
if (paragraphRange.length == 0) {
|
|
119
|
+
NSInteger existingLevel = 0;
|
|
120
|
+
ENRMBlockRange *existing = [self listBlockAtPosition:paragraphRange.location inText:text];
|
|
121
|
+
if (existing != nil) {
|
|
122
|
+
existingLevel = existing.level;
|
|
123
|
+
}
|
|
124
|
+
[_blockStore setBlockType:type level:existingLevel forParagraphRange:paragraphRange inText:text];
|
|
125
|
+
} else {
|
|
126
|
+
[text enumerateSubstringsInRange:paragraphRange
|
|
127
|
+
options:NSStringEnumerationByParagraphs | NSStringEnumerationSubstringNotRequired
|
|
128
|
+
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange,
|
|
129
|
+
BOOL *stop) {
|
|
130
|
+
NSInteger existingLevel = 0;
|
|
131
|
+
ENRMBlockRange *existing = [self listBlockAtPosition:substringRange.location inText:text];
|
|
132
|
+
if (existing != nil) {
|
|
133
|
+
existingLevel = existing.level;
|
|
134
|
+
}
|
|
135
|
+
[self->_blockStore setBlockType:type
|
|
136
|
+
level:existingLevel
|
|
137
|
+
forParagraphRange:substringRange
|
|
138
|
+
inText:text];
|
|
139
|
+
}];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
[_blockStore normalizeToLineBoundsInText:text];
|
|
144
|
+
return turningOff;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
- (ENRMDepthChangeResult)changeDepthBy:(NSInteger)delta
|
|
148
|
+
cursorPosition:(NSUInteger)cursorPos
|
|
149
|
+
selectionRange:(NSRange)selection
|
|
150
|
+
inText:(NSString *)text
|
|
151
|
+
{
|
|
152
|
+
ENRMBlockRange *cursorBlock = [self listBlockAtPosition:cursorPos inText:text];
|
|
153
|
+
if (cursorBlock == nil) {
|
|
154
|
+
if (delta > 0 && [self headingLevelAtPosition:cursorPos inText:text] == 0) {
|
|
155
|
+
[self toggleListType:ENRMInputBlockTypeUnorderedListItem
|
|
156
|
+
cursorPosition:cursorPos
|
|
157
|
+
selectionRange:selection
|
|
158
|
+
inText:text];
|
|
159
|
+
return ENRMDepthChangeResultStartedList;
|
|
160
|
+
}
|
|
161
|
+
return ENRMDepthChangeResultNoOp;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (delta < 0 && cursorBlock.level == 0) {
|
|
165
|
+
[self toggleListType:cursorBlock.type cursorPosition:cursorPos selectionRange:selection inText:text];
|
|
166
|
+
return ENRMDepthChangeResultExitedList;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
NSRange paragraphRange = [text paragraphRangeForRange:selection];
|
|
170
|
+
|
|
171
|
+
if (paragraphRange.length == 0) {
|
|
172
|
+
NSInteger newDepth = MIN(MAX(cursorBlock.level + delta, (NSInteger)0), kENRMMaxListDepth);
|
|
173
|
+
[_blockStore setBlockType:cursorBlock.type level:newDepth forParagraphRange:paragraphRange inText:text];
|
|
174
|
+
} else {
|
|
175
|
+
[text
|
|
176
|
+
enumerateSubstringsInRange:paragraphRange
|
|
177
|
+
options:NSStringEnumerationByParagraphs | NSStringEnumerationSubstringNotRequired
|
|
178
|
+
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
|
|
179
|
+
ENRMBlockRange *block = [self listBlockAtPosition:substringRange.location inText:text];
|
|
180
|
+
if (block == nil) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
NSInteger newDepth = MIN(MAX(block.level + delta, (NSInteger)0), kENRMMaxListDepth);
|
|
184
|
+
[self->_blockStore setBlockType:block.type
|
|
185
|
+
level:newDepth
|
|
186
|
+
forParagraphRange:substringRange
|
|
187
|
+
inText:text];
|
|
188
|
+
}];
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
[_blockStore normalizeToLineBoundsInText:text];
|
|
192
|
+
return ENRMDepthChangeResultChanged;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
@end
|