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
|
@@ -3,11 +3,16 @@
|
|
|
3
3
|
|
|
4
4
|
@class RendererFactory;
|
|
5
5
|
@class StyleConfig;
|
|
6
|
+
@class RenderContext;
|
|
7
|
+
@class MarkdownASTNode;
|
|
6
8
|
|
|
7
9
|
/// Shared base for all node renderers — provides `_rendererFactory` and `_config`
|
|
8
10
|
/// as protected ivars and the common designated initializer.
|
|
9
|
-
///
|
|
10
|
-
|
|
11
|
+
/// `renderNode:into:context:` is a template method: take context snapshot ->
|
|
12
|
+
/// `renderNodeContent:into:context:` -> restore snapshot. Subclasses implement
|
|
13
|
+
/// `renderNodeContent:into:context:` and, when they mutate scoped context state,
|
|
14
|
+
/// override `takeContextSnapshot:` to return `[context snapshotScope]`.
|
|
15
|
+
@interface BaseRenderer : NSObject <NodeRenderer> {
|
|
11
16
|
@protected
|
|
12
17
|
__weak RendererFactory *_rendererFactory;
|
|
13
18
|
StyleConfig *_config;
|
|
@@ -15,4 +20,14 @@
|
|
|
15
20
|
|
|
16
21
|
- (instancetype)initWithRendererFactory:(id)rendererFactory config:(id)config;
|
|
17
22
|
|
|
23
|
+
- (void)renderNodeContent:(MarkdownASTNode *)node
|
|
24
|
+
into:(NSMutableAttributedString *)output
|
|
25
|
+
context:(RenderContext *)context;
|
|
26
|
+
|
|
27
|
+
/// Default returns nil.
|
|
28
|
+
- (nullable id)takeContextSnapshot:(RenderContext *)context;
|
|
29
|
+
|
|
30
|
+
/// Default restores a scope frame when snapshot is non-nil, no-op otherwise.
|
|
31
|
+
- (void)restoreContextSnapshot:(nullable id)snapshot context:(RenderContext *)context;
|
|
32
|
+
|
|
18
33
|
@end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#import "BaseRenderer.h"
|
|
2
|
+
#import "RenderContext.h"
|
|
2
3
|
#import "RendererFactory.h"
|
|
3
4
|
#import "StyleConfig.h"
|
|
4
5
|
|
|
@@ -13,4 +14,33 @@
|
|
|
13
14
|
return self;
|
|
14
15
|
}
|
|
15
16
|
|
|
17
|
+
- (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
|
|
18
|
+
{
|
|
19
|
+
id snapshot = [self takeContextSnapshot:context];
|
|
20
|
+
@try {
|
|
21
|
+
[self renderNodeContent:node into:output context:context];
|
|
22
|
+
} @finally {
|
|
23
|
+
[self restoreContextSnapshot:snapshot context:context];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
- (void)renderNodeContent:(MarkdownASTNode *)node
|
|
28
|
+
into:(NSMutableAttributedString *)output
|
|
29
|
+
context:(RenderContext *)context
|
|
30
|
+
{
|
|
31
|
+
[self doesNotRecognizeSelector:_cmd];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
- (id)takeContextSnapshot:(RenderContext *)context
|
|
35
|
+
{
|
|
36
|
+
return nil;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
- (void)restoreContextSnapshot:(id)snapshot context:(RenderContext *)context
|
|
40
|
+
{
|
|
41
|
+
if (snapshot) {
|
|
42
|
+
[context restoreScope:snapshot];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
16
46
|
@end
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
#import "BlockquoteRenderer.h"
|
|
2
2
|
#import "BlockquoteBorder.h"
|
|
3
3
|
#import "FontUtils.h"
|
|
4
|
+
#import "LastElementUtils.h"
|
|
5
|
+
#import "ListItemRenderer.h"
|
|
4
6
|
#import "MarkdownASTNode.h"
|
|
5
7
|
#import "ParagraphStyleUtils.h"
|
|
8
|
+
#import "RenderContext.h"
|
|
6
9
|
#import "RendererFactory.h"
|
|
7
10
|
#import "StyleConfig.h"
|
|
8
11
|
|
|
@@ -11,8 +14,19 @@ static NSString *const kNestedInfoRangeKey = @"range";
|
|
|
11
14
|
|
|
12
15
|
@implementation BlockquoteRenderer
|
|
13
16
|
|
|
14
|
-
- (
|
|
17
|
+
- (id)takeContextSnapshot:(RenderContext *)context
|
|
15
18
|
{
|
|
19
|
+
return [context snapshotScope];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
- (void)renderNodeContent:(MarkdownASTNode *)node
|
|
23
|
+
into:(NSMutableAttributedString *)output
|
|
24
|
+
context:(RenderContext *)context
|
|
25
|
+
{
|
|
26
|
+
if (output.length > 0 && ![output.string hasSuffix:@"\n"]) {
|
|
27
|
+
[output appendAttributedString:kNewlineAttributedString];
|
|
28
|
+
}
|
|
29
|
+
|
|
16
30
|
NSInteger currentDepth = context.blockquoteDepth;
|
|
17
31
|
context.blockquoteDepth = currentDepth + 1;
|
|
18
32
|
|
|
@@ -22,19 +36,14 @@ static NSString *const kNestedInfoRangeKey = @"range";
|
|
|
22
36
|
headingLevel:0];
|
|
23
37
|
|
|
24
38
|
NSUInteger start = output.length;
|
|
25
|
-
|
|
26
|
-
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
27
|
-
} @finally {
|
|
28
|
-
[context clearBlockStyle];
|
|
29
|
-
context.blockquoteDepth = currentDepth;
|
|
30
|
-
}
|
|
39
|
+
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
31
40
|
|
|
32
41
|
NSUInteger end = output.length;
|
|
33
42
|
if (end <= start) {
|
|
34
43
|
return;
|
|
35
44
|
}
|
|
36
45
|
|
|
37
|
-
[self applyStylingAndSpacing:output start:start end:end currentDepth:currentDepth];
|
|
46
|
+
[self applyStylingAndSpacing:output start:start end:end currentDepth:currentDepth context:context];
|
|
38
47
|
}
|
|
39
48
|
|
|
40
49
|
#pragma mark - Styling and Spacing
|
|
@@ -43,19 +52,42 @@ static NSString *const kNestedInfoRangeKey = @"range";
|
|
|
43
52
|
start:(NSUInteger)start
|
|
44
53
|
end:(NSUInteger)end
|
|
45
54
|
currentDepth:(NSInteger)currentDepth
|
|
55
|
+
context:(RenderContext *)context
|
|
46
56
|
{
|
|
47
57
|
NSUInteger contentStart = start;
|
|
48
58
|
if (currentDepth == 0) {
|
|
49
59
|
contentStart += applyBlockSpacingBefore(output, start, [_config blockquoteMarginTop]);
|
|
50
60
|
}
|
|
51
61
|
|
|
52
|
-
|
|
62
|
+
// nested quotes pad their own box (matching web CSS padding)
|
|
63
|
+
CGFloat padding = [_config blockquotePadding];
|
|
64
|
+
NSUInteger topPadLength = 0;
|
|
65
|
+
NSUInteger bottomPadLength = 0;
|
|
66
|
+
if (padding > 0) {
|
|
67
|
+
NSMutableParagraphStyle *topSpacerStyle = [context spacerStyleWithHeight:padding spacing:0];
|
|
68
|
+
NSAttributedString *topSpacer = [[NSAttributedString alloc]
|
|
69
|
+
initWithString:@"\n"
|
|
70
|
+
attributes:@{NSParagraphStyleAttributeName : topSpacerStyle, BlockquoteSpacerAttributeName : @YES}];
|
|
71
|
+
[output insertAttributedString:topSpacer atIndex:contentStart];
|
|
72
|
+
topPadLength = 1;
|
|
73
|
+
|
|
74
|
+
NSUInteger bottomSpacerLocation = output.length;
|
|
75
|
+
[output appendAttributedString:kNewlineAttributedString];
|
|
76
|
+
NSMutableParagraphStyle *bottomSpacerStyle = [context spacerStyleWithHeight:padding spacing:0];
|
|
77
|
+
[output addAttributes:@{NSParagraphStyleAttributeName : bottomSpacerStyle, BlockquoteSpacerAttributeName : @YES}
|
|
78
|
+
range:NSMakeRange(bottomSpacerLocation, 1)];
|
|
79
|
+
bottomPadLength = 1;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
NSRange blockquoteRange = NSMakeRange(contentStart, (end - start) + topPadLength + bottomPadLength);
|
|
83
|
+
NSRange innerRange = NSMakeRange(contentStart + topPadLength, end - start);
|
|
53
84
|
CGFloat levelSpacing = [_config blockquoteBorderWidth] + [_config blockquoteGapWidth];
|
|
54
|
-
NSArray<NSDictionary *> *nestedInfo = [self collectNestedBlockquotes:output range:
|
|
85
|
+
NSArray<NSDictionary *> *nestedInfo = [self collectNestedBlockquotes:output range:innerRange depth:currentDepth];
|
|
55
86
|
|
|
56
87
|
// Apply base styling (indentation, depth, background, line height)
|
|
57
88
|
[self applyBaseBlockquoteStyle:output
|
|
58
|
-
|
|
89
|
+
boxRange:blockquoteRange
|
|
90
|
+
innerRange:innerRange
|
|
59
91
|
depth:currentDepth
|
|
60
92
|
levelSpacing:levelSpacing
|
|
61
93
|
backgroundColor:[_config blockquoteBackgroundColor]
|
|
@@ -94,26 +126,66 @@ static NSString *const kNestedInfoRangeKey = @"range";
|
|
|
94
126
|
}
|
|
95
127
|
|
|
96
128
|
- (void)applyBaseBlockquoteStyle:(NSMutableAttributedString *)output
|
|
97
|
-
|
|
129
|
+
boxRange:(NSRange)boxRange
|
|
130
|
+
innerRange:(NSRange)innerRange
|
|
98
131
|
depth:(NSInteger)currentDepth
|
|
99
132
|
levelSpacing:(CGFloat)levelSpacing
|
|
100
133
|
backgroundColor:(RCTUIColor *)backgroundColor
|
|
101
134
|
lineHeight:(CGFloat)lineHeight
|
|
102
135
|
{
|
|
103
|
-
|
|
104
|
-
CGFloat
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
NSMutableDictionary *
|
|
109
|
-
[NSMutableDictionary dictionaryWithObjectsAndKeys
|
|
110
|
-
BlockquoteDepthAttributeName, nil];
|
|
136
|
+
CGFloat totalIndent = blockquoteIndentForDepth(currentDepth + 1, levelSpacing);
|
|
137
|
+
CGFloat padding = [_config blockquotePadding];
|
|
138
|
+
|
|
139
|
+
// Depth and background cover the whole box (incl. padding spacers) so the
|
|
140
|
+
// border and background render behind list content and the padding rows.
|
|
141
|
+
NSMutableDictionary *depthAttributes =
|
|
142
|
+
[NSMutableDictionary dictionaryWithObjectsAndKeys:@(currentDepth), BlockquoteDepthAttributeName, nil];
|
|
111
143
|
if (backgroundColor) {
|
|
112
|
-
|
|
144
|
+
depthAttributes[BlockquoteBackgroundColorAttributeName] = backgroundColor;
|
|
113
145
|
}
|
|
114
|
-
[output addAttributes:
|
|
146
|
+
[output addAttributes:depthAttributes range:boxRange];
|
|
115
147
|
|
|
116
|
-
|
|
148
|
+
// List items bake the blockquote indent into their own paragraph style; only non-list content is stamped here.
|
|
149
|
+
[self enumerateNonListRangesIn:output
|
|
150
|
+
range:innerRange
|
|
151
|
+
usingBlock:^(NSRange nonListRange) {
|
|
152
|
+
NSMutableParagraphStyle *paragraphStyle =
|
|
153
|
+
getOrCreateParagraphStyle(output, nonListRange.location);
|
|
154
|
+
paragraphStyle.firstLineHeadIndent = totalIndent;
|
|
155
|
+
paragraphStyle.headIndent = totalIndent;
|
|
156
|
+
if (padding > 0) {
|
|
157
|
+
paragraphStyle.tailIndent = -padding;
|
|
158
|
+
}
|
|
159
|
+
[output addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:nonListRange];
|
|
160
|
+
applyLineHeight(output, nonListRange, lineHeight);
|
|
161
|
+
}];
|
|
162
|
+
|
|
163
|
+
if (padding > 0) {
|
|
164
|
+
[self applyTailIndent:-padding toListRangesIn:output range:innerRange];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
- (void)applyTailIndent:(CGFloat)tailIndent toListRangesIn:(NSMutableAttributedString *)output range:(NSRange)range
|
|
169
|
+
{
|
|
170
|
+
[output enumerateAttribute:ListDepthAttribute
|
|
171
|
+
inRange:range
|
|
172
|
+
options:0
|
|
173
|
+
usingBlock:^(id value, NSRange listRange, BOOL *stop) {
|
|
174
|
+
if (!value) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
[output enumerateAttribute:NSParagraphStyleAttributeName
|
|
178
|
+
inRange:listRange
|
|
179
|
+
options:0
|
|
180
|
+
usingBlock:^(NSParagraphStyle *style, NSRange styleRange, BOOL *innerStop) {
|
|
181
|
+
NSMutableParagraphStyle *mutableStyle =
|
|
182
|
+
style ? [style mutableCopy] : [[NSMutableParagraphStyle alloc] init];
|
|
183
|
+
mutableStyle.tailIndent = tailIndent;
|
|
184
|
+
[output addAttribute:NSParagraphStyleAttributeName
|
|
185
|
+
value:mutableStyle
|
|
186
|
+
range:styleRange];
|
|
187
|
+
}];
|
|
188
|
+
}];
|
|
117
189
|
}
|
|
118
190
|
|
|
119
191
|
- (void)reapplyNestedStyles:(NSMutableAttributedString *)output
|
|
@@ -122,27 +194,64 @@ static NSString *const kNestedInfoRangeKey = @"range";
|
|
|
122
194
|
{
|
|
123
195
|
// Re-apply indentation to nested blockquotes since applyBaseBlockquoteStyle
|
|
124
196
|
// overwrote them with the parent's indentation
|
|
197
|
+
CGFloat padding = [_config blockquotePadding];
|
|
125
198
|
for (NSDictionary *info in nestedInfo) {
|
|
126
199
|
NSRange nestedRange = [info[kNestedInfoRangeKey] rangeValue];
|
|
127
200
|
NSInteger nestedDepth = [info[kNestedInfoDepthKey] integerValue];
|
|
128
|
-
|
|
201
|
+
CGFloat indent = blockquoteIndentForDepth(nestedDepth + 1, levelSpacing);
|
|
129
202
|
|
|
130
|
-
|
|
131
|
-
style.firstLineHeadIndent = indent;
|
|
132
|
-
style.headIndent = indent;
|
|
133
|
-
style.tailIndent = 0;
|
|
203
|
+
[output addAttribute:BlockquoteDepthAttributeName value:info[kNestedInfoDepthKey] range:nestedRange];
|
|
134
204
|
|
|
135
|
-
[output
|
|
136
|
-
|
|
137
|
-
|
|
205
|
+
[self enumerateNonListRangesIn:output
|
|
206
|
+
range:nestedRange
|
|
207
|
+
usingBlock:^(NSRange nonListRange) {
|
|
208
|
+
NSMutableParagraphStyle *style = getOrCreateParagraphStyle(output, nonListRange.location);
|
|
209
|
+
style.firstLineHeadIndent = indent;
|
|
210
|
+
style.headIndent = indent;
|
|
211
|
+
style.tailIndent = padding > 0 ? -padding : 0;
|
|
212
|
+
[output addAttribute:NSParagraphStyleAttributeName value:style range:nonListRange];
|
|
213
|
+
}];
|
|
138
214
|
}
|
|
139
215
|
}
|
|
140
216
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
217
|
+
- (void)enumerateNonListRangesIn:(NSMutableAttributedString *)output
|
|
218
|
+
range:(NSRange)range
|
|
219
|
+
usingBlock:(void (^)(NSRange nonListRange))block
|
|
144
220
|
{
|
|
145
|
-
|
|
221
|
+
// List items — and code blocks nested inside them (which carry a list-derived
|
|
222
|
+
// indent instead of ListDepthAttribute) — already bake the correct indent in.
|
|
223
|
+
NSMutableArray<NSValue *> *listRanges = [NSMutableArray array];
|
|
224
|
+
void (^collectRanges)(NSString *) = ^(NSString *attribute) {
|
|
225
|
+
[output enumerateAttribute:attribute
|
|
226
|
+
inRange:range
|
|
227
|
+
options:0
|
|
228
|
+
usingBlock:^(id value, NSRange subRange, BOOL *stop) {
|
|
229
|
+
if (value) {
|
|
230
|
+
[listRanges addObject:[NSValue valueWithRange:subRange]];
|
|
231
|
+
}
|
|
232
|
+
}];
|
|
233
|
+
};
|
|
234
|
+
collectRanges(ListDepthAttribute);
|
|
235
|
+
collectRanges(CodeBlockIndentAttributeName);
|
|
236
|
+
collectRanges(BlockquoteSpacerAttributeName);
|
|
237
|
+
[listRanges sortUsingComparator:^NSComparisonResult(NSValue *a, NSValue *b) {
|
|
238
|
+
NSUInteger la = [a rangeValue].location;
|
|
239
|
+
NSUInteger lb = [b rangeValue].location;
|
|
240
|
+
return la < lb ? NSOrderedAscending : (la > lb ? NSOrderedDescending : NSOrderedSame);
|
|
241
|
+
}];
|
|
242
|
+
|
|
243
|
+
NSUInteger pos = range.location;
|
|
244
|
+
const NSUInteger end = NSMaxRange(range);
|
|
245
|
+
for (NSValue *val in listRanges) {
|
|
246
|
+
NSRange listRange = [val rangeValue];
|
|
247
|
+
if (pos < listRange.location) {
|
|
248
|
+
block(NSMakeRange(pos, listRange.location - pos));
|
|
249
|
+
}
|
|
250
|
+
pos = MAX(pos, NSMaxRange(listRange));
|
|
251
|
+
}
|
|
252
|
+
if (pos < end) {
|
|
253
|
+
block(NSMakeRange(pos, end - pos));
|
|
254
|
+
}
|
|
146
255
|
}
|
|
147
256
|
|
|
148
257
|
@end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
#import "CodeBlockRenderer.h"
|
|
2
2
|
#import "CodeBlockBackground.h"
|
|
3
|
+
#import "ENRMCodeBlockContent.h"
|
|
4
|
+
#import "ENRMCodeBlockHighlighter.h"
|
|
3
5
|
#import "LastElementUtils.h"
|
|
4
6
|
#import "MarkdownASTNode.h"
|
|
5
7
|
#import "ParagraphStyleUtils.h"
|
|
@@ -9,12 +11,25 @@
|
|
|
9
11
|
|
|
10
12
|
@implementation CodeBlockRenderer
|
|
11
13
|
|
|
12
|
-
- (
|
|
14
|
+
- (id)takeContextSnapshot:(RenderContext *)context
|
|
13
15
|
{
|
|
16
|
+
return [context snapshotScope];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
- (void)renderNodeContent:(MarkdownASTNode *)node
|
|
20
|
+
into:(NSMutableAttributedString *)output
|
|
21
|
+
context:(RenderContext *)context
|
|
22
|
+
{
|
|
23
|
+
// In tight lists md4c emits raw Text siblings without paragraph wrappers,
|
|
24
|
+
// so the preceding content may not terminate with a newline.
|
|
25
|
+
if (output.length > 0 && ![output.string hasSuffix:@"\n"]) {
|
|
26
|
+
[output appendAttributedString:kNewlineAttributedString];
|
|
27
|
+
}
|
|
28
|
+
|
|
14
29
|
[context setBlockStyle:BlockTypeCodeBlock font:[_config codeBlockFont] color:[_config codeBlockColor] headingLevel:0];
|
|
15
30
|
|
|
31
|
+
CGFloat listIndent = context.accumulatedIndent;
|
|
16
32
|
CGFloat padding = [_config codeBlockPadding];
|
|
17
|
-
CGFloat lineHeight = [_config codeBlockLineHeight];
|
|
18
33
|
CGFloat marginTop = [_config codeBlockMarginTop];
|
|
19
34
|
CGFloat marginBottom = [_config codeBlockMarginBottom];
|
|
20
35
|
|
|
@@ -31,11 +46,7 @@
|
|
|
31
46
|
}
|
|
32
47
|
|
|
33
48
|
NSUInteger contentStart = output.length;
|
|
34
|
-
|
|
35
|
-
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
36
|
-
} @finally {
|
|
37
|
-
[context clearBlockStyle];
|
|
38
|
-
}
|
|
49
|
+
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
39
50
|
|
|
40
51
|
NSUInteger contentEnd = output.length;
|
|
41
52
|
if (contentEnd <= contentStart)
|
|
@@ -43,25 +54,15 @@
|
|
|
43
54
|
|
|
44
55
|
NSRange contentRange = NSMakeRange(contentStart, contentEnd - contentStart);
|
|
45
56
|
|
|
46
|
-
|
|
47
|
-
RCTUIColor *codeColor = [_config codeBlockColor];
|
|
48
|
-
if (codeColor) {
|
|
49
|
-
[output addAttributes:@{NSFontAttributeName : codeFont, NSForegroundColorAttributeName : codeColor}
|
|
50
|
-
range:contentRange];
|
|
51
|
-
} else {
|
|
52
|
-
[output addAttribute:NSFontAttributeName value:codeFont range:contentRange];
|
|
53
|
-
}
|
|
57
|
+
ENRMApplyCodeBlockTextAttributes(output, contentRange, _config);
|
|
54
58
|
|
|
55
|
-
|
|
56
|
-
applyLineHeight(output, contentRange, lineHeight);
|
|
57
|
-
}
|
|
59
|
+
ENRMApplyHighlightTokens(output, contentRange, ENRMCodeBlockExtractCode(node), ENRMCodeBlockLanguage(node), _config);
|
|
58
60
|
|
|
59
|
-
//
|
|
61
|
+
// Horizontal padding is paragraph indentation in this flavor; the shared
|
|
62
|
+
// helper already forced the LTR left-aligned base style.
|
|
60
63
|
NSMutableParagraphStyle *baseStyle = [getOrCreateParagraphStyle(output, contentStart) mutableCopy];
|
|
61
|
-
baseStyle.
|
|
62
|
-
baseStyle.
|
|
63
|
-
baseStyle.firstLineHeadIndent = padding;
|
|
64
|
-
baseStyle.headIndent = padding;
|
|
64
|
+
baseStyle.firstLineHeadIndent = padding + listIndent;
|
|
65
|
+
baseStyle.headIndent = padding + listIndent;
|
|
65
66
|
baseStyle.tailIndent = -padding;
|
|
66
67
|
[output addAttribute:NSParagraphStyleAttributeName value:baseStyle range:contentRange];
|
|
67
68
|
|
|
@@ -80,6 +81,9 @@
|
|
|
80
81
|
// Define the range for background rendering (includes padding, excludes margins)
|
|
81
82
|
NSRange backgroundRange = NSMakeRange(blockStart, output.length - blockStart);
|
|
82
83
|
[output addAttribute:CodeBlockAttributeName value:@YES range:backgroundRange];
|
|
84
|
+
if (listIndent > 0) {
|
|
85
|
+
[output addAttribute:CodeBlockIndentAttributeName value:@(listIndent) range:backgroundRange];
|
|
86
|
+
}
|
|
83
87
|
|
|
84
88
|
// External Margin: Applied outside the background range
|
|
85
89
|
if (marginBottom > 0) {
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
|
|
11
11
|
@implementation CodeRenderer
|
|
12
12
|
|
|
13
|
-
- (void)
|
|
13
|
+
- (void)renderNodeContent:(MarkdownASTNode *)node
|
|
14
|
+
into:(NSMutableAttributedString *)output
|
|
15
|
+
context:(RenderContext *)context
|
|
14
16
|
{
|
|
15
17
|
|
|
16
18
|
BlockStyle *blockStyle = [context getBlockStyle];
|
|
@@ -10,7 +10,9 @@ static const unichar kZeroWidthSpace = 0x200B;
|
|
|
10
10
|
|
|
11
11
|
@implementation ENRMImageRenderer
|
|
12
12
|
|
|
13
|
-
- (void)
|
|
13
|
+
- (void)renderNodeContent:(MarkdownASTNode *)node
|
|
14
|
+
into:(NSMutableAttributedString *)output
|
|
15
|
+
context:(RenderContext *)context
|
|
14
16
|
{
|
|
15
17
|
NSString *imageURL = node.attributes[@"url"];
|
|
16
18
|
if (!imageURL || imageURL.length == 0) {
|
|
@@ -45,6 +47,8 @@ static const unichar kZeroWidthSpace = 0x200B;
|
|
|
45
47
|
{
|
|
46
48
|
if (node.content.length > 0) {
|
|
47
49
|
[buffer appendString:node.content];
|
|
50
|
+
} else if (node.type == MarkdownNodeTypeSoftBreak || node.type == MarkdownNodeTypeLineBreak) {
|
|
51
|
+
[buffer appendString:@" "];
|
|
48
52
|
}
|
|
49
53
|
|
|
50
54
|
for (MarkdownASTNode *child in node.children) {
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
|
|
13
13
|
@implementation ENRMMathInlineRenderer
|
|
14
14
|
|
|
15
|
-
- (void)
|
|
15
|
+
- (void)renderNodeContent:(MarkdownASTNode *)node
|
|
16
|
+
into:(NSMutableAttributedString *)output
|
|
17
|
+
context:(RenderContext *)context
|
|
16
18
|
{
|
|
17
19
|
NSString *latex = [self extractLatexFromNode:node];
|
|
18
20
|
if (latex.length == 0) {
|
|
@@ -28,6 +30,7 @@
|
|
|
28
30
|
attachment.mathTextColor = [_config inlineMathColor];
|
|
29
31
|
attachment.containerPaddingVertical = [_config inlineMathPaddingVertical];
|
|
30
32
|
attachment.bold = ENRMMathFontWeightIsBold([_config inlineMathFontWeight]);
|
|
33
|
+
attachment.glyphOverflow = [_config inlineMathGlyphOverflow];
|
|
31
34
|
|
|
32
35
|
#if TARGET_OS_OSX
|
|
33
36
|
// On macOS, NSLayoutManager uses self.image/self.bounds rather than calling
|
|
@@ -53,6 +56,8 @@
|
|
|
53
56
|
for (MarkdownASTNode *child in node.children) {
|
|
54
57
|
if (child.content.length > 0) {
|
|
55
58
|
[buffer appendString:child.content];
|
|
59
|
+
} else if (child.type == MarkdownNodeTypeSoftBreak || child.type == MarkdownNodeTypeLineBreak) {
|
|
60
|
+
[buffer appendString:@" "];
|
|
56
61
|
}
|
|
57
62
|
}
|
|
58
63
|
return buffer;
|
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
|
|
7
7
|
@implementation ENRMSpoilerRenderer
|
|
8
8
|
|
|
9
|
-
- (void)
|
|
9
|
+
- (void)renderNodeContent:(MarkdownASTNode *)node
|
|
10
|
+
into:(NSMutableAttributedString *)output
|
|
11
|
+
context:(RenderContext *)context
|
|
10
12
|
{
|
|
11
13
|
NSUInteger start = output.length;
|
|
12
14
|
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
|
|
11
11
|
#pragma mark - Rendering
|
|
12
12
|
|
|
13
|
-
- (void)
|
|
13
|
+
- (void)renderNodeContent:(MarkdownASTNode *)node
|
|
14
|
+
into:(NSMutableAttributedString *)output
|
|
15
|
+
context:(RenderContext *)context
|
|
14
16
|
{
|
|
15
17
|
NSUInteger start = output.length;
|
|
16
18
|
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
@@ -21,8 +21,19 @@ static NSString *const kHeadingTypes[] = {nil, @"heading-1", @"heading-
|
|
|
21
21
|
|
|
22
22
|
@implementation HeadingRenderer
|
|
23
23
|
|
|
24
|
-
- (
|
|
24
|
+
- (id)takeContextSnapshot:(RenderContext *)context
|
|
25
25
|
{
|
|
26
|
+
return [context snapshotScope];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
- (void)renderNodeContent:(MarkdownASTNode *)node
|
|
30
|
+
into:(NSMutableAttributedString *)output
|
|
31
|
+
context:(RenderContext *)context
|
|
32
|
+
{
|
|
33
|
+
if (output.length > 0 && ![output.string hasSuffix:@"\n"]) {
|
|
34
|
+
[output appendAttributedString:kNewlineAttributedString];
|
|
35
|
+
}
|
|
36
|
+
|
|
26
37
|
NSInteger level = [node.attributes[@"level"] integerValue];
|
|
27
38
|
if (level < 1 || level > 6)
|
|
28
39
|
level = 1;
|
|
@@ -40,11 +51,7 @@ static NSString *const kHeadingTypes[] = {nil, @"heading-1", @"heading-
|
|
|
40
51
|
start += offset;
|
|
41
52
|
}
|
|
42
53
|
|
|
43
|
-
|
|
44
|
-
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
45
|
-
} @finally {
|
|
46
|
-
[context clearBlockStyle];
|
|
47
|
-
}
|
|
54
|
+
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|
|
48
55
|
|
|
49
56
|
NSRange range = NSMakeRange(start, output.length - start);
|
|
50
57
|
if (range.length == 0)
|
|
@@ -10,7 +10,9 @@ NSString *const HighlightAttributeName = @"EnrichedMarkdownHighlight";
|
|
|
10
10
|
|
|
11
11
|
#pragma mark - Rendering
|
|
12
12
|
|
|
13
|
-
- (void)
|
|
13
|
+
- (void)renderNodeContent:(MarkdownASTNode *)node
|
|
14
|
+
into:(NSMutableAttributedString *)output
|
|
15
|
+
context:(RenderContext *)context
|
|
14
16
|
{
|
|
15
17
|
NSUInteger start = output.length;
|
|
16
18
|
[_rendererFactory renderChildrenOfNode:node into:output context:context];
|