react-native-enriched-markdown-scaffold 0.7.4-scaffold.8 → 1.0.2-scaffold.1
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 +191 -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 +27 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerInterface.java +9 -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 +40 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +839 -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 +175 -11
- 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 +62 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +911 -460
- 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/BlockSyntaxSentinel.kt +69 -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 +180 -27
- 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 +7 -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 +33 -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 +19 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +388 -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 +32 -5
- 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 +2 -0
- 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 +231 -8
- package/docs/BREAKING_CHANGES.md +129 -0
- package/docs/CODE_HIGHLIGHT.md +133 -0
- package/docs/COPY_OPTIONS.md +21 -3
- package/docs/ELEMENTS_STRUCTURE.md +52 -4
- package/docs/IMAGE_CACHING.md +30 -0
- package/docs/INPUT.md +146 -5
- 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 +262 -67
- package/ios/EnrichedMarkdownText.h +7 -0
- package/ios/EnrichedMarkdownText.mm +97 -68
- 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 +40 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +839 -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/ENRMBlockSyntaxSentinel.h +25 -0
- package/ios/input/ENRMBlockSyntaxSentinel.mm +80 -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 +10 -6
- package/ios/input/ENRMInputParser.mm +527 -171
- 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 +1104 -1024
- 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/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.m +22 -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/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 +46 -0
- package/ios/views/ENRMCodeBlockContainerView.m +566 -0
- package/ios/views/ENRMMathContainerView.h +12 -0
- package/ios/views/ENRMMathContainerView.m +71 -1
- package/ios/views/TableContainerView.h +18 -0
- package/ios/views/TableContainerView.m +259 -159
- package/jest.d.ts +1 -0
- package/jest.js +5 -0
- package/lib/module/EnrichedMarkdownNativeComponent.ts +65 -0
- package/lib/module/EnrichedMarkdownTextInput.js +86 -5
- package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
- package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +89 -5
- package/lib/module/EnrichedMarkdownTextNativeComponent.ts +66 -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 +30 -4
- 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 +62 -0
- package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +95 -9
- package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +80 -5
- package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +62 -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 +65 -1
- 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 +65 -0
- package/src/EnrichedMarkdownTextInput.tsx +162 -8
- package/src/EnrichedMarkdownTextInputNativeComponent.ts +89 -5
- package/src/EnrichedMarkdownTextNativeComponent.ts +66 -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 +40 -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 +65 -0
- 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
|
@@ -30,26 +30,32 @@ static inline void ENRMDetachLayoutManager(ENRMPlatformTextView *textView)
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
/// Turns a raw TextKit layout pass into the final measured size. Shared by
|
|
34
|
+
/// the view-backed path (`ENRMMeasureMarkdownText`) and the view-free path
|
|
35
|
+
/// (`ENRMMeasureMarkdownViewFree`) so both measure with one algorithm.
|
|
36
|
+
///
|
|
37
|
+
/// Steps, in order:
|
|
38
|
+
/// - Multiline pin: if the first line fragment doesn't span all glyphs the
|
|
39
|
+
/// text wrapped, and returning the tight usedRect width would let flexShrink
|
|
40
|
+
/// narrow the view below maxWidth, re-wrapping at the narrower width and
|
|
41
|
+
/// mismatching the measured height — so multiline content reports maxWidth,
|
|
42
|
+
/// while single-line content keeps its tight width for shrink-to-fit.
|
|
43
|
+
/// - Subtract the extra line fragment (iOS counts a trailing newline's empty
|
|
44
|
+
/// line fragment into usedRect).
|
|
45
|
+
/// - Add code-block padding when the last element is a code block, and the
|
|
46
|
+
/// trailing margin when enabled.
|
|
47
|
+
/// - Round up to the pixel grid of `scale` (pass `RCTScreenScale()` on main;
|
|
48
|
+
/// off-main callers must pass `LayoutContext::pointScaleFactor` instead —
|
|
49
|
+
/// `RCTScreenScale()` dispatch_syncs to main on first use, which the
|
|
50
|
+
/// measure path must never do, see issue #550).
|
|
51
|
+
static inline CGSize ENRMFinalizeMeasuredTextSize(ENRMTextLayoutResult layout, NSLayoutManager *layoutManager,
|
|
52
|
+
NSAttributedString *text, CGFloat maxWidth, StyleConfig *config,
|
|
53
|
+
BOOL allowTrailingMargin, CGFloat lastElementMarginBottom,
|
|
54
|
+
CGFloat scale)
|
|
35
55
|
{
|
|
36
|
-
NSAttributedString *text = ENRMGetAttributedText(textView);
|
|
37
|
-
if (text.length == 0) {
|
|
38
|
-
return CGSizeZero;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
ENRMTextLayoutResult layout = ENRMMeasureTextLayout(textView, maxWidth);
|
|
42
|
-
|
|
43
56
|
CGFloat measuredWidth = layout.usedRect.size.width;
|
|
44
57
|
CGFloat measuredHeight = layout.usedRect.size.height;
|
|
45
58
|
|
|
46
|
-
// Detect multiline content by checking if the layout produced more than one
|
|
47
|
-
// line fragment. When text wraps, returning the tight usedRect width lets
|
|
48
|
-
// flexShrink narrow the view below maxWidth, causing re-wrap at the narrower
|
|
49
|
-
// width and a height mismatch. Pin to maxWidth for multiline content so Yoga
|
|
50
|
-
// assigns the width the text was actually measured at. Single-line content
|
|
51
|
-
// keeps its tight width for shrink-to-fit behavior.
|
|
52
|
-
NSLayoutManager *layoutManager = textView.layoutManager;
|
|
53
59
|
NSUInteger glyphCount = [layoutManager numberOfGlyphs];
|
|
54
60
|
if (glyphCount > 0) {
|
|
55
61
|
NSRange firstLineRange;
|
|
@@ -71,8 +77,20 @@ static inline CGSize ENRMMeasureMarkdownText(ENRMPlatformTextView *textView, CGF
|
|
|
71
77
|
measuredHeight += lastElementMarginBottom;
|
|
72
78
|
}
|
|
73
79
|
|
|
74
|
-
CGFloat scale = RCTScreenScale();
|
|
75
80
|
return CGSizeMake(ceil(measuredWidth * scale) / scale, ceil(measuredHeight * scale) / scale);
|
|
76
81
|
}
|
|
77
82
|
|
|
83
|
+
static inline CGSize ENRMMeasureMarkdownText(ENRMPlatformTextView *textView, CGFloat maxWidth, StyleConfig *config,
|
|
84
|
+
BOOL allowTrailingMargin, CGFloat lastElementMarginBottom)
|
|
85
|
+
{
|
|
86
|
+
NSAttributedString *text = ENRMGetAttributedText(textView);
|
|
87
|
+
if (text.length == 0) {
|
|
88
|
+
return CGSizeZero;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
ENRMTextLayoutResult layout = ENRMMeasureTextLayout(textView, maxWidth);
|
|
92
|
+
return ENRMFinalizeMeasuredTextSize(layout, textView.layoutManager, text, maxWidth, config, allowTrailingMargin,
|
|
93
|
+
lastElementMarginBottom, RCTScreenScale());
|
|
94
|
+
}
|
|
95
|
+
|
|
78
96
|
NS_ASSUME_NONNULL_END
|
|
@@ -47,13 +47,34 @@ static UIAction *_Nullable createCopyImageURLAction(NSArray<NSString *> *imageUR
|
|
|
47
47
|
handler:^(__kindof UIAction *action) { copyStringToPasteboard(urlsToCopy); }];
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
/// Rebuilds the standard-edit menu with the system Copy swapped for the enhanced
|
|
51
|
+
/// copy action. All other system items are kept — dropping them would remove
|
|
52
|
+
/// Select All, which on iOS 16+ is the only way to start a selection from the
|
|
53
|
+
/// long-press menu of a non-editable text view.
|
|
50
54
|
static UIMenu *createEnhancedStandardEditMenu(UIMenu *originalMenu, UIAction *copyAction)
|
|
51
55
|
{
|
|
56
|
+
NSMutableArray<UIMenuElement *> *children = [NSMutableArray arrayWithCapacity:originalMenu.children.count];
|
|
57
|
+
BOOL replacedCopy = NO;
|
|
58
|
+
|
|
59
|
+
for (UIMenuElement *element in originalMenu.children) {
|
|
60
|
+
if (!replacedCopy && [element isKindOfClass:[UICommand class]] &&
|
|
61
|
+
((UICommand *)element).action == @selector(copy:)) {
|
|
62
|
+
[children addObject:copyAction];
|
|
63
|
+
replacedCopy = YES;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
[children addObject:element];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (!replacedCopy) {
|
|
70
|
+
[children insertObject:copyAction atIndex:0];
|
|
71
|
+
}
|
|
72
|
+
|
|
52
73
|
return [UIMenu menuWithTitle:originalMenu.title
|
|
53
74
|
image:originalMenu.image
|
|
54
75
|
identifier:originalMenu.identifier
|
|
55
76
|
options:originalMenu.options
|
|
56
|
-
children
|
|
77
|
+
children:children];
|
|
57
78
|
}
|
|
58
79
|
|
|
59
80
|
static void addOptionalAction(NSMutableArray<UIMenuElement *> *array, UIAction *_Nullable action)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#import <Foundation/Foundation.h>
|
|
4
|
+
|
|
5
|
+
#ifdef __cplusplus
|
|
6
|
+
#include <vector>
|
|
7
|
+
|
|
8
|
+
template <typename T>
|
|
9
|
+
static bool ENRMImageRequestHeadersChanged(const std::vector<T> &oldHeaders, const std::vector<T> &newHeaders)
|
|
10
|
+
{
|
|
11
|
+
if (newHeaders.size() != oldHeaders.size()) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
for (size_t i = 0; i < newHeaders.size(); i++) {
|
|
15
|
+
if (newHeaders[i].name != oldHeaders[i].name || newHeaders[i].value != oldHeaders[i].value) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
template <typename T>
|
|
23
|
+
static NSDictionary<NSString *, NSString *> *_Nullable ENRMImageRequestHeadersFromProps(const std::vector<T> &headers)
|
|
24
|
+
{
|
|
25
|
+
if (headers.empty()) {
|
|
26
|
+
return nil;
|
|
27
|
+
}
|
|
28
|
+
NSMutableDictionary<NSString *, NSString *> *result = [NSMutableDictionary dictionaryWithCapacity:headers.size()];
|
|
29
|
+
for (const auto &header : headers) {
|
|
30
|
+
result[@(header.name.c_str())] = @(header.value.c_str());
|
|
31
|
+
}
|
|
32
|
+
return [result copy];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
#endif
|
|
@@ -5,11 +5,7 @@
|
|
|
5
5
|
#import "RenderContext.h"
|
|
6
6
|
#import "StyleConfig.h"
|
|
7
7
|
|
|
8
|
-
extern NSString *const
|
|
9
|
-
extern NSString *const ListTypeAttribute;
|
|
10
|
-
extern NSString *const ListItemNumberAttribute;
|
|
11
|
-
extern NSString *const TaskItemAttribute;
|
|
12
|
-
extern NSString *const TaskCheckedAttribute;
|
|
8
|
+
extern NSString *const ListItemMarkerStartAttribute;
|
|
13
9
|
|
|
14
10
|
@implementation ListMarkerDrawer {
|
|
15
11
|
StyleConfig *_config;
|
|
@@ -44,13 +40,13 @@ extern NSString *const TaskCheckedAttribute;
|
|
|
44
40
|
if (charRange.location == NSNotFound)
|
|
45
41
|
return;
|
|
46
42
|
|
|
47
|
-
// 1. Fetch all attributes at once for efficiency
|
|
48
43
|
NSDictionary *attrs = [storage attributesAtIndex:charRange.location
|
|
49
44
|
effectiveRange:NULL];
|
|
50
|
-
|
|
45
|
+
NSArray *markers = attrs[ListItemMarkerStartAttribute];
|
|
46
|
+
if (![markers isKindOfClass:[NSArray class]] || markers.count == 0)
|
|
51
47
|
return;
|
|
52
48
|
|
|
53
|
-
//
|
|
49
|
+
// Identify the start of the paragraph
|
|
54
50
|
NSRange paraRange = [storage.string paragraphRangeForRange:charRange];
|
|
55
51
|
if (charRange.location != paraRange.location ||
|
|
56
52
|
[drawnParagraphs containsObject:@(paraRange.location)])
|
|
@@ -61,30 +57,28 @@ extern NSString *const TaskCheckedAttribute;
|
|
|
61
57
|
|
|
62
58
|
CGPoint glyphLoc = [layoutManager locationForGlyphAtIndex:glyphRange.location];
|
|
63
59
|
CGFloat baselineY = origin.y + rect.origin.y + glyphLoc.y;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
centerY:baselineY - (font.capHeight /
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
} else {
|
|
87
|
-
[self drawOrderedMarkerAtX:markerX attrs:attrs baselineY:baselineY isRTL:isRTL];
|
|
60
|
+
UIFont *font = attrs[NSFontAttributeName] ?: [self defaultFont];
|
|
61
|
+
|
|
62
|
+
for (ENRMListMarkerDescriptor *marker in markers) {
|
|
63
|
+
CGFloat markerX = isRTL ? origin.x + container.size.width - marker.indent + gap
|
|
64
|
+
: origin.x + marker.indent - gap;
|
|
65
|
+
|
|
66
|
+
if (marker.isTask) {
|
|
67
|
+
const CGFloat size = [_config taskListCheckboxSize];
|
|
68
|
+
CGFloat checkboxX = isRTL ? markerX + size / 2.0 : markerX - size / 2.0;
|
|
69
|
+
[self drawCheckboxAtX:checkboxX
|
|
70
|
+
centerY:baselineY - (font.capHeight / 2.0)
|
|
71
|
+
checked:marker.isChecked];
|
|
72
|
+
} else if (marker.listType == ListTypeUnordered) {
|
|
73
|
+
[self drawBulletAtX:markerX
|
|
74
|
+
centerY:baselineY - (font.xHeight + font.capHeight) / 4.0
|
|
75
|
+
depth:marker.depth];
|
|
76
|
+
} else {
|
|
77
|
+
[self drawOrderedMarkerAtX:markerX
|
|
78
|
+
number:marker.number
|
|
79
|
+
baselineY:baselineY
|
|
80
|
+
isRTL:isRTL];
|
|
81
|
+
}
|
|
88
82
|
}
|
|
89
83
|
}];
|
|
90
84
|
}
|
|
@@ -167,17 +161,10 @@ extern NSString *const TaskCheckedAttribute;
|
|
|
167
161
|
y:y];
|
|
168
162
|
}
|
|
169
163
|
|
|
170
|
-
- (void)drawOrderedMarkerAtX:(CGFloat)boundaryX
|
|
171
|
-
attrs:(NSDictionary *)attrs
|
|
172
|
-
baselineY:(CGFloat)baselineY
|
|
173
|
-
isRTL:(BOOL)isRTL
|
|
164
|
+
- (void)drawOrderedMarkerAtX:(CGFloat)boundaryX number:(NSInteger)number baselineY:(CGFloat)baselineY isRTL:(BOOL)isRTL
|
|
174
165
|
{
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
return;
|
|
178
|
-
|
|
179
|
-
NSString *text = isRTL ? [NSString stringWithFormat:@".%ld", (long)num.integerValue]
|
|
180
|
-
: [NSString stringWithFormat:@"%ld.", (long)num.integerValue];
|
|
166
|
+
NSString *text =
|
|
167
|
+
isRTL ? [NSString stringWithFormat:@".%ld", (long)number] : [NSString stringWithFormat:@"%ld.", (long)number];
|
|
181
168
|
UIFont *font = [_config listMarkerFont] ?: [self defaultFont];
|
|
182
169
|
|
|
183
170
|
NSDictionary *mAttrs = @{NSFontAttributeName : font, NSForegroundColorAttributeName : [_config listStyleMarkerColor]};
|
|
@@ -45,6 +45,11 @@ NSUInteger applyBlockSpacingBefore(NSMutableAttributedString *output, NSUInteger
|
|
|
45
45
|
void applyBlockSpacingAfter(NSMutableAttributedString *output, CGFloat marginBottom);
|
|
46
46
|
void applyLineHeight(NSMutableAttributedString *output, NSRange range, CGFloat lineHeight);
|
|
47
47
|
void applyBaselineOffset(NSMutableAttributedString *output, NSRange range);
|
|
48
|
+
|
|
49
|
+
/// True when the range contains a block (non-inline) image attachment. Lines holding
|
|
50
|
+
/// such attachments must not be clamped by maximumLineHeight or the image box
|
|
51
|
+
/// overflows the line and paints over surrounding content.
|
|
52
|
+
BOOL ENRMRangeContainsBlockImage(NSAttributedString *output, NSRange range);
|
|
48
53
|
void applyTextAlignment(NSMutableAttributedString *output, NSRange range, NSTextAlignment textAlign);
|
|
49
54
|
NSTextAlignment textAlignmentFromString(NSString *textAlign);
|
|
50
55
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#import "ParagraphStyleUtils.h"
|
|
2
2
|
#import "ENRMFeatureFlags.h"
|
|
3
|
+
#import "ENRMImageAttachment.h"
|
|
3
4
|
#import "LastElementUtils.h"
|
|
4
5
|
#import <React/RCTI18nUtil.h>
|
|
5
6
|
|
|
@@ -246,6 +247,21 @@ void applyBlockSpacingAfter(NSMutableAttributedString *output, CGFloat marginBot
|
|
|
246
247
|
[output addAttribute:NSParagraphStyleAttributeName value:spacerStyle range:NSMakeRange(spacerLocation, 1)];
|
|
247
248
|
}
|
|
248
249
|
|
|
250
|
+
BOOL ENRMRangeContainsBlockImage(NSAttributedString *output, NSRange range)
|
|
251
|
+
{
|
|
252
|
+
__block BOOL found = NO;
|
|
253
|
+
[output enumerateAttribute:NSAttachmentAttributeName
|
|
254
|
+
inRange:range
|
|
255
|
+
options:0
|
|
256
|
+
usingBlock:^(id value, __unused NSRange attrRange, BOOL *stop) {
|
|
257
|
+
if ([value isKindOfClass:[ENRMImageAttachment class]] && !((ENRMImageAttachment *)value).isInline) {
|
|
258
|
+
found = YES;
|
|
259
|
+
*stop = YES;
|
|
260
|
+
}
|
|
261
|
+
}];
|
|
262
|
+
return found;
|
|
263
|
+
}
|
|
264
|
+
|
|
249
265
|
void applyLineHeight(NSMutableAttributedString *output, NSRange range, CGFloat lineHeight)
|
|
250
266
|
{
|
|
251
267
|
if (lineHeight <= 0) {
|
|
@@ -266,10 +282,12 @@ void applyLineHeight(NSMutableAttributedString *output, NSRange range, CGFloat l
|
|
|
266
282
|
}];
|
|
267
283
|
#endif
|
|
268
284
|
|
|
285
|
+
BOOL hasBlockImage = ENRMRangeContainsBlockImage(output, range);
|
|
286
|
+
|
|
269
287
|
NSMutableParagraphStyle *style = getOrCreateParagraphStyle(output, range.location);
|
|
270
288
|
|
|
271
289
|
style.minimumLineHeight = lineHeight;
|
|
272
|
-
style.maximumLineHeight = hasMath ? 0 : lineHeight;
|
|
290
|
+
style.maximumLineHeight = (hasMath || hasBlockImage) ? 0 : lineHeight;
|
|
273
291
|
|
|
274
292
|
[output addAttribute:NSParagraphStyleAttributeName value:style range:range];
|
|
275
293
|
}
|
|
@@ -284,7 +302,8 @@ void applyBaselineOffset(NSMutableAttributedString *output, NSRange range)
|
|
|
284
302
|
return;
|
|
285
303
|
}
|
|
286
304
|
|
|
287
|
-
|
|
305
|
+
// Math paragraphs leave maximumLineHeight at 0, so fall back to minimumLineHeight.
|
|
306
|
+
__block CGFloat targetLineHeight = 0;
|
|
288
307
|
[output enumerateAttribute:NSParagraphStyleAttributeName
|
|
289
308
|
inRange:range
|
|
290
309
|
options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
|
|
@@ -292,29 +311,59 @@ void applyBaselineOffset(NSMutableAttributedString *output, NSRange range)
|
|
|
292
311
|
if (!paragraphStyle) {
|
|
293
312
|
return;
|
|
294
313
|
}
|
|
295
|
-
|
|
314
|
+
CGFloat clamp = MAX(paragraphStyle.maximumLineHeight, paragraphStyle.minimumLineHeight);
|
|
315
|
+
targetLineHeight = MAX(clamp, targetLineHeight);
|
|
296
316
|
}];
|
|
297
317
|
|
|
298
|
-
if (
|
|
318
|
+
if (targetLineHeight <= 0) {
|
|
299
319
|
return;
|
|
300
320
|
}
|
|
301
321
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
322
|
+
// Center on real text; on a math-only line center the math box instead of its font.
|
|
323
|
+
__block CGFloat textLineHeight = 0;
|
|
324
|
+
#if ENRICHED_MARKDOWN_MATH
|
|
325
|
+
__block BOOL hasMath = NO;
|
|
326
|
+
#endif
|
|
327
|
+
[output enumerateAttributesInRange:range
|
|
328
|
+
options:0
|
|
329
|
+
usingBlock:^(NSDictionary<NSAttributedStringKey, id> *attrs, __unused NSRange subrange,
|
|
330
|
+
__unused BOOL *stop) {
|
|
331
|
+
#if ENRICHED_MARKDOWN_MATH
|
|
332
|
+
if ([attrs[NSAttachmentAttributeName] isKindOfClass:[ENRMMathInlineAttachment class]]) {
|
|
333
|
+
hasMath = YES;
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
#endif
|
|
337
|
+
UIFont *font = attrs[NSFontAttributeName];
|
|
338
|
+
if (font) {
|
|
339
|
+
textLineHeight = MAX(UIFontLineHeight(font), textLineHeight);
|
|
340
|
+
}
|
|
341
|
+
}];
|
|
342
|
+
|
|
343
|
+
CGFloat contentLineHeight = textLineHeight;
|
|
344
|
+
|
|
345
|
+
#if ENRICHED_MARKDOWN_MATH
|
|
346
|
+
// Math only grows the content height, so measure it (parsing LaTeX) only when text
|
|
347
|
+
// alone wouldn't already fill the line.
|
|
348
|
+
if (hasMath && targetLineHeight > textLineHeight) {
|
|
349
|
+
__block CGFloat mathBoxHeight = 0;
|
|
350
|
+
[output enumerateAttribute:NSAttachmentAttributeName
|
|
351
|
+
inRange:range
|
|
352
|
+
options:0
|
|
353
|
+
usingBlock:^(id value, __unused NSRange subrange, __unused BOOL *stop) {
|
|
354
|
+
if ([value isKindOfClass:[ENRMMathInlineAttachment class]]) {
|
|
355
|
+
mathBoxHeight = MAX(((ENRMMathInlineAttachment *)value).boxHeight, mathBoxHeight);
|
|
356
|
+
}
|
|
357
|
+
}];
|
|
358
|
+
contentLineHeight = MAX(textLineHeight, mathBoxHeight);
|
|
359
|
+
}
|
|
360
|
+
#endif
|
|
312
361
|
|
|
313
|
-
if (
|
|
362
|
+
if (contentLineHeight <= 0 || targetLineHeight <= contentLineHeight) {
|
|
314
363
|
return;
|
|
315
364
|
}
|
|
316
365
|
|
|
317
|
-
CGFloat baseLineOffset = (
|
|
366
|
+
CGFloat baseLineOffset = (targetLineHeight - contentLineHeight) / 2.0;
|
|
318
367
|
|
|
319
368
|
[output enumerateAttribute:NSBaselineOffsetAttributeName
|
|
320
369
|
inRange:range
|
|
@@ -323,7 +372,18 @@ void applyBaselineOffset(NSMutableAttributedString *output, NSRange range)
|
|
|
323
372
|
if (existingOffset != nil) {
|
|
324
373
|
return;
|
|
325
374
|
}
|
|
326
|
-
[output
|
|
375
|
+
[output enumerateAttribute:NSAttachmentAttributeName
|
|
376
|
+
inRange:subrange
|
|
377
|
+
options:0
|
|
378
|
+
usingBlock:^(id attachment, NSRange attachmentRange, BOOL *innerStop) {
|
|
379
|
+
if ([attachment isKindOfClass:[ENRMImageAttachment class]] &&
|
|
380
|
+
!((ENRMImageAttachment *)attachment).isInline) {
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
[output addAttribute:NSBaselineOffsetAttributeName
|
|
384
|
+
value:@(baseLineOffset)
|
|
385
|
+
range:attachmentRange];
|
|
386
|
+
}];
|
|
327
387
|
}];
|
|
328
388
|
}
|
|
329
389
|
|
|
@@ -7,7 +7,12 @@
|
|
|
7
7
|
|
|
8
8
|
NS_ASSUME_NONNULL_BEGIN
|
|
9
9
|
|
|
10
|
-
typedef NS_ENUM(NSInteger, ENRMSegmentKind) {
|
|
10
|
+
typedef NS_ENUM(NSInteger, ENRMSegmentKind) {
|
|
11
|
+
ENRMSegmentKindText,
|
|
12
|
+
ENRMSegmentKindTable,
|
|
13
|
+
ENRMSegmentKindMath,
|
|
14
|
+
ENRMSegmentKindCodeBlock
|
|
15
|
+
};
|
|
11
16
|
|
|
12
17
|
@interface ENRMTextSegment : NSObject
|
|
13
18
|
@property (nonatomic, strong) NSArray<MarkdownASTNode *> *nodes;
|
|
@@ -24,15 +29,22 @@ typedef NS_ENUM(NSInteger, ENRMSegmentKind) { ENRMSegmentKindText, ENRMSegmentKi
|
|
|
24
29
|
+ (instancetype)segmentWithLatex:(NSString *)latex;
|
|
25
30
|
@end
|
|
26
31
|
|
|
32
|
+
@interface ENRMCodeBlockSegment : NSObject
|
|
33
|
+
@property (nonatomic, strong) MarkdownASTNode *codeBlockNode;
|
|
34
|
+
+ (instancetype)segmentWithCodeBlockNode:(MarkdownASTNode *)node;
|
|
35
|
+
@end
|
|
36
|
+
|
|
27
37
|
@interface ENRMRenderedSegment : NSObject
|
|
28
38
|
@property (nonatomic, assign) ENRMSegmentKind kind;
|
|
29
39
|
@property (nonatomic, assign) uint64_t signature;
|
|
30
40
|
@property (nonatomic, strong, nullable) ENRMRenderResult *textResult;
|
|
31
41
|
@property (nonatomic, strong, nullable) ENRMTableSegment *tableSegment;
|
|
32
42
|
@property (nonatomic, strong, nullable) ENRMMathSegment *mathSegment;
|
|
43
|
+
@property (nonatomic, strong, nullable) ENRMCodeBlockSegment *codeBlockSegment;
|
|
33
44
|
+ (instancetype)textSegmentWithResult:(ENRMRenderResult *)result signature:(uint64_t)signature;
|
|
34
45
|
+ (instancetype)tableSegmentWithSegment:(ENRMTableSegment *)segment signature:(uint64_t)signature;
|
|
35
46
|
+ (instancetype)mathSegmentWithSegment:(ENRMMathSegment *)segment signature:(uint64_t)signature;
|
|
47
|
+
+ (instancetype)codeBlockSegmentWithSegment:(ENRMCodeBlockSegment *)segment signature:(uint64_t)signature;
|
|
36
48
|
@end
|
|
37
49
|
|
|
38
50
|
#ifdef __cplusplus
|
|
@@ -31,6 +31,16 @@
|
|
|
31
31
|
}
|
|
32
32
|
@end
|
|
33
33
|
|
|
34
|
+
@implementation ENRMCodeBlockSegment
|
|
35
|
+
+ (instancetype)segmentWithCodeBlockNode:(MarkdownASTNode *)node
|
|
36
|
+
{
|
|
37
|
+
NSParameterAssert(node != nil);
|
|
38
|
+
ENRMCodeBlockSegment *segment = [[ENRMCodeBlockSegment alloc] init];
|
|
39
|
+
segment.codeBlockNode = node;
|
|
40
|
+
return segment;
|
|
41
|
+
}
|
|
42
|
+
@end
|
|
43
|
+
|
|
34
44
|
@implementation ENRMRenderedSegment
|
|
35
45
|
+ (instancetype)textSegmentWithResult:(ENRMRenderResult *)result signature:(uint64_t)signature
|
|
36
46
|
{
|
|
@@ -61,6 +71,16 @@
|
|
|
61
71
|
segment.signature = signature;
|
|
62
72
|
return segment;
|
|
63
73
|
}
|
|
74
|
+
|
|
75
|
+
+ (instancetype)codeBlockSegmentWithSegment:(ENRMCodeBlockSegment *)codeBlockSegment signature:(uint64_t)signature
|
|
76
|
+
{
|
|
77
|
+
NSParameterAssert(codeBlockSegment != nil);
|
|
78
|
+
ENRMRenderedSegment *segment = [[ENRMRenderedSegment alloc] init];
|
|
79
|
+
segment.kind = ENRMSegmentKindCodeBlock;
|
|
80
|
+
segment.codeBlockSegment = codeBlockSegment;
|
|
81
|
+
segment.signature = signature;
|
|
82
|
+
return segment;
|
|
83
|
+
}
|
|
64
84
|
@end
|
|
65
85
|
|
|
66
86
|
// FNV-1a 64-bit hash for segment signatures. Collisions are theoretically
|
|
@@ -33,7 +33,13 @@ static NSArray *ENRMSplitASTIntoSegments(MarkdownASTNode *root)
|
|
|
33
33
|
#endif
|
|
34
34
|
}
|
|
35
35
|
#endif
|
|
36
|
-
else {
|
|
36
|
+
else if (child.type == MarkdownNodeTypeCodeBlock) {
|
|
37
|
+
if (currentTextNodes.count > 0) {
|
|
38
|
+
[segments addObject:[ENRMTextSegment segmentWithNodes:[currentTextNodes copy]]];
|
|
39
|
+
[currentTextNodes removeAllObjects];
|
|
40
|
+
}
|
|
41
|
+
[segments addObject:[ENRMCodeBlockSegment segmentWithCodeBlockNode:child]];
|
|
42
|
+
} else {
|
|
37
43
|
[currentTextNodes addObject:child];
|
|
38
44
|
}
|
|
39
45
|
}
|
|
@@ -53,9 +59,10 @@ NSArray<ENRMRenderedSegment *> *ENRMRenderSegmentsFromAST(MarkdownASTNode *ast,
|
|
|
53
59
|
NSArray *segments = ENRMSplitASTIntoSegments(ast);
|
|
54
60
|
NSMutableArray<ENRMRenderedSegment *> *renderedSegments = [NSMutableArray array];
|
|
55
61
|
|
|
56
|
-
static const uint64_t kTextKindSalt = 0x7465787400000000ULL;
|
|
57
|
-
static const uint64_t kTableKindSalt = 0x7461626C00000000ULL;
|
|
58
|
-
static const uint64_t kMathKindSalt = 0x6D61746800000000ULL;
|
|
62
|
+
static const uint64_t kTextKindSalt = 0x7465787400000000ULL; // "text"
|
|
63
|
+
static const uint64_t kTableKindSalt = 0x7461626C00000000ULL; // "tabl"
|
|
64
|
+
static const uint64_t kMathKindSalt = 0x6D61746800000000ULL; // "math"
|
|
65
|
+
static const uint64_t kCodeBlockKindSalt = 0x63626C6B00000000ULL; // "cblk"
|
|
59
66
|
|
|
60
67
|
for (id segment in segments) {
|
|
61
68
|
if ([segment isKindOfClass:[ENRMTextSegment class]]) {
|
|
@@ -82,6 +89,12 @@ NSArray<ENRMRenderedSegment *> *ENRMRenderSegmentsFromAST(MarkdownASTNode *ast,
|
|
|
82
89
|
[renderedSegments addObject:[ENRMRenderedSegment mathSegmentWithSegment:mathSegment signature:signature]];
|
|
83
90
|
}
|
|
84
91
|
#endif
|
|
92
|
+
else if ([segment isKindOfClass:[ENRMCodeBlockSegment class]]) {
|
|
93
|
+
ENRMCodeBlockSegment *codeBlockSegment = (ENRMCodeBlockSegment *)segment;
|
|
94
|
+
uint64_t signature = ENRMSignatureForNode(codeBlockSegment.codeBlockNode) ^ kCodeBlockKindSalt;
|
|
95
|
+
[renderedSegments addObject:[ENRMRenderedSegment codeBlockSegmentWithSegment:codeBlockSegment
|
|
96
|
+
signature:signature]];
|
|
97
|
+
}
|
|
85
98
|
}
|
|
86
99
|
|
|
87
100
|
return renderedSegments;
|
|
@@ -9,11 +9,21 @@ typedef NS_ENUM(NSInteger, ENRMTableStreamingMode) {
|
|
|
9
9
|
ENRMTableStreamingModeProgressive,
|
|
10
10
|
};
|
|
11
11
|
|
|
12
|
+
typedef NS_ENUM(NSInteger, ENRMCodeBlockStreamingMode) {
|
|
13
|
+
ENRMCodeBlockStreamingModeHidden = 0,
|
|
14
|
+
ENRMCodeBlockStreamingModeProgressive,
|
|
15
|
+
};
|
|
16
|
+
|
|
12
17
|
#ifdef __cplusplus
|
|
13
18
|
extern "C" {
|
|
14
19
|
#endif
|
|
15
20
|
|
|
16
|
-
|
|
21
|
+
// Filtered markdown for the current streaming tick. When non-NULL,
|
|
22
|
+
// outEndsInsideOpenCodeFence reports whether the result ends inside a still-open
|
|
23
|
+
// fenced code block (the trailing block whose chrome the renderer defers).
|
|
24
|
+
NSString *ENRMRenderableMarkdownForStreaming(NSString *markdown, ENRMTableStreamingMode tableMode,
|
|
25
|
+
ENRMCodeBlockStreamingMode codeBlockMode,
|
|
26
|
+
BOOL *_Nullable outEndsInsideOpenCodeFence);
|
|
17
27
|
|
|
18
28
|
#ifdef __cplusplus
|
|
19
29
|
}
|