react-native-enriched-markdown-scaffold 0.7.4-scaffold.8 → 1.0.2-scaffold.1
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 +191 -1
- package/android/consumer-rules.pro +1 -1
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerDelegate.java +9 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerInterface.java +3 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerDelegate.java +27 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerInterface.java +9 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +9 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +3 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +75 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +63 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +40 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +839 -23
- 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 +175 -11
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownInternalText.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownManager.kt +50 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +48 -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 +42 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +82 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/events/CopyPressEvent.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager.kt +62 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +911 -460
- 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 +101 -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/BlockSyntaxSentinel.kt +69 -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 +180 -27
- 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 +7 -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/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 +30 -27
- 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 +27 -3
- 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/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/ListStyle.kt +4 -1
- 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 +33 -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 +20 -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/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/LinkLongPressMovementMethod.kt +58 -27
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionActionMode.kt +19 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +388 -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 +32 -5
- 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 +7 -2
- package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathChipSpan.kt +1 -1
- package/android/src/math/java/com/swmansion/enriched/markdown/views/MathContainerView.kt +2 -0
- 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 +231 -8
- package/docs/BREAKING_CHANGES.md +129 -0
- package/docs/CODE_HIGHLIGHT.md +133 -0
- package/docs/COPY_OPTIONS.md +21 -3
- package/docs/ELEMENTS_STRUCTURE.md +52 -4
- package/docs/IMAGE_CACHING.md +30 -0
- package/docs/INPUT.md +146 -5
- package/docs/LATEX_MATH.md +87 -45
- package/docs/MACOS.md +1 -1
- package/docs/MARKDOWN_STREAMING.md +27 -1
- package/docs/NATIVE_ASSETS.md +127 -0
- package/docs/RTL.md +1 -1
- package/docs/STYLES.md +46 -6
- package/docs/TESTING.md +112 -0
- package/docs/TEXT.md +16 -6
- package/docs/WEB.md +3 -1
- package/ios/EnrichedMarkdown.h +7 -0
- package/ios/EnrichedMarkdown.mm +262 -67
- package/ios/EnrichedMarkdownText.h +7 -0
- package/ios/EnrichedMarkdownText.mm +97 -68
- package/ios/attachments/ENRMImageAttachment.h +9 -0
- package/ios/attachments/ENRMImageAttachment.m +143 -40
- package/ios/attachments/ENRMMathInlineAttachment.h +2 -0
- package/ios/attachments/ENRMMathInlineAttachment.m +48 -81
- package/ios/attachments/ENRMMathInlineAttachmentShared.h +2 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.cpp +75 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.h +63 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.cpp +40 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +839 -23
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +131 -0
- 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/ENRMBlockSyntaxSentinel.h +25 -0
- package/ios/input/ENRMBlockSyntaxSentinel.mm +80 -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 +10 -6
- package/ios/input/ENRMInputParser.mm +527 -171
- 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 +1104 -1024
- 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 +33 -7
- 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 +4 -1
- 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 +5 -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 +3 -1
- 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 +22 -0
- package/ios/styles/StyleConfig.mm +132 -0
- package/ios/utils/BlockquoteBorder.h +6 -0
- package/ios/utils/BlockquoteBorder.m +249 -52
- package/ios/utils/CodeBlockBackground.m +16 -2
- package/ios/utils/ENRMAtomicSize.h +65 -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/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/ENRMTextViewSetup.h +35 -17
- package/ios/utils/EditMenuUtils.m +22 -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/ParagraphStyleUtils.h +5 -0
- package/ios/utils/ParagraphStyleUtils.m +77 -17
- 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 +63 -0
- package/ios/utils/TaskListTapUtils.m +24 -0
- package/ios/views/ENRMCodeBlockContainerView.h +46 -0
- package/ios/views/ENRMCodeBlockContainerView.m +566 -0
- package/ios/views/ENRMMathContainerView.h +12 -0
- package/ios/views/ENRMMathContainerView.m +71 -1
- package/ios/views/TableContainerView.h +18 -0
- package/ios/views/TableContainerView.m +259 -159
- package/jest.d.ts +1 -0
- package/jest.js +5 -0
- package/lib/module/EnrichedMarkdownNativeComponent.ts +65 -0
- package/lib/module/EnrichedMarkdownTextInput.js +86 -5
- package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
- package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +89 -5
- package/lib/module/EnrichedMarkdownTextNativeComponent.ts +66 -0
- 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 +191 -0
- package/lib/module/jest/index.js.map +1 -0
- package/lib/module/native/EnrichedMarkdownText.js +30 -4
- package/lib/module/native/EnrichedMarkdownText.js.map +1 -1
- package/lib/module/normalizeMarkdownStyle.js +81 -19
- package/lib/module/normalizeMarkdownStyle.js.map +1 -1
- package/lib/module/normalizeMarkdownStyle.web.js +56 -18
- 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 +9 -5
- 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 +6 -0
- 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 +83 -6
- package/lib/module/web/styles.js.map +1 -1
- package/lib/module/web/utils.js +1 -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 +62 -0
- package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +95 -9
- package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +80 -5
- package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +62 -0
- 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 +2 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/index.web.d.ts +1 -1
- 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 +3 -3
- 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 +72 -0
- package/lib/typescript/src/types/MarkdownStyle.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownStyleInternal.d.ts +27 -0
- package/lib/typescript/src/types/MarkdownStyleInternal.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownTextProps.d.ts +65 -1
- package/lib/typescript/src/types/MarkdownTextProps.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownTextProps.web.d.ts +19 -0
- package/lib/typescript/src/types/MarkdownTextProps.web.d.ts.map +1 -1
- package/lib/typescript/src/types/events.d.ts +19 -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 +6 -2
- package/lib/typescript/src/web/types.d.ts.map +1 -1
- 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 +65 -0
- package/src/EnrichedMarkdownTextInput.tsx +162 -8
- package/src/EnrichedMarkdownTextInputNativeComponent.ts +89 -5
- package/src/EnrichedMarkdownTextNativeComponent.ts +66 -0
- package/src/headingDefaults.ts +21 -0
- package/src/index.tsx +9 -0
- package/src/index.web.tsx +1 -0
- package/src/jest/index.tsx +215 -0
- package/src/native/EnrichedMarkdownText.tsx +40 -2
- package/src/normalizeMarkdownStyle.ts +102 -16
- package/src/normalizeMarkdownStyle.web.ts +63 -15
- package/src/normalizeMarkdownTextInputStyle.ts +110 -35
- package/src/normalizeMenuItem.ts +1 -1
- package/src/types/MarkdownStyle.ts +74 -0
- package/src/types/MarkdownStyleInternal.ts +39 -0
- package/src/types/MarkdownTextProps.ts +65 -0
- package/src/types/MarkdownTextProps.web.ts +19 -0
- package/src/types/events.ts +21 -0
- package/src/utils/textInputState.ts +35 -0
- package/src/web/EnrichedMarkdownText.tsx +16 -2
- package/src/web/parseMarkdown.ts +6 -2
- package/src/web/renderers/InlineRenderers.tsx +5 -0
- package/src/web/renderers/ListRenderers.tsx +14 -2
- package/src/web/renderers/index.tsx +6 -2
- package/src/web/styles.ts +89 -5
- package/src/web/types.ts +6 -1
- package/src/web/utils.ts +1 -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
|
@@ -27,8 +27,14 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
27
27
|
- (void)toggleUnderline;
|
|
28
28
|
- (void)toggleStrikethrough;
|
|
29
29
|
- (void)toggleSpoiler;
|
|
30
|
+
- (void)toggleHeading:(NSInteger)level;
|
|
31
|
+
- (void)toggleUnorderedList;
|
|
32
|
+
- (void)toggleOrderedList;
|
|
33
|
+
- (void)indentList;
|
|
34
|
+
- (void)outdentList;
|
|
30
35
|
- (void)setLink:(NSString *)url;
|
|
31
36
|
- (void)insertLink:(NSString *)text url:(NSString *)url;
|
|
37
|
+
- (void)insertText:(NSString *)text;
|
|
32
38
|
- (void)insertMention:(NSString *)displayText url:(NSString *)url;
|
|
33
39
|
- (void)startMention:(NSString *)indicator;
|
|
34
40
|
- (void)removeLink;
|
|
@@ -36,6 +42,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
36
42
|
- (void)updateMath:(NSInteger)start latex:(NSString *)latex displayMode:(BOOL)displayMode;
|
|
37
43
|
- (void)removeMath:(NSInteger)start;
|
|
38
44
|
- (void)copyToClipboard;
|
|
45
|
+
- (void)resolvePaste:(NSString *)text markdown:(NSString *)markdown;
|
|
39
46
|
- (void)requestMarkdown:(NSInteger)requestId;
|
|
40
47
|
- (void)requestCaretRect:(NSInteger)requestId;
|
|
41
48
|
@end
|
|
@@ -191,6 +198,82 @@ if ([commandName isEqualToString:@"toggleSpoiler"]) {
|
|
|
191
198
|
return;
|
|
192
199
|
}
|
|
193
200
|
|
|
201
|
+
if ([commandName isEqualToString:@"toggleHeading"]) {
|
|
202
|
+
#if RCT_DEBUG
|
|
203
|
+
if ([args count] != 1) {
|
|
204
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 1);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
#endif
|
|
208
|
+
|
|
209
|
+
NSObject *arg0 = args[0];
|
|
210
|
+
#if RCT_DEBUG
|
|
211
|
+
if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSNumber class], @"number", @"EnrichedMarkdownTextInput", commandName, @"1st")) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
#endif
|
|
215
|
+
NSInteger level = [(NSNumber *)arg0 intValue];
|
|
216
|
+
|
|
217
|
+
[componentView toggleHeading:level];
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if ([commandName isEqualToString:@"toggleUnorderedList"]) {
|
|
222
|
+
#if RCT_DEBUG
|
|
223
|
+
if ([args count] != 0) {
|
|
224
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 0);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
#endif
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
[componentView toggleUnorderedList];
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if ([commandName isEqualToString:@"toggleOrderedList"]) {
|
|
236
|
+
#if RCT_DEBUG
|
|
237
|
+
if ([args count] != 0) {
|
|
238
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 0);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
#endif
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
[componentView toggleOrderedList];
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
if ([commandName isEqualToString:@"indentList"]) {
|
|
250
|
+
#if RCT_DEBUG
|
|
251
|
+
if ([args count] != 0) {
|
|
252
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 0);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
#endif
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
[componentView indentList];
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if ([commandName isEqualToString:@"outdentList"]) {
|
|
264
|
+
#if RCT_DEBUG
|
|
265
|
+
if ([args count] != 0) {
|
|
266
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 0);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
#endif
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
[componentView outdentList];
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
|
|
194
277
|
if ([commandName isEqualToString:@"setLink"]) {
|
|
195
278
|
#if RCT_DEBUG
|
|
196
279
|
if ([args count] != 1) {
|
|
@@ -239,6 +322,26 @@ NSObject *arg1 = args[1];
|
|
|
239
322
|
return;
|
|
240
323
|
}
|
|
241
324
|
|
|
325
|
+
if ([commandName isEqualToString:@"insertText"]) {
|
|
326
|
+
#if RCT_DEBUG
|
|
327
|
+
if ([args count] != 1) {
|
|
328
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 1);
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
#endif
|
|
332
|
+
|
|
333
|
+
NSObject *arg0 = args[0];
|
|
334
|
+
#if RCT_DEBUG
|
|
335
|
+
if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSString class], @"string", @"EnrichedMarkdownTextInput", commandName, @"1st")) {
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
#endif
|
|
339
|
+
NSString * text = (NSString *)arg0;
|
|
340
|
+
|
|
341
|
+
[componentView insertText:text];
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
|
|
242
345
|
if ([commandName isEqualToString:@"insertMention"]) {
|
|
243
346
|
#if RCT_DEBUG
|
|
244
347
|
if ([args count] != 2) {
|
|
@@ -399,6 +502,34 @@ if ([commandName isEqualToString:@"copyToClipboard"]) {
|
|
|
399
502
|
return;
|
|
400
503
|
}
|
|
401
504
|
|
|
505
|
+
if ([commandName isEqualToString:@"resolvePaste"]) {
|
|
506
|
+
#if RCT_DEBUG
|
|
507
|
+
if ([args count] != 2) {
|
|
508
|
+
RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 2);
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
#endif
|
|
512
|
+
|
|
513
|
+
NSObject *arg0 = args[0];
|
|
514
|
+
#if RCT_DEBUG
|
|
515
|
+
if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSString class], @"string", @"EnrichedMarkdownTextInput", commandName, @"1st")) {
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
#endif
|
|
519
|
+
NSString * text = (NSString *)arg0;
|
|
520
|
+
|
|
521
|
+
NSObject *arg1 = args[1];
|
|
522
|
+
#if RCT_DEBUG
|
|
523
|
+
if (!RCTValidateTypeOfViewCommandArgument(arg1, [NSString class], @"string", @"EnrichedMarkdownTextInput", commandName, @"2nd")) {
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
#endif
|
|
527
|
+
NSString * markdown = (NSString *)arg1;
|
|
528
|
+
|
|
529
|
+
[componentView resolvePaste:text markdown:markdown];
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
|
|
402
533
|
if ([commandName isEqualToString:@"requestMarkdown"]) {
|
|
403
534
|
#if RCT_DEBUG
|
|
404
535
|
if ([args count] != 1) {
|
|
@@ -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
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#import "ENRMInputBlockType.h"
|
|
4
|
+
#import <Foundation/Foundation.h>
|
|
5
|
+
|
|
6
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
7
|
+
|
|
8
|
+
/// A block-level element occupying a paragraph/line range. Mirrors
|
|
9
|
+
/// ENRMFormattingRange but for block scope: the range always covers whole lines.
|
|
10
|
+
@interface ENRMBlockRange : NSObject <NSCopying>
|
|
11
|
+
|
|
12
|
+
@property (nonatomic, assign) ENRMInputBlockType type;
|
|
13
|
+
@property (nonatomic, assign) NSRange range;
|
|
14
|
+
|
|
15
|
+
/// Generic integer payload for the block. 0 by default. Headings use it for the
|
|
16
|
+
/// H-level (1-6); list items use it for nesting depth.
|
|
17
|
+
@property (nonatomic, assign) NSInteger level;
|
|
18
|
+
|
|
19
|
+
/// 1-based position of an ordered item among its adjacent same-depth siblings;
|
|
20
|
+
/// recomputed by the block store's list-metadata pass.
|
|
21
|
+
@property (nonatomic, assign) NSInteger ordinal;
|
|
22
|
+
|
|
23
|
+
+ (instancetype)rangeWithType:(ENRMInputBlockType)type range:(NSRange)range;
|
|
24
|
+
+ (instancetype)rangeWithType:(ENRMInputBlockType)type range:(NSRange)range level:(NSInteger)level;
|
|
25
|
+
|
|
26
|
+
@end
|
|
27
|
+
|
|
28
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#import "ENRMBlockRange.h"
|
|
2
|
+
|
|
3
|
+
@implementation ENRMBlockRange
|
|
4
|
+
|
|
5
|
+
+ (instancetype)rangeWithType:(ENRMInputBlockType)type range:(NSRange)range
|
|
6
|
+
{
|
|
7
|
+
return [self rangeWithType:type range:range level:0];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
+ (instancetype)rangeWithType:(ENRMInputBlockType)type range:(NSRange)range level:(NSInteger)level
|
|
11
|
+
{
|
|
12
|
+
ENRMBlockRange *blockRange = [[ENRMBlockRange alloc] init];
|
|
13
|
+
blockRange.type = type;
|
|
14
|
+
blockRange.range = range;
|
|
15
|
+
blockRange.level = level;
|
|
16
|
+
blockRange.ordinal = 1;
|
|
17
|
+
return blockRange;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
- (id)copyWithZone:(NSZone *)zone
|
|
21
|
+
{
|
|
22
|
+
ENRMBlockRange *copy = [[ENRMBlockRange allocWithZone:zone] init];
|
|
23
|
+
copy.type = _type;
|
|
24
|
+
copy.range = _range;
|
|
25
|
+
copy.level = _level;
|
|
26
|
+
copy.ordinal = _ordinal;
|
|
27
|
+
return copy;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@end
|