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,118 +1,19 @@
|
|
|
1
1
|
#import "ENRMInputFormatter.h"
|
|
2
|
+
#import "ENRMBlockHandler.h"
|
|
2
3
|
#import "ENRMBoldStyleHandler.h"
|
|
4
|
+
#import "ENRMHeadingBlockHandler.h"
|
|
3
5
|
#import "ENRMItalicStyleHandler.h"
|
|
4
6
|
#import "ENRMLinkStyleHandler.h"
|
|
7
|
+
#import "ENRMOrderedListBlockHandler.h"
|
|
5
8
|
#import "ENRMSpoilerStyleHandler.h"
|
|
6
9
|
#import "ENRMStrikethroughStyleHandler.h"
|
|
7
10
|
#import "ENRMStyleHandler.h"
|
|
8
11
|
#import "ENRMUnderlineStyleHandler.h"
|
|
9
|
-
|
|
10
|
-
@implementation ENRMInputLinkVariantStyle
|
|
11
|
-
@end
|
|
12
|
-
|
|
13
|
-
@implementation ENRMInputFormatterStyle {
|
|
14
|
-
NSMutableDictionary<NSNumber *, UIFont *> *_fontCache;
|
|
15
|
-
UIFont *_lastBaseFont;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
- (instancetype)init
|
|
19
|
-
{
|
|
20
|
-
if (self = [super init]) {
|
|
21
|
-
_baseFont = [UIFont systemFontOfSize:16.0];
|
|
22
|
-
_baseTextColor = [RCTUIColor labelColor];
|
|
23
|
-
_linkVariants = @[];
|
|
24
|
-
_fontCache = [NSMutableDictionary dictionary];
|
|
25
|
-
_mathFontSize = 16.0;
|
|
26
|
-
_mathBlockFontSize = 20.0;
|
|
27
|
-
_mathBlockPaddingHorizontal = 12.0;
|
|
28
|
-
_mathBlockPaddingVertical = 8.0;
|
|
29
|
-
_mathBlockMarginTop = 8.0;
|
|
30
|
-
_mathBlockMarginBottom = 8.0;
|
|
31
|
-
_mathBlockAlignment = NSTextAlignmentCenter;
|
|
32
|
-
}
|
|
33
|
-
return self;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
- (id)copyWithZone:(NSZone *)zone
|
|
37
|
-
{
|
|
38
|
-
ENRMInputFormatterStyle *copy = [[ENRMInputFormatterStyle allocWithZone:zone] init];
|
|
39
|
-
copy.baseFont = _baseFont;
|
|
40
|
-
copy.baseTextColor = _baseTextColor;
|
|
41
|
-
copy.boldColor = _boldColor;
|
|
42
|
-
copy.italicColor = _italicColor;
|
|
43
|
-
copy.linkColor = _linkColor;
|
|
44
|
-
copy.linkUnderline = _linkUnderline;
|
|
45
|
-
copy.linkBackgroundColor = _linkBackgroundColor;
|
|
46
|
-
copy.linkVariants = [_linkVariants copy];
|
|
47
|
-
copy.spoilerColor = _spoilerColor;
|
|
48
|
-
copy.spoilerBackgroundColor = _spoilerBackgroundColor;
|
|
49
|
-
copy.mathColor = _mathColor;
|
|
50
|
-
copy.mathFontSize = _mathFontSize;
|
|
51
|
-
copy.mathBackgroundColor = _mathBackgroundColor;
|
|
52
|
-
copy.mathBorderColor = _mathBorderColor;
|
|
53
|
-
copy.mathBorderWidth = _mathBorderWidth;
|
|
54
|
-
copy.mathBorderRadius = _mathBorderRadius;
|
|
55
|
-
copy.mathPaddingHorizontal = _mathPaddingHorizontal;
|
|
56
|
-
copy.mathPaddingVertical = _mathPaddingVertical;
|
|
57
|
-
copy.mathSelectedBackgroundColor = _mathSelectedBackgroundColor;
|
|
58
|
-
copy.mathSelectedBorderColor = _mathSelectedBorderColor;
|
|
59
|
-
copy.mathFontWeight = _mathFontWeight;
|
|
60
|
-
copy.mathBlockColor = _mathBlockColor;
|
|
61
|
-
copy.mathBlockFontSize = _mathBlockFontSize;
|
|
62
|
-
copy.mathBlockBackgroundColor = _mathBlockBackgroundColor;
|
|
63
|
-
copy.mathBlockBorderColor = _mathBlockBorderColor;
|
|
64
|
-
copy.mathBlockBorderWidth = _mathBlockBorderWidth;
|
|
65
|
-
copy.mathBlockBorderRadius = _mathBlockBorderRadius;
|
|
66
|
-
copy.mathBlockPaddingHorizontal = _mathBlockPaddingHorizontal;
|
|
67
|
-
copy.mathBlockPaddingVertical = _mathBlockPaddingVertical;
|
|
68
|
-
copy.mathBlockSelectedBackgroundColor = _mathBlockSelectedBackgroundColor;
|
|
69
|
-
copy.mathBlockSelectedBorderColor = _mathBlockSelectedBorderColor;
|
|
70
|
-
copy.mathBlockMarginTop = _mathBlockMarginTop;
|
|
71
|
-
copy.mathBlockMarginBottom = _mathBlockMarginBottom;
|
|
72
|
-
copy.mathBlockAlignment = _mathBlockAlignment;
|
|
73
|
-
copy.mathBlockFontWeight = _mathBlockFontWeight;
|
|
74
|
-
return copy;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
- (void)invalidateCacheIfNeeded
|
|
78
|
-
{
|
|
79
|
-
if (_lastBaseFont != _baseFont) {
|
|
80
|
-
[_fontCache removeAllObjects];
|
|
81
|
-
_lastBaseFont = _baseFont;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
- (void)invalidateFontCache
|
|
86
|
-
{
|
|
87
|
-
[_fontCache removeAllObjects];
|
|
88
|
-
_lastBaseFont = nil;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
- (UIFont *)fontForTraits:(UIFontDescriptorSymbolicTraits)traits
|
|
92
|
-
{
|
|
93
|
-
[self invalidateCacheIfNeeded];
|
|
94
|
-
|
|
95
|
-
if (traits == 0) {
|
|
96
|
-
return _baseFont;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
NSNumber *key = @(traits);
|
|
100
|
-
UIFont *cached = _fontCache[key];
|
|
101
|
-
if (cached) {
|
|
102
|
-
return cached;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
UIFontDescriptor *descriptor =
|
|
106
|
-
[_baseFont.fontDescriptor fontDescriptorWithSymbolicTraits:_baseFont.fontDescriptor.symbolicTraits | traits];
|
|
107
|
-
UIFont *derived = descriptor ? [UIFont fontWithDescriptor:descriptor size:0] : _baseFont;
|
|
108
|
-
_fontCache[key] = derived;
|
|
109
|
-
return derived;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
@end
|
|
12
|
+
#import "ENRMUnorderedListBlockHandler.h"
|
|
113
13
|
|
|
114
14
|
@implementation ENRMInputFormatter {
|
|
115
15
|
NSDictionary<NSNumber *, id<ENRMStyleHandler>> *_styleHandlers;
|
|
16
|
+
NSDictionary<NSNumber *, id<ENRMBlockHandler>> *_blockHandlers;
|
|
116
17
|
}
|
|
117
18
|
|
|
118
19
|
- (instancetype)init
|
|
@@ -131,6 +32,15 @@
|
|
|
131
32
|
map[@(handler.styleType)] = handler;
|
|
132
33
|
}
|
|
133
34
|
_styleHandlers = [map copy];
|
|
35
|
+
|
|
36
|
+
ENRMHeadingBlockHandler *headingHandler = [[ENRMHeadingBlockHandler alloc] init];
|
|
37
|
+
NSMutableDictionary<NSNumber *, id<ENRMBlockHandler>> *blockMap = [NSMutableDictionary dictionary];
|
|
38
|
+
for (NSInteger level = 1; level <= 6; level++) {
|
|
39
|
+
blockMap[@(ENRMBlockTypeForHeadingLevel(level))] = headingHandler;
|
|
40
|
+
}
|
|
41
|
+
blockMap[@(ENRMInputBlockTypeUnorderedListItem)] = [[ENRMUnorderedListBlockHandler alloc] init];
|
|
42
|
+
blockMap[@(ENRMInputBlockTypeOrderedListItem)] = [[ENRMOrderedListBlockHandler alloc] init];
|
|
43
|
+
_blockHandlers = [blockMap copy];
|
|
134
44
|
}
|
|
135
45
|
return self;
|
|
136
46
|
}
|
|
@@ -140,9 +50,25 @@
|
|
|
140
50
|
return _styleHandlers[@(type)];
|
|
141
51
|
}
|
|
142
52
|
|
|
53
|
+
- (nullable id<ENRMBlockHandler>)handlerForBlockType:(ENRMInputBlockType)type
|
|
54
|
+
{
|
|
55
|
+
return _blockHandlers[@(type)];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
- (void)applyFormattingRanges:(NSArray<ENRMFormattingRange *> *)ranges
|
|
59
|
+
toTextView:(ENRMPlatformTextView *)textView
|
|
60
|
+
style:(ENRMInputFormatterStyle *)style
|
|
61
|
+
{
|
|
62
|
+
[self applyFormattingRanges:ranges
|
|
63
|
+
toTextView:textView
|
|
64
|
+
style:style
|
|
65
|
+
scopedToRange:NSMakeRange(0, textView.textStorage.length)];
|
|
66
|
+
}
|
|
67
|
+
|
|
143
68
|
- (void)applyFormattingRanges:(NSArray<ENRMFormattingRange *> *)ranges
|
|
144
69
|
toTextView:(ENRMPlatformTextView *)textView
|
|
145
70
|
style:(ENRMInputFormatterStyle *)style
|
|
71
|
+
scopedToRange:(NSRange)scope
|
|
146
72
|
{
|
|
147
73
|
NSTextStorage *textStorage = textView.textStorage;
|
|
148
74
|
NSUInteger textLength = textStorage.length;
|
|
@@ -151,18 +77,24 @@
|
|
|
151
77
|
return;
|
|
152
78
|
}
|
|
153
79
|
|
|
154
|
-
|
|
80
|
+
NSUInteger scopeStart = MIN(scope.location, textLength);
|
|
81
|
+
NSUInteger scopeEnd = MIN(NSMaxRange(scope), textLength);
|
|
82
|
+
if (scopeEnd <= scopeStart) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
NSRange scopeRange = NSMakeRange(scopeStart, scopeEnd - scopeStart);
|
|
86
|
+
NSUInteger scopeLength = scopeRange.length;
|
|
155
87
|
|
|
156
88
|
[textStorage beginEditing];
|
|
157
89
|
|
|
158
|
-
[textStorage addAttribute:NSFontAttributeName value:style.baseFont range:
|
|
159
|
-
[textStorage addAttribute:NSForegroundColorAttributeName value:style.baseTextColor range:
|
|
160
|
-
[textStorage removeAttribute:NSUnderlineStyleAttributeName range:
|
|
161
|
-
[textStorage removeAttribute:NSStrikethroughStyleAttributeName range:
|
|
162
|
-
[textStorage removeAttribute:NSBackgroundColorAttributeName range:
|
|
90
|
+
[textStorage addAttribute:NSFontAttributeName value:style.baseFont range:scopeRange];
|
|
91
|
+
[textStorage addAttribute:NSForegroundColorAttributeName value:style.baseTextColor range:scopeRange];
|
|
92
|
+
[textStorage removeAttribute:NSUnderlineStyleAttributeName range:scopeRange];
|
|
93
|
+
[textStorage removeAttribute:NSStrikethroughStyleAttributeName range:scopeRange];
|
|
94
|
+
[textStorage removeAttribute:NSBackgroundColorAttributeName range:scopeRange];
|
|
163
95
|
|
|
164
96
|
UIFontDescriptorSymbolicTraits *traitMap =
|
|
165
|
-
(UIFontDescriptorSymbolicTraits *)calloc(
|
|
97
|
+
(UIFontDescriptorSymbolicTraits *)calloc(scopeLength, sizeof(UIFontDescriptorSymbolicTraits));
|
|
166
98
|
if (!traitMap) {
|
|
167
99
|
[textStorage endEditing];
|
|
168
100
|
return;
|
|
@@ -173,6 +105,13 @@
|
|
|
173
105
|
continue;
|
|
174
106
|
}
|
|
175
107
|
|
|
108
|
+
// Ranges straddling the scope boundary are clipped: attributes are
|
|
109
|
+
// per-character and the out-of-scope part is untouched by the reset above.
|
|
110
|
+
NSRange clipped = NSIntersectionRange(formattingRange.range, scopeRange);
|
|
111
|
+
if (clipped.length == 0) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
|
|
176
115
|
id<ENRMStyleHandler> handler = _styleHandlers[@(formattingRange.type)];
|
|
177
116
|
if (!handler) {
|
|
178
117
|
continue;
|
|
@@ -180,31 +119,30 @@
|
|
|
180
119
|
|
|
181
120
|
UIFontDescriptorSymbolicTraits traits = [handler fontTraits];
|
|
182
121
|
if (traits != 0) {
|
|
183
|
-
NSUInteger start =
|
|
184
|
-
NSUInteger end = NSMaxRange(
|
|
122
|
+
NSUInteger start = clipped.location;
|
|
123
|
+
NSUInteger end = NSMaxRange(clipped);
|
|
185
124
|
for (NSUInteger i = start; i < end; i++) {
|
|
186
|
-
traitMap[i] |= traits;
|
|
125
|
+
traitMap[i - scopeStart] |= traits;
|
|
187
126
|
}
|
|
188
127
|
}
|
|
189
128
|
|
|
190
|
-
[handler applyNonFontAttributesToTextStorage:textStorage
|
|
191
|
-
range:formattingRange.range
|
|
192
|
-
formattingRange:formattingRange
|
|
193
|
-
style:style];
|
|
129
|
+
[handler applyNonFontAttributesToTextStorage:textStorage range:clipped formattingRange:formattingRange style:style];
|
|
194
130
|
}
|
|
195
131
|
|
|
196
132
|
NSUInteger runStart = 0;
|
|
197
133
|
UIFontDescriptorSymbolicTraits currentTraits = traitMap[0];
|
|
198
134
|
|
|
199
|
-
for (NSUInteger i = 1; i <=
|
|
200
|
-
UIFontDescriptorSymbolicTraits nextTraits = (i <
|
|
135
|
+
for (NSUInteger i = 1; i <= scopeLength; i++) {
|
|
136
|
+
UIFontDescriptorSymbolicTraits nextTraits = (i < scopeLength) ? traitMap[i] : ~currentTraits;
|
|
201
137
|
if (nextTraits != currentTraits) {
|
|
202
138
|
if (currentTraits != 0) {
|
|
203
139
|
UIFont *font = [style fontForTraits:currentTraits];
|
|
204
|
-
[textStorage addAttribute:NSFontAttributeName
|
|
140
|
+
[textStorage addAttribute:NSFontAttributeName
|
|
141
|
+
value:font
|
|
142
|
+
range:NSMakeRange(scopeStart + runStart, i - runStart)];
|
|
205
143
|
}
|
|
206
144
|
runStart = i;
|
|
207
|
-
currentTraits = (i <
|
|
145
|
+
currentTraits = (i < scopeLength) ? traitMap[i] : 0;
|
|
208
146
|
}
|
|
209
147
|
}
|
|
210
148
|
|
|
@@ -214,11 +152,165 @@
|
|
|
214
152
|
|
|
215
153
|
NSLayoutManager *layoutManager = textStorage.layoutManagers.firstObject;
|
|
216
154
|
if (layoutManager) {
|
|
217
|
-
[layoutManager invalidateLayoutForCharacterRange:
|
|
218
|
-
[layoutManager ensureLayoutForCharacterRange:
|
|
155
|
+
[layoutManager invalidateLayoutForCharacterRange:scopeRange actualCharacterRange:NULL];
|
|
156
|
+
[layoutManager ensureLayoutForCharacterRange:scopeRange];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
ENRMSetNeedsDisplay(textView);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
- (void)applyBlockRanges:(NSArray<ENRMBlockRange *> *)blockRanges
|
|
163
|
+
toTextView:(ENRMPlatformTextView *)textView
|
|
164
|
+
style:(ENRMInputFormatterStyle *)style
|
|
165
|
+
{
|
|
166
|
+
[self applyBlockRanges:blockRanges
|
|
167
|
+
toTextView:textView
|
|
168
|
+
style:style
|
|
169
|
+
scopedToRange:NSMakeRange(0, textView.textStorage.length)];
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
- (void)applyBlockRanges:(NSArray<ENRMBlockRange *> *)blockRanges
|
|
173
|
+
toTextView:(ENRMPlatformTextView *)textView
|
|
174
|
+
style:(ENRMInputFormatterStyle *)style
|
|
175
|
+
scopedToRange:(NSRange)scope
|
|
176
|
+
{
|
|
177
|
+
if (_blockHandlers.count == 0) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
NSTextStorage *textStorage = textView.textStorage;
|
|
182
|
+
NSUInteger textLength = textStorage.length;
|
|
183
|
+
if (textLength == 0) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
NSUInteger scopeStart = MIN(scope.location, textLength);
|
|
188
|
+
NSUInteger scopeEnd = MIN(NSMaxRange(scope), textLength);
|
|
189
|
+
if (scopeEnd <= scopeStart) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
NSRange scopeRange = NSMakeRange(scopeStart, scopeEnd - scopeStart);
|
|
193
|
+
|
|
194
|
+
[textStorage beginEditing];
|
|
195
|
+
|
|
196
|
+
// Reset pass: strip everything the previous block pass applied — paragraphs
|
|
197
|
+
// are found via the ENRMBlockTypeAttributeName marker — so a removed or moved
|
|
198
|
+
// block doesn't leave stale paragraph styling behind. Character-level
|
|
199
|
+
// attributes (fonts, colors) are already reset by the inline pass, which runs
|
|
200
|
+
// first. This runs even with zero current ranges: deleting the last block
|
|
201
|
+
// must still clear its styling.
|
|
202
|
+
NSMutableArray<NSValue *> *previouslyClaimedRanges = [NSMutableArray array];
|
|
203
|
+
[textStorage enumerateAttribute:ENRMBlockTypeAttributeName
|
|
204
|
+
inRange:scopeRange
|
|
205
|
+
options:0
|
|
206
|
+
usingBlock:^(id value, NSRange range, BOOL *stop) {
|
|
207
|
+
if (value != nil) {
|
|
208
|
+
[previouslyClaimedRanges addObject:[NSValue valueWithRange:range]];
|
|
209
|
+
}
|
|
210
|
+
}];
|
|
211
|
+
for (NSValue *rangeValue in previouslyClaimedRanges) {
|
|
212
|
+
NSRange range = rangeValue.rangeValue;
|
|
213
|
+
[textStorage removeAttribute:ENRMBlockTypeAttributeName range:range];
|
|
214
|
+
[textStorage removeAttribute:ENRMBlockLevelAttributeName range:range];
|
|
215
|
+
[textStorage removeAttribute:ENRMBlockOrdinalAttributeName range:range];
|
|
216
|
+
[textStorage removeAttribute:NSParagraphStyleAttributeName range:range];
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
for (ENRMBlockRange *blockRange in blockRanges) {
|
|
220
|
+
BOOL isHeadingAnchor = blockRange.range.length == 0 && ENRMHeadingLevelForBlockType(blockRange.type) > 0;
|
|
221
|
+
|
|
222
|
+
if (!isHeadingAnchor && (blockRange.range.length == 0 || NSMaxRange(blockRange.range) > textLength)) {
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if (isHeadingAnchor && blockRange.range.location > textLength) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Scope check: normal blocks are line-scoped and either fully inside or
|
|
230
|
+
// outside; a zero-length heading anchor is in-scope when its point falls
|
|
231
|
+
// within [scopeStart, scopeEnd] inclusive.
|
|
232
|
+
if (isHeadingAnchor) {
|
|
233
|
+
if (blockRange.range.location < scopeRange.location || blockRange.range.location > NSMaxRange(scopeRange)) {
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
} else if (NSIntersectionRange(blockRange.range, scopeRange).length == 0) {
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
id<ENRMBlockHandler> handler = _blockHandlers[@(blockRange.type)];
|
|
241
|
+
if (!handler) {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
NSUInteger attrIndex = blockRange.range.location;
|
|
246
|
+
if (attrIndex >= textLength) {
|
|
247
|
+
attrIndex = textLength > 0 ? textLength - 1 : 0;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
NSParagraphStyle *existingStyle = [textStorage attribute:NSParagraphStyleAttributeName
|
|
251
|
+
atIndex:attrIndex
|
|
252
|
+
effectiveRange:NULL];
|
|
253
|
+
NSMutableParagraphStyle *paragraphStyle =
|
|
254
|
+
existingStyle ? [existingStyle mutableCopy] : [[NSMutableParagraphStyle alloc] init];
|
|
255
|
+
NSMutableDictionary<NSAttributedStringKey, id> *attributes = [NSMutableDictionary dictionary];
|
|
256
|
+
|
|
257
|
+
[handler applyAttributesToParagraphStyle:paragraphStyle attributes:attributes blockRange:blockRange style:style];
|
|
258
|
+
|
|
259
|
+
attributes[NSParagraphStyleAttributeName] = paragraphStyle;
|
|
260
|
+
attributes[ENRMBlockTypeAttributeName] = @(blockRange.type);
|
|
261
|
+
attributes[ENRMBlockLevelAttributeName] = @(blockRange.level);
|
|
262
|
+
attributes[ENRMBlockOrdinalAttributeName] = @(blockRange.ordinal);
|
|
263
|
+
|
|
264
|
+
// For a zero-length heading anchor on an empty line, stamp onto the line
|
|
265
|
+
// terminator so the paragraph style (heading font size) takes effect.
|
|
266
|
+
NSRange applyRange = blockRange.range;
|
|
267
|
+
if (isHeadingAnchor && applyRange.location < textLength) {
|
|
268
|
+
applyRange = NSMakeRange(applyRange.location, 1);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
UIFont *blockFont = attributes[NSFontAttributeName];
|
|
272
|
+
if (blockFont) {
|
|
273
|
+
[attributes removeObjectForKey:NSFontAttributeName];
|
|
274
|
+
if (applyRange.length > 0) {
|
|
275
|
+
[self mergeFontSize:blockFont overRange:applyRange inTextStorage:textStorage];
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
if (applyRange.length > 0) {
|
|
280
|
+
[textStorage addAttributes:attributes range:applyRange];
|
|
281
|
+
}
|
|
219
282
|
}
|
|
220
283
|
|
|
284
|
+
[textStorage endEditing];
|
|
285
|
+
|
|
221
286
|
ENRMSetNeedsDisplay(textView);
|
|
222
287
|
}
|
|
223
288
|
|
|
289
|
+
/// Applies `blockFont` over `range` while preserving the symbolic traits already
|
|
290
|
+
/// present on each existing font run (set by the inline formatting pass). The
|
|
291
|
+
/// resulting font takes its size and descriptor from `blockFont` but unions in
|
|
292
|
+
/// the run's traits, so inline bold/italic survives the block's size change.
|
|
293
|
+
- (void)mergeFontSize:(UIFont *)blockFont overRange:(NSRange)range inTextStorage:(NSTextStorage *)textStorage
|
|
294
|
+
{
|
|
295
|
+
UIFontDescriptorSymbolicTraits blockTraits = blockFont.fontDescriptor.symbolicTraits;
|
|
296
|
+
|
|
297
|
+
[textStorage enumerateAttribute:NSFontAttributeName
|
|
298
|
+
inRange:range
|
|
299
|
+
options:0
|
|
300
|
+
usingBlock:^(UIFont *_Nullable runFont, NSRange runRange, BOOL *_Nonnull stop) {
|
|
301
|
+
UIFontDescriptorSymbolicTraits runTraits = runFont ? runFont.fontDescriptor.symbolicTraits : 0;
|
|
302
|
+
UIFontDescriptorSymbolicTraits mergedTraits = blockTraits | runTraits;
|
|
303
|
+
|
|
304
|
+
UIFont *resolved = blockFont;
|
|
305
|
+
if (mergedTraits != blockTraits) {
|
|
306
|
+
UIFontDescriptor *descriptor =
|
|
307
|
+
[blockFont.fontDescriptor fontDescriptorWithSymbolicTraits:mergedTraits];
|
|
308
|
+
if (descriptor) {
|
|
309
|
+
resolved = [UIFont fontWithDescriptor:descriptor size:0];
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
[textStorage addAttribute:NSFontAttributeName value:resolved range:runRange];
|
|
313
|
+
}];
|
|
314
|
+
}
|
|
315
|
+
|
|
224
316
|
@end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#import "ENRMUIKit.h"
|
|
4
|
+
#import <Foundation/Foundation.h>
|
|
5
|
+
|
|
6
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
7
|
+
|
|
8
|
+
@interface ENRMInputLinkVariantStyle : NSObject
|
|
9
|
+
|
|
10
|
+
@property (nonatomic, copy) NSString *pattern;
|
|
11
|
+
@property (nonatomic, strong) RCTUIColor *color;
|
|
12
|
+
@property (nonatomic, assign) BOOL underline;
|
|
13
|
+
@property (nonatomic, strong, nullable) RCTUIColor *backgroundColor;
|
|
14
|
+
@property (nonatomic, strong, nullable) NSRegularExpression *regex;
|
|
15
|
+
|
|
16
|
+
@end
|
|
17
|
+
|
|
18
|
+
@interface ENRMInputFormatterStyle : NSObject <NSCopying>
|
|
19
|
+
|
|
20
|
+
/// Base text properties
|
|
21
|
+
@property (nonatomic, strong) UIFont *baseFont;
|
|
22
|
+
@property (nonatomic, strong) RCTUIColor *baseTextColor;
|
|
23
|
+
|
|
24
|
+
/// Bold — color override (nil = inherit baseTextColor)
|
|
25
|
+
@property (nonatomic, strong, nullable) RCTUIColor *boldColor;
|
|
26
|
+
|
|
27
|
+
/// Italic — color override (nil = inherit baseTextColor)
|
|
28
|
+
@property (nonatomic, strong, nullable) RCTUIColor *italicColor;
|
|
29
|
+
|
|
30
|
+
/// Link
|
|
31
|
+
@property (nonatomic, strong, nullable) RCTUIColor *linkColor;
|
|
32
|
+
@property (nonatomic, assign) BOOL linkUnderline;
|
|
33
|
+
@property (nonatomic, strong, nullable) RCTUIColor *linkBackgroundColor;
|
|
34
|
+
@property (nonatomic, copy) NSArray<ENRMInputLinkVariantStyle *> *linkVariants;
|
|
35
|
+
|
|
36
|
+
/// Spoiler
|
|
37
|
+
@property (nonatomic, strong, nullable) RCTUIColor *spoilerColor;
|
|
38
|
+
@property (nonatomic, strong, nullable) RCTUIColor *spoilerBackgroundColor;
|
|
39
|
+
|
|
40
|
+
/// Inline math (`$...$`) chip style, from `markdownStyle.inlineMath`.
|
|
41
|
+
/// Consumed by the math chip layer (ENRICHED_MARKDOWN_MATH).
|
|
42
|
+
@property (nonatomic, strong, nullable) RCTUIColor *inlineMathColor;
|
|
43
|
+
@property (nonatomic, assign) CGFloat inlineMathFontSize;
|
|
44
|
+
@property (nonatomic, strong, nullable) RCTUIColor *inlineMathBackgroundColor;
|
|
45
|
+
@property (nonatomic, strong, nullable) RCTUIColor *inlineMathBorderColor;
|
|
46
|
+
@property (nonatomic, assign) CGFloat inlineMathBorderWidth;
|
|
47
|
+
@property (nonatomic, assign) CGFloat inlineMathBorderRadius;
|
|
48
|
+
@property (nonatomic, assign) CGFloat inlineMathPaddingHorizontal;
|
|
49
|
+
@property (nonatomic, assign) CGFloat inlineMathPaddingVertical;
|
|
50
|
+
@property (nonatomic, strong, nullable) RCTUIColor *inlineMathSelectedBackgroundColor;
|
|
51
|
+
@property (nonatomic, strong, nullable) RCTUIColor *inlineMathSelectedBorderColor;
|
|
52
|
+
/// Raw `fontWeight` string; narrowed at the draw site (see ENRMMathFontWeight.h).
|
|
53
|
+
@property (nonatomic, copy, nullable) NSString *inlineMathFontWeight;
|
|
54
|
+
|
|
55
|
+
/// Block math (`$$...$$`) chip style, from `markdownStyle.math`. Field names
|
|
56
|
+
/// mirror the read-only renderer's `markdownStyle.math`; the author-facing
|
|
57
|
+
/// `padding` shorthand is expanded per axis in JS and never reaches here.
|
|
58
|
+
@property (nonatomic, strong, nullable) RCTUIColor *mathColor;
|
|
59
|
+
@property (nonatomic, assign) CGFloat mathFontSize;
|
|
60
|
+
@property (nonatomic, strong, nullable) RCTUIColor *mathBackgroundColor;
|
|
61
|
+
@property (nonatomic, strong, nullable) RCTUIColor *mathBorderColor;
|
|
62
|
+
@property (nonatomic, assign) CGFloat mathBorderWidth;
|
|
63
|
+
@property (nonatomic, assign) CGFloat mathBorderRadius;
|
|
64
|
+
@property (nonatomic, assign) CGFloat mathPaddingHorizontal;
|
|
65
|
+
@property (nonatomic, assign) CGFloat mathPaddingVertical;
|
|
66
|
+
@property (nonatomic, strong, nullable) RCTUIColor *mathSelectedBackgroundColor;
|
|
67
|
+
@property (nonatomic, strong, nullable) RCTUIColor *mathSelectedBorderColor;
|
|
68
|
+
@property (nonatomic, assign) CGFloat mathMarginTop;
|
|
69
|
+
@property (nonatomic, assign) CGFloat mathMarginBottom;
|
|
70
|
+
@property (nonatomic, assign) NSTextAlignment mathTextAlign;
|
|
71
|
+
/// Raw `fontWeight` string; narrowed at the draw site (see ENRMMathFontWeight.h).
|
|
72
|
+
@property (nonatomic, copy, nullable) NSString *mathFontWeight;
|
|
73
|
+
|
|
74
|
+
/// Vertical spacing (points) added above each list item via the paragraph
|
|
75
|
+
/// style's paragraphSpacingBefore, so bullets read as separate rows. Configured
|
|
76
|
+
/// from the `markdownStyle.list.itemSpacing` prop; defaults to 0 (items pack tightly).
|
|
77
|
+
@property (nonatomic, assign) CGFloat listItemSpacing;
|
|
78
|
+
|
|
79
|
+
/// Per-level heading config, indexed by level 1-6. A nil/0 entry means the level
|
|
80
|
+
/// uses a built-in default derived from the base font. Configured from the
|
|
81
|
+
/// `markdownStyle.h1..h6` props.
|
|
82
|
+
- (void)setHeadingFontSize:(CGFloat)fontSize forLevel:(NSInteger)level;
|
|
83
|
+
- (void)setHeadingFontWeight:(nullable NSString *)fontWeight forLevel:(NSInteger)level;
|
|
84
|
+
- (void)setHeadingColor:(nullable RCTUIColor *)color forLevel:(NSInteger)level;
|
|
85
|
+
|
|
86
|
+
/// Resolved foreground color for a heading level, or nil to inherit baseTextColor.
|
|
87
|
+
- (nullable RCTUIColor *)headingColorForLevel:(NSInteger)level;
|
|
88
|
+
|
|
89
|
+
/// Font for a heading level, built over the base font at the configured per-level
|
|
90
|
+
/// size and weight (from markdownStyle h1..h6). Does not carry inline traits —
|
|
91
|
+
/// those are merged on top in the formatter's font pass.
|
|
92
|
+
- (UIFont *)headingFontForLevel:(NSInteger)level;
|
|
93
|
+
|
|
94
|
+
- (UIFont *)fontForTraits:(UIFontDescriptorSymbolicTraits)traits;
|
|
95
|
+
- (void)invalidateFontCache;
|
|
96
|
+
|
|
97
|
+
@end
|
|
98
|
+
|
|
99
|
+
NS_ASSUME_NONNULL_END
|