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
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
#include "CodeBlockHighlighter.hpp"
|
|
2
|
+
|
|
3
|
+
// Stub compiled when the syntax highlighting module is disabled. The real
|
|
4
|
+
// implementation defines the same symbol under ENRICHED_MARKDOWN_CODE_HIGHLIGHT,
|
|
5
|
+
// so exactly one definition exists in any build configuration.
|
|
6
|
+
|
|
7
|
+
#if !defined(ENRICHED_MARKDOWN_CODE_HIGHLIGHT)
|
|
8
|
+
|
|
9
|
+
namespace Markdown {
|
|
10
|
+
|
|
11
|
+
std::vector<HighlightToken> highlightCode(const std::string & /*code*/, const std::string & /*language*/) {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
} // namespace Markdown
|
|
16
|
+
|
|
17
|
+
#else
|
|
18
|
+
|
|
19
|
+
#include "CodeBlockLanguages.hpp"
|
|
20
|
+
#include "HighlightGrammars.hpp"
|
|
21
|
+
|
|
22
|
+
#include <tree_sitter/api.h>
|
|
23
|
+
|
|
24
|
+
#include <algorithm>
|
|
25
|
+
#include <cstring>
|
|
26
|
+
#include <memory>
|
|
27
|
+
#include <mutex>
|
|
28
|
+
#include <unordered_map>
|
|
29
|
+
|
|
30
|
+
namespace Markdown {
|
|
31
|
+
|
|
32
|
+
namespace {
|
|
33
|
+
|
|
34
|
+
// Bounds the synchronous main-thread parse against pathological inputs. Typical
|
|
35
|
+
// blocks parse in sub-millisecond to low-millisecond time; anything past these
|
|
36
|
+
// caps falls back to plain rendering instead of risking a frame hang.
|
|
37
|
+
constexpr size_t kMaxBytes = 50u * 1024u;
|
|
38
|
+
constexpr size_t kMaxLines = 2000u;
|
|
39
|
+
|
|
40
|
+
// tree-sitter highlight capture names, flattened to their leading dotted
|
|
41
|
+
// prefix. The longest matching prefix wins, so "variable.member" resolves to
|
|
42
|
+
// Property while a bare "variable" resolves to Variable. Names with no entry
|
|
43
|
+
// (for example "spell", "none") are skipped and leave their bytes uncolored.
|
|
44
|
+
struct CaptureMapping {
|
|
45
|
+
const char *prefix;
|
|
46
|
+
HighlightTokenType type;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
constexpr CaptureMapping kCaptureMappings[] = {
|
|
50
|
+
{"keyword", HighlightTokenType::Keyword},
|
|
51
|
+
{"operator", HighlightTokenType::Operator},
|
|
52
|
+
{"punctuation", HighlightTokenType::Punctuation},
|
|
53
|
+
{"string", HighlightTokenType::String},
|
|
54
|
+
{"escape", HighlightTokenType::String},
|
|
55
|
+
{"character", HighlightTokenType::String},
|
|
56
|
+
{"number", HighlightTokenType::Number},
|
|
57
|
+
{"float", HighlightTokenType::Number},
|
|
58
|
+
{"boolean", HighlightTokenType::Constant},
|
|
59
|
+
{"constant", HighlightTokenType::Constant},
|
|
60
|
+
{"comment", HighlightTokenType::Comment},
|
|
61
|
+
{"function", HighlightTokenType::Function},
|
|
62
|
+
{"method", HighlightTokenType::Function},
|
|
63
|
+
{"constructor", HighlightTokenType::Type},
|
|
64
|
+
{"type", HighlightTokenType::Type},
|
|
65
|
+
{"module", HighlightTokenType::Type},
|
|
66
|
+
{"namespace", HighlightTokenType::Type},
|
|
67
|
+
{"variable", HighlightTokenType::Variable},
|
|
68
|
+
{"parameter", HighlightTokenType::Variable},
|
|
69
|
+
{"variable.member", HighlightTokenType::Property},
|
|
70
|
+
{"property", HighlightTokenType::Property},
|
|
71
|
+
{"field", HighlightTokenType::Property},
|
|
72
|
+
{"tag", HighlightTokenType::Tag},
|
|
73
|
+
{"attribute", HighlightTokenType::Attribute},
|
|
74
|
+
{"embedded", HighlightTokenType::Embedded},
|
|
75
|
+
{"injection", HighlightTokenType::Embedded},
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// A capture name matches a prefix only on dotted boundaries so "type" never
|
|
79
|
+
// swallows "typename"-style names. Returns false when nothing maps.
|
|
80
|
+
bool mapCaptureName(const char *name, uint32_t length, HighlightTokenType &out) {
|
|
81
|
+
size_t best = 0;
|
|
82
|
+
bool found = false;
|
|
83
|
+
for (const CaptureMapping &m : kCaptureMappings) {
|
|
84
|
+
size_t plen = std::strlen(m.prefix);
|
|
85
|
+
if (plen > length || plen < best) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (std::strncmp(name, m.prefix, plen) != 0) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (plen != length && name[plen] != '.') {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
best = plen;
|
|
95
|
+
out = m.type;
|
|
96
|
+
found = true;
|
|
97
|
+
}
|
|
98
|
+
return found;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Compiled queries are immutable after creation and reused across calls. Access
|
|
102
|
+
// is serialized on the main thread today; the mutex is cheap insurance should
|
|
103
|
+
// highlighting ever move off-main. A cached nullptr marks a query that failed to
|
|
104
|
+
// compile so it is not retried.
|
|
105
|
+
TSQuery *queryForLanguage(const TSLanguage *language, const char *source) {
|
|
106
|
+
static std::mutex mutex;
|
|
107
|
+
static std::unordered_map<const TSLanguage *, TSQuery *> cache;
|
|
108
|
+
|
|
109
|
+
std::lock_guard<std::mutex> lock(mutex);
|
|
110
|
+
auto it = cache.find(language);
|
|
111
|
+
if (it != cache.end()) {
|
|
112
|
+
return it->second;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
uint32_t errorOffset = 0;
|
|
116
|
+
TSQueryError errorType = TSQueryErrorNone;
|
|
117
|
+
TSQuery *query = ts_query_new(language, source, static_cast<uint32_t>(std::strlen(source)), &errorOffset, &errorType);
|
|
118
|
+
cache.emplace(language, query);
|
|
119
|
+
return query;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Precomputes, for every byte offset that starts a code point, the number of
|
|
123
|
+
// UTF-16 code units preceding it. Token boundaries always land on code-point
|
|
124
|
+
// boundaries, so mapping a byte offset is a single lookup. Astral code points
|
|
125
|
+
// (4-byte UTF-8) contribute a surrogate pair (+2).
|
|
126
|
+
std::vector<uint32_t> buildUtf16PrefixMap(const std::string &code) {
|
|
127
|
+
const size_t n = code.size();
|
|
128
|
+
std::vector<uint32_t> prefix(n + 1, 0);
|
|
129
|
+
uint32_t units = 0;
|
|
130
|
+
size_t i = 0;
|
|
131
|
+
while (i < n) {
|
|
132
|
+
unsigned char c = static_cast<unsigned char>(code[i]);
|
|
133
|
+
size_t len;
|
|
134
|
+
uint32_t width;
|
|
135
|
+
if (c < 0x80) {
|
|
136
|
+
len = 1;
|
|
137
|
+
width = 1;
|
|
138
|
+
} else if ((c >> 5) == 0x6) {
|
|
139
|
+
len = 2;
|
|
140
|
+
width = 1;
|
|
141
|
+
} else if ((c >> 4) == 0xE) {
|
|
142
|
+
len = 3;
|
|
143
|
+
width = 1;
|
|
144
|
+
} else if ((c >> 3) == 0x1E) {
|
|
145
|
+
len = 4;
|
|
146
|
+
width = 2;
|
|
147
|
+
} else {
|
|
148
|
+
len = 1;
|
|
149
|
+
width = 1;
|
|
150
|
+
}
|
|
151
|
+
units += width;
|
|
152
|
+
for (size_t k = 1; k <= len && i + k <= n; ++k) {
|
|
153
|
+
prefix[i + k] = units;
|
|
154
|
+
}
|
|
155
|
+
i += len;
|
|
156
|
+
}
|
|
157
|
+
return prefix;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
using ParserPtr = std::unique_ptr<TSParser, decltype(&ts_parser_delete)>;
|
|
161
|
+
using TreePtr = std::unique_ptr<TSTree, decltype(&ts_tree_delete)>;
|
|
162
|
+
using CursorPtr = std::unique_ptr<TSQueryCursor, decltype(&ts_query_cursor_delete)>;
|
|
163
|
+
|
|
164
|
+
} // namespace
|
|
165
|
+
|
|
166
|
+
// Resolves the language to a compiled grammar, parses the code, runs the
|
|
167
|
+
// grammar's highlight query, resolves overlapping captures (innermost span
|
|
168
|
+
// wins per byte), and returns coalesced foreground-only tokens with UTF-16
|
|
169
|
+
// offsets. Any failure along the way degrades to an empty vector (plain
|
|
170
|
+
// rendering).
|
|
171
|
+
std::vector<HighlightToken> highlightCode(const std::string &code, const std::string &language) {
|
|
172
|
+
try {
|
|
173
|
+
if (code.empty()) {
|
|
174
|
+
return {};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
std::string grammarId = canonicalGrammarId(language);
|
|
178
|
+
if (grammarId.empty()) {
|
|
179
|
+
return {};
|
|
180
|
+
}
|
|
181
|
+
const GrammarEntry *grammar = findGrammar(grammarId.c_str());
|
|
182
|
+
if (grammar == nullptr) {
|
|
183
|
+
return {};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (code.size() > kMaxBytes) {
|
|
187
|
+
return {};
|
|
188
|
+
}
|
|
189
|
+
size_t lines = 1;
|
|
190
|
+
for (char c : code) {
|
|
191
|
+
if (c == '\n' && ++lines > kMaxLines) {
|
|
192
|
+
return {};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
ParserPtr parser(ts_parser_new(), ts_parser_delete);
|
|
197
|
+
if (!parser) {
|
|
198
|
+
return {};
|
|
199
|
+
}
|
|
200
|
+
const TSLanguage *tsLanguage = grammar->language();
|
|
201
|
+
if (tsLanguage == nullptr || !ts_parser_set_language(parser.get(), tsLanguage)) {
|
|
202
|
+
return {};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
TSQuery *query = queryForLanguage(tsLanguage, grammar->highlightsQuery);
|
|
206
|
+
if (query == nullptr) {
|
|
207
|
+
return {};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
TreePtr tree(ts_parser_parse_string(parser.get(), nullptr, code.c_str(), static_cast<uint32_t>(code.size())),
|
|
211
|
+
ts_tree_delete);
|
|
212
|
+
if (!tree) {
|
|
213
|
+
return {};
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
CursorPtr cursor(ts_query_cursor_new(), ts_query_cursor_delete);
|
|
217
|
+
if (!cursor) {
|
|
218
|
+
return {};
|
|
219
|
+
}
|
|
220
|
+
ts_query_cursor_exec(cursor.get(), query, ts_tree_root_node(tree.get()));
|
|
221
|
+
|
|
222
|
+
// Innermost-wins overlap resolution: paint each capture's byte range,
|
|
223
|
+
// widest span first, so tighter captures overwrite. A -1 byte is uncolored.
|
|
224
|
+
struct Capture {
|
|
225
|
+
uint32_t start;
|
|
226
|
+
uint32_t end;
|
|
227
|
+
HighlightTokenType type;
|
|
228
|
+
};
|
|
229
|
+
std::vector<Capture> captures;
|
|
230
|
+
TSQueryMatch match;
|
|
231
|
+
uint32_t captureIndex = 0;
|
|
232
|
+
while (ts_query_cursor_next_capture(cursor.get(), &match, &captureIndex)) {
|
|
233
|
+
const TSQueryCapture &capture = match.captures[captureIndex];
|
|
234
|
+
uint32_t nameLength = 0;
|
|
235
|
+
const char *name = ts_query_capture_name_for_id(query, capture.index, &nameLength);
|
|
236
|
+
HighlightTokenType type;
|
|
237
|
+
if (name == nullptr || !mapCaptureName(name, nameLength, type)) {
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
uint32_t start = ts_node_start_byte(capture.node);
|
|
241
|
+
uint32_t end = ts_node_end_byte(capture.node);
|
|
242
|
+
if (end > start && end <= code.size()) {
|
|
243
|
+
captures.push_back({start, end, type});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (captures.empty()) {
|
|
247
|
+
return {};
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
std::stable_sort(captures.begin(), captures.end(),
|
|
251
|
+
[](const Capture &a, const Capture &b) { return (a.end - a.start) > (b.end - b.start); });
|
|
252
|
+
|
|
253
|
+
std::vector<int8_t> byteType(code.size(), -1);
|
|
254
|
+
for (const Capture &capture : captures) {
|
|
255
|
+
for (uint32_t b = capture.start; b < capture.end; ++b) {
|
|
256
|
+
byteType[b] = static_cast<int8_t>(capture.type);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
std::vector<uint32_t> u16 = buildUtf16PrefixMap(code);
|
|
261
|
+
std::vector<HighlightToken> tokens;
|
|
262
|
+
size_t b = 0;
|
|
263
|
+
const size_t n = code.size();
|
|
264
|
+
while (b < n) {
|
|
265
|
+
if (byteType[b] < 0) {
|
|
266
|
+
++b;
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
int8_t type = byteType[b];
|
|
270
|
+
size_t runStart = b;
|
|
271
|
+
while (b < n && byteType[b] == type) {
|
|
272
|
+
++b;
|
|
273
|
+
}
|
|
274
|
+
tokens.push_back({u16[runStart], u16[b], static_cast<HighlightTokenType>(type)});
|
|
275
|
+
}
|
|
276
|
+
return tokens;
|
|
277
|
+
} catch (...) {
|
|
278
|
+
return {};
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
} // namespace Markdown
|
|
283
|
+
|
|
284
|
+
#endif
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <cstdint>
|
|
4
|
+
#include <string>
|
|
5
|
+
#include <vector>
|
|
6
|
+
|
|
7
|
+
// Shared seam for optional syntax highlighting of fenced code blocks.
|
|
8
|
+
//
|
|
9
|
+
// The real implementation is compiled only when ENRICHED_MARKDOWN_CODE_HIGHLIGHT
|
|
10
|
+
// is defined by the build. Without the flag the stub in CodeBlockHighlighter.cpp
|
|
11
|
+
// returns no tokens and platform callers keep the plain uncolored rendering, so
|
|
12
|
+
// the absent module degrades to the default code block appearance. The same
|
|
13
|
+
// fallback applies at runtime when a language has no compiled grammar or
|
|
14
|
+
// highlighting fails.
|
|
15
|
+
//
|
|
16
|
+
// The seam returns semantic tokens instead of a platform text type on
|
|
17
|
+
// purpose. Platform adapters map token types to foreground colors and apply
|
|
18
|
+
// them to their attributed string. Since foreground color never affects text
|
|
19
|
+
// metrics, the block height measured from the plain string is guaranteed to
|
|
20
|
+
// match the drawn height regardless of what an implementation returns.
|
|
21
|
+
//
|
|
22
|
+
// Token offsets are UTF-16 code units into the code string, because both
|
|
23
|
+
// Android (Spannable) and iOS (NSAttributedString) address text in UTF-16.
|
|
24
|
+
// Implementations are responsible for converting tree-sitter byte offsets.
|
|
25
|
+
//
|
|
26
|
+
// Token types follow tree-sitter's standard highlight capture names,
|
|
27
|
+
// flattened to one level. Values are explicit because they cross the JNI
|
|
28
|
+
// boundary as plain integers.
|
|
29
|
+
//
|
|
30
|
+
// Both markdown flavors call this seam: the github flavor highlights the code
|
|
31
|
+
// string in its container view, and the commonmark renderers
|
|
32
|
+
// (CodeBlockRenderer.kt / CodeBlockRenderer.m) apply the tokens to their
|
|
33
|
+
// content range through the platform adapters.
|
|
34
|
+
|
|
35
|
+
namespace Markdown {
|
|
36
|
+
|
|
37
|
+
enum class HighlightTokenType : uint8_t {
|
|
38
|
+
Keyword = 0,
|
|
39
|
+
Operator = 1,
|
|
40
|
+
Punctuation = 2,
|
|
41
|
+
String = 3,
|
|
42
|
+
Number = 4,
|
|
43
|
+
Constant = 5,
|
|
44
|
+
Comment = 6,
|
|
45
|
+
Function = 7,
|
|
46
|
+
Type = 8,
|
|
47
|
+
Variable = 9,
|
|
48
|
+
Property = 10,
|
|
49
|
+
Tag = 11,
|
|
50
|
+
Attribute = 12,
|
|
51
|
+
Embedded = 13,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
struct HighlightToken {
|
|
55
|
+
uint32_t start;
|
|
56
|
+
uint32_t end;
|
|
57
|
+
HighlightTokenType type;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// code is the UTF-8 code block content without the fence lines; language is
|
|
61
|
+
// the fence info string (for example "python"), empty when absent. Returns an
|
|
62
|
+
// empty vector whenever highlighting is unavailable (module compiled out,
|
|
63
|
+
// unknown language, parse failure).
|
|
64
|
+
std::vector<HighlightToken> highlightCode(const std::string& code, const std::string& language);
|
|
65
|
+
|
|
66
|
+
} // namespace Markdown
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#include "CodeBlockLanguages.hpp"
|
|
2
|
+
|
|
3
|
+
#include <algorithm>
|
|
4
|
+
#include <array>
|
|
5
|
+
#include <cctype>
|
|
6
|
+
#include <cstring>
|
|
7
|
+
|
|
8
|
+
namespace Markdown {
|
|
9
|
+
|
|
10
|
+
namespace {
|
|
11
|
+
|
|
12
|
+
struct LanguageName {
|
|
13
|
+
const char *key;
|
|
14
|
+
const char *name;
|
|
15
|
+
// Canonical tree-sitter grammar id (vendored directory name), or "" when no
|
|
16
|
+
// grammar covers this fence language.
|
|
17
|
+
const char *grammar;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// Sorted by key; both lookups below binary-search this table.
|
|
21
|
+
constexpr std::array<LanguageName, 42> kLanguageNames{{
|
|
22
|
+
{"bash", "Bash", "bash"},
|
|
23
|
+
{"c", "C", "c"},
|
|
24
|
+
{"cc", "C++", "cpp"},
|
|
25
|
+
{"cpp", "C++", "cpp"},
|
|
26
|
+
{"cs", "C#", "c-sharp"},
|
|
27
|
+
{"csharp", "C#", "c-sharp"},
|
|
28
|
+
{"css", "CSS", "css"},
|
|
29
|
+
{"cxx", "C++", "cpp"},
|
|
30
|
+
{"dockerfile", "Dockerfile", ""},
|
|
31
|
+
{"go", "Go", "go"},
|
|
32
|
+
{"golang", "Go", "go"},
|
|
33
|
+
{"graphql", "GraphQL", ""},
|
|
34
|
+
{"html", "HTML", "html"},
|
|
35
|
+
{"java", "Java", "java"},
|
|
36
|
+
{"javascript", "JavaScript", "javascript"},
|
|
37
|
+
{"js", "JavaScript", "javascript"},
|
|
38
|
+
{"json", "JSON", "json"},
|
|
39
|
+
{"jsx", "JSX", "javascript"},
|
|
40
|
+
{"markdown", "Markdown", "markdown"},
|
|
41
|
+
{"md", "Markdown", "markdown"},
|
|
42
|
+
{"objc", "Objective-C", ""},
|
|
43
|
+
{"objectivec", "Objective-C", ""},
|
|
44
|
+
{"php", "PHP", "php"},
|
|
45
|
+
{"py", "Python", "python"},
|
|
46
|
+
{"python", "Python", "python"},
|
|
47
|
+
{"rb", "Ruby", "ruby"},
|
|
48
|
+
{"rs", "Rust", "rust"},
|
|
49
|
+
{"ruby", "Ruby", "ruby"},
|
|
50
|
+
{"rust", "Rust", "rust"},
|
|
51
|
+
{"scss", "SCSS", ""},
|
|
52
|
+
{"sh", "Shell", "bash"},
|
|
53
|
+
{"shell", "Shell", "bash"},
|
|
54
|
+
{"sql", "SQL", ""},
|
|
55
|
+
{"swift", "Swift", "swift"},
|
|
56
|
+
{"toml", "TOML", ""},
|
|
57
|
+
{"ts", "TypeScript", "typescript"},
|
|
58
|
+
{"tsx", "TSX", "tsx"},
|
|
59
|
+
{"typescript", "TypeScript", "typescript"},
|
|
60
|
+
{"xml", "XML", ""},
|
|
61
|
+
{"yaml", "YAML", "yaml"},
|
|
62
|
+
{"yml", "YAML", "yaml"},
|
|
63
|
+
{"zsh", "Zsh", "bash"},
|
|
64
|
+
}};
|
|
65
|
+
|
|
66
|
+
// findLanguage binary-searches kLanguageNames, so the table must be strictly
|
|
67
|
+
// ascending by key under C strcmp order. Enforce it at compile time: a
|
|
68
|
+
// misordered entry (e.g. "ruby" before "rs") would otherwise silently fail the
|
|
69
|
+
// lookup and leave that language unhighlighted.
|
|
70
|
+
constexpr bool keyLess(const char *a, const char *b) {
|
|
71
|
+
for (std::size_t i = 0;; ++i) {
|
|
72
|
+
unsigned char ca = static_cast<unsigned char>(a[i]);
|
|
73
|
+
unsigned char cb = static_cast<unsigned char>(b[i]);
|
|
74
|
+
if (ca != cb) {
|
|
75
|
+
return ca < cb;
|
|
76
|
+
}
|
|
77
|
+
if (ca == '\0') {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
constexpr bool languageTableIsSorted() {
|
|
84
|
+
for (std::size_t i = 1; i < kLanguageNames.size(); ++i) {
|
|
85
|
+
if (!keyLess(kLanguageNames[i - 1].key, kLanguageNames[i].key)) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
static_assert(languageTableIsSorted(), "kLanguageNames must be sorted by key for binary search");
|
|
93
|
+
|
|
94
|
+
// Lowercases language and binary-searches the table. Returns nullptr on miss.
|
|
95
|
+
const LanguageName *findLanguage(const std::string &language, std::string &lowerOut) {
|
|
96
|
+
lowerOut = language;
|
|
97
|
+
for (char &c : lowerOut) {
|
|
98
|
+
c = static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
auto it =
|
|
102
|
+
std::lower_bound(kLanguageNames.begin(), kLanguageNames.end(), lowerOut.c_str(),
|
|
103
|
+
[](const LanguageName &entry, const char *key) { return std::strcmp(entry.key, key) < 0; });
|
|
104
|
+
if (it != kLanguageNames.end() && lowerOut == it->key) {
|
|
105
|
+
return &(*it);
|
|
106
|
+
}
|
|
107
|
+
return nullptr;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
} // namespace
|
|
111
|
+
|
|
112
|
+
std::string displayNameForLanguage(const std::string &language) {
|
|
113
|
+
if (language.empty()) {
|
|
114
|
+
return "";
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
std::string lower;
|
|
118
|
+
if (const LanguageName *entry = findLanguage(language, lower)) {
|
|
119
|
+
return entry->name;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
lower[0] = static_cast<char>(std::toupper(static_cast<unsigned char>(lower[0])));
|
|
123
|
+
return lower;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
std::string canonicalGrammarId(const std::string &language) {
|
|
127
|
+
if (language.empty()) {
|
|
128
|
+
return "";
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
std::string lower;
|
|
132
|
+
if (const LanguageName *entry = findLanguage(language, lower)) {
|
|
133
|
+
return entry->grammar;
|
|
134
|
+
}
|
|
135
|
+
return "";
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
} // namespace Markdown
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <string>
|
|
4
|
+
|
|
5
|
+
// Display names for code block fence languages, shared by every platform and
|
|
6
|
+
// both markdown flavors so a fence like ```python is labeled identically
|
|
7
|
+
// everywhere. Unlike the highlighting seam this is always compiled; it does
|
|
8
|
+
// not depend on ENRICHED_MARKDOWN_CODE_HIGHLIGHT.
|
|
9
|
+
|
|
10
|
+
namespace Markdown {
|
|
11
|
+
|
|
12
|
+
// Maps a fence info string (for example "python", "js") to a human readable
|
|
13
|
+
// display name ("Python", "JavaScript"). Unknown languages fall back to the
|
|
14
|
+
// lowercased input with the first ASCII letter capitalized. Empty input
|
|
15
|
+
// returns an empty string.
|
|
16
|
+
std::string displayNameForLanguage(const std::string& language);
|
|
17
|
+
|
|
18
|
+
// Maps a fence info string to the canonical tree-sitter grammar id that can
|
|
19
|
+
// highlight it (for example "js" and "jsx" both map to "javascript"), or an
|
|
20
|
+
// empty string when no grammar covers the language. The id is the vendored
|
|
21
|
+
// grammar directory name; whether that grammar is actually compiled into the
|
|
22
|
+
// build is answered separately by findGrammar.
|
|
23
|
+
std::string canonicalGrammarId(const std::string& language);
|
|
24
|
+
|
|
25
|
+
} // namespace Markdown
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
// Registry of the tree-sitter grammars compiled into this build. The table and
|
|
4
|
+
// the findGrammar definition live in generated_registry.cpp, emitted by
|
|
5
|
+
// vendor/gen-registry.mjs for exactly the selected language subset, so this
|
|
6
|
+
// header never references symbols for grammars that were not compiled.
|
|
7
|
+
//
|
|
8
|
+
// Only meaningful when ENRICHED_MARKDOWN_CODE_HIGHLIGHT is defined; without the
|
|
9
|
+
// flag neither this header nor generated_registry.cpp is compiled.
|
|
10
|
+
|
|
11
|
+
struct TSLanguage;
|
|
12
|
+
|
|
13
|
+
namespace Markdown {
|
|
14
|
+
|
|
15
|
+
struct GrammarEntry {
|
|
16
|
+
// Canonical grammar id, matching canonicalGrammarId() in CodeBlockLanguages.
|
|
17
|
+
const char *canonicalId;
|
|
18
|
+
// tree-sitter language constructor (extern "C" tree_sitter_<id>).
|
|
19
|
+
const TSLanguage *(*language)(void);
|
|
20
|
+
// The grammar's highlights.scm, inheritance already inlined, as a C string.
|
|
21
|
+
const char *highlightsQuery;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// Returns the entry for canonicalId, or nullptr when no grammar for it was
|
|
25
|
+
// compiled into this build (unselected language) or canonicalId is empty.
|
|
26
|
+
const GrammarEntry *findGrammar(const char *canonicalId);
|
|
27
|
+
|
|
28
|
+
} // namespace Markdown
|