react-native-enriched-markdown-scaffold 0.7.4-scaffold.9 → 1.0.2-scaffold.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -8
- package/ReactNativeEnrichedMarkdown.podspec +82 -73
- package/android/build.gradle +186 -1
- package/android/consumer-rules.pro +1 -1
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerDelegate.java +9 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerInterface.java +3 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerDelegate.java +24 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerInterface.java +8 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +9 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +3 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +75 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +63 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +35 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +886 -23
- package/android/src/main/baseline-prof.txt +1 -1
- package/android/src/main/cpp/jni-adapter.cpp +74 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt +189 -13
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownInternalText.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownManager.kt +50 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +48 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager.kt +10 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +42 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +82 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/events/CopyPressEvent.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager.kt +54 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +901 -462
- package/android/src/main/java/com/swmansion/enriched/markdown/input/MarkdownClipboard.kt +42 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/BlockEditCoordinator.kt +196 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/ClipboardCoordinator.kt +73 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditContext.kt +19 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditPipeline.kt +248 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditSession.kt +52 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/InputConnectionWrapper.kt +101 -7
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/LinkCoordinator.kt +69 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownTextWatcher.kt +3 -3
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MentionCoordinator.kt +118 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnChangeStateEvent.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnContextMenuItemPressEvent.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnInputKeyPressEvent.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnPasteEvent.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/BlockStore.kt +254 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/FormattingStore.kt +80 -87
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputFormatter.kt +109 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputParser.kt +116 -22
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/MarkdownSerializer.kt +167 -38
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/RangeEditAdjustment.kt +149 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt +66 -5
- package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputMeasurementStore.kt +4 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockRange.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockType.kt +48 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/FormattingRange.kt +9 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/InputFormatterStyle.kt +39 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathAtom.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathChipStyle.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MutableRangeBounds.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputBulletSpan.kt +82 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputHeadingSpan.kt +58 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputListItemSpacingSpan.kt +37 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputOrderedListMarkerSpan.kt +63 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/BlockHandler.kt +54 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/HeadingBlockHandler.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/OrderedListBlockHandler.kt +38 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/UnorderedListBlockHandler.kt +37 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt +8 -26
- package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +9 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +100 -12
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +16 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +4 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +2 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +74 -18
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +43 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +9 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SoftBreakRenderer.kt +16 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +30 -27
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +174 -24
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +27 -3
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +13 -16
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +182 -46
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListItemSpacingSpan.kt +33 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListMarkerAnchorSpan.kt +38 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +2 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/TaskListSpan.kt +3 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +3 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +6 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +7 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +4 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +13 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/TableStyle.kt +6 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockHighlighter.kt +90 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockNode.kt +57 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/FeatureFlags.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownSegment.kt +9 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownViewManagerUtils.kt +37 -7
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/ReadableMapExtensions.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/RenderedSegment.kt +10 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/SegmentSignature.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/StreamingMarkdownFilter.kt +83 -5
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/serialization/MarkdownASTSerializer.kt +4 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/MarkdownStyleParser.kt +74 -44
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/PasteTextUtils.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageCache.kt +26 -3
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageDownloader.kt +22 -9
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/LocalImageLoader.kt +161 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/extensions/TextPaintExtensions.kt +23 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/CheckboxTouchHelper.kt +7 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/TaskListTapUtils.kt +41 -21
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/span/BlockSpacing.kt +15 -8
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLongPressMovementMethod.kt +58 -27
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionActionMode.kt +49 -15
- package/android/src/main/java/com/swmansion/enriched/markdown/views/BlockMenuOptions.kt +45 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +396 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/views/ContextMenuPopup.kt +9 -6
- package/android/src/main/java/com/swmansion/enriched/markdown/views/CopyGlyph.kt +101 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/views/TableContainerView.kt +36 -9
- package/android/src/main/jni/CMakeLists.txt +53 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp +10 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h +11 -2
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +10 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +12 -2
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.cpp +9 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.h +24 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +16 -0
- package/android/src/math/java/com/swmansion/enriched/markdown/input/math/MathChipControllerImpl.kt +21 -4
- package/android/src/math/java/com/swmansion/enriched/markdown/renderer/MathInlineRenderer.kt +7 -2
- package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathChipSpan.kt +1 -1
- package/android/src/math/java/com/swmansion/enriched/markdown/views/MathContainerView.kt +6 -4
- package/cpp/highlight/CodeBlockHighlighter.cpp +284 -0
- package/cpp/highlight/CodeBlockHighlighter.hpp +66 -0
- package/cpp/highlight/CodeBlockLanguages.cpp +138 -0
- package/cpp/highlight/CodeBlockLanguages.hpp +25 -0
- package/cpp/highlight/HighlightGrammars.hpp +28 -0
- package/cpp/highlight/code_highlight_podspec.rb +211 -0
- package/cpp/highlight/gen-registry.mjs +155 -0
- package/cpp/highlight/grammar-versions.json +159 -0
- package/cpp/highlight/vendor/generated/generated_queries.h +1665 -0
- package/cpp/highlight/vendor/generated/generated_registry.cpp +59 -0
- package/cpp/parser/MD4CParser.cpp +173 -61
- package/cpp/parser/MD4CParser.hpp +1 -0
- package/cpp/parser/MarkdownASTNode.hpp +2 -1
- package/cpp/wasm/ASTSerializer.cpp +2 -0
- package/cpp/wasm/build.sh +1 -0
- package/cpp/wasm/md4c_wasm.cpp +3 -1
- package/docs/ACCESSIBILITY.md +14 -2
- package/docs/API_REFERENCE.md +234 -12
- package/docs/BREAKING_CHANGES.md +129 -0
- package/docs/CODE_HIGHLIGHT.md +133 -0
- package/docs/COPY_OPTIONS.md +47 -3
- package/docs/ELEMENTS_STRUCTURE.md +52 -4
- package/docs/IMAGE_CACHING.md +30 -0
- package/docs/INPUT.md +108 -11
- package/docs/LATEX_MATH.md +87 -45
- package/docs/MACOS.md +1 -1
- package/docs/MARKDOWN_STREAMING.md +27 -1
- package/docs/NATIVE_ASSETS.md +127 -0
- package/docs/RTL.md +1 -1
- package/docs/STYLES.md +46 -6
- package/docs/TESTING.md +112 -0
- package/docs/TEXT.md +16 -6
- package/docs/WEB.md +3 -1
- package/ios/EnrichedMarkdown.h +7 -0
- package/ios/EnrichedMarkdown.mm +284 -75
- package/ios/EnrichedMarkdownText.h +7 -0
- package/ios/EnrichedMarkdownText.mm +101 -73
- package/ios/attachments/ENRMImageAttachment.h +9 -0
- package/ios/attachments/ENRMImageAttachment.m +143 -40
- package/ios/attachments/ENRMMathInlineAttachment.h +2 -0
- package/ios/attachments/ENRMMathInlineAttachment.m +48 -81
- package/ios/attachments/ENRMMathInlineAttachmentShared.h +2 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.cpp +75 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.h +63 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.cpp +35 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +886 -23
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +131 -0
- package/ios/input/ENRMAutoLinkDetector.h +2 -1
- package/ios/input/ENRMAutoLinkDetector.mm +79 -41
- package/ios/input/ENRMBlockEditCoordinator.h +71 -0
- package/ios/input/ENRMBlockEditCoordinator.mm +195 -0
- package/ios/input/ENRMBlockRange.h +28 -0
- package/ios/input/ENRMBlockRange.mm +30 -0
- package/ios/input/ENRMBlockStore.h +56 -0
- package/ios/input/ENRMBlockStore.mm +275 -0
- package/ios/input/ENRMClipboardCoordinator.h +45 -0
- package/ios/input/ENRMClipboardCoordinator.mm +120 -0
- package/ios/input/ENRMDetectorPipeline.h +2 -1
- package/ios/input/ENRMEditPipeline.h +76 -0
- package/ios/input/ENRMEditPipeline.mm +228 -0
- package/ios/input/ENRMEditSession.h +36 -0
- package/ios/input/ENRMEditSession.mm +63 -0
- package/ios/input/ENRMFormattingStore.h +17 -0
- package/ios/input/ENRMFormattingStore.mm +95 -105
- package/ios/input/ENRMInputBlockType.h +91 -0
- package/ios/input/ENRMInputBlockType.mm +5 -0
- package/ios/input/ENRMInputDecorationDrawer.h +18 -0
- package/ios/input/ENRMInputEventEmitter.h +56 -0
- package/ios/input/ENRMInputEventEmitter.mm +308 -0
- package/ios/input/ENRMInputFormatter.h +29 -69
- package/ios/input/ENRMInputFormatter.mm +216 -124
- package/ios/input/ENRMInputFormatterStyle.h +99 -0
- package/ios/input/ENRMInputFormatterStyle.mm +188 -0
- package/ios/input/ENRMInputLayoutManager.h +9 -0
- package/ios/input/ENRMInputLayoutManager.mm +30 -0
- package/ios/input/ENRMInputListMarkerDrawer.h +32 -0
- package/ios/input/ENRMInputListMarkerDrawer.mm +426 -0
- package/ios/input/ENRMInputParser.h +5 -6
- package/ios/input/ENRMInputParser.mm +461 -178
- package/ios/input/ENRMInputRemend.mm +2 -2
- package/ios/input/ENRMInputStyleStateBuilder.h +40 -0
- package/ios/input/ENRMInputStyleStateBuilder.mm +60 -0
- package/ios/input/ENRMInputTextView.mm +103 -8
- package/ios/input/ENRMInputTypingAttributesController.h +42 -0
- package/ios/input/ENRMInputTypingAttributesController.mm +203 -0
- package/ios/input/ENRMLinkCoordinator.h +41 -0
- package/ios/input/ENRMLinkCoordinator.mm +89 -0
- package/ios/input/ENRMMarkdownSerializer.h +29 -5
- package/ios/input/ENRMMarkdownSerializer.mm +170 -48
- package/ios/input/ENRMMathAtom.h +26 -0
- package/ios/input/ENRMMathAtom.mm +12 -0
- package/ios/input/ENRMMentionCoordinator.h +45 -0
- package/ios/input/ENRMMentionCoordinator.mm +167 -0
- package/ios/input/ENRMRangeEditAdjustment.h +38 -0
- package/ios/input/ENRMRangeEditAdjustment.mm +91 -0
- package/ios/input/ENRMRangeStoreUtils.h +39 -0
- package/ios/input/EnrichedMarkdownTextInput+ContextMenu.mm +6 -6
- package/ios/input/EnrichedMarkdownTextInput+Internal.h +11 -3
- package/ios/input/EnrichedMarkdownTextInput.h +7 -1
- package/ios/input/EnrichedMarkdownTextInput.mm +1089 -1023
- package/ios/input/InputStylePropsUtils.h +109 -68
- package/ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm +2 -1
- package/ios/input/styles/ENRMBlockHandler.h +46 -0
- package/ios/input/styles/ENRMHeadingBlockHandler.h +15 -0
- package/ios/input/styles/ENRMHeadingBlockHandler.mm +38 -0
- package/ios/input/styles/ENRMOrderedListBlockHandler.h +14 -0
- package/ios/input/styles/ENRMOrderedListBlockHandler.mm +48 -0
- package/ios/input/styles/ENRMUnorderedListBlockHandler.h +15 -0
- package/ios/input/styles/ENRMUnorderedListBlockHandler.mm +51 -0
- package/ios/internals/ENRMViewFreeMeasurement.h +331 -0
- package/ios/internals/EnrichedMarkdownShadowNode.h +1 -3
- package/ios/internals/EnrichedMarkdownShadowNode.mm +16 -20
- package/ios/internals/EnrichedMarkdownTextShadowNode.h +1 -3
- package/ios/internals/EnrichedMarkdownTextShadowNode.mm +15 -20
- package/ios/internals/MeasurementCache.h +33 -7
- package/ios/internals/ShadowMeasurementUtils.h +63 -58
- package/ios/math/ENRMMathChipController.h +74 -0
- package/ios/math/ENRMMathChipController.mm +476 -0
- package/ios/math/ENRMRaTeXBridge.swift +4 -1
- package/ios/parser/ENRMMarkdownParser.h +1 -8
- package/ios/parser/ENRMMarkdownParser.mm +2 -11
- package/ios/parser/MarkdownASTNode.h +2 -1
- package/ios/parser/MarkdownParserBridge.mm +4 -0
- package/ios/renderer/AttributedRenderer.m +20 -2
- package/ios/renderer/BaseRenderer.h +17 -2
- package/ios/renderer/BaseRenderer.m +30 -0
- package/ios/renderer/BlockquoteRenderer.h +1 -1
- package/ios/renderer/BlockquoteRenderer.m +144 -35
- package/ios/renderer/CodeBlockRenderer.h +1 -1
- package/ios/renderer/CodeBlockRenderer.m +27 -23
- package/ios/renderer/CodeRenderer.h +1 -1
- package/ios/renderer/CodeRenderer.m +3 -1
- package/ios/renderer/ENRMImageRenderer.h +1 -1
- package/ios/renderer/ENRMImageRenderer.m +5 -1
- package/ios/renderer/ENRMMathInlineRenderer.h +1 -1
- package/ios/renderer/ENRMMathInlineRenderer.m +5 -1
- package/ios/renderer/ENRMSpoilerRenderer.h +1 -1
- package/ios/renderer/ENRMSpoilerRenderer.m +3 -1
- package/ios/renderer/EmphasisRenderer.h +1 -1
- package/ios/renderer/EmphasisRenderer.m +3 -1
- package/ios/renderer/HeadingRenderer.h +1 -1
- package/ios/renderer/HeadingRenderer.m +13 -6
- package/ios/renderer/HighlightRenderer.h +1 -1
- package/ios/renderer/HighlightRenderer.m +3 -1
- package/ios/renderer/LinkRenderer.h +1 -1
- package/ios/renderer/LinkRenderer.m +3 -1
- package/ios/renderer/ListItemRenderer.h +13 -1
- package/ios/renderer/ListItemRenderer.m +102 -44
- package/ios/renderer/ListRenderer.h +2 -2
- package/ios/renderer/ListRenderer.m +63 -25
- package/ios/renderer/ParagraphRenderer.h +1 -1
- package/ios/renderer/ParagraphRenderer.m +16 -8
- package/ios/renderer/RenderContext.h +10 -0
- package/ios/renderer/RenderContext.m +44 -0
- package/ios/renderer/RendererFactory.m +14 -0
- package/ios/renderer/StrikethroughRenderer.h +1 -1
- package/ios/renderer/StrikethroughRenderer.m +3 -1
- package/ios/renderer/StrongRenderer.h +1 -1
- package/ios/renderer/StrongRenderer.m +3 -1
- package/ios/renderer/SubscriptRenderer.h +1 -1
- package/ios/renderer/SubscriptRenderer.m +3 -1
- package/ios/renderer/SuperscriptRenderer.h +1 -1
- package/ios/renderer/SuperscriptRenderer.m +3 -1
- package/ios/renderer/TextRenderer.h +2 -2
- package/ios/renderer/TextRenderer.m +3 -1
- package/ios/renderer/ThematicBreakRenderer.h +1 -1
- package/ios/renderer/ThematicBreakRenderer.m +3 -1
- package/ios/renderer/UnderlineRenderer.h +1 -1
- package/ios/renderer/UnderlineRenderer.m +3 -1
- package/ios/styles/StyleConfig.h +22 -0
- package/ios/styles/StyleConfig.mm +132 -0
- package/ios/utils/BlockquoteBorder.h +6 -0
- package/ios/utils/BlockquoteBorder.m +249 -52
- package/ios/utils/CodeBlockBackground.m +16 -2
- package/ios/utils/ENRMAtomicSize.h +65 -0
- package/ios/utils/ENRMBlockMenu.h +57 -0
- package/ios/utils/ENRMCodeBlockContent.h +37 -0
- package/ios/utils/ENRMCodeBlockContent.mm +79 -0
- package/ios/utils/ENRMCodeBlockHighlighter.h +37 -0
- package/ios/utils/ENRMCodeBlockHighlighter.mm +51 -0
- package/ios/utils/ENRMFeatureFlags.h +7 -0
- package/ios/utils/ENRMImageDownloader.h +11 -1
- package/ios/utils/ENRMImageDownloader.m +60 -16
- package/ios/utils/ENRMLocalImageLoader.h +31 -0
- package/ios/utils/ENRMLocalImageLoader.m +68 -0
- package/ios/utils/ENRMMathFallback.h +26 -0
- package/ios/utils/ENRMMathFallback.m +18 -0
- package/ios/utils/ENRMTextViewSetup.h +35 -17
- package/ios/utils/EditMenuUtils.h +22 -5
- package/ios/utils/EditMenuUtils.m +53 -9
- package/ios/utils/ImageRequestHeaderUtils.h +35 -0
- package/ios/utils/LastElementUtils.h +1 -0
- package/ios/utils/ListMarkerDrawer.m +29 -42
- package/ios/utils/MarkdownASTSerializer.m +4 -0
- package/ios/utils/ParagraphStyleUtils.h +5 -0
- package/ios/utils/ParagraphStyleUtils.m +77 -17
- package/ios/utils/RenderedMarkdownSegment.h +13 -1
- package/ios/utils/RenderedMarkdownSegment.m +20 -0
- package/ios/utils/SegmentRenderer.m +17 -4
- package/ios/utils/StreamingMarkdownFilter.h +11 -1
- package/ios/utils/StreamingMarkdownFilter.m +98 -2
- package/ios/utils/StylePropsUtils.h +63 -0
- package/ios/utils/TaskListTapUtils.m +24 -0
- package/ios/views/ENRMCodeBlockContainerView.h +53 -0
- package/ios/views/ENRMCodeBlockContainerView.m +559 -0
- package/ios/views/ENRMMathContainerView.h +16 -0
- package/ios/views/ENRMMathContainerView.m +74 -19
- package/ios/views/TableContainerView.h +22 -0
- package/ios/views/TableContainerView.m +261 -175
- package/jest.d.ts +1 -0
- package/jest.js +5 -0
- package/lib/module/EnrichedMarkdownNativeComponent.ts +73 -0
- package/lib/module/EnrichedMarkdownTextInput.js +84 -5
- package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
- package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
- package/lib/module/EnrichedMarkdownTextNativeComponent.ts +74 -0
- package/lib/module/headingDefaults.js +34 -0
- package/lib/module/headingDefaults.js.map +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/jest/index.js +191 -0
- package/lib/module/jest/index.js.map +1 -0
- package/lib/module/native/EnrichedMarkdownText.js +37 -5
- package/lib/module/native/EnrichedMarkdownText.js.map +1 -1
- package/lib/module/normalizeMarkdownStyle.js +81 -19
- package/lib/module/normalizeMarkdownStyle.js.map +1 -1
- package/lib/module/normalizeMarkdownStyle.web.js +56 -18
- package/lib/module/normalizeMarkdownStyle.web.js.map +1 -1
- package/lib/module/normalizeMarkdownTextInputStyle.js +62 -15
- package/lib/module/normalizeMarkdownTextInputStyle.js.map +1 -1
- package/lib/module/normalizeMenuItem.js +1 -1
- package/lib/module/utils/textInputState.js +26 -0
- package/lib/module/utils/textInputState.js.map +1 -0
- package/lib/module/web/EnrichedMarkdownText.js +9 -5
- package/lib/module/web/EnrichedMarkdownText.js.map +1 -1
- package/lib/module/web/parseMarkdown.js +4 -3
- package/lib/module/web/parseMarkdown.js.map +1 -1
- package/lib/module/web/renderers/InlineRenderers.js +6 -0
- package/lib/module/web/renderers/InlineRenderers.js.map +1 -1
- package/lib/module/web/renderers/ListRenderers.js +7 -2
- package/lib/module/web/renderers/ListRenderers.js.map +1 -1
- package/lib/module/web/renderers/index.js +7 -4
- package/lib/module/web/renderers/index.js.map +1 -1
- package/lib/module/web/styles.js +83 -6
- package/lib/module/web/styles.js.map +1 -1
- package/lib/module/web/utils.js +1 -0
- package/lib/module/web/utils.js.map +1 -1
- package/lib/module/web/wasm/md4c.js +0 -0
- package/lib/module/web/wasm/md4c.js.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts +66 -0
- package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +94 -9
- package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +69 -5
- package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +66 -0
- package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/headingDefaults.d.ts +9 -0
- package/lib/typescript/src/headingDefaults.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +2 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/index.web.d.ts +1 -1
- package/lib/typescript/src/index.web.d.ts.map +1 -1
- package/lib/typescript/src/jest/index.d.ts +6 -0
- package/lib/typescript/src/jest/index.d.ts.map +1 -0
- package/lib/typescript/src/native/EnrichedMarkdownText.d.ts +3 -3
- package/lib/typescript/src/native/EnrichedMarkdownText.d.ts.map +1 -1
- package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -1
- package/lib/typescript/src/normalizeMarkdownStyle.web.d.ts.map +1 -1
- package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts +19 -5
- package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownStyle.d.ts +72 -0
- package/lib/typescript/src/types/MarkdownStyle.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownStyleInternal.d.ts +27 -0
- package/lib/typescript/src/types/MarkdownStyleInternal.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownTextProps.d.ts +104 -9
- package/lib/typescript/src/types/MarkdownTextProps.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownTextProps.web.d.ts +19 -0
- package/lib/typescript/src/types/MarkdownTextProps.web.d.ts.map +1 -1
- package/lib/typescript/src/types/events.d.ts +19 -0
- package/lib/typescript/src/types/events.d.ts.map +1 -1
- package/lib/typescript/src/utils/textInputState.d.ts +24 -0
- package/lib/typescript/src/utils/textInputState.d.ts.map +1 -0
- package/lib/typescript/src/web/EnrichedMarkdownText.d.ts +1 -1
- package/lib/typescript/src/web/EnrichedMarkdownText.d.ts.map +1 -1
- package/lib/typescript/src/web/parseMarkdown.d.ts +1 -1
- package/lib/typescript/src/web/parseMarkdown.d.ts.map +1 -1
- package/lib/typescript/src/web/renderers/InlineRenderers.d.ts.map +1 -1
- package/lib/typescript/src/web/renderers/ListRenderers.d.ts.map +1 -1
- package/lib/typescript/src/web/renderers/index.d.ts +2 -1
- package/lib/typescript/src/web/renderers/index.d.ts.map +1 -1
- package/lib/typescript/src/web/styles.d.ts +2 -1
- package/lib/typescript/src/web/styles.d.ts.map +1 -1
- package/lib/typescript/src/web/types.d.ts +6 -2
- package/lib/typescript/src/web/types.d.ts.map +1 -1
- package/lib/typescript/src/web/utils.d.ts.map +1 -1
- package/package.json +36 -9
- package/postinstall.mjs +131 -0
- package/ratex-version.json +21 -0
- package/src/EnrichedMarkdownNativeComponent.ts +73 -0
- package/src/EnrichedMarkdownTextInput.tsx +159 -8
- package/src/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
- package/src/EnrichedMarkdownTextNativeComponent.ts +74 -0
- package/src/headingDefaults.ts +21 -0
- package/src/index.tsx +9 -0
- package/src/index.web.tsx +1 -0
- package/src/jest/index.tsx +215 -0
- package/src/native/EnrichedMarkdownText.tsx +53 -2
- package/src/normalizeMarkdownStyle.ts +102 -16
- package/src/normalizeMarkdownStyle.web.ts +63 -15
- package/src/normalizeMarkdownTextInputStyle.ts +110 -35
- package/src/normalizeMenuItem.ts +1 -1
- package/src/types/MarkdownStyle.ts +74 -0
- package/src/types/MarkdownStyleInternal.ts +39 -0
- package/src/types/MarkdownTextProps.ts +101 -9
- package/src/types/MarkdownTextProps.web.ts +19 -0
- package/src/types/events.ts +21 -0
- package/src/utils/textInputState.ts +35 -0
- package/src/web/EnrichedMarkdownText.tsx +16 -2
- package/src/web/parseMarkdown.ts +6 -2
- package/src/web/renderers/InlineRenderers.tsx +5 -0
- package/src/web/renderers/ListRenderers.tsx +14 -2
- package/src/web/renderers/index.tsx +6 -2
- package/src/web/styles.ts +89 -5
- package/src/web/types.ts +6 -1
- package/src/web/utils.ts +1 -0
- package/src/web/wasm/md4c.js +0 -0
- package/vendor-grammars.mjs +511 -0
- package/vendor-ratex.mjs +173 -0
- package/app.plugin.js +0 -2
- package/plugin/build/withAndroidMath.js +0 -19
- package/plugin/build/withIosMath.js +0 -28
- package/plugin/build/withReactNativeEnrichedMarkdown.js +0 -11
- package/plugin/src/withAndroidMath.ts +0 -24
- package/plugin/src/withIosMath.ts +0 -35
- package/plugin/src/withReactNativeEnrichedMarkdown.ts +0 -17
- package/plugin/tsconfig.build.json +0 -16
|
@@ -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) {
|
|
@@ -53,6 +55,8 @@
|
|
|
53
55
|
for (MarkdownASTNode *child in node.children) {
|
|
54
56
|
if (child.content.length > 0) {
|
|
55
57
|
[buffer appendString:child.content];
|
|
58
|
+
} else if (child.type == MarkdownNodeTypeSoftBreak || child.type == MarkdownNodeTypeLineBreak) {
|
|
59
|
+
[buffer appendString:@" "];
|
|
56
60
|
}
|
|
57
61
|
}
|
|
58
62
|
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];
|
|
@@ -9,7 +9,9 @@
|
|
|
9
9
|
|
|
10
10
|
#pragma mark - Rendering
|
|
11
11
|
|
|
12
|
-
- (void)
|
|
12
|
+
- (void)renderNodeContent:(MarkdownASTNode *)node
|
|
13
|
+
into:(NSMutableAttributedString *)output
|
|
14
|
+
context:(RenderContext *)context
|
|
13
15
|
{
|
|
14
16
|
NSUInteger start = output.length;
|
|
15
17
|
|
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
#import "BaseRenderer.h"
|
|
2
|
+
#import "RenderContext.h"
|
|
2
3
|
|
|
3
4
|
extern NSString *const ListDepthAttribute;
|
|
4
5
|
extern NSString *const ListTypeAttribute;
|
|
5
6
|
extern NSString *const ListItemNumberAttribute;
|
|
7
|
+
extern NSString *const ListItemMarkerStartAttribute;
|
|
6
8
|
|
|
7
9
|
extern NSString *const TaskItemAttribute;
|
|
8
10
|
extern NSString *const TaskCheckedAttribute;
|
|
9
11
|
extern NSString *const TaskIndexAttribute;
|
|
10
12
|
|
|
11
|
-
@interface
|
|
13
|
+
@interface ENRMListMarkerDescriptor : NSObject
|
|
14
|
+
@property (nonatomic, assign) BOOL isTask;
|
|
15
|
+
@property (nonatomic, assign) BOOL isChecked;
|
|
16
|
+
@property (nonatomic, assign) NSInteger taskIndex;
|
|
17
|
+
@property (nonatomic, assign) ListType listType;
|
|
18
|
+
@property (nonatomic, assign) NSInteger number;
|
|
19
|
+
@property (nonatomic, assign) NSInteger depth;
|
|
20
|
+
@property (nonatomic, assign) CGFloat indent;
|
|
21
|
+
@end
|
|
22
|
+
|
|
23
|
+
@interface ListItemRenderer : BaseRenderer
|
|
12
24
|
@end
|