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
|
@@ -7,7 +7,12 @@
|
|
|
7
7
|
|
|
8
8
|
NS_ASSUME_NONNULL_BEGIN
|
|
9
9
|
|
|
10
|
-
typedef NS_ENUM(NSInteger, ENRMSegmentKind) {
|
|
10
|
+
typedef NS_ENUM(NSInteger, ENRMSegmentKind) {
|
|
11
|
+
ENRMSegmentKindText,
|
|
12
|
+
ENRMSegmentKindTable,
|
|
13
|
+
ENRMSegmentKindMath,
|
|
14
|
+
ENRMSegmentKindCodeBlock
|
|
15
|
+
};
|
|
11
16
|
|
|
12
17
|
@interface ENRMTextSegment : NSObject
|
|
13
18
|
@property (nonatomic, strong) NSArray<MarkdownASTNode *> *nodes;
|
|
@@ -24,15 +29,22 @@ typedef NS_ENUM(NSInteger, ENRMSegmentKind) { ENRMSegmentKindText, ENRMSegmentKi
|
|
|
24
29
|
+ (instancetype)segmentWithLatex:(NSString *)latex;
|
|
25
30
|
@end
|
|
26
31
|
|
|
32
|
+
@interface ENRMCodeBlockSegment : NSObject
|
|
33
|
+
@property (nonatomic, strong) MarkdownASTNode *codeBlockNode;
|
|
34
|
+
+ (instancetype)segmentWithCodeBlockNode:(MarkdownASTNode *)node;
|
|
35
|
+
@end
|
|
36
|
+
|
|
27
37
|
@interface ENRMRenderedSegment : NSObject
|
|
28
38
|
@property (nonatomic, assign) ENRMSegmentKind kind;
|
|
29
39
|
@property (nonatomic, assign) uint64_t signature;
|
|
30
40
|
@property (nonatomic, strong, nullable) ENRMRenderResult *textResult;
|
|
31
41
|
@property (nonatomic, strong, nullable) ENRMTableSegment *tableSegment;
|
|
32
42
|
@property (nonatomic, strong, nullable) ENRMMathSegment *mathSegment;
|
|
43
|
+
@property (nonatomic, strong, nullable) ENRMCodeBlockSegment *codeBlockSegment;
|
|
33
44
|
+ (instancetype)textSegmentWithResult:(ENRMRenderResult *)result signature:(uint64_t)signature;
|
|
34
45
|
+ (instancetype)tableSegmentWithSegment:(ENRMTableSegment *)segment signature:(uint64_t)signature;
|
|
35
46
|
+ (instancetype)mathSegmentWithSegment:(ENRMMathSegment *)segment signature:(uint64_t)signature;
|
|
47
|
+
+ (instancetype)codeBlockSegmentWithSegment:(ENRMCodeBlockSegment *)segment signature:(uint64_t)signature;
|
|
36
48
|
@end
|
|
37
49
|
|
|
38
50
|
#ifdef __cplusplus
|
|
@@ -31,6 +31,16 @@
|
|
|
31
31
|
}
|
|
32
32
|
@end
|
|
33
33
|
|
|
34
|
+
@implementation ENRMCodeBlockSegment
|
|
35
|
+
+ (instancetype)segmentWithCodeBlockNode:(MarkdownASTNode *)node
|
|
36
|
+
{
|
|
37
|
+
NSParameterAssert(node != nil);
|
|
38
|
+
ENRMCodeBlockSegment *segment = [[ENRMCodeBlockSegment alloc] init];
|
|
39
|
+
segment.codeBlockNode = node;
|
|
40
|
+
return segment;
|
|
41
|
+
}
|
|
42
|
+
@end
|
|
43
|
+
|
|
34
44
|
@implementation ENRMRenderedSegment
|
|
35
45
|
+ (instancetype)textSegmentWithResult:(ENRMRenderResult *)result signature:(uint64_t)signature
|
|
36
46
|
{
|
|
@@ -61,6 +71,16 @@
|
|
|
61
71
|
segment.signature = signature;
|
|
62
72
|
return segment;
|
|
63
73
|
}
|
|
74
|
+
|
|
75
|
+
+ (instancetype)codeBlockSegmentWithSegment:(ENRMCodeBlockSegment *)codeBlockSegment signature:(uint64_t)signature
|
|
76
|
+
{
|
|
77
|
+
NSParameterAssert(codeBlockSegment != nil);
|
|
78
|
+
ENRMRenderedSegment *segment = [[ENRMRenderedSegment alloc] init];
|
|
79
|
+
segment.kind = ENRMSegmentKindCodeBlock;
|
|
80
|
+
segment.codeBlockSegment = codeBlockSegment;
|
|
81
|
+
segment.signature = signature;
|
|
82
|
+
return segment;
|
|
83
|
+
}
|
|
64
84
|
@end
|
|
65
85
|
|
|
66
86
|
// FNV-1a 64-bit hash for segment signatures. Collisions are theoretically
|
|
@@ -33,7 +33,13 @@ static NSArray *ENRMSplitASTIntoSegments(MarkdownASTNode *root)
|
|
|
33
33
|
#endif
|
|
34
34
|
}
|
|
35
35
|
#endif
|
|
36
|
-
else {
|
|
36
|
+
else if (child.type == MarkdownNodeTypeCodeBlock) {
|
|
37
|
+
if (currentTextNodes.count > 0) {
|
|
38
|
+
[segments addObject:[ENRMTextSegment segmentWithNodes:[currentTextNodes copy]]];
|
|
39
|
+
[currentTextNodes removeAllObjects];
|
|
40
|
+
}
|
|
41
|
+
[segments addObject:[ENRMCodeBlockSegment segmentWithCodeBlockNode:child]];
|
|
42
|
+
} else {
|
|
37
43
|
[currentTextNodes addObject:child];
|
|
38
44
|
}
|
|
39
45
|
}
|
|
@@ -53,9 +59,10 @@ NSArray<ENRMRenderedSegment *> *ENRMRenderSegmentsFromAST(MarkdownASTNode *ast,
|
|
|
53
59
|
NSArray *segments = ENRMSplitASTIntoSegments(ast);
|
|
54
60
|
NSMutableArray<ENRMRenderedSegment *> *renderedSegments = [NSMutableArray array];
|
|
55
61
|
|
|
56
|
-
static const uint64_t kTextKindSalt = 0x7465787400000000ULL;
|
|
57
|
-
static const uint64_t kTableKindSalt = 0x7461626C00000000ULL;
|
|
58
|
-
static const uint64_t kMathKindSalt = 0x6D61746800000000ULL;
|
|
62
|
+
static const uint64_t kTextKindSalt = 0x7465787400000000ULL; // "text"
|
|
63
|
+
static const uint64_t kTableKindSalt = 0x7461626C00000000ULL; // "tabl"
|
|
64
|
+
static const uint64_t kMathKindSalt = 0x6D61746800000000ULL; // "math"
|
|
65
|
+
static const uint64_t kCodeBlockKindSalt = 0x63626C6B00000000ULL; // "cblk"
|
|
59
66
|
|
|
60
67
|
for (id segment in segments) {
|
|
61
68
|
if ([segment isKindOfClass:[ENRMTextSegment class]]) {
|
|
@@ -82,6 +89,12 @@ NSArray<ENRMRenderedSegment *> *ENRMRenderSegmentsFromAST(MarkdownASTNode *ast,
|
|
|
82
89
|
[renderedSegments addObject:[ENRMRenderedSegment mathSegmentWithSegment:mathSegment signature:signature]];
|
|
83
90
|
}
|
|
84
91
|
#endif
|
|
92
|
+
else if ([segment isKindOfClass:[ENRMCodeBlockSegment class]]) {
|
|
93
|
+
ENRMCodeBlockSegment *codeBlockSegment = (ENRMCodeBlockSegment *)segment;
|
|
94
|
+
uint64_t signature = ENRMSignatureForNode(codeBlockSegment.codeBlockNode) ^ kCodeBlockKindSalt;
|
|
95
|
+
[renderedSegments addObject:[ENRMRenderedSegment codeBlockSegmentWithSegment:codeBlockSegment
|
|
96
|
+
signature:signature]];
|
|
97
|
+
}
|
|
85
98
|
}
|
|
86
99
|
|
|
87
100
|
return renderedSegments;
|
|
@@ -9,11 +9,21 @@ typedef NS_ENUM(NSInteger, ENRMTableStreamingMode) {
|
|
|
9
9
|
ENRMTableStreamingModeProgressive,
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
+
typedef NS_ENUM(NSInteger, ENRMCodeBlockStreamingMode) {
|
|
13
|
+
ENRMCodeBlockStreamingModeHidden = 0,
|
|
14
|
+
ENRMCodeBlockStreamingModeProgressive,
|
|
15
|
+
};
|
|
16
|
+
|
|
12
17
|
#ifdef __cplusplus
|
|
13
18
|
extern "C" {
|
|
14
19
|
#endif
|
|
15
20
|
|
|
16
|
-
|
|
21
|
+
// Filtered markdown for the current streaming tick. When non-NULL,
|
|
22
|
+
// outEndsInsideOpenCodeFence reports whether the result ends inside a still-open
|
|
23
|
+
// fenced code block (the trailing block whose chrome the renderer defers).
|
|
24
|
+
NSString *ENRMRenderableMarkdownForStreaming(NSString *markdown, ENRMTableStreamingMode tableMode,
|
|
25
|
+
ENRMCodeBlockStreamingMode codeBlockMode,
|
|
26
|
+
BOOL *_Nullable outEndsInsideOpenCodeFence);
|
|
17
27
|
|
|
18
28
|
#ifdef __cplusplus
|
|
19
29
|
}
|
|
@@ -155,11 +155,107 @@ static NSString *ENRMRemovePendingStreamingTableBlock(NSString *markdown, NSArra
|
|
|
155
155
|
return result;
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
-
NSString *
|
|
158
|
+
static NSString *ENRMRemovePendingTablesAndMath(NSString *markdown, ENRMTableStreamingMode tableMode,
|
|
159
|
+
NSArray<NSString *> *lines)
|
|
159
160
|
{
|
|
160
|
-
|
|
161
|
+
if (!lines) {
|
|
162
|
+
lines = [markdown componentsSeparatedByString:@"\n"];
|
|
163
|
+
}
|
|
161
164
|
NSString *afterMath = ENRMRemovePendingStreamingMathBlock(markdown, lines);
|
|
162
165
|
NSArray<NSString *> *linesForTable =
|
|
163
166
|
(afterMath.length == markdown.length) ? lines : [afterMath componentsSeparatedByString:@"\n"];
|
|
164
167
|
return ENRMRemovePendingStreamingTableBlock(afterMath, linesForTable, tableMode);
|
|
165
168
|
}
|
|
169
|
+
|
|
170
|
+
// Parses a fence marker into char/length/info; NO if the line isn't one.
|
|
171
|
+
static BOOL ENRMParseFenceMarker(NSString *line, unichar *outChar, NSUInteger *outLength, NSString **outInfo)
|
|
172
|
+
{
|
|
173
|
+
NSUInteger i = 0;
|
|
174
|
+
while (i < line.length && [line characterAtIndex:i] == ' ' && i < 3) {
|
|
175
|
+
i++;
|
|
176
|
+
}
|
|
177
|
+
if (i >= line.length) {
|
|
178
|
+
return NO;
|
|
179
|
+
}
|
|
180
|
+
unichar ch = [line characterAtIndex:i];
|
|
181
|
+
if (ch != '`' && ch != '~') {
|
|
182
|
+
return NO;
|
|
183
|
+
}
|
|
184
|
+
NSUInteger runLength = 0;
|
|
185
|
+
while (i < line.length && [line characterAtIndex:i] == ch) {
|
|
186
|
+
i++;
|
|
187
|
+
runLength++;
|
|
188
|
+
}
|
|
189
|
+
if (runLength < 3) {
|
|
190
|
+
return NO;
|
|
191
|
+
}
|
|
192
|
+
NSString *info = [line substringFromIndex:i];
|
|
193
|
+
if (ch == '`' && [info rangeOfString:@"`"].location != NSNotFound) {
|
|
194
|
+
return NO;
|
|
195
|
+
}
|
|
196
|
+
if (outChar) {
|
|
197
|
+
*outChar = ch;
|
|
198
|
+
}
|
|
199
|
+
if (outLength) {
|
|
200
|
+
*outLength = runLength;
|
|
201
|
+
}
|
|
202
|
+
if (outInfo) {
|
|
203
|
+
*outInfo = info;
|
|
204
|
+
}
|
|
205
|
+
return YES;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
static NSInteger ENRMFindOpenCodeFenceLineIndex(NSArray<NSString *> *lines)
|
|
209
|
+
{
|
|
210
|
+
NSInteger openIndex = -1;
|
|
211
|
+
unichar openChar = 0;
|
|
212
|
+
NSUInteger openLength = 0;
|
|
213
|
+
for (NSUInteger i = 0; i < lines.count; i++) {
|
|
214
|
+
unichar ch = 0;
|
|
215
|
+
NSUInteger length = 0;
|
|
216
|
+
NSString *info = nil;
|
|
217
|
+
BOOL isMarker = ENRMParseFenceMarker(lines[i], &ch, &length, &info);
|
|
218
|
+
if (openIndex == -1) {
|
|
219
|
+
if (isMarker) {
|
|
220
|
+
openIndex = (NSInteger)i;
|
|
221
|
+
openChar = ch;
|
|
222
|
+
openLength = length;
|
|
223
|
+
}
|
|
224
|
+
} else if (isMarker && ch == openChar && length >= openLength &&
|
|
225
|
+
[info stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]].length == 0) {
|
|
226
|
+
openIndex = -1;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return openIndex;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
NSString *ENRMRenderableMarkdownForStreaming(NSString *markdown, ENRMTableStreamingMode tableMode,
|
|
233
|
+
ENRMCodeBlockStreamingMode codeBlockMode, BOOL *outEndsInsideOpenCodeFence)
|
|
234
|
+
{
|
|
235
|
+
NSArray<NSString *> *lines = [markdown componentsSeparatedByString:@"\n"];
|
|
236
|
+
NSInteger openFenceIndex = ENRMFindOpenCodeFenceLineIndex(lines);
|
|
237
|
+
|
|
238
|
+
if (openFenceIndex == -1) {
|
|
239
|
+
if (outEndsInsideOpenCodeFence) {
|
|
240
|
+
*outEndsInsideOpenCodeFence = NO;
|
|
241
|
+
}
|
|
242
|
+
return ENRMRemovePendingTablesAndMath(markdown, tableMode, lines);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
NSUInteger *offsets = ENRMBuildLineOffsets(lines, lines.count);
|
|
246
|
+
NSUInteger fenceOffset = offsets[(NSUInteger)openFenceIndex];
|
|
247
|
+
free(offsets);
|
|
248
|
+
|
|
249
|
+
NSString *head = [markdown substringToIndex:fenceOffset];
|
|
250
|
+
if (codeBlockMode == ENRMCodeBlockStreamingModeHidden) {
|
|
251
|
+
if (outEndsInsideOpenCodeFence) {
|
|
252
|
+
*outEndsInsideOpenCodeFence = NO;
|
|
253
|
+
}
|
|
254
|
+
return ENRMRemovePendingTablesAndMath(head, tableMode, nil);
|
|
255
|
+
}
|
|
256
|
+
if (outEndsInsideOpenCodeFence) {
|
|
257
|
+
*outEndsInsideOpenCodeFence = YES;
|
|
258
|
+
}
|
|
259
|
+
NSString *tail = [markdown substringFromIndex:fenceOffset];
|
|
260
|
+
return [ENRMRemovePendingTablesAndMath(head, tableMode, nil) stringByAppendingString:tail];
|
|
261
|
+
}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* mapping once and instantiate it for each type.
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
+
#import "CodeBlockHighlighter.hpp"
|
|
13
14
|
#import "ParagraphStyleUtils.h"
|
|
14
15
|
#import "StyleConfig.h"
|
|
15
16
|
#import <React/RCTConversions.h>
|
|
@@ -480,6 +481,16 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
|
|
|
480
481
|
changed = YES;
|
|
481
482
|
}
|
|
482
483
|
|
|
484
|
+
if (newStyle.blockquote.borderRadius != oldStyle.blockquote.borderRadius) {
|
|
485
|
+
[config setBlockquoteBorderRadius:newStyle.blockquote.borderRadius];
|
|
486
|
+
changed = YES;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
if (newStyle.blockquote.padding != oldStyle.blockquote.padding) {
|
|
490
|
+
[config setBlockquotePadding:newStyle.blockquote.padding];
|
|
491
|
+
changed = YES;
|
|
492
|
+
}
|
|
493
|
+
|
|
483
494
|
// ── Link ───────────────────────────────────────────────────────────────────
|
|
484
495
|
|
|
485
496
|
if (newStyle.link.fontFamily != oldStyle.link.fontFamily) {
|
|
@@ -512,6 +523,32 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
|
|
|
512
523
|
changed = YES;
|
|
513
524
|
}
|
|
514
525
|
|
|
526
|
+
if (newStyle.link.borderRadius != oldStyle.link.borderRadius) {
|
|
527
|
+
[config setLinkBorderRadius:newStyle.link.borderRadius];
|
|
528
|
+
changed = YES;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
if (newStyle.link.paddingHorizontal != oldStyle.link.paddingHorizontal) {
|
|
532
|
+
[config setLinkPaddingHorizontal:newStyle.link.paddingHorizontal];
|
|
533
|
+
changed = YES;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
if (newStyle.link.paddingVertical != oldStyle.link.paddingVertical) {
|
|
537
|
+
[config setLinkPaddingVertical:newStyle.link.paddingVertical];
|
|
538
|
+
changed = YES;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
if (newStyle.link.borderColor != oldStyle.link.borderColor) {
|
|
542
|
+
RCTUIColor *color = RCTUIColorFromSharedColor(newStyle.link.borderColor);
|
|
543
|
+
[config setLinkBorderColor:CGColorGetAlpha(color.CGColor) > 0 ? color : nil];
|
|
544
|
+
changed = YES;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
if (newStyle.link.borderWidth != oldStyle.link.borderWidth) {
|
|
548
|
+
[config setLinkBorderWidth:newStyle.link.borderWidth];
|
|
549
|
+
changed = YES;
|
|
550
|
+
}
|
|
551
|
+
|
|
515
552
|
{
|
|
516
553
|
BOOL linkVariantsChanged = newStyle.linkVariants.size() != oldStyle.linkVariants.size();
|
|
517
554
|
if (!linkVariantsChanged) {
|
|
@@ -519,7 +556,11 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
|
|
|
519
556
|
const auto &newVariant = newStyle.linkVariants[i];
|
|
520
557
|
const auto &oldVariant = oldStyle.linkVariants[i];
|
|
521
558
|
if (newVariant.pattern != oldVariant.pattern || newVariant.color != oldVariant.color ||
|
|
522
|
-
newVariant.underline != oldVariant.underline || newVariant.backgroundColor != oldVariant.backgroundColor
|
|
559
|
+
newVariant.underline != oldVariant.underline || newVariant.backgroundColor != oldVariant.backgroundColor ||
|
|
560
|
+
newVariant.borderRadius != oldVariant.borderRadius ||
|
|
561
|
+
newVariant.paddingHorizontal != oldVariant.paddingHorizontal ||
|
|
562
|
+
newVariant.paddingVertical != oldVariant.paddingVertical ||
|
|
563
|
+
newVariant.borderColor != oldVariant.borderColor || newVariant.borderWidth != oldVariant.borderWidth) {
|
|
523
564
|
linkVariantsChanged = YES;
|
|
524
565
|
break;
|
|
525
566
|
}
|
|
@@ -534,6 +575,12 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
|
|
|
534
575
|
variant.underline = entry.underline;
|
|
535
576
|
RCTUIColor *backgroundColor = RCTUIColorFromSharedColor(entry.backgroundColor);
|
|
536
577
|
variant.backgroundColor = CGColorGetAlpha(backgroundColor.CGColor) > 0 ? backgroundColor : nil;
|
|
578
|
+
variant.borderRadius = entry.borderRadius;
|
|
579
|
+
variant.paddingHorizontal = entry.paddingHorizontal;
|
|
580
|
+
variant.paddingVertical = entry.paddingVertical;
|
|
581
|
+
RCTUIColor *borderColor = RCTUIColorFromSharedColor(entry.borderColor);
|
|
582
|
+
variant.borderColor = CGColorGetAlpha(borderColor.CGColor) > 0 ? borderColor : nil;
|
|
583
|
+
variant.borderWidth = entry.borderWidth;
|
|
537
584
|
[variants addObject:variant];
|
|
538
585
|
}
|
|
539
586
|
[config setLinkVariants:variants];
|
|
@@ -689,6 +736,21 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
|
|
|
689
736
|
changed = YES;
|
|
690
737
|
}
|
|
691
738
|
|
|
739
|
+
if (newStyle.image.maxHeight != oldStyle.image.maxHeight) {
|
|
740
|
+
[config setImageMaxHeight:newStyle.image.maxHeight];
|
|
741
|
+
changed = YES;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
if (newStyle.image.aspectRatio != oldStyle.image.aspectRatio) {
|
|
745
|
+
[config setImageAspectRatio:newStyle.image.aspectRatio];
|
|
746
|
+
changed = YES;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
if (newStyle.image.resizeMode != oldStyle.image.resizeMode) {
|
|
750
|
+
[config setImageResizeMode:@(newStyle.image.resizeMode.c_str())];
|
|
751
|
+
changed = YES;
|
|
752
|
+
}
|
|
753
|
+
|
|
692
754
|
if (newStyle.image.borderRadius != oldStyle.image.borderRadius) {
|
|
693
755
|
[config setImageBorderRadius:newStyle.image.borderRadius];
|
|
694
756
|
changed = YES;
|
|
@@ -789,6 +851,11 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
|
|
|
789
851
|
changed = YES;
|
|
790
852
|
}
|
|
791
853
|
|
|
854
|
+
if (newStyle.list.itemSpacing != oldStyle.list.itemSpacing) {
|
|
855
|
+
[config setListStyleItemSpacing:newStyle.list.itemSpacing];
|
|
856
|
+
changed = YES;
|
|
857
|
+
}
|
|
858
|
+
|
|
792
859
|
// ── Code Block ─────────────────────────────────────────────────────────────
|
|
793
860
|
|
|
794
861
|
if (newStyle.codeBlock.fontSize != oldStyle.codeBlock.fontSize) {
|
|
@@ -856,6 +923,28 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
|
|
|
856
923
|
changed = YES;
|
|
857
924
|
}
|
|
858
925
|
|
|
926
|
+
#define ENRM_SET_SYNTAX_COLOR(field, token) \
|
|
927
|
+
if (newStyle.codeBlock.syntaxColors.field != oldStyle.codeBlock.syntaxColors.field) { \
|
|
928
|
+
[config setCodeBlockSyntaxColor:RCTUIColorFromSharedColor(newStyle.codeBlock.syntaxColors.field) \
|
|
929
|
+
forToken:(NSInteger)Markdown::HighlightTokenType::token]; \
|
|
930
|
+
changed = YES; \
|
|
931
|
+
}
|
|
932
|
+
ENRM_SET_SYNTAX_COLOR(keyword, Keyword)
|
|
933
|
+
ENRM_SET_SYNTAX_COLOR(operatorColor, Operator)
|
|
934
|
+
ENRM_SET_SYNTAX_COLOR(punctuation, Punctuation)
|
|
935
|
+
ENRM_SET_SYNTAX_COLOR(string, String)
|
|
936
|
+
ENRM_SET_SYNTAX_COLOR(number, Number)
|
|
937
|
+
ENRM_SET_SYNTAX_COLOR(constant, Constant)
|
|
938
|
+
ENRM_SET_SYNTAX_COLOR(comment, Comment)
|
|
939
|
+
ENRM_SET_SYNTAX_COLOR(function, Function)
|
|
940
|
+
ENRM_SET_SYNTAX_COLOR(type, Type)
|
|
941
|
+
ENRM_SET_SYNTAX_COLOR(variable, Variable)
|
|
942
|
+
ENRM_SET_SYNTAX_COLOR(property, Property)
|
|
943
|
+
ENRM_SET_SYNTAX_COLOR(tag, Tag)
|
|
944
|
+
ENRM_SET_SYNTAX_COLOR(attribute, Attribute)
|
|
945
|
+
ENRM_SET_SYNTAX_COLOR(embedded, Embedded)
|
|
946
|
+
#undef ENRM_SET_SYNTAX_COLOR
|
|
947
|
+
|
|
859
948
|
// ── Thematic Break ─────────────────────────────────────────────────────────
|
|
860
949
|
|
|
861
950
|
if (newStyle.thematicBreak.color != oldStyle.thematicBreak.color) {
|
|
@@ -991,6 +1080,16 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
|
|
|
991
1080
|
changed = YES;
|
|
992
1081
|
}
|
|
993
1082
|
|
|
1083
|
+
if (newStyle.table.horizontalOverflow != oldStyle.table.horizontalOverflow) {
|
|
1084
|
+
[config setTableHorizontalOverflow:newStyle.table.horizontalOverflow];
|
|
1085
|
+
changed = YES;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
if (newStyle.table.align != oldStyle.table.align) {
|
|
1089
|
+
[config setTableAlign:@(newStyle.table.align.c_str())];
|
|
1090
|
+
changed = YES;
|
|
1091
|
+
}
|
|
1092
|
+
|
|
994
1093
|
// ── Task List ───────────────────────────────────────────────────────────────
|
|
995
1094
|
|
|
996
1095
|
if (newStyle.taskList.checkedColor != oldStyle.taskList.checkedColor) {
|
|
@@ -1068,6 +1167,11 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
|
|
|
1068
1167
|
changed = YES;
|
|
1069
1168
|
}
|
|
1070
1169
|
|
|
1170
|
+
if (newStyle.math.glyphOverflow != oldStyle.math.glyphOverflow) {
|
|
1171
|
+
[config setMathGlyphOverflow:newStyle.math.glyphOverflow];
|
|
1172
|
+
changed = YES;
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1071
1175
|
if (newStyle.math.marginTop != oldStyle.math.marginTop) {
|
|
1072
1176
|
[config setMathMarginTop:newStyle.math.marginTop];
|
|
1073
1177
|
changed = YES;
|
|
@@ -1116,6 +1220,11 @@ BOOL applyMarkdownStyleToConfig(StyleConfig *config, const MarkdownStyle &newSty
|
|
|
1116
1220
|
changed = YES;
|
|
1117
1221
|
}
|
|
1118
1222
|
|
|
1223
|
+
if (newStyle.inlineMath.glyphOverflow != oldStyle.inlineMath.glyphOverflow) {
|
|
1224
|
+
[config setInlineMathGlyphOverflow:newStyle.inlineMath.glyphOverflow];
|
|
1225
|
+
changed = YES;
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1119
1228
|
// ── Spoiler ─────────────────────────────────────────────────────────────
|
|
1120
1229
|
|
|
1121
1230
|
if (newStyle.spoiler.color != oldStyle.spoiler.color) {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#import "TaskListTapUtils.h"
|
|
2
2
|
#import "ENRMUIKit.h"
|
|
3
|
+
#import "LastElementUtils.h"
|
|
3
4
|
#import "ListItemRenderer.h"
|
|
4
5
|
#import "ParagraphStyleUtils.h"
|
|
5
6
|
#import "StyleConfig.h"
|
|
@@ -171,6 +172,13 @@ BOOL updateTaskListItemCheckedState(ENRMPlatformTextView *textView, NSInteger ta
|
|
|
171
172
|
if (depth && [depth integerValue] > nestingLevel)
|
|
172
173
|
return;
|
|
173
174
|
|
|
175
|
+
// Skip code block ranges — preserve CodeBlockRenderer styles.
|
|
176
|
+
NSNumber *isCodeBlock = [mutableText attribute:CodeBlockAttributeName
|
|
177
|
+
atIndex:segmentRange.location
|
|
178
|
+
effectiveRange:nil];
|
|
179
|
+
if ([isCodeBlock boolValue])
|
|
180
|
+
return;
|
|
181
|
+
|
|
174
182
|
[mutableText addAttribute:TaskCheckedAttribute value:@(newChecked) range:segmentRange];
|
|
175
183
|
|
|
176
184
|
if (newChecked) {
|
|
@@ -195,6 +203,22 @@ BOOL updateTaskListItemCheckedState(ENRMPlatformTextView *textView, NSInteger ta
|
|
|
195
203
|
}
|
|
196
204
|
}];
|
|
197
205
|
|
|
206
|
+
// The checkbox glyph is drawn from the marker descriptor, not from
|
|
207
|
+
// TaskCheckedAttribute — keep it in sync. Enumerated over the full text:
|
|
208
|
+
// for code-block-first items the anchor sits outside the metadata ranges.
|
|
209
|
+
[mutableText enumerateAttribute:ListItemMarkerStartAttribute
|
|
210
|
+
inRange:NSMakeRange(0, mutableText.length)
|
|
211
|
+
options:0
|
|
212
|
+
usingBlock:^(NSArray *markers, NSRange range, BOOL *stop) {
|
|
213
|
+
if (![markers isKindOfClass:[NSArray class]])
|
|
214
|
+
return;
|
|
215
|
+
for (ENRMListMarkerDescriptor *marker in markers) {
|
|
216
|
+
if (marker.isTask && marker.taskIndex == targetIndex) {
|
|
217
|
+
marker.isChecked = newChecked;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}];
|
|
221
|
+
|
|
198
222
|
ENRMSetAttributedText(textView, mutableText);
|
|
199
223
|
NSLayoutManager *layoutManager = textView.layoutManager;
|
|
200
224
|
if (layoutManager) {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
#import "BlockquoteBorder.h"
|
|
3
3
|
#import "CodeBackground.h"
|
|
4
4
|
#import "CodeBlockBackground.h"
|
|
5
|
+
#import "ENRMLinkChip.h"
|
|
5
6
|
#import "ListMarkerDrawer.h"
|
|
6
7
|
#import "RuntimeKeys.h"
|
|
7
8
|
#import "StyleConfig.h"
|
|
@@ -31,6 +32,8 @@
|
|
|
31
32
|
// We fetch the objects into local variables FIRST to ensure they don't
|
|
32
33
|
// disappear mid-method if setConfig: is called on another thread.
|
|
33
34
|
|
|
35
|
+
ENRMDrawLinkChipsForGlyphRange(self, textContainer, glyphsToShow, origin);
|
|
36
|
+
|
|
34
37
|
CodeBackground *codeBg = [self getCodeBackgroundWithConfig:config];
|
|
35
38
|
[codeBg drawBackgroundsForGlyphRange:glyphsToShow layoutManager:self textContainer:textContainer atPoint:origin];
|
|
36
39
|
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
#import "ENRMBlockMenu.h"
|
|
3
|
+
#import "ENRMUIKit.h"
|
|
4
|
+
#import "StyleConfig.h"
|
|
5
|
+
|
|
6
|
+
@class MarkdownASTNode;
|
|
7
|
+
|
|
8
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
9
|
+
|
|
10
|
+
typedef void (^ENRMCodeBlockCopyBlock)(NSString *code, NSString *language);
|
|
11
|
+
|
|
12
|
+
@interface ENRMCodeBlockContainerView : RCTUIView
|
|
13
|
+
|
|
14
|
+
- (instancetype)initWithConfig:(StyleConfig *)config;
|
|
15
|
+
|
|
16
|
+
- (void)applyCodeBlockNode:(MarkdownASTNode *)node;
|
|
17
|
+
|
|
18
|
+
- (CGFloat)measureHeight:(CGFloat)maxWidth;
|
|
19
|
+
|
|
20
|
+
// View-free height for the shadow-node measurement pass: the same height an
|
|
21
|
+
// instance's measureHeight: reports for the node, without building a view.
|
|
22
|
+
+ (CGFloat)measureHeightForCodeBlockNode:(MarkdownASTNode *)node config:(StyleConfig *)config;
|
|
23
|
+
|
|
24
|
+
@property (nonatomic, strong) StyleConfig *config;
|
|
25
|
+
|
|
26
|
+
// True until the closing fence arrives: highlighting is deferred and copying is
|
|
27
|
+
// disabled, while the header stays visible.
|
|
28
|
+
@property (nonatomic, assign) BOOL pending;
|
|
29
|
+
|
|
30
|
+
// Renamed getters avoid the Cocoa `copy` method family (which signals +1
|
|
31
|
+
// retained returns). Property names are unchanged so call sites stay the same.
|
|
32
|
+
@property (nonatomic, copy, nullable, getter=menuCopyLabel) NSString *copyLabel;
|
|
33
|
+
@property (nonatomic, copy, nullable, getter=menuCopyAsMarkdownLabel) NSString *copyAsMarkdownLabel;
|
|
34
|
+
|
|
35
|
+
/// Suppresses the long-press copy menu on this block. Mirrors the
|
|
36
|
+
/// `contextMenuHidden` prop; the header copy button is a visible control, not a
|
|
37
|
+
/// context menu, and stays (hide it with `menuOptions.copyButtonHidden`).
|
|
38
|
+
@property (nonatomic, assign) BOOL contextMenuHidden;
|
|
39
|
+
|
|
40
|
+
/// Copy / Copy as Markdown visibility, Copy format and the header copy button
|
|
41
|
+
/// from `selectionMenuConfig`. `copyHidden` also drops the VoiceOver copy action;
|
|
42
|
+
/// the header button and VoiceOver action always copy the raw code.
|
|
43
|
+
@property (nonatomic, assign) ENRMBlockMenuOptions menuOptions;
|
|
44
|
+
|
|
45
|
+
/// Set by the host; receives the Copy item's content when
|
|
46
|
+
/// `menuOptions.interceptCopy` is set.
|
|
47
|
+
@property (nonatomic, copy, nullable) ENRMBlockCopyRequestBlock onCopyRequest;
|
|
48
|
+
/// Called instead of the menu on long press while `contextMenuHidden` is on, so
|
|
49
|
+
/// the owner can report the block (`onSelectionChange`) and show its own UI.
|
|
50
|
+
@property (nonatomic, copy, nullable) ENRMBlockCopyRequestBlock onMenuSuppressed;
|
|
51
|
+
|
|
52
|
+
// Fired when the code is copied (header button, context-menu Copy, or the
|
|
53
|
+
// VoiceOver copy action); set by the host to bridge up to the JS onCopyPress
|
|
54
|
+
// event. Not fired for "Copy as Markdown", nor for the context-menu Copy when
|
|
55
|
+
// `menuOptions.copyWritesMarkdown` is set.
|
|
56
|
+
@property (nonatomic, copy, nullable) ENRMCodeBlockCopyBlock onCopyPress;
|
|
57
|
+
|
|
58
|
+
@end
|
|
59
|
+
|
|
60
|
+
NS_ASSUME_NONNULL_END
|