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
|
@@ -25,8 +25,17 @@ endif()
|
|
|
25
25
|
|
|
26
26
|
set(ANDROID_CPP_DIR "${LIB_ANDROID_DIR}/src/main/cpp")
|
|
27
27
|
|
|
28
|
+
# Optional tree-sitter code highlighting. build.gradle writes this config during
|
|
29
|
+
# configuration (enable flag, selected languages, generated registry dir); absent
|
|
30
|
+
# on a bare CMake invocation, in which case highlighting stays compiled out.
|
|
31
|
+
set(HIGHLIGHT_CONFIG "${LIB_ANDROID_DIR}/build/generated/highlight/highlight-config.cmake")
|
|
32
|
+
if(EXISTS "${HIGHLIGHT_CONFIG}")
|
|
33
|
+
include("${HIGHLIGHT_CONFIG}")
|
|
34
|
+
endif()
|
|
35
|
+
|
|
28
36
|
file(GLOB MD4C_SOURCES "${CPP_ROOT}/md4c/*.c")
|
|
29
37
|
file(GLOB PARSER_SOURCES "${CPP_ROOT}/parser/*.cpp")
|
|
38
|
+
file(GLOB HIGHLIGHT_SOURCES "${CPP_ROOT}/highlight/*.cpp")
|
|
30
39
|
|
|
31
40
|
# md4c is C code, build as separate static library with C flags
|
|
32
41
|
add_library(md4c_lib STATIC ${MD4C_SOURCES})
|
|
@@ -46,6 +55,7 @@ add_library(
|
|
|
46
55
|
${LIB_CODEGEN_SRCS}
|
|
47
56
|
${LIB_CUSTOM_JNI_SRCS}
|
|
48
57
|
${PARSER_SOURCES}
|
|
58
|
+
${HIGHLIGHT_SOURCES}
|
|
49
59
|
${ANDROID_CPP_DIR}/jni-adapter.cpp
|
|
50
60
|
)
|
|
51
61
|
|
|
@@ -58,6 +68,7 @@ target_include_directories(
|
|
|
58
68
|
${LIB_ANDROID_GENERATED_COMPONENTS_DIR}
|
|
59
69
|
${CPP_ROOT}/md4c
|
|
60
70
|
${CPP_ROOT}/parser
|
|
71
|
+
${CPP_ROOT}/highlight
|
|
61
72
|
)
|
|
62
73
|
|
|
63
74
|
target_compile_definitions(${LIB_TARGET_NAME} PRIVATE MD4C_USE_UTF8=1)
|
|
@@ -82,3 +93,45 @@ target_include_directories(
|
|
|
82
93
|
)
|
|
83
94
|
|
|
84
95
|
target_compile_reactnative_options(${LIB_TARGET_NAME} PRIVATE)
|
|
96
|
+
|
|
97
|
+
# --- Code-block syntax highlighting (tree-sitter) ---
|
|
98
|
+
# CodeBlockHighlighter.cpp / CodeBlockLanguages.cpp are already in the target via
|
|
99
|
+
# HIGHLIGHT_SOURCES; without the define below CodeBlockHighlighter.cpp is the stub.
|
|
100
|
+
# When enabled we add the runtime, the generated registry, and one OBJECT lib per
|
|
101
|
+
# selected grammar (each isolated to its own dir so grammar parser.h files never
|
|
102
|
+
# collide), then define ENRICHED_MARKDOWN_CODE_HIGHLIGHT so the real seam compiles.
|
|
103
|
+
if(ENRICHED_MARKDOWN_CODE_HIGHLIGHT)
|
|
104
|
+
set(TS_VENDOR "${CPP_ROOT}/highlight/vendor")
|
|
105
|
+
|
|
106
|
+
add_library(tree_sitter_runtime STATIC "${TS_VENDOR}/tree-sitter/src/lib.c")
|
|
107
|
+
target_include_directories(tree_sitter_runtime
|
|
108
|
+
PRIVATE "${TS_VENDOR}/tree-sitter/src"
|
|
109
|
+
PUBLIC "${TS_VENDOR}/tree-sitter/include")
|
|
110
|
+
set_target_properties(tree_sitter_runtime PROPERTIES
|
|
111
|
+
C_STANDARD 11 C_STANDARD_REQUIRED ON POSITION_INDEPENDENT_CODE ON)
|
|
112
|
+
target_compile_options(tree_sitter_runtime PRIVATE -fvisibility=hidden)
|
|
113
|
+
|
|
114
|
+
set(GRAMMAR_OBJECTS "")
|
|
115
|
+
foreach(lang IN LISTS ENRICHED_MARKDOWN_HIGHLIGHT_LANGUAGES)
|
|
116
|
+
set(gdir "${TS_VENDOR}/grammars/${lang}")
|
|
117
|
+
set(gsrcs "${gdir}/parser.c")
|
|
118
|
+
if(EXISTS "${gdir}/scanner.c")
|
|
119
|
+
list(APPEND gsrcs "${gdir}/scanner.c")
|
|
120
|
+
endif()
|
|
121
|
+
add_library(ts_grammar_${lang} OBJECT ${gsrcs})
|
|
122
|
+
target_include_directories(ts_grammar_${lang} PRIVATE "${gdir}")
|
|
123
|
+
set_target_properties(ts_grammar_${lang} PROPERTIES
|
|
124
|
+
C_STANDARD 11 C_STANDARD_REQUIRED ON POSITION_INDEPENDENT_CODE ON)
|
|
125
|
+
target_compile_options(ts_grammar_${lang} PRIVATE -fvisibility=hidden)
|
|
126
|
+
list(APPEND GRAMMAR_OBJECTS $<TARGET_OBJECTS:ts_grammar_${lang}>)
|
|
127
|
+
endforeach()
|
|
128
|
+
|
|
129
|
+
target_sources(${LIB_TARGET_NAME} PRIVATE
|
|
130
|
+
"${ENRICHED_MARKDOWN_HIGHLIGHT_GENERATED_DIR}/generated_registry.cpp"
|
|
131
|
+
${GRAMMAR_OBJECTS})
|
|
132
|
+
target_include_directories(${LIB_TARGET_NAME} PRIVATE
|
|
133
|
+
"${TS_VENDOR}/tree-sitter/include"
|
|
134
|
+
"${ENRICHED_MARKDOWN_HIGHLIGHT_GENERATED_DIR}")
|
|
135
|
+
target_compile_definitions(${LIB_TARGET_NAME} PRIVATE ENRICHED_MARKDOWN_CODE_HIGHLIGHT=1)
|
|
136
|
+
target_link_libraries(${LIB_TARGET_NAME} tree_sitter_runtime)
|
|
137
|
+
endif()
|
|
@@ -12,6 +12,16 @@ void MarkdownContainerShadowNode::setMeasurementsManager(
|
|
|
12
12
|
measurementsManager_ = measurementsManager;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
void MarkdownContainerShadowNode::dirtyLayoutIfNeeded() {
|
|
16
|
+
const auto state = this->getStateData();
|
|
17
|
+
const auto counter = state.getForceHeightRecalculationCounter();
|
|
18
|
+
|
|
19
|
+
if (forceHeightRecalculationCounter_ != counter) {
|
|
20
|
+
forceHeightRecalculationCounter_ = counter;
|
|
21
|
+
dirtyLayout();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
15
25
|
Size MarkdownContainerShadowNode::measureContent(const LayoutContext &layoutContext,
|
|
16
26
|
const LayoutConstraints &layoutConstraints) const {
|
|
17
27
|
return measurementsManager_->measure(getSurfaceId(), getTag(), getConcreteProps(), layoutConstraints);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#include "MarkdownContainerMeasurementManager.h"
|
|
4
|
+
#include "MarkdownTextState.h"
|
|
4
5
|
|
|
5
6
|
#include <react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h>
|
|
6
7
|
#include <react/renderer/components/EnrichedMarkdownTextSpec/Props.h>
|
|
@@ -11,11 +12,16 @@ namespace facebook::react {
|
|
|
11
12
|
JSI_EXPORT extern const char MarkdownContainerComponentName[];
|
|
12
13
|
|
|
13
14
|
class MarkdownContainerShadowNode final
|
|
14
|
-
: public ConcreteViewShadowNode<MarkdownContainerComponentName, EnrichedMarkdownProps,
|
|
15
|
-
|
|
15
|
+
: public ConcreteViewShadowNode<MarkdownContainerComponentName, EnrichedMarkdownProps, EnrichedMarkdownEventEmitter,
|
|
16
|
+
MarkdownTextState> {
|
|
16
17
|
public:
|
|
17
18
|
using ConcreteViewShadowNode::ConcreteViewShadowNode;
|
|
18
19
|
|
|
20
|
+
MarkdownContainerShadowNode(ShadowNode const &sourceShadowNode, ShadowNodeFragment const &fragment)
|
|
21
|
+
: ConcreteViewShadowNode(sourceShadowNode, fragment) {
|
|
22
|
+
dirtyLayoutIfNeeded();
|
|
23
|
+
}
|
|
24
|
+
|
|
19
25
|
static ShadowNodeTraits BaseTraits() {
|
|
20
26
|
auto traits = ConcreteViewShadowNode::BaseTraits();
|
|
21
27
|
traits.set(ShadowNodeTraits::Trait::LeafYogaNode);
|
|
@@ -25,9 +31,12 @@ public:
|
|
|
25
31
|
|
|
26
32
|
void setMeasurementsManager(const std::shared_ptr<MarkdownContainerMeasurementManager> &measurementsManager);
|
|
27
33
|
|
|
34
|
+
void dirtyLayoutIfNeeded();
|
|
35
|
+
|
|
28
36
|
Size measureContent(const LayoutContext &layoutContext, const LayoutConstraints &layoutConstraints) const override;
|
|
29
37
|
|
|
30
38
|
private:
|
|
39
|
+
int forceHeightRecalculationCounter_{0};
|
|
31
40
|
std::shared_ptr<MarkdownContainerMeasurementManager> measurementsManager_;
|
|
32
41
|
};
|
|
33
42
|
|
|
@@ -12,6 +12,16 @@ void MarkdownTextShadowNode::setMeasurementsManager(
|
|
|
12
12
|
measurementsManager_ = measurementsManager;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
void MarkdownTextShadowNode::dirtyLayoutIfNeeded() {
|
|
16
|
+
const auto state = this->getStateData();
|
|
17
|
+
const auto counter = state.getForceHeightRecalculationCounter();
|
|
18
|
+
|
|
19
|
+
if (forceHeightRecalculationCounter_ != counter) {
|
|
20
|
+
forceHeightRecalculationCounter_ = counter;
|
|
21
|
+
dirtyLayout();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
15
25
|
Size MarkdownTextShadowNode::measureContent(const LayoutContext &layoutContext,
|
|
16
26
|
const LayoutConstraints &layoutConstraints) const {
|
|
17
27
|
return measurementsManager_->measure(getSurfaceId(), getTag(), getConcreteProps(), layoutConstraints);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#include "MarkdownTextMeasurementManager.h"
|
|
4
|
+
#include "MarkdownTextState.h"
|
|
4
5
|
|
|
5
6
|
#include <react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h>
|
|
6
7
|
#include <react/renderer/components/EnrichedMarkdownTextSpec/Props.h>
|
|
@@ -13,11 +14,17 @@ JSI_EXPORT extern const char MarkdownTextComponentName[];
|
|
|
13
14
|
/*
|
|
14
15
|
* `ShadowNode` for <EnrichedMarkdownText> component.
|
|
15
16
|
*/
|
|
16
|
-
class MarkdownTextShadowNode final
|
|
17
|
-
|
|
17
|
+
class MarkdownTextShadowNode final
|
|
18
|
+
: public ConcreteViewShadowNode<MarkdownTextComponentName, EnrichedMarkdownTextProps,
|
|
19
|
+
EnrichedMarkdownTextEventEmitter, MarkdownTextState> {
|
|
18
20
|
public:
|
|
19
21
|
using ConcreteViewShadowNode::ConcreteViewShadowNode;
|
|
20
22
|
|
|
23
|
+
MarkdownTextShadowNode(ShadowNode const &sourceShadowNode, ShadowNodeFragment const &fragment)
|
|
24
|
+
: ConcreteViewShadowNode(sourceShadowNode, fragment) {
|
|
25
|
+
dirtyLayoutIfNeeded();
|
|
26
|
+
}
|
|
27
|
+
|
|
21
28
|
static ShadowNodeTraits BaseTraits() {
|
|
22
29
|
auto traits = ConcreteViewShadowNode::BaseTraits();
|
|
23
30
|
traits.set(ShadowNodeTraits::Trait::LeafYogaNode);
|
|
@@ -28,9 +35,12 @@ public:
|
|
|
28
35
|
// Associates a shared `MarkdownTextMeasurementManager` with the node.
|
|
29
36
|
void setMeasurementsManager(const std::shared_ptr<MarkdownTextMeasurementManager> &measurementsManager);
|
|
30
37
|
|
|
38
|
+
void dirtyLayoutIfNeeded();
|
|
39
|
+
|
|
31
40
|
Size measureContent(const LayoutContext &layoutContext, const LayoutConstraints &layoutConstraints) const override;
|
|
32
41
|
|
|
33
42
|
private:
|
|
43
|
+
int forceHeightRecalculationCounter_{0};
|
|
34
44
|
std::shared_ptr<MarkdownTextMeasurementManager> measurementsManager_;
|
|
35
45
|
};
|
|
36
46
|
|
package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.h
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <folly/dynamic.h>
|
|
4
|
+
|
|
5
|
+
namespace facebook::react {
|
|
6
|
+
|
|
7
|
+
class MarkdownTextState {
|
|
8
|
+
public:
|
|
9
|
+
MarkdownTextState() : forceHeightRecalculationCounter_(0) {}
|
|
10
|
+
|
|
11
|
+
MarkdownTextState(MarkdownTextState const &previousState, folly::dynamic data)
|
|
12
|
+
: forceHeightRecalculationCounter_((int)data["forceHeightRecalculationCounter"].getInt()) {}
|
|
13
|
+
|
|
14
|
+
folly::dynamic getDynamic() const {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
int getForceHeightRecalculationCounter() const;
|
|
19
|
+
|
|
20
|
+
private:
|
|
21
|
+
const int forceHeightRecalculationCounter_{};
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
} // namespace facebook::react
|
package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h
CHANGED
|
@@ -12,9 +12,17 @@ inline folly::dynamic toDynamic(const EnrichedMarkdownTextProps &props) {
|
|
|
12
12
|
serializedProps["markdown"] = props.markdown;
|
|
13
13
|
serializedProps["markdownStyle"] = toDynamic(props.markdownStyle);
|
|
14
14
|
serializedProps["md4cFlags"] = toDynamic(props.md4cFlags);
|
|
15
|
+
serializedProps["allowFontScaling"] = props.allowFontScaling;
|
|
16
|
+
serializedProps["maxFontSizeMultiplier"] = props.maxFontSizeMultiplier;
|
|
15
17
|
serializedProps["allowTrailingMargin"] = props.allowTrailingMargin;
|
|
16
18
|
serializedProps["streamingAnimation"] = props.streamingAnimation;
|
|
17
19
|
|
|
20
|
+
folly::dynamic imageRequestHeaders = folly::dynamic::array();
|
|
21
|
+
for (const auto &header : props.imageRequestHeaders) {
|
|
22
|
+
imageRequestHeaders.push_back(toDynamic(header));
|
|
23
|
+
}
|
|
24
|
+
serializedProps["imageRequestHeaders"] = std::move(imageRequestHeaders);
|
|
25
|
+
|
|
18
26
|
return serializedProps;
|
|
19
27
|
}
|
|
20
28
|
|
|
@@ -23,9 +31,17 @@ inline folly::dynamic toDynamic(const EnrichedMarkdownProps &props) {
|
|
|
23
31
|
serializedProps["markdown"] = props.markdown;
|
|
24
32
|
serializedProps["markdownStyle"] = toDynamic(props.markdownStyle);
|
|
25
33
|
serializedProps["md4cFlags"] = toDynamic(props.md4cFlags);
|
|
34
|
+
serializedProps["allowFontScaling"] = props.allowFontScaling;
|
|
35
|
+
serializedProps["maxFontSizeMultiplier"] = props.maxFontSizeMultiplier;
|
|
26
36
|
serializedProps["allowTrailingMargin"] = props.allowTrailingMargin;
|
|
27
37
|
serializedProps["streamingAnimation"] = props.streamingAnimation;
|
|
28
38
|
|
|
39
|
+
folly::dynamic imageRequestHeaders = folly::dynamic::array();
|
|
40
|
+
for (const auto &header : props.imageRequestHeaders) {
|
|
41
|
+
imageRequestHeaders.push_back(toDynamic(header));
|
|
42
|
+
}
|
|
43
|
+
serializedProps["imageRequestHeaders"] = std::move(imageRequestHeaders);
|
|
44
|
+
|
|
29
45
|
return serializedProps;
|
|
30
46
|
}
|
|
31
47
|
|
package/android/src/math/java/com/swmansion/enriched/markdown/input/math/MathChipControllerImpl.kt
CHANGED
|
@@ -195,11 +195,28 @@ class MathChipControllerImpl(
|
|
|
195
195
|
) {
|
|
196
196
|
if (!displayMode) return
|
|
197
197
|
val blockStyle = style as? MathBlockStyle ?: return
|
|
198
|
-
if (blockStyle.
|
|
198
|
+
if (blockStyle.textAlign == Layout.Alignment.ALIGN_NORMAL) return
|
|
199
|
+
|
|
200
|
+
// An AlignmentSpan is paragraph-scoped, and SpannableStringBuilder *throws* unless a
|
|
201
|
+
// SPAN_PARAGRAPH span starts at a paragraph boundary and ends just past one — its end
|
|
202
|
+
// check is `charAt(end - 1) == '\n' || end == length`. A bare (position, position + 1)
|
|
203
|
+
// span therefore crashes for every chip that is not the buffer's last character, so
|
|
204
|
+
// the span has to cover the chip's whole paragraph, trailing newline included.
|
|
205
|
+
var start = position
|
|
206
|
+
while (start > 0 && editable[start - 1] != '\n') start--
|
|
207
|
+
var end = position + 1
|
|
208
|
+
while (end < editable.length && editable[end - 1] != '\n') end++
|
|
209
|
+
|
|
210
|
+
// Align only a paragraph the chip owns. Display math can also arrive from the middle
|
|
211
|
+
// of a paragraph ("text $$x$$ more", upstream #537); aligning that whole paragraph
|
|
212
|
+
// because of one formula would move the surrounding prose too.
|
|
213
|
+
val glyphCount = (start until end).count { editable[it] != '\n' }
|
|
214
|
+
if (glyphCount != 1) return
|
|
215
|
+
|
|
199
216
|
editable.setSpan(
|
|
200
|
-
AlignmentSpan.Standard(blockStyle.
|
|
201
|
-
|
|
202
|
-
|
|
217
|
+
AlignmentSpan.Standard(blockStyle.textAlign),
|
|
218
|
+
start,
|
|
219
|
+
end,
|
|
203
220
|
Spanned.SPAN_PARAGRAPH,
|
|
204
221
|
)
|
|
205
222
|
}
|
package/android/src/math/java/com/swmansion/enriched/markdown/renderer/MathInlineRenderer.kt
CHANGED
|
@@ -37,13 +37,19 @@ class MathInlineRenderer(
|
|
|
37
37
|
textColor = config.style.inlineMathStyle.color,
|
|
38
38
|
paddingVertical = config.style.inlineMathStyle.paddingVertical,
|
|
39
39
|
fontWeight = config.style.inlineMathStyle.fontWeight,
|
|
40
|
+
glyphOverflow = config.style.inlineMathStyle.glyphOverflow,
|
|
40
41
|
)
|
|
41
42
|
|
|
42
43
|
builder.setSpan(span, start, end, SPAN_FLAGS_EXCLUSIVE_EXCLUSIVE)
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
private fun extractLatex(node: MarkdownASTNode): String {
|
|
46
|
-
if (
|
|
47
|
-
return node.children.
|
|
47
|
+
if (node.content.isNotEmpty()) return node.content
|
|
48
|
+
return node.children.joinToString("") { child ->
|
|
49
|
+
when (child.type) {
|
|
50
|
+
MarkdownASTNode.NodeType.SoftBreak, MarkdownASTNode.NodeType.LineBreak -> " "
|
|
51
|
+
else -> child.content
|
|
52
|
+
}
|
|
53
|
+
}
|
|
48
54
|
}
|
|
49
55
|
}
|
|
@@ -185,7 +185,7 @@ class MathChipSpan(
|
|
|
185
185
|
if (blockStyle != null && totalWidth > intrinsicWidth) {
|
|
186
186
|
val slack = totalWidth - formulaWidth - style.paddingHorizontal * 2f
|
|
187
187
|
val offset =
|
|
188
|
-
when (blockStyle.
|
|
188
|
+
when (blockStyle.textAlign) {
|
|
189
189
|
Layout.Alignment.ALIGN_CENTER -> slack / 2f
|
|
190
190
|
Layout.Alignment.ALIGN_OPPOSITE -> slack
|
|
191
191
|
else -> 0f
|
|
@@ -16,6 +16,7 @@ class MathInlineSpan(
|
|
|
16
16
|
private val textColor: Int,
|
|
17
17
|
private val paddingVertical: Float,
|
|
18
18
|
private val fontWeight: String = "normal",
|
|
19
|
+
private val glyphOverflow: Float = 0f,
|
|
19
20
|
) : ReplacementSpan() {
|
|
20
21
|
private var cachedBitmap: Bitmap? = null
|
|
21
22
|
private var cachedWidth = 0
|
|
@@ -31,18 +32,24 @@ class MathInlineSpan(
|
|
|
31
32
|
val displayList = RaTeXEngine.parseBlocking(latex, displayMode = false, color = textColor)
|
|
32
33
|
val renderer = RaTeXRenderer(displayList, fontSize, ratexTypefaceLoader(fontWeight))
|
|
33
34
|
|
|
34
|
-
cachedWidth = renderer.widthPx.toInt().coerceAtLeast(1)
|
|
35
|
+
cachedWidth = ceil(renderer.widthPx).toInt().coerceAtLeast(1)
|
|
35
36
|
mathAscent = renderer.heightPx
|
|
36
37
|
mathDescent = renderer.depthPx
|
|
37
38
|
|
|
39
|
+
// RaTeX reports TeX metric boxes, which digit and capital outlines (and the
|
|
40
|
+
// fake-bold stroke) overshoot; the bitmap keeps glyphOverflow px of headroom
|
|
41
|
+
// on both sides so that ink is not cut off.
|
|
42
|
+
val overflowPx = glyphOverflow.toInt()
|
|
38
43
|
val bitmap =
|
|
39
44
|
Bitmap.createBitmap(
|
|
40
45
|
cachedWidth,
|
|
41
|
-
ceil(renderer.totalHeightPx).toInt().coerceAtLeast(1),
|
|
46
|
+
ceil(renderer.totalHeightPx).toInt().coerceAtLeast(1) + overflowPx * 2,
|
|
42
47
|
Bitmap.Config.ARGB_8888,
|
|
43
48
|
)
|
|
44
49
|
|
|
45
|
-
|
|
50
|
+
val canvas = Canvas(bitmap)
|
|
51
|
+
canvas.translate(0f, overflowPx.toFloat())
|
|
52
|
+
renderer.draw(canvas)
|
|
46
53
|
cachedBitmap = bitmap
|
|
47
54
|
} catch (_: Exception) {
|
|
48
55
|
renderFailed = true
|
|
@@ -66,9 +73,9 @@ class MathInlineSpan(
|
|
|
66
73
|
// Must stay identical to MathInlinePlaceholderSpan.getSize: that span measures
|
|
67
74
|
// this one off the main thread, and a box that disagrees by even a pixel either
|
|
68
75
|
// clips the formula or eats the padding this field is here to add.
|
|
69
|
-
ascent = -ceil(mathAscent + paddingVertical).toInt()
|
|
76
|
+
ascent = -ceil(mathAscent + (paddingVertical + glyphOverflow)).toInt()
|
|
70
77
|
top = ascent
|
|
71
|
-
descent = ceil(mathDescent + paddingVertical).toInt()
|
|
78
|
+
descent = ceil(mathDescent + (paddingVertical + glyphOverflow)).toInt()
|
|
72
79
|
bottom = descent
|
|
73
80
|
}
|
|
74
81
|
|
|
@@ -88,7 +95,7 @@ class MathInlineSpan(
|
|
|
88
95
|
) {
|
|
89
96
|
prepareResources()
|
|
90
97
|
cachedBitmap?.let {
|
|
91
|
-
val bitmapY = y - ceil(mathAscent)
|
|
98
|
+
val bitmapY = y - ceil(mathAscent) - glyphOverflow
|
|
92
99
|
canvas.drawBitmap(it, x, bitmapY, paint)
|
|
93
100
|
}
|
|
94
101
|
}
|
|
@@ -5,6 +5,7 @@ import android.util.Log
|
|
|
5
5
|
import io.ratex.RaTeXEngine
|
|
6
6
|
import io.ratex.RaTeXFontLoader
|
|
7
7
|
import io.ratex.RaTeXRenderer
|
|
8
|
+
import kotlin.math.ceil
|
|
8
9
|
|
|
9
10
|
object MathMeasureHelper {
|
|
10
11
|
@JvmStatic
|
|
@@ -37,7 +38,7 @@ object MathMeasureHelper {
|
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
return MathMetrics(
|
|
40
|
-
renderer.widthPx.toInt(),
|
|
41
|
+
ceil(renderer.widthPx).toInt().coerceAtLeast(1),
|
|
41
42
|
renderer.heightPx,
|
|
42
43
|
renderer.depthPx,
|
|
43
44
|
)
|
|
@@ -41,6 +41,12 @@ class MathContainerView(
|
|
|
41
41
|
// Set reflectively by EnrichedMarkdown (math is an optional module).
|
|
42
42
|
var copyLabel: String = ""
|
|
43
43
|
var copyAsMarkdownLabel: String = ""
|
|
44
|
+
var contextMenuHidden: Boolean = false
|
|
45
|
+
var menuOptions: BlockMenuOptions = BlockMenuOptions()
|
|
46
|
+
|
|
47
|
+
// Called instead of the menu on long press while contextMenuHidden is on, so
|
|
48
|
+
// the owner can report the block (onSelectionChange) and show its own UI.
|
|
49
|
+
var onMenuSuppressed: ((markdown: String, text: String) -> Unit)? = null
|
|
44
50
|
|
|
45
51
|
override val segmentMarginTop: Int get() = mathStyle.marginTop.toInt()
|
|
46
52
|
override val segmentMarginBottom: Int get() = mathStyle.marginBottom.toInt()
|
|
@@ -52,7 +58,7 @@ class MathContainerView(
|
|
|
52
58
|
else -> Gravity.CENTER_HORIZONTAL
|
|
53
59
|
}
|
|
54
60
|
|
|
55
|
-
private val mathView = RaTeXCanvasView(context)
|
|
61
|
+
private val mathView = RaTeXCanvasView(context, mathStyle.glyphOverflow)
|
|
56
62
|
|
|
57
63
|
init {
|
|
58
64
|
setBackgroundColor(mathStyle.backgroundColor)
|
|
@@ -117,19 +123,27 @@ class MathContainerView(
|
|
|
117
123
|
}
|
|
118
124
|
|
|
119
125
|
private fun showContextMenu(anchor: View) {
|
|
126
|
+
if (contextMenuHidden) {
|
|
127
|
+
onMenuSuppressed?.invoke("$$\n$cachedLatex\n$$", cachedLatex)
|
|
128
|
+
return
|
|
129
|
+
}
|
|
120
130
|
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
|
121
131
|
ContextMenuPopup.show(anchor, this) {
|
|
122
|
-
|
|
132
|
+
blockCopyItems(menuOptions, copyLabel, copyAsMarkdownLabel, markdown = {
|
|
133
|
+
"$$\n$cachedLatex\n$$"
|
|
134
|
+
}, rawText = { cachedLatex }, copyRaw = {
|
|
123
135
|
clipboard.setPrimaryClip(ClipData.newPlainText("Math", cachedLatex))
|
|
124
|
-
}
|
|
125
|
-
item(ContextMenuPopup.Icon.DOCUMENT, copyAsMarkdownLabel) {
|
|
136
|
+
}, copyMarkdown = {
|
|
126
137
|
clipboard.setPrimaryClip(ClipData.newPlainText("Math", "$$\n$cachedLatex\n$$"))
|
|
127
|
-
}
|
|
138
|
+
})
|
|
128
139
|
}
|
|
129
140
|
}
|
|
130
141
|
|
|
142
|
+
// glyphOverflow px of headroom above and below the RaTeX box: digit and capital
|
|
143
|
+
// outlines (and the fake-bold stroke) overshoot it, and this view clips to its size.
|
|
131
144
|
private class RaTeXCanvasView(
|
|
132
145
|
context: Context,
|
|
146
|
+
private val glyphOverflow: Float,
|
|
133
147
|
) : View(context) {
|
|
134
148
|
var renderer: RaTeXRenderer? = null
|
|
135
149
|
|
|
@@ -142,12 +156,16 @@ class MathContainerView(
|
|
|
142
156
|
?: return setMeasuredDimension(0, 0)
|
|
143
157
|
setMeasuredDimension(
|
|
144
158
|
ceil(currentRenderer.widthPx).toInt().coerceAtLeast(1),
|
|
145
|
-
ceil(currentRenderer.totalHeightPx).toInt().coerceAtLeast(1),
|
|
159
|
+
ceil(currentRenderer.totalHeightPx).toInt().coerceAtLeast(1) + (glyphOverflow * 2).toInt(),
|
|
146
160
|
)
|
|
147
161
|
}
|
|
148
162
|
|
|
149
163
|
override fun onDraw(canvas: Canvas) {
|
|
150
|
-
renderer
|
|
164
|
+
val currentRenderer = renderer ?: return
|
|
165
|
+
canvas.save()
|
|
166
|
+
canvas.translate(0f, glyphOverflow)
|
|
167
|
+
currentRenderer.draw(canvas)
|
|
168
|
+
canvas.restore()
|
|
151
169
|
}
|
|
152
170
|
}
|
|
153
171
|
|
|
@@ -164,7 +182,7 @@ class MathContainerView(
|
|
|
164
182
|
mode = MathRenderMode.Display,
|
|
165
183
|
)
|
|
166
184
|
val metrics = MathMeasureHelper.measure(context, listOf(request)).first()
|
|
167
|
-
return ceil(metrics.ascent + metrics.descent).toInt() + (mathStyle.padding * 2)
|
|
185
|
+
return ceil(metrics.ascent + metrics.descent).toInt() + (mathStyle.padding * 2) + (mathStyle.glyphOverflow * 2)
|
|
168
186
|
}
|
|
169
187
|
|
|
170
188
|
private const val TAG = "MathContainerView"
|