react-native-enriched-markdown-scaffold 0.7.4-scaffold.9 → 1.0.2-scaffold.2
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 +186 -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 +24 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerInterface.java +8 -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 +35 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +886 -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 +189 -13
- 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 +54 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +901 -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 +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/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/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 +37 -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 +49 -15
- package/android/src/main/java/com/swmansion/enriched/markdown/views/BlockMenuOptions.kt +45 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +396 -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 +36 -9
- 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 +6 -4
- 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 +234 -12
- package/docs/BREAKING_CHANGES.md +129 -0
- package/docs/CODE_HIGHLIGHT.md +133 -0
- package/docs/COPY_OPTIONS.md +47 -3
- package/docs/ELEMENTS_STRUCTURE.md +52 -4
- package/docs/IMAGE_CACHING.md +30 -0
- package/docs/INPUT.md +108 -11
- 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 +284 -75
- package/ios/EnrichedMarkdownText.h +7 -0
- package/ios/EnrichedMarkdownText.mm +101 -73
- 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 +35 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +886 -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/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 +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/ENRMBlockMenu.h +57 -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.h +22 -5
- package/ios/utils/EditMenuUtils.m +53 -9
- 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 +53 -0
- package/ios/views/ENRMCodeBlockContainerView.m +559 -0
- package/ios/views/ENRMMathContainerView.h +16 -0
- package/ios/views/ENRMMathContainerView.m +74 -19
- package/ios/views/TableContainerView.h +22 -0
- package/ios/views/TableContainerView.m +261 -175
- package/jest.d.ts +1 -0
- package/jest.js +5 -0
- package/lib/module/EnrichedMarkdownNativeComponent.ts +73 -0
- 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 +74 -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 +37 -5
- 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 +66 -0
- 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 +66 -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 +104 -9
- 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 +73 -0
- package/src/EnrichedMarkdownTextInput.tsx +159 -8
- package/src/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
- package/src/EnrichedMarkdownTextNativeComponent.ts +74 -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 +53 -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 +101 -9
- 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
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Generated by vendor/gen-registry.mjs. Do not edit.
|
|
2
|
+
|
|
3
|
+
#include "HighlightGrammars.hpp"
|
|
4
|
+
#include "generated_queries.h"
|
|
5
|
+
|
|
6
|
+
#include <cstring>
|
|
7
|
+
|
|
8
|
+
extern "C" {
|
|
9
|
+
const TSLanguage *tree_sitter_json(void);
|
|
10
|
+
const TSLanguage *tree_sitter_html(void);
|
|
11
|
+
const TSLanguage *tree_sitter_css(void);
|
|
12
|
+
const TSLanguage *tree_sitter_markdown(void);
|
|
13
|
+
const TSLanguage *tree_sitter_yaml(void);
|
|
14
|
+
const TSLanguage *tree_sitter_go(void);
|
|
15
|
+
const TSLanguage *tree_sitter_java(void);
|
|
16
|
+
const TSLanguage *tree_sitter_javascript(void);
|
|
17
|
+
const TSLanguage *tree_sitter_python(void);
|
|
18
|
+
const TSLanguage *tree_sitter_c(void);
|
|
19
|
+
const TSLanguage *tree_sitter_rust(void);
|
|
20
|
+
const TSLanguage *tree_sitter_bash(void);
|
|
21
|
+
const TSLanguage *tree_sitter_typescript(void);
|
|
22
|
+
const TSLanguage *tree_sitter_tsx(void);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
namespace Markdown {
|
|
26
|
+
namespace {
|
|
27
|
+
|
|
28
|
+
constexpr GrammarEntry kGrammars[] = {
|
|
29
|
+
{"json", tree_sitter_json, kHighlightsQuery_json},
|
|
30
|
+
{"html", tree_sitter_html, kHighlightsQuery_html},
|
|
31
|
+
{"css", tree_sitter_css, kHighlightsQuery_css},
|
|
32
|
+
{"markdown", tree_sitter_markdown, kHighlightsQuery_markdown},
|
|
33
|
+
{"yaml", tree_sitter_yaml, kHighlightsQuery_yaml},
|
|
34
|
+
{"go", tree_sitter_go, kHighlightsQuery_go},
|
|
35
|
+
{"java", tree_sitter_java, kHighlightsQuery_java},
|
|
36
|
+
{"javascript", tree_sitter_javascript, kHighlightsQuery_javascript},
|
|
37
|
+
{"python", tree_sitter_python, kHighlightsQuery_python},
|
|
38
|
+
{"c", tree_sitter_c, kHighlightsQuery_c},
|
|
39
|
+
{"rust", tree_sitter_rust, kHighlightsQuery_rust},
|
|
40
|
+
{"bash", tree_sitter_bash, kHighlightsQuery_bash},
|
|
41
|
+
{"typescript", tree_sitter_typescript, kHighlightsQuery_typescript},
|
|
42
|
+
{"tsx", tree_sitter_tsx, kHighlightsQuery_tsx},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
} // namespace
|
|
46
|
+
|
|
47
|
+
const GrammarEntry *findGrammar(const char *canonicalId) {
|
|
48
|
+
if (canonicalId == nullptr) {
|
|
49
|
+
return nullptr;
|
|
50
|
+
}
|
|
51
|
+
for (const GrammarEntry &entry : kGrammars) {
|
|
52
|
+
if (std::strcmp(entry.canonicalId, canonicalId) == 0) {
|
|
53
|
+
return &entry;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return nullptr;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
} // namespace Markdown
|
|
@@ -19,6 +19,7 @@ public:
|
|
|
19
19
|
static const std::string ATTR_LANGUAGE;
|
|
20
20
|
static const std::string ATTR_IS_TASK;
|
|
21
21
|
static const std::string ATTR_TASK_CHECKED;
|
|
22
|
+
static const std::string ATTR_START;
|
|
22
23
|
|
|
23
24
|
void reset(size_t estimatedDepth) {
|
|
24
25
|
root = std::make_shared<MarkdownASTNode>(NodeType::Document);
|
|
@@ -114,7 +115,14 @@ public:
|
|
|
114
115
|
}
|
|
115
116
|
|
|
116
117
|
case MD_BLOCK_OL: {
|
|
117
|
-
|
|
118
|
+
auto node = std::make_shared<MarkdownASTNode>(NodeType::OrderedList);
|
|
119
|
+
if (detail) {
|
|
120
|
+
auto *ol = static_cast<MD_BLOCK_OL_DETAIL *>(detail);
|
|
121
|
+
if (ol->start != 1) {
|
|
122
|
+
node->setAttribute(ATTR_START, std::to_string(ol->start));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
impl->pushNode(node);
|
|
118
126
|
break;
|
|
119
127
|
}
|
|
120
128
|
|
|
@@ -346,10 +354,13 @@ public:
|
|
|
346
354
|
return 0;
|
|
347
355
|
auto *impl = static_cast<Impl *>(userdata);
|
|
348
356
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
357
|
+
if (type == MD_TEXT_SOFTBR) {
|
|
358
|
+
impl->addInlineNode(std::make_shared<MarkdownASTNode>(NodeType::SoftBreak));
|
|
359
|
+
return 0;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
if (type == MD_TEXT_BR) {
|
|
363
|
+
impl->addInlineNode(std::make_shared<MarkdownASTNode>(NodeType::LineBreak));
|
|
353
364
|
return 0;
|
|
354
365
|
}
|
|
355
366
|
|
|
@@ -364,63 +375,89 @@ public:
|
|
|
364
375
|
|
|
365
376
|
namespace {
|
|
366
377
|
|
|
378
|
+
using NodeList = std::vector<std::shared_ptr<MarkdownASTNode>>;
|
|
379
|
+
|
|
367
380
|
bool isDisplayMathNode(const MarkdownASTNode &node) {
|
|
368
381
|
return node.type == NodeType::LatexMathDisplay;
|
|
369
382
|
}
|
|
370
383
|
|
|
371
384
|
bool isSeparatorNode(const MarkdownASTNode &node) {
|
|
372
|
-
return node.type == NodeType::LineBreak ||
|
|
385
|
+
return node.type == NodeType::LineBreak || node.type == NodeType::SoftBreak ||
|
|
373
386
|
(node.type == NodeType::Text && node.content.find_first_not_of(" \t\n\r") == std::string::npos);
|
|
374
387
|
}
|
|
375
388
|
|
|
376
|
-
//
|
|
377
|
-
//
|
|
378
|
-
//
|
|
379
|
-
//
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
bool
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
389
|
+
// A display-math node is "isolated" — i.e. block-level — when at least one of its
|
|
390
|
+
// neighbours is a boundary: the paragraph edge, or a separator (LineBreak / blank
|
|
391
|
+
// text). Display math flanked by real text on BOTH sides (e.g. `a $$x$$ b`) is
|
|
392
|
+
// genuinely inline and is left in place.
|
|
393
|
+
bool isIsolatedDisplayMath(const std::vector<std::shared_ptr<MarkdownASTNode>> &children, size_t i) {
|
|
394
|
+
if (!isDisplayMathNode(*children[i]))
|
|
395
|
+
return false;
|
|
396
|
+
bool leftBoundary = (i == 0) || isSeparatorNode(*children[i - 1]);
|
|
397
|
+
bool rightBoundary = (i + 1 >= children.size()) || isSeparatorNode(*children[i + 1]);
|
|
398
|
+
return leftBoundary || rightBoundary;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// md4c parses $$...$$ as an inline span, so display math always lands nested inside a
|
|
402
|
+
// Paragraph — even when it sits on its own line, and even in the middle of a paragraph
|
|
403
|
+
// (text on lines before and after it, with no blank separator).
|
|
404
|
+
//
|
|
405
|
+
// This rebuilds such a paragraph into a sequence of top-level siblings so the rendering
|
|
406
|
+
// layer sees isolated display math as a block: each run of inline content becomes its own
|
|
407
|
+
// Paragraph, and each isolated display-math node becomes a bare LatexMathDisplay sibling.
|
|
408
|
+
// Separators bordering a promoted node are dropped. Returns an empty vector when the
|
|
409
|
+
// paragraph has no promotable display math, signalling the caller to leave it untouched.
|
|
410
|
+
//
|
|
411
|
+
// This subsumes the earlier trailing-only behaviour: pure (`$$x$$`), trailing
|
|
412
|
+
// (`text\n$$x$$`) and leading (`$$x$$\ntext`) are all just special cases of the general
|
|
413
|
+
// interior split.
|
|
414
|
+
std::vector<std::shared_ptr<MarkdownASTNode>>
|
|
415
|
+
splitParagraphAroundDisplayMath(const std::vector<std::shared_ptr<MarkdownASTNode>> &children) {
|
|
416
|
+
bool anyPromotion = false;
|
|
417
|
+
for (size_t i = 0; i < children.size(); ++i) {
|
|
418
|
+
if (isIsolatedDisplayMath(children, i)) {
|
|
419
|
+
anyPromotion = true;
|
|
394
420
|
break;
|
|
395
421
|
}
|
|
396
422
|
}
|
|
423
|
+
if (!anyPromotion)
|
|
424
|
+
return {};
|
|
397
425
|
|
|
398
|
-
return hasDisplayMath ? trailingRunStart : children.size();
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
// Collect only the LatexMathDisplay nodes from a range, skipping separators.
|
|
402
|
-
std::vector<std::shared_ptr<MarkdownASTNode>>
|
|
403
|
-
collectDisplayMathNodes(const std::vector<std::shared_ptr<MarkdownASTNode>> &children, size_t from) {
|
|
404
426
|
std::vector<std::shared_ptr<MarkdownASTNode>> result;
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
427
|
+
std::vector<std::shared_ptr<MarkdownASTNode>> inlineRun;
|
|
428
|
+
|
|
429
|
+
auto flushInlineRun = [&]() {
|
|
430
|
+
// Trim separators left dangling against the promoted math on either side.
|
|
431
|
+
size_t start = 0;
|
|
432
|
+
size_t end = inlineRun.size();
|
|
433
|
+
while (start < end && isSeparatorNode(*inlineRun[start]))
|
|
434
|
+
++start;
|
|
435
|
+
while (end > start && isSeparatorNode(*inlineRun[end - 1]))
|
|
436
|
+
--end;
|
|
437
|
+
if (start < end) {
|
|
438
|
+
auto paragraph = std::make_shared<MarkdownASTNode>(NodeType::Paragraph);
|
|
439
|
+
paragraph->children.assign(inlineRun.begin() + static_cast<NodeList::difference_type>(start),
|
|
440
|
+
inlineRun.begin() + static_cast<NodeList::difference_type>(end));
|
|
441
|
+
result.push_back(std::move(paragraph));
|
|
442
|
+
}
|
|
443
|
+
inlineRun.clear();
|
|
444
|
+
};
|
|
445
|
+
|
|
446
|
+
for (size_t i = 0; i < children.size(); ++i) {
|
|
447
|
+
if (isIsolatedDisplayMath(children, i)) {
|
|
448
|
+
flushInlineRun();
|
|
449
|
+
result.push_back(children[i]);
|
|
450
|
+
} else {
|
|
451
|
+
inlineRun.push_back(children[i]);
|
|
452
|
+
}
|
|
408
453
|
}
|
|
454
|
+
flushInlineRun();
|
|
455
|
+
|
|
409
456
|
return result;
|
|
410
457
|
}
|
|
411
458
|
|
|
412
|
-
//
|
|
413
|
-
//
|
|
414
|
-
// with any preceding text — into a single Paragraph with LineBreak nodes between them.
|
|
415
|
-
//
|
|
416
|
-
// This post-processing step walks the document's top-level children and promotes
|
|
417
|
-
// trailing LatexMathDisplay nodes out of their parent Paragraph so that the
|
|
418
|
-
// rendering layer sees them as top-level block elements.
|
|
419
|
-
//
|
|
420
|
-
// Two cases:
|
|
421
|
-
// (a) Pure: every child is display math or a separator → replace paragraph entirely.
|
|
422
|
-
// (b) Mixed: leading text followed by display math → keep text in the paragraph,
|
|
423
|
-
// splice the display math nodes as siblings after it.
|
|
459
|
+
// Walk the document's top-level children and promote isolated display math out of its
|
|
460
|
+
// parent Paragraph so the rendering layer sees it as a top-level block element.
|
|
424
461
|
void promoteDisplayMathFromParagraphs(MarkdownASTNode &root) {
|
|
425
462
|
auto &children = root.children;
|
|
426
463
|
|
|
@@ -431,31 +468,101 @@ void promoteDisplayMathFromParagraphs(MarkdownASTNode &root) {
|
|
|
431
468
|
continue;
|
|
432
469
|
}
|
|
433
470
|
|
|
434
|
-
auto
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
if (trailingRunStart >= paragraphChildren.size()) {
|
|
471
|
+
auto replacement = splitParagraphAroundDisplayMath(paragraph->children);
|
|
472
|
+
if (replacement.empty()) {
|
|
438
473
|
++i;
|
|
439
474
|
continue;
|
|
440
475
|
}
|
|
441
476
|
|
|
442
|
-
auto
|
|
477
|
+
auto position = children.erase(children.begin() + static_cast<NodeList::difference_type>(i));
|
|
478
|
+
children.insert(position, replacement.begin(), replacement.end());
|
|
479
|
+
i += replacement.size();
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
bool isBlockNode(const MarkdownASTNode &node) {
|
|
484
|
+
switch (node.type) {
|
|
485
|
+
case NodeType::Document:
|
|
486
|
+
case NodeType::Paragraph:
|
|
487
|
+
case NodeType::Heading:
|
|
488
|
+
case NodeType::Blockquote:
|
|
489
|
+
case NodeType::UnorderedList:
|
|
490
|
+
case NodeType::OrderedList:
|
|
491
|
+
case NodeType::ListItem:
|
|
492
|
+
case NodeType::CodeBlock:
|
|
493
|
+
case NodeType::ThematicBreak:
|
|
494
|
+
case NodeType::LatexMathDisplay:
|
|
495
|
+
case NodeType::Table:
|
|
496
|
+
case NodeType::TableHead:
|
|
497
|
+
case NodeType::TableBody:
|
|
498
|
+
case NodeType::TableRow:
|
|
499
|
+
case NodeType::TableHeaderCell:
|
|
500
|
+
case NodeType::TableCell:
|
|
501
|
+
return true;
|
|
502
|
+
default:
|
|
503
|
+
return false;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// md4c omits Paragraph wrappers around the inline content of tight list items.
|
|
508
|
+
// Wrap each run of consecutive inline children of a ListItem in a synthetic
|
|
509
|
+
// Paragraph (marked "tight") so renderers only ever see block children.
|
|
510
|
+
void wrapListItemInlineRuns(MarkdownASTNode &node) {
|
|
511
|
+
for (auto &child : node.children) {
|
|
512
|
+
wrapListItemInlineRuns(*child);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
if (node.type != NodeType::ListItem)
|
|
516
|
+
return;
|
|
443
517
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
518
|
+
bool hasInlineChild = false;
|
|
519
|
+
for (auto &child : node.children) {
|
|
520
|
+
if (!isBlockNode(*child)) {
|
|
521
|
+
hasInlineChild = true;
|
|
522
|
+
break;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
if (!hasInlineChild)
|
|
526
|
+
return;
|
|
527
|
+
|
|
528
|
+
std::vector<std::shared_ptr<MarkdownASTNode>> newChildren;
|
|
529
|
+
newChildren.reserve(node.children.size());
|
|
530
|
+
std::vector<std::shared_ptr<MarkdownASTNode>> run;
|
|
531
|
+
|
|
532
|
+
auto flushRun = [&]() {
|
|
533
|
+
if (run.empty())
|
|
534
|
+
return;
|
|
535
|
+
bool hasContent = false;
|
|
536
|
+
for (auto &n : run) {
|
|
537
|
+
if (!isSeparatorNode(*n)) {
|
|
538
|
+
hasContent = true;
|
|
539
|
+
break;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
if (hasContent) {
|
|
543
|
+
auto paragraph = std::make_shared<MarkdownASTNode>(NodeType::Paragraph);
|
|
544
|
+
paragraph->setAttribute("tight", "true");
|
|
545
|
+
paragraph->children = std::move(run);
|
|
546
|
+
newChildren.push_back(std::move(paragraph));
|
|
448
547
|
} else {
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
paragraphChildren.pop_back();
|
|
548
|
+
// Whitespace-only run between blocks — keep as-is, a paragraph would add spacing.
|
|
549
|
+
for (auto &n : run) {
|
|
550
|
+
newChildren.push_back(std::move(n));
|
|
453
551
|
}
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
552
|
+
}
|
|
553
|
+
run.clear();
|
|
554
|
+
};
|
|
555
|
+
|
|
556
|
+
for (auto &child : node.children) {
|
|
557
|
+
if (isBlockNode(*child)) {
|
|
558
|
+
flushRun();
|
|
559
|
+
newChildren.push_back(std::move(child));
|
|
560
|
+
} else {
|
|
561
|
+
run.push_back(std::move(child));
|
|
457
562
|
}
|
|
458
563
|
}
|
|
564
|
+
flushRun();
|
|
565
|
+
node.children = std::move(newChildren);
|
|
459
566
|
}
|
|
460
567
|
|
|
461
568
|
} // anonymous namespace
|
|
@@ -501,6 +608,9 @@ std::shared_ptr<MarkdownASTNode> MD4CParser::parse(const std::string &markdown,
|
|
|
501
608
|
if (md4cFlags.highlight) {
|
|
502
609
|
flags |= MD_FLAG_HIGHLIGHT;
|
|
503
610
|
}
|
|
611
|
+
if (md4cFlags.hardSoftBreaks) {
|
|
612
|
+
flags |= MD_FLAG_HARD_SOFT_BREAKS;
|
|
613
|
+
}
|
|
504
614
|
|
|
505
615
|
// Configure MD4C parser with callbacks
|
|
506
616
|
MD_PARSER parser = {
|
|
@@ -522,6 +632,7 @@ std::shared_ptr<MarkdownASTNode> MD4CParser::parse(const std::string &markdown,
|
|
|
522
632
|
|
|
523
633
|
if (impl_->root) {
|
|
524
634
|
promoteDisplayMathFromParagraphs(*impl_->root);
|
|
635
|
+
wrapListItemInlineRuns(*impl_->root);
|
|
525
636
|
}
|
|
526
637
|
|
|
527
638
|
return impl_->root ? impl_->root : std::make_shared<MarkdownASTNode>(NodeType::Document);
|
|
@@ -535,5 +646,6 @@ const std::string MD4CParser::Impl::ATTR_FENCE_CHAR = "fenceChar";
|
|
|
535
646
|
const std::string MD4CParser::Impl::ATTR_LANGUAGE = "language";
|
|
536
647
|
const std::string MD4CParser::Impl::ATTR_IS_TASK = "isTask";
|
|
537
648
|
const std::string MD4CParser::Impl::ATTR_TASK_CHECKED = "taskChecked";
|
|
649
|
+
const std::string MD4CParser::Impl::ATTR_START = "start";
|
|
538
650
|
|
|
539
651
|
} // namespace Markdown
|
package/cpp/wasm/build.sh
CHANGED
package/cpp/wasm/md4c_wasm.cpp
CHANGED
|
@@ -18,10 +18,11 @@ extern "C" {
|
|
|
18
18
|
* @param superscript 1 → enable ^superscript^ spans; 0 → disable.
|
|
19
19
|
* @param subscript 1 → enable ~subscript~ spans; 0 → disable.
|
|
20
20
|
* @param highlight 1 → enable ==highlight== spans; 0 → disable.
|
|
21
|
+
* @param hardSoftBreaks 1 → treat soft breaks as hard breaks; 0 → collapse to space.
|
|
21
22
|
* @return Null-terminated UTF-8 JSON string, valid until the next call.
|
|
22
23
|
*/
|
|
23
24
|
const char *parseMarkdown(const char *markdown, int underline, int latexMath, int superscript, int subscript,
|
|
24
|
-
int highlight) {
|
|
25
|
+
int highlight, int hardSoftBreaks) {
|
|
25
26
|
if (!markdown) {
|
|
26
27
|
g_resultBuffer = "{\"type\":\"Document\"}";
|
|
27
28
|
return g_resultBuffer.c_str();
|
|
@@ -33,6 +34,7 @@ const char *parseMarkdown(const char *markdown, int underline, int latexMath, in
|
|
|
33
34
|
flags.superscript = (superscript != 0);
|
|
34
35
|
flags.subscript = (subscript != 0);
|
|
35
36
|
flags.highlight = (highlight != 0);
|
|
37
|
+
flags.hardSoftBreaks = (hardSoftBreaks != 0);
|
|
36
38
|
|
|
37
39
|
Markdown::MD4CParser parser;
|
|
38
40
|
auto root = parser.parse(std::string(markdown), flags);
|
package/docs/ACCESSIBILITY.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Accessibility
|
|
2
2
|
|
|
3
|
-
`react-native-enriched-markdown` provides comprehensive accessibility support for screen readers on both iOS and Android platforms.
|
|
3
|
+
`react-native-enriched-markdown-scaffold` provides comprehensive accessibility support for screen readers on both iOS and Android platforms.
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
@@ -15,7 +15,7 @@ Plain text paragraphs without inline links or images are announced as a single V
|
|
|
15
15
|
All strings spoken by the screen reader (list announcements, blockquote suffix, table rows, math equation prefix, and iOS rotor names) can be overridden via the optional `accessibilityLabels` prop on `EnrichedMarkdownText`. The defaults are English; consumers wire in their own i18n pipeline.
|
|
16
16
|
|
|
17
17
|
```tsx
|
|
18
|
-
import { EnrichedMarkdownText } from 'react-native-enriched-markdown';
|
|
18
|
+
import { EnrichedMarkdownText } from 'react-native-enriched-markdown-scaffold';
|
|
19
19
|
|
|
20
20
|
<EnrichedMarkdownText
|
|
21
21
|
markdown={markdown}
|
|
@@ -164,9 +164,21 @@ Tables expose one focusable element per row (header included), labeled with the
|
|
|
164
164
|
|
|
165
165
|
Each math block exposes a single focusable element labeled `"Math: <latex>"`. The library does **not** convert LaTeX to natural language — the screen reader reads the raw LaTeX source. If you need spoken math, plug in a LaTeX→speech library on the consumer side and translate the labels accordingly.
|
|
166
166
|
|
|
167
|
+
## Text input (`EnrichedMarkdownTextInput`)
|
|
168
|
+
|
|
169
|
+
The editor's accessibility model is intentionally simpler than the renderer's. The input is built on a custom TextKit stack, so its inner `UITextView` is not surfaced to VoiceOver directly — instead the component is presented as a **single accessibility element** that reads its whole content as one paragraph.
|
|
170
|
+
|
|
171
|
+
**iOS (VoiceOver):**
|
|
172
|
+
- The field is one element whose spoken value is the full plain text (delimiters stripped). When the field is empty, the placeholder is announced instead.
|
|
173
|
+
- `accessibilityLabel` / `accessibilityHint` set on the component are forwarded and announced.
|
|
174
|
+
- Double-tapping activates the field: it becomes first responder and the keyboard opens for editing.
|
|
175
|
+
|
|
176
|
+
**Android (TalkBack):** the input is a native `EditText`, announced and edited as a standard editable text field.
|
|
177
|
+
|
|
167
178
|
## Known Limitations
|
|
168
179
|
|
|
169
180
|
- **Inline formatting** (bold / italic / underline / strikethrough / inline code / spoiler) is not split into separate accessibility elements — the entire paragraph is read as one element, exactly as the surrounding text. Screen readers don't apply visual emphasis to bold/italic by default.
|
|
170
181
|
- **macOS** screen-reader support is still pending — `MarkdownAccessibilityElementBuilder.m` ships a no-op stub for macOS. Tracked as a TODO; iOS implementation can serve as a reference.
|
|
171
182
|
- **Android** has no rotor concept — `accessibilityLabels.rotor.*` is silently ignored on that platform.
|
|
172
183
|
- **iOS** blockquote backgrounds may break at link boundaries instead of spanning the full line. Visual only; doesn't affect accessibility.
|
|
184
|
+
- **Text input** (`EnrichedMarkdownTextInput`, iOS) is exposed as a single VoiceOver element reading its full plain text as one paragraph. It is **not** announced with the native "text field" role, has no in-field cursor navigation or per-character echo (editing happens via the keyboard after a double-tap activation), and its spoken value refreshes on re-focus rather than live. Exposing the inner `UITextView` for these would be unreliable under the custom TextKit stack (duplicate/flaky announcements). Inline formatting and headings are read as plain text.
|