react-native-enriched-markdown-scaffold 0.7.4-scaffold.9 → 1.0.2-scaffold.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -8
- package/ReactNativeEnrichedMarkdown.podspec +82 -73
- package/android/build.gradle +188 -1
- package/android/consumer-rules.pro +1 -1
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerDelegate.java +27 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerInterface.java +7 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerDelegate.java +24 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerInterface.java +8 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +27 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +7 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +223 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +183 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +65 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +1086 -61
- package/android/src/main/baseline-prof.txt +1 -1
- package/android/src/main/cpp/jni-adapter.cpp +74 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt +351 -13
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownInternalText.kt +62 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownManager.kt +85 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +160 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager.kt +10 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +76 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +126 -10
- package/android/src/main/java/com/swmansion/enriched/markdown/events/CopyPressEvent.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/events/CopyRequestEvent.kt +28 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkLayoutEvent.kt +36 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/events/SelectionChangeEvent.kt +43 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager.kt +54 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +923 -462
- package/android/src/main/java/com/swmansion/enriched/markdown/input/MarkdownClipboard.kt +42 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/BlockEditCoordinator.kt +196 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/ClipboardCoordinator.kt +73 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditContext.kt +19 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditPipeline.kt +248 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditSession.kt +52 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/InputConnectionWrapper.kt +108 -7
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/LinkCoordinator.kt +69 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownTextWatcher.kt +3 -3
- package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MentionCoordinator.kt +118 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnChangeStateEvent.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnContextMenuItemPressEvent.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnInputKeyPressEvent.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnPasteEvent.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/BlockStore.kt +254 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/FormattingStore.kt +80 -87
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputFormatter.kt +109 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputParser.kt +116 -22
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/MarkdownSerializer.kt +167 -38
- package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/RangeEditAdjustment.kt +149 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt +66 -5
- package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputMeasurementStore.kt +4 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockRange.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockType.kt +48 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/FormattingRange.kt +9 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/InputFormatterStyle.kt +39 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathAtom.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathChipStyle.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MutableRangeBounds.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputBulletSpan.kt +82 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputHeadingSpan.kt +58 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputListItemSpacingSpan.kt +37 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputOrderedListMarkerSpan.kt +63 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/BlockHandler.kt +54 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/HeadingBlockHandler.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/OrderedListBlockHandler.kt +38 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/UnorderedListBlockHandler.kt +37 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt +8 -26
- package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +9 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +100 -12
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +16 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +4 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LinkRenderer.kt +37 -7
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +2 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +74 -18
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +43 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +9 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SoftBreakRenderer.kt +16 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +35 -28
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +24 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +174 -24
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +20 -82
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +13 -16
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +182 -46
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/InlineChipPainter.kt +140 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkChipSpans.kt +177 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkSpan.kt +1 -6
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListItemSpacingSpan.kt +33 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListMarkerAnchorSpan.kt +38 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +2 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/TaskListSpan.kt +3 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +3 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +6 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +26 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +7 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/InlineMathStyle.kt +16 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkStyle.kt +36 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkVariantEntry.kt +7 -3
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +4 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/MathStyle.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +13 -4
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/TableStyle.kt +6 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockHighlighter.kt +90 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockNode.kt +57 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/FeatureFlags.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownSegment.kt +9 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownViewManagerUtils.kt +84 -7
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/ReadableMapExtensions.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/RenderedSegment.kt +10 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/SegmentSignature.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/StreamingMarkdownFilter.kt +83 -5
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/serialization/MarkdownASTSerializer.kt +4 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/MarkdownStyleParser.kt +74 -44
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/PasteTextUtils.kt +52 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageCache.kt +26 -3
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageDownloader.kt +22 -9
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/LocalImageLoader.kt +161 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/conversion/HTMLGenerator.kt +2 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/conversion/MarkdownExtractor.kt +6 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/extensions/TextPaintExtensions.kt +23 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/CheckboxTouchHelper.kt +7 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/TaskListTapUtils.kt +41 -21
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/span/BlockSpacing.kt +15 -8
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/HeadlessActionMode.kt +88 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLayoutCollector.kt +100 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLongPressMovementMethod.kt +58 -27
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionActionMode.kt +72 -16
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionChangeReporter.kt +232 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/views/BlockMenuOptions.kt +64 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +414 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/views/ContextMenuPopup.kt +9 -6
- package/android/src/main/java/com/swmansion/enriched/markdown/views/CopyGlyph.kt +101 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/views/TableContainerView.kt +61 -11
- package/android/src/main/jni/CMakeLists.txt +53 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp +10 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h +11 -2
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +10 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +12 -2
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.cpp +9 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.h +24 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +16 -0
- package/android/src/math/java/com/swmansion/enriched/markdown/input/math/MathChipControllerImpl.kt +21 -4
- package/android/src/math/java/com/swmansion/enriched/markdown/renderer/MathInlineRenderer.kt +8 -2
- package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathChipSpan.kt +1 -1
- package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathInlineSpan.kt +13 -6
- package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathMeasureHelper.kt +2 -1
- package/android/src/math/java/com/swmansion/enriched/markdown/views/MathContainerView.kt +26 -8
- package/cpp/highlight/CodeBlockHighlighter.cpp +284 -0
- package/cpp/highlight/CodeBlockHighlighter.hpp +66 -0
- package/cpp/highlight/CodeBlockLanguages.cpp +138 -0
- package/cpp/highlight/CodeBlockLanguages.hpp +25 -0
- package/cpp/highlight/HighlightGrammars.hpp +28 -0
- package/cpp/highlight/code_highlight_podspec.rb +211 -0
- package/cpp/highlight/gen-registry.mjs +155 -0
- package/cpp/highlight/grammar-versions.json +159 -0
- package/cpp/highlight/vendor/generated/generated_queries.h +1665 -0
- package/cpp/highlight/vendor/generated/generated_registry.cpp +59 -0
- package/cpp/parser/MD4CParser.cpp +173 -61
- package/cpp/parser/MD4CParser.hpp +1 -0
- package/cpp/parser/MarkdownASTNode.hpp +2 -1
- package/cpp/wasm/ASTSerializer.cpp +2 -0
- package/cpp/wasm/build.sh +1 -0
- package/cpp/wasm/md4c_wasm.cpp +3 -1
- package/docs/ACCESSIBILITY.md +14 -2
- package/docs/API_REFERENCE.md +405 -12
- package/docs/BREAKING_CHANGES.md +129 -0
- package/docs/CODE_HIGHLIGHT.md +133 -0
- package/docs/COPY_OPTIONS.md +61 -3
- package/docs/ELEMENTS_STRUCTURE.md +52 -4
- package/docs/IMAGE_CACHING.md +30 -0
- package/docs/INPUT.md +110 -11
- package/docs/LATEX_MATH.md +87 -45
- package/docs/MACOS.md +1 -1
- package/docs/MARKDOWN_STREAMING.md +27 -1
- package/docs/MENTIONS.md +8 -1
- package/docs/NATIVE_ASSETS.md +127 -0
- package/docs/RTL.md +1 -1
- package/docs/STYLES.md +73 -6
- package/docs/TESTING.md +112 -0
- package/docs/TEXT.md +18 -6
- package/docs/WEB.md +4 -1
- package/ios/EnrichedMarkdown.h +7 -0
- package/ios/EnrichedMarkdown.mm +583 -76
- package/ios/EnrichedMarkdownText.h +7 -0
- package/ios/EnrichedMarkdownText.mm +299 -73
- package/ios/attachments/ENRMImageAttachment.h +9 -0
- package/ios/attachments/ENRMImageAttachment.m +143 -40
- package/ios/attachments/ENRMMathInlineAttachment+macOS.m +2 -1
- package/ios/attachments/ENRMMathInlineAttachment.h +5 -0
- package/ios/attachments/ENRMMathInlineAttachment.m +50 -82
- package/ios/attachments/ENRMMathInlineAttachmentShared.h +2 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.cpp +223 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.h +183 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.cpp +65 -0
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +1086 -61
- package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +181 -2
- package/ios/input/ENRMAutoLinkDetector.h +2 -1
- package/ios/input/ENRMAutoLinkDetector.mm +79 -41
- package/ios/input/ENRMBlockEditCoordinator.h +71 -0
- package/ios/input/ENRMBlockEditCoordinator.mm +195 -0
- package/ios/input/ENRMBlockRange.h +28 -0
- package/ios/input/ENRMBlockRange.mm +30 -0
- package/ios/input/ENRMBlockStore.h +56 -0
- package/ios/input/ENRMBlockStore.mm +275 -0
- package/ios/input/ENRMClipboardCoordinator.h +45 -0
- package/ios/input/ENRMClipboardCoordinator.mm +120 -0
- package/ios/input/ENRMDetectorPipeline.h +2 -1
- package/ios/input/ENRMEditPipeline.h +76 -0
- package/ios/input/ENRMEditPipeline.mm +228 -0
- package/ios/input/ENRMEditSession.h +36 -0
- package/ios/input/ENRMEditSession.mm +63 -0
- package/ios/input/ENRMFormattingStore.h +17 -0
- package/ios/input/ENRMFormattingStore.mm +95 -105
- package/ios/input/ENRMInputBlockType.h +91 -0
- package/ios/input/ENRMInputBlockType.mm +5 -0
- package/ios/input/ENRMInputDecorationDrawer.h +18 -0
- package/ios/input/ENRMInputEventEmitter.h +56 -0
- package/ios/input/ENRMInputEventEmitter.mm +308 -0
- package/ios/input/ENRMInputFormatter.h +29 -69
- package/ios/input/ENRMInputFormatter.mm +216 -124
- package/ios/input/ENRMInputFormatterStyle.h +99 -0
- package/ios/input/ENRMInputFormatterStyle.mm +188 -0
- package/ios/input/ENRMInputLayoutManager.h +9 -0
- package/ios/input/ENRMInputLayoutManager.mm +30 -0
- package/ios/input/ENRMInputListMarkerDrawer.h +32 -0
- package/ios/input/ENRMInputListMarkerDrawer.mm +426 -0
- package/ios/input/ENRMInputParser.h +5 -6
- package/ios/input/ENRMInputParser.mm +461 -178
- package/ios/input/ENRMInputRemend.mm +2 -2
- package/ios/input/ENRMInputStyleStateBuilder.h +40 -0
- package/ios/input/ENRMInputStyleStateBuilder.mm +60 -0
- package/ios/input/ENRMInputTextView.mm +103 -8
- package/ios/input/ENRMInputTypingAttributesController.h +42 -0
- package/ios/input/ENRMInputTypingAttributesController.mm +203 -0
- package/ios/input/ENRMLinkCoordinator.h +41 -0
- package/ios/input/ENRMLinkCoordinator.mm +89 -0
- package/ios/input/ENRMMarkdownSerializer.h +29 -5
- package/ios/input/ENRMMarkdownSerializer.mm +170 -48
- package/ios/input/ENRMMathAtom.h +26 -0
- package/ios/input/ENRMMathAtom.mm +12 -0
- package/ios/input/ENRMMentionCoordinator.h +45 -0
- package/ios/input/ENRMMentionCoordinator.mm +167 -0
- package/ios/input/ENRMRangeEditAdjustment.h +38 -0
- package/ios/input/ENRMRangeEditAdjustment.mm +91 -0
- package/ios/input/ENRMRangeStoreUtils.h +39 -0
- package/ios/input/EnrichedMarkdownTextInput+ContextMenu.mm +6 -6
- package/ios/input/EnrichedMarkdownTextInput+Internal.h +11 -3
- package/ios/input/EnrichedMarkdownTextInput.h +7 -1
- package/ios/input/EnrichedMarkdownTextInput.mm +1089 -1023
- package/ios/input/InputStylePropsUtils.h +109 -68
- package/ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm +2 -1
- package/ios/input/styles/ENRMBlockHandler.h +46 -0
- package/ios/input/styles/ENRMHeadingBlockHandler.h +15 -0
- package/ios/input/styles/ENRMHeadingBlockHandler.mm +38 -0
- package/ios/input/styles/ENRMOrderedListBlockHandler.h +14 -0
- package/ios/input/styles/ENRMOrderedListBlockHandler.mm +48 -0
- package/ios/input/styles/ENRMUnorderedListBlockHandler.h +15 -0
- package/ios/input/styles/ENRMUnorderedListBlockHandler.mm +51 -0
- package/ios/internals/ENRMViewFreeMeasurement.h +331 -0
- package/ios/internals/EnrichedMarkdownShadowNode.h +1 -3
- package/ios/internals/EnrichedMarkdownShadowNode.mm +16 -20
- package/ios/internals/EnrichedMarkdownTextShadowNode.h +1 -3
- package/ios/internals/EnrichedMarkdownTextShadowNode.mm +15 -20
- package/ios/internals/MeasurementCache.h +41 -9
- package/ios/internals/ShadowMeasurementUtils.h +63 -58
- package/ios/math/ENRMMathChipController.h +74 -0
- package/ios/math/ENRMMathChipController.mm +476 -0
- package/ios/math/ENRMRaTeXBridge.swift +27 -6
- package/ios/parser/ENRMMarkdownParser.h +1 -8
- package/ios/parser/ENRMMarkdownParser.mm +2 -11
- package/ios/parser/MarkdownASTNode.h +2 -1
- package/ios/parser/MarkdownParserBridge.mm +4 -0
- package/ios/renderer/AttributedRenderer.m +20 -2
- package/ios/renderer/BaseRenderer.h +17 -2
- package/ios/renderer/BaseRenderer.m +30 -0
- package/ios/renderer/BlockquoteRenderer.h +1 -1
- package/ios/renderer/BlockquoteRenderer.m +144 -35
- package/ios/renderer/CodeBlockRenderer.h +1 -1
- package/ios/renderer/CodeBlockRenderer.m +27 -23
- package/ios/renderer/CodeRenderer.h +1 -1
- package/ios/renderer/CodeRenderer.m +3 -1
- package/ios/renderer/ENRMImageRenderer.h +1 -1
- package/ios/renderer/ENRMImageRenderer.m +5 -1
- package/ios/renderer/ENRMMathInlineRenderer.h +1 -1
- package/ios/renderer/ENRMMathInlineRenderer.m +6 -1
- package/ios/renderer/ENRMSpoilerRenderer.h +1 -1
- package/ios/renderer/ENRMSpoilerRenderer.m +3 -1
- package/ios/renderer/EmphasisRenderer.h +1 -1
- package/ios/renderer/EmphasisRenderer.m +3 -1
- package/ios/renderer/HeadingRenderer.h +1 -1
- package/ios/renderer/HeadingRenderer.m +13 -6
- package/ios/renderer/HighlightRenderer.h +1 -1
- package/ios/renderer/HighlightRenderer.m +3 -1
- package/ios/renderer/LinkRenderer.h +1 -1
- package/ios/renderer/LinkRenderer.m +50 -16
- package/ios/renderer/ListItemRenderer.h +13 -1
- package/ios/renderer/ListItemRenderer.m +102 -44
- package/ios/renderer/ListRenderer.h +2 -2
- package/ios/renderer/ListRenderer.m +63 -25
- package/ios/renderer/ParagraphRenderer.h +1 -1
- package/ios/renderer/ParagraphRenderer.m +16 -8
- package/ios/renderer/RenderContext.h +10 -0
- package/ios/renderer/RenderContext.m +44 -0
- package/ios/renderer/RendererFactory.m +14 -0
- package/ios/renderer/StrikethroughRenderer.h +1 -1
- package/ios/renderer/StrikethroughRenderer.m +3 -1
- package/ios/renderer/StrongRenderer.h +1 -1
- package/ios/renderer/StrongRenderer.m +3 -1
- package/ios/renderer/SubscriptRenderer.h +1 -1
- package/ios/renderer/SubscriptRenderer.m +3 -1
- package/ios/renderer/SuperscriptRenderer.h +1 -1
- package/ios/renderer/SuperscriptRenderer.m +3 -1
- package/ios/renderer/TextRenderer.h +2 -2
- package/ios/renderer/TextRenderer.m +3 -1
- package/ios/renderer/ThematicBreakRenderer.h +1 -1
- package/ios/renderer/ThematicBreakRenderer.m +3 -1
- package/ios/renderer/UnderlineRenderer.h +1 -1
- package/ios/renderer/UnderlineRenderer.m +3 -1
- package/ios/styles/StyleConfig.h +42 -0
- package/ios/styles/StyleConfig.mm +216 -0
- package/ios/utils/BlockquoteBorder.h +6 -0
- package/ios/utils/BlockquoteBorder.m +249 -52
- package/ios/utils/CodeBackground.m +3 -65
- package/ios/utils/CodeBlockBackground.m +16 -2
- package/ios/utils/ENRMAtomicSize.h +65 -0
- package/ios/utils/ENRMBlockMenu.h +66 -0
- package/ios/utils/ENRMChipDrawing.h +24 -0
- package/ios/utils/ENRMChipDrawing.m +83 -0
- package/ios/utils/ENRMCodeBlockContent.h +37 -0
- package/ios/utils/ENRMCodeBlockContent.mm +79 -0
- package/ios/utils/ENRMCodeBlockHighlighter.h +37 -0
- package/ios/utils/ENRMCodeBlockHighlighter.mm +51 -0
- package/ios/utils/ENRMFeatureFlags.h +7 -0
- package/ios/utils/ENRMImageDownloader.h +11 -1
- package/ios/utils/ENRMImageDownloader.m +60 -16
- package/ios/utils/ENRMLinkChip.h +70 -0
- package/ios/utils/ENRMLinkChip.m +213 -0
- package/ios/utils/ENRMLinkLayout.h +50 -0
- package/ios/utils/ENRMLinkLayout.m +45 -0
- package/ios/utils/ENRMLocalImageLoader.h +31 -0
- package/ios/utils/ENRMLocalImageLoader.m +68 -0
- package/ios/utils/ENRMMathFallback.h +26 -0
- package/ios/utils/ENRMMathFallback.m +18 -0
- package/ios/utils/ENRMSelectionChange.h +120 -0
- package/ios/utils/ENRMSelectionChange.m +282 -0
- package/ios/utils/ENRMTextViewSetup.h +35 -17
- package/ios/utils/EditMenuUtils+macOS.m +4 -1
- package/ios/utils/EditMenuUtils.h +35 -6
- package/ios/utils/EditMenuUtils.m +188 -11
- package/ios/utils/HTMLGenerator.m +2 -1
- package/ios/utils/ImageRequestHeaderUtils.h +35 -0
- package/ios/utils/LastElementUtils.h +1 -0
- package/ios/utils/ListMarkerDrawer.m +29 -42
- package/ios/utils/MarkdownASTSerializer.m +4 -0
- package/ios/utils/MarkdownAccessibilityElementBuilder.m +3 -1
- package/ios/utils/MarkdownExtractor.m +2 -1
- package/ios/utils/ParagraphStyleUtils.h +5 -0
- package/ios/utils/ParagraphStyleUtils.m +77 -17
- package/ios/utils/RTFExportUtils.m +2 -0
- package/ios/utils/RenderedMarkdownSegment.h +13 -1
- package/ios/utils/RenderedMarkdownSegment.m +20 -0
- package/ios/utils/SegmentRenderer.m +17 -4
- package/ios/utils/StreamingMarkdownFilter.h +11 -1
- package/ios/utils/StreamingMarkdownFilter.m +98 -2
- package/ios/utils/StylePropsUtils.h +110 -1
- package/ios/utils/TaskListTapUtils.m +24 -0
- package/ios/utils/TextViewLayoutManager.mm +3 -0
- package/ios/views/ENRMCodeBlockContainerView.h +60 -0
- package/ios/views/ENRMCodeBlockContainerView.m +569 -0
- package/ios/views/ENRMMathContainerView.h +23 -0
- package/ios/views/ENRMMathContainerView.m +87 -20
- package/ios/views/TableContainerView.h +32 -0
- package/ios/views/TableContainerView.m +291 -175
- package/jest.d.ts +1 -0
- package/jest.js +5 -0
- package/lib/module/EnrichedMarkdownNativeComponent.ts +203 -1
- package/lib/module/EnrichedMarkdownTextInput.js +84 -5
- package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
- package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
- package/lib/module/EnrichedMarkdownTextNativeComponent.ts +204 -1
- package/lib/module/headingDefaults.js +34 -0
- package/lib/module/headingDefaults.js.map +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/jest/index.js +205 -0
- package/lib/module/jest/index.js.map +1 -0
- package/lib/module/native/EnrichedMarkdownText.js +199 -15
- package/lib/module/native/EnrichedMarkdownText.js.map +1 -1
- package/lib/module/normalizeMarkdownStyle.js +98 -23
- package/lib/module/normalizeMarkdownStyle.js.map +1 -1
- package/lib/module/normalizeMarkdownStyle.web.js +73 -22
- package/lib/module/normalizeMarkdownStyle.web.js.map +1 -1
- package/lib/module/normalizeMarkdownTextInputStyle.js +62 -15
- package/lib/module/normalizeMarkdownTextInputStyle.js.map +1 -1
- package/lib/module/normalizeMenuItem.js +1 -1
- package/lib/module/utils/textInputState.js +26 -0
- package/lib/module/utils/textInputState.js.map +1 -0
- package/lib/module/web/EnrichedMarkdownText.js +15 -8
- package/lib/module/web/EnrichedMarkdownText.js.map +1 -1
- package/lib/module/web/parseMarkdown.js +4 -3
- package/lib/module/web/parseMarkdown.js.map +1 -1
- package/lib/module/web/renderers/InlineRenderers.js +102 -3
- package/lib/module/web/renderers/InlineRenderers.js.map +1 -1
- package/lib/module/web/renderers/ListRenderers.js +7 -2
- package/lib/module/web/renderers/ListRenderers.js.map +1 -1
- package/lib/module/web/renderers/index.js +7 -4
- package/lib/module/web/renderers/index.js.map +1 -1
- package/lib/module/web/styles.js +101 -6
- package/lib/module/web/styles.js.map +1 -1
- package/lib/module/web/utils.js +14 -0
- package/lib/module/web/utils.js.map +1 -1
- package/lib/module/web/wasm/md4c.js +0 -0
- package/lib/module/web/wasm/md4c.js.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts +185 -2
- package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +94 -9
- package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +69 -5
- package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +185 -2
- package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/headingDefaults.d.ts +9 -0
- package/lib/typescript/src/headingDefaults.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +3 -3
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/index.web.d.ts +2 -2
- package/lib/typescript/src/index.web.d.ts.map +1 -1
- package/lib/typescript/src/jest/index.d.ts +6 -0
- package/lib/typescript/src/jest/index.d.ts.map +1 -0
- package/lib/typescript/src/native/EnrichedMarkdownText.d.ts +5 -5
- package/lib/typescript/src/native/EnrichedMarkdownText.d.ts.map +1 -1
- package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -1
- package/lib/typescript/src/normalizeMarkdownStyle.web.d.ts.map +1 -1
- package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts +19 -5
- package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownStyle.d.ts +122 -5
- package/lib/typescript/src/types/MarkdownStyle.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownStyleInternal.d.ts +39 -0
- package/lib/typescript/src/types/MarkdownStyleInternal.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownTextProps.d.ts +207 -10
- package/lib/typescript/src/types/MarkdownTextProps.d.ts.map +1 -1
- package/lib/typescript/src/types/MarkdownTextProps.web.d.ts +60 -1
- package/lib/typescript/src/types/MarkdownTextProps.web.d.ts.map +1 -1
- package/lib/typescript/src/types/events.d.ts +85 -0
- package/lib/typescript/src/types/events.d.ts.map +1 -1
- package/lib/typescript/src/utils/textInputState.d.ts +24 -0
- package/lib/typescript/src/utils/textInputState.d.ts.map +1 -0
- package/lib/typescript/src/web/EnrichedMarkdownText.d.ts +1 -1
- package/lib/typescript/src/web/EnrichedMarkdownText.d.ts.map +1 -1
- package/lib/typescript/src/web/parseMarkdown.d.ts +1 -1
- package/lib/typescript/src/web/parseMarkdown.d.ts.map +1 -1
- package/lib/typescript/src/web/renderers/InlineRenderers.d.ts.map +1 -1
- package/lib/typescript/src/web/renderers/ListRenderers.d.ts.map +1 -1
- package/lib/typescript/src/web/renderers/index.d.ts +2 -1
- package/lib/typescript/src/web/renderers/index.d.ts.map +1 -1
- package/lib/typescript/src/web/styles.d.ts +2 -1
- package/lib/typescript/src/web/styles.d.ts.map +1 -1
- package/lib/typescript/src/web/types.d.ts +10 -2
- package/lib/typescript/src/web/types.d.ts.map +1 -1
- package/lib/typescript/src/web/utils.d.ts +4 -0
- package/lib/typescript/src/web/utils.d.ts.map +1 -1
- package/package.json +36 -9
- package/postinstall.mjs +131 -0
- package/ratex-version.json +21 -0
- package/src/EnrichedMarkdownNativeComponent.ts +203 -1
- package/src/EnrichedMarkdownTextInput.tsx +159 -8
- package/src/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
- package/src/EnrichedMarkdownTextNativeComponent.ts +204 -1
- package/src/headingDefaults.ts +21 -0
- package/src/index.tsx +15 -0
- package/src/index.web.tsx +6 -1
- package/src/jest/index.tsx +236 -0
- package/src/native/EnrichedMarkdownText.tsx +260 -11
- package/src/normalizeMarkdownStyle.ts +117 -16
- package/src/normalizeMarkdownStyle.web.ts +76 -15
- package/src/normalizeMarkdownTextInputStyle.ts +110 -35
- package/src/normalizeMenuItem.ts +1 -1
- package/src/types/MarkdownStyle.ts +125 -5
- package/src/types/MarkdownStyleInternal.ts +51 -0
- package/src/types/MarkdownTextProps.ts +215 -10
- package/src/types/MarkdownTextProps.web.ts +62 -1
- package/src/types/events.ts +90 -0
- package/src/utils/textInputState.ts +35 -0
- package/src/web/EnrichedMarkdownText.tsx +26 -5
- package/src/web/parseMarkdown.ts +6 -2
- package/src/web/renderers/InlineRenderers.tsx +116 -3
- package/src/web/renderers/ListRenderers.tsx +14 -2
- package/src/web/renderers/index.tsx +6 -2
- package/src/web/styles.ts +114 -5
- package/src/web/types.ts +10 -1
- package/src/web/utils.ts +9 -0
- package/src/web/wasm/md4c.js +0 -0
- package/vendor-grammars.mjs +511 -0
- package/vendor-ratex.mjs +173 -0
- package/app.plugin.js +0 -2
- package/plugin/build/withAndroidMath.js +0 -19
- package/plugin/build/withIosMath.js +0 -28
- package/plugin/build/withReactNativeEnrichedMarkdown.js +0 -11
- package/plugin/src/withAndroidMath.ts +0 -24
- package/plugin/src/withIosMath.ts +0 -35
- package/plugin/src/withReactNativeEnrichedMarkdown.ts +0 -17
- package/plugin/tsconfig.build.json +0 -16
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
#import "StyleConfig.h"
|
|
6
6
|
#import <objc/runtime.h>
|
|
7
7
|
|
|
8
|
-
#define CACHE_KEY_PROCESSED(url, w, h, r) [NSString stringWithFormat:@"%@_w%.1f_h%.1f_r%.
|
|
8
|
+
#define CACHE_KEY_PROCESSED(url, w, h, r, m) [NSString stringWithFormat:@"%@_w%.1f_h%.1f_r%.1f_m%@", url, w, h, r, m]
|
|
9
9
|
|
|
10
10
|
static inline NSUInteger ENRMImageByteCost(RCTUIImage *image)
|
|
11
11
|
{
|
|
@@ -22,13 +22,19 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
22
22
|
@interface ENRMImageAttachment ()
|
|
23
23
|
|
|
24
24
|
@property (nonatomic, copy) NSString *imageURL;
|
|
25
|
+
@property (nonatomic, copy, nullable) NSDictionary<NSString *, NSString *> *requestHeaders;
|
|
26
|
+
@property (nonatomic, copy) NSString *cacheKey;
|
|
25
27
|
@property (nonatomic, assign) BOOL isInline;
|
|
26
28
|
@property (nonatomic, assign) CGFloat cachedHeight;
|
|
29
|
+
@property (nonatomic, assign) CGFloat cachedMaxHeight;
|
|
30
|
+
@property (nonatomic, assign) CGFloat cachedAspectRatio;
|
|
31
|
+
@property (nonatomic, copy) NSString *cachedResizeMode;
|
|
27
32
|
@property (nonatomic, assign) CGFloat cachedBorderRadius;
|
|
28
33
|
@property (nonatomic, weak) NSTextContainer *textContainer;
|
|
29
34
|
@property (nonatomic, weak) ENRMPlatformTextView *textView;
|
|
30
35
|
@property (nonatomic, strong) RCTUIImage *originalImage;
|
|
31
36
|
@property (nonatomic, strong) RCTUIImage *loadedImage;
|
|
37
|
+
@property (nonatomic, strong) RCTUIImage *placeholderImage;
|
|
32
38
|
@property (nonatomic, copy) NSString *lastProcessedKey;
|
|
33
39
|
|
|
34
40
|
@end
|
|
@@ -66,7 +72,8 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
66
72
|
|
|
67
73
|
+ (instancetype)attachmentForURL:(NSString *)imageURL config:(StyleConfig *)config isInline:(BOOL)isInline
|
|
68
74
|
{
|
|
69
|
-
NSString *key =
|
|
75
|
+
NSString *key =
|
|
76
|
+
[NSString stringWithFormat:@"%@_%d", ENRMImageCacheKey(imageURL, [config imageRequestHeaders]), isInline];
|
|
70
77
|
ENRMImageAttachment *existing = [[self attachmentRegistry] objectForKey:key];
|
|
71
78
|
if (existing && existing.loadedImage) {
|
|
72
79
|
return existing;
|
|
@@ -86,9 +93,14 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
86
93
|
self = [super init];
|
|
87
94
|
if (self) {
|
|
88
95
|
_imageURL = imageURL;
|
|
96
|
+
_requestHeaders = [[config imageRequestHeaders] copy];
|
|
97
|
+
_cacheKey = ENRMImageCacheKey(imageURL, _requestHeaders);
|
|
89
98
|
_isInline = isInline;
|
|
90
99
|
|
|
91
100
|
_cachedHeight = isInline ? [config inlineImageSize] : [config imageHeight];
|
|
101
|
+
_cachedMaxHeight = [config imageMaxHeight];
|
|
102
|
+
_cachedAspectRatio = [config imageAspectRatio];
|
|
103
|
+
_cachedResizeMode = [config imageResizeMode];
|
|
92
104
|
_cachedBorderRadius = [config imageBorderRadius];
|
|
93
105
|
|
|
94
106
|
[self setupPlaceholder];
|
|
@@ -97,6 +109,33 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
97
109
|
return self;
|
|
98
110
|
}
|
|
99
111
|
|
|
112
|
+
- (CGFloat)resolvedBoxHeightForWidth:(CGFloat)width
|
|
113
|
+
{
|
|
114
|
+
if (self.cachedAspectRatio > 0 && width > 0) {
|
|
115
|
+
return width / self.cachedAspectRatio;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (self.cachedMaxHeight > 0) {
|
|
119
|
+
RCTUIImage *source = self.originalImage;
|
|
120
|
+
if (source && width > 0 && source.size.width > 0 && source.size.height > 0) {
|
|
121
|
+
CGFloat fitted = width * source.size.height / source.size.width;
|
|
122
|
+
return MIN(self.cachedMaxHeight, fitted);
|
|
123
|
+
}
|
|
124
|
+
// Intrinsic size not known yet — fall back to the full max height; the box
|
|
125
|
+
// shrinks once the image loads and layout is invalidated.
|
|
126
|
+
return self.cachedMaxHeight;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return self.cachedHeight;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// True when resizeMode is unset ('') - legacy always implies a fixed height box.
|
|
133
|
+
|
|
134
|
+
- (BOOL)isLegacyBlockSizing
|
|
135
|
+
{
|
|
136
|
+
return !self.isInline && self.cachedResizeMode.length == 0;
|
|
137
|
+
}
|
|
138
|
+
|
|
100
139
|
- (CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer
|
|
101
140
|
proposedLineFragment:(CGRect)lineFragment
|
|
102
141
|
glyphPosition:(CGPoint)position
|
|
@@ -105,26 +144,27 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
105
144
|
CGFloat height = self.cachedHeight;
|
|
106
145
|
CGFloat width = self.isInline ? height : (lineFragment.size.width > 0 ? lineFragment.size.width : height);
|
|
107
146
|
|
|
108
|
-
if (self.isInline) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
147
|
+
if (!self.isInline) {
|
|
148
|
+
height = [self resolvedBoxHeightForWidth:width];
|
|
149
|
+
return CGRectMake(0, 0, width, height);
|
|
150
|
+
}
|
|
112
151
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
152
|
+
UIFont *appliedFont = nil;
|
|
153
|
+
NSLayoutManager *layoutManager = textContainer.layoutManager;
|
|
154
|
+
NSTextStorage *textStorage = layoutManager.textStorage;
|
|
116
155
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
} else {
|
|
121
|
-
verticalOffset = (lineFragment.size.height - height) / 2.0;
|
|
122
|
-
}
|
|
156
|
+
if (textStorage && characterIndex < textStorage.length) {
|
|
157
|
+
appliedFont = [textStorage attribute:NSFontAttributeName atIndex:characterIndex effectiveRange:NULL];
|
|
158
|
+
}
|
|
123
159
|
|
|
124
|
-
|
|
160
|
+
CGFloat verticalOffset;
|
|
161
|
+
if (appliedFont) {
|
|
162
|
+
verticalOffset = (appliedFont.capHeight - height) / 2.0;
|
|
163
|
+
} else {
|
|
164
|
+
verticalOffset = (lineFragment.size.height - height) / 2.0;
|
|
125
165
|
}
|
|
126
166
|
|
|
127
|
-
return CGRectMake(0,
|
|
167
|
+
return CGRectMake(0, verticalOffset, width, height);
|
|
128
168
|
}
|
|
129
169
|
|
|
130
170
|
- (RCTUIImage *)imageForBounds:(CGRect)imageBounds
|
|
@@ -138,7 +178,7 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
138
178
|
[self processAndApplyImage:self.originalImage withTargetWidth:imageBounds.size.width];
|
|
139
179
|
}
|
|
140
180
|
|
|
141
|
-
return self.loadedImage ?: self.
|
|
181
|
+
return self.loadedImage ?: self.placeholderImage;
|
|
142
182
|
}
|
|
143
183
|
|
|
144
184
|
- (void)handleLoadedImage:(RCTUIImage *)image
|
|
@@ -146,7 +186,15 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
146
186
|
if (!image)
|
|
147
187
|
return;
|
|
148
188
|
|
|
189
|
+
// The downloader completes synchronously on cache hits, which can happen on the render queue
|
|
190
|
+
if (!NSThread.isMainThread) {
|
|
191
|
+
dispatch_async(dispatch_get_main_queue(), ^{ [self handleLoadedImage:image]; });
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
|
|
149
195
|
self.originalImage = image;
|
|
196
|
+
// UIKit reads the plain image property for save/drag/copy — it must hold the original
|
|
197
|
+
self.image = image;
|
|
150
198
|
CGFloat targetWidth = self.isInline ? self.cachedHeight : self.bounds.size.width;
|
|
151
199
|
|
|
152
200
|
// Defer processing if we don't have valid bounds yet (common for non-inline block images)
|
|
@@ -162,7 +210,10 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
162
210
|
if (targetWidth <= 0)
|
|
163
211
|
return;
|
|
164
212
|
|
|
165
|
-
|
|
213
|
+
CGFloat boxHeight = self.isInline ? self.cachedHeight : [self resolvedBoxHeightForWidth:targetWidth];
|
|
214
|
+
|
|
215
|
+
NSString *processedKey =
|
|
216
|
+
CACHE_KEY_PROCESSED(self.cacheKey, targetWidth, boxHeight, self.cachedBorderRadius, self.cachedResizeMode);
|
|
166
217
|
|
|
167
218
|
if ([processedKey isEqualToString:self.lastProcessedKey])
|
|
168
219
|
return;
|
|
@@ -172,8 +223,6 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
172
223
|
|
|
173
224
|
if (cachedProcessed) {
|
|
174
225
|
self.loadedImage = cachedProcessed;
|
|
175
|
-
if (self.isInline)
|
|
176
|
-
self.image = cachedProcessed;
|
|
177
226
|
[self refreshDisplay];
|
|
178
227
|
return;
|
|
179
228
|
}
|
|
@@ -186,7 +235,7 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
186
235
|
|
|
187
236
|
RCTUIImage *processedImage = [strongSelf createScaledImage:image
|
|
188
237
|
toWidth:targetWidth
|
|
189
|
-
height:
|
|
238
|
+
height:boxHeight
|
|
190
239
|
borderRadius:strongSelf.cachedBorderRadius];
|
|
191
240
|
|
|
192
241
|
if (processedImage) {
|
|
@@ -198,10 +247,7 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
198
247
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
199
248
|
strongSelf.loadedImage = processedImage;
|
|
200
249
|
if (strongSelf.isInline) {
|
|
201
|
-
strongSelf.image = processedImage;
|
|
202
250
|
strongSelf.bounds = CGRectMake(0, 0, strongSelf.cachedHeight, strongSelf.cachedHeight);
|
|
203
|
-
} else {
|
|
204
|
-
strongSelf.image = image; // Keep original for layout references
|
|
205
251
|
}
|
|
206
252
|
[strongSelf refreshDisplay];
|
|
207
253
|
});
|
|
@@ -218,32 +264,64 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
218
264
|
if (sourceWidth <= 0 || sourceHeight <= 0)
|
|
219
265
|
return nil;
|
|
220
266
|
|
|
221
|
-
|
|
267
|
+
CGSize source = CGSizeMake(sourceWidth, sourceHeight);
|
|
268
|
+
CGSize box = CGSizeMake(targetWidth, targetHeight);
|
|
269
|
+
BOOL legacy = [self isLegacyBlockSizing];
|
|
222
270
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
drawingWidth
|
|
226
|
-
|
|
271
|
+
CGRect drawingRect;
|
|
272
|
+
if (self.isInline || legacy) {
|
|
273
|
+
CGFloat drawingWidth, drawingHeight;
|
|
274
|
+
if (!self.isInline) {
|
|
275
|
+
CGFloat aspectRatioScale = targetWidth / sourceWidth;
|
|
276
|
+
drawingWidth = targetWidth;
|
|
277
|
+
drawingHeight = sourceHeight * aspectRatioScale;
|
|
278
|
+
} else {
|
|
279
|
+
drawingWidth = targetWidth;
|
|
280
|
+
drawingHeight = targetHeight;
|
|
281
|
+
}
|
|
282
|
+
drawingRect = CGRectMake((targetWidth - drawingWidth) / 2.0, (targetHeight - drawingHeight) / 2.0, drawingWidth,
|
|
283
|
+
drawingHeight);
|
|
227
284
|
} else {
|
|
228
|
-
|
|
229
|
-
drawingHeight = targetHeight;
|
|
285
|
+
drawingRect = [self drawingRectForResizeMode:self.cachedResizeMode source:source box:box];
|
|
230
286
|
}
|
|
231
287
|
|
|
232
|
-
|
|
233
|
-
CGRectMake((targetWidth - drawingWidth) / 2.0, (targetHeight - drawingHeight) / 2.0, drawingWidth, drawingHeight);
|
|
234
|
-
|
|
235
|
-
RCTUIGraphicsImageRenderer *renderer = ImageRendererForSize(CGSizeMake(targetWidth, targetHeight));
|
|
288
|
+
RCTUIGraphicsImageRenderer *renderer = ImageRendererForSize(box);
|
|
236
289
|
|
|
237
290
|
return [renderer imageWithActions:^(RCTUIGraphicsImageRendererContext *context) {
|
|
238
291
|
if (radius > 0) {
|
|
239
|
-
CGRect
|
|
240
|
-
UIBezierPath *path = UIBezierPathWithRoundedRect(
|
|
292
|
+
CGRect clipRect = CGRectIntersection(CGRectMake(0, 0, targetWidth, targetHeight), drawingRect);
|
|
293
|
+
UIBezierPath *path = UIBezierPathWithRoundedRect(clipRect, radius);
|
|
241
294
|
[path addClip];
|
|
242
295
|
}
|
|
243
296
|
[image drawInRect:drawingRect];
|
|
244
297
|
}];
|
|
245
298
|
}
|
|
246
299
|
|
|
300
|
+
- (CGRect)drawingRectForResizeMode:(NSString *)mode source:(CGSize)source box:(CGSize)box
|
|
301
|
+
{
|
|
302
|
+
if ([mode isEqualToString:@"stretch"]) {
|
|
303
|
+
return CGRectMake(0, 0, box.width, box.height);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
CGFloat widthScale = box.width / source.width;
|
|
307
|
+
CGFloat heightScale = box.height / source.height;
|
|
308
|
+
|
|
309
|
+
CGFloat scale;
|
|
310
|
+
if ([mode isEqualToString:@"contain"]) {
|
|
311
|
+
scale = MIN(widthScale, heightScale);
|
|
312
|
+
} else if ([mode isEqualToString:@"center"]) {
|
|
313
|
+
scale = MIN(1.0, MIN(widthScale, heightScale));
|
|
314
|
+
} else if ([mode isEqualToString:@"none"]) {
|
|
315
|
+
scale = 1.0;
|
|
316
|
+
} else { // cover (default)
|
|
317
|
+
scale = MAX(widthScale, heightScale);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
CGFloat drawingWidth = source.width * scale;
|
|
321
|
+
CGFloat drawingHeight = source.height * scale;
|
|
322
|
+
return CGRectMake((box.width - drawingWidth) / 2.0, (box.height - drawingHeight) / 2.0, drawingWidth, drawingHeight);
|
|
323
|
+
}
|
|
324
|
+
|
|
247
325
|
- (void)startDownloadingImage
|
|
248
326
|
{
|
|
249
327
|
if (self.imageURL.length == 0)
|
|
@@ -251,6 +329,7 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
251
329
|
|
|
252
330
|
__weak typeof(self) weakSelf = self;
|
|
253
331
|
[[ENRMImageDownloader shared] downloadURL:self.imageURL
|
|
332
|
+
headers:self.requestHeaders
|
|
254
333
|
completion:^(RCTUIImage *image) { [weakSelf handleLoadedImage:image]; }];
|
|
255
334
|
}
|
|
256
335
|
|
|
@@ -265,10 +344,34 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
265
344
|
[textView.layoutManager invalidateDisplayForCharacterRange:range];
|
|
266
345
|
if (!self.isInline) {
|
|
267
346
|
[textView.layoutManager invalidateLayoutForCharacterRange:range actualCharacterRange:NULL];
|
|
347
|
+
[self notifyImageLayoutObserver:textView];
|
|
268
348
|
}
|
|
269
349
|
}
|
|
270
350
|
}
|
|
271
351
|
|
|
352
|
+
// With maxHeight/aspectRatio sizing the box height can settle after the image
|
|
353
|
+
// loads, while the component was measured (and its size cached) with the
|
|
354
|
+
// pre-load fallback. Notify the hosting component so it can re-measure.
|
|
355
|
+
// Dispatched async: refreshDisplay can run mid-layout (imageForBounds) and
|
|
356
|
+
// re-measuring would re-enter the layout manager.
|
|
357
|
+
- (void)notifyImageLayoutObserver:(UITextView *)textView
|
|
358
|
+
{
|
|
359
|
+
// Only maxHeight/aspectRatio boxes can change height after load; a fixed
|
|
360
|
+
// height box (legacy or explicit resizeMode) never needs a re-measure.
|
|
361
|
+
if (self.cachedMaxHeight <= 0 && self.cachedAspectRatio <= 0)
|
|
362
|
+
return;
|
|
363
|
+
|
|
364
|
+
RCTUIView *candidate = textView;
|
|
365
|
+
while (candidate && ![candidate conformsToProtocol:@protocol(ENRMImageLayoutObserver)]) {
|
|
366
|
+
candidate = candidate.superview;
|
|
367
|
+
}
|
|
368
|
+
if (!candidate)
|
|
369
|
+
return;
|
|
370
|
+
|
|
371
|
+
id<ENRMImageLayoutObserver> observer = (id<ENRMImageLayoutObserver>)candidate;
|
|
372
|
+
dispatch_async(dispatch_get_main_queue(), ^{ [observer imageAttachmentDidResolveLayout]; });
|
|
373
|
+
}
|
|
374
|
+
|
|
272
375
|
- (ENRMPlatformTextView *)fetchAssociatedTextView
|
|
273
376
|
{
|
|
274
377
|
if (self.textView)
|
|
@@ -284,7 +387,7 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
284
387
|
CGFloat size = self.cachedHeight;
|
|
285
388
|
self.bounds = CGRectMake(0, 0, size, size);
|
|
286
389
|
RCTUIGraphicsImageRenderer *renderer = [[RCTUIGraphicsImageRenderer alloc] initWithSize:CGSizeMake(1, 1)];
|
|
287
|
-
self.
|
|
390
|
+
self.placeholderImage = [renderer imageWithActions:^(RCTUIGraphicsImageRendererContext *ctx){}];
|
|
288
391
|
}
|
|
289
392
|
|
|
290
393
|
- (NSRange)findAttachmentRangeInText:(NSAttributedString *)attributedString
|
|
@@ -302,4 +405,4 @@ static NSMapTable<NSString *, ENRMImageAttachment *> *_attachmentRegistry;
|
|
|
302
405
|
return foundRange;
|
|
303
406
|
}
|
|
304
407
|
|
|
305
|
-
@end
|
|
408
|
+
@end
|
|
@@ -9,9 +9,14 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
9
9
|
@property (nonatomic, assign) CGFloat fontSize;
|
|
10
10
|
@property (nonatomic, strong, nullable) RCTUIColor *mathTextColor;
|
|
11
11
|
|
|
12
|
+
@property (nonatomic, readonly) CGFloat boxHeight;
|
|
13
|
+
|
|
12
14
|
/// Typeset the glyphs at bold weight (synthetic — see ENRMRaTeXBridge).
|
|
13
15
|
@property (nonatomic, assign) BOOL bold;
|
|
14
16
|
|
|
17
|
+
/// Ink headroom above and below the formula box (`inlineMath.glyphOverflow`, points).
|
|
18
|
+
@property (nonatomic, assign) CGFloat glyphOverflow;
|
|
19
|
+
|
|
15
20
|
/// YES if block math (`$$...$$`), NO for inline (`$...$`).
|
|
16
21
|
@property (nonatomic, assign) BOOL displayMode;
|
|
17
22
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
#import "ENRMMathFallback.h"
|
|
1
2
|
#import "ENRMMathInlineAttachmentShared.h"
|
|
2
3
|
|
|
3
4
|
#if ENRICHED_MARKDOWN_MATH
|
|
@@ -10,21 +11,50 @@
|
|
|
10
11
|
|
|
11
12
|
@implementation ENRMMathInlineAttachment
|
|
12
13
|
|
|
14
|
+
- (CGFloat)boxHeight
|
|
15
|
+
{
|
|
16
|
+
#if !TARGET_OS_OSX
|
|
17
|
+
[self prepareIfNeeded];
|
|
18
|
+
#endif
|
|
19
|
+
return _cachedSize.height + _containerPaddingVertical * 2;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/// Clears the cached glyph render so the next layout regenerates it
|
|
23
|
+
/// (e.g. after style or latex changes).
|
|
24
|
+
- (void)invalidateRender
|
|
25
|
+
{
|
|
26
|
+
_renderResult = nil;
|
|
27
|
+
_fallbackSource = nil;
|
|
28
|
+
_cachedSize = CGSizeZero;
|
|
29
|
+
_mathAscent = 0;
|
|
30
|
+
_mathDescent = 0;
|
|
31
|
+
}
|
|
32
|
+
|
|
13
33
|
#if !TARGET_OS_OSX
|
|
14
34
|
|
|
15
35
|
- (void)prepareIfNeeded
|
|
16
36
|
{
|
|
17
|
-
if (_renderResult)
|
|
37
|
+
if (_renderResult || _fallbackSource)
|
|
18
38
|
return;
|
|
19
39
|
|
|
20
40
|
RCTUIColor *color = self.mathTextColor ?: [RCTUIColor blackColor];
|
|
21
41
|
ENRMRaTeXRenderResult *result = [ENRMRaTeXBridge parse:self.latex
|
|
22
|
-
displayMode:
|
|
42
|
+
displayMode:NO
|
|
23
43
|
fontSize:self.fontSize
|
|
24
44
|
color:color
|
|
25
|
-
bold:self.bold
|
|
26
|
-
|
|
45
|
+
bold:self.bold
|
|
46
|
+
glyphOverflow:self.glyphOverflow];
|
|
47
|
+
if (!result) {
|
|
48
|
+
_fallbackSource = ENRMMathFallbackString(self.latex, @"$", self.fontSize, color);
|
|
49
|
+
UIFont *font = [_fallbackSource attribute:NSFontAttributeName atIndex:0 effectiveRange:NULL];
|
|
50
|
+
CGRect bounds = [_fallbackSource boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)
|
|
51
|
+
options:NSStringDrawingUsesLineFragmentOrigin
|
|
52
|
+
context:nil];
|
|
53
|
+
_mathAscent = font.ascender;
|
|
54
|
+
_mathDescent = -font.descender;
|
|
55
|
+
_cachedSize = CGSizeMake(ceil(bounds.size.width), ceil(_mathAscent + _mathDescent));
|
|
27
56
|
return;
|
|
57
|
+
}
|
|
28
58
|
|
|
29
59
|
_renderResult = result;
|
|
30
60
|
_mathAscent = result.ascent;
|
|
@@ -32,33 +62,16 @@
|
|
|
32
62
|
_cachedSize = CGSizeMake(ceil(result.width), ceil(result.totalHeight));
|
|
33
63
|
}
|
|
34
64
|
|
|
35
|
-
- (void)invalidateRender
|
|
36
|
-
{
|
|
37
|
-
_renderResult = nil;
|
|
38
|
-
_cachedSize = CGSizeZero;
|
|
39
|
-
_mathAscent = 0;
|
|
40
|
-
_mathDescent = 0;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
65
|
- (CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer
|
|
44
66
|
proposedLineFragment:(CGRect)lineFragment
|
|
45
67
|
glyphPosition:(CGPoint)position
|
|
46
68
|
characterIndex:(NSUInteger)characterIndex
|
|
47
69
|
{
|
|
48
70
|
[self prepareIfNeeded];
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if (_displayMode) {
|
|
54
|
-
totalH += _blockMarginTop + _blockMarginBottom;
|
|
55
|
-
// Block chip claims the full line fragment so text can't share the row.
|
|
56
|
-
// Fall back to intrinsic width when the proposed fragment is degenerate
|
|
57
|
-
// (e.g. during initial layout before the text container has a size).
|
|
58
|
-
CGFloat fullW = MAX(lineFragment.size.width, intrinsicW);
|
|
59
|
-
return CGRectMake(0, -(_mathDescent + _containerPaddingVertical + _blockMarginBottom), fullW, totalH);
|
|
60
|
-
}
|
|
61
|
-
return CGRectMake(0, -(_mathDescent + _containerPaddingVertical), intrinsicW, totalH);
|
|
71
|
+
// inlineMath.paddingVertical grows the glyph box symmetrically so a tall formula
|
|
72
|
+
// (\frac, \sum) stops sitting flush against the neighbouring line.
|
|
73
|
+
return CGRectMake(0, -(_mathDescent + _containerPaddingVertical), _cachedSize.width,
|
|
74
|
+
_cachedSize.height + _containerPaddingVertical * 2);
|
|
62
75
|
}
|
|
63
76
|
|
|
64
77
|
- (UIImage *)imageForBounds:(CGRect)imageBounds
|
|
@@ -66,72 +79,27 @@
|
|
|
66
79
|
characterIndex:(NSUInteger)characterIndex
|
|
67
80
|
{
|
|
68
81
|
[self prepareIfNeeded];
|
|
69
|
-
if (!_renderResult)
|
|
82
|
+
if (!_renderResult && !_fallbackSource)
|
|
70
83
|
return nil;
|
|
71
84
|
|
|
72
|
-
// Block chips claim the full line fragment (set in attachmentBounds…), so
|
|
73
|
-
// the canvas is `imageBounds.width` wide and the formula floats inside it
|
|
74
|
-
// according to `blockAlignment`. Inline chips fall back to intrinsic width.
|
|
75
|
-
CGFloat intrinsicW = _cachedSize.width + _containerPaddingHorizontal * 2;
|
|
76
|
-
CGFloat totalW = (_displayMode && imageBounds.size.width > intrinsicW) ? imageBounds.size.width : intrinsicW;
|
|
77
|
-
CGFloat totalH = _cachedSize.height + _containerPaddingVertical * 2;
|
|
78
|
-
CGSize totalSize = CGSizeMake(totalW, totalH);
|
|
79
|
-
|
|
80
|
-
RCTUIColor *bg = _isSelected ? (_selectedBackgroundColor ?: _containerBackgroundColor) : _containerBackgroundColor;
|
|
81
|
-
RCTUIColor *border = _isSelected ? (_selectedBorderColor ?: _containerBorderColor) : _containerBorderColor;
|
|
82
|
-
CGFloat borderWidth = _containerBorderWidth;
|
|
83
|
-
CGFloat borderRadius = _containerBorderRadius;
|
|
84
|
-
CGFloat padH = _containerPaddingHorizontal;
|
|
85
|
-
CGFloat padV = _containerPaddingVertical;
|
|
86
|
-
ENRMRaTeXRenderResult *render = _renderResult;
|
|
87
|
-
CGFloat formulaW = _cachedSize.width;
|
|
88
|
-
NSTextAlignment alignment = _blockAlignment;
|
|
89
|
-
BOOL displayMode = _displayMode;
|
|
90
|
-
|
|
91
85
|
UIGraphicsImageRendererFormat *format = [UIGraphicsImageRendererFormat preferredFormat];
|
|
92
86
|
format.opaque = NO;
|
|
93
87
|
|
|
94
|
-
|
|
88
|
+
CGFloat padV = _containerPaddingVertical;
|
|
89
|
+
CGSize boxSize = CGSizeMake(_cachedSize.width, _cachedSize.height + padV * 2);
|
|
90
|
+
UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:boxSize format:format];
|
|
95
91
|
|
|
96
92
|
return [renderer imageWithActions:^(UIGraphicsImageRendererContext *rendererContext) {
|
|
97
93
|
CGContextRef ctx = rendererContext.CGContext;
|
|
98
|
-
|
|
99
|
-
if (bg) {
|
|
100
|
-
CGFloat inset = borderWidth / 2.0;
|
|
101
|
-
CGRect rect = CGRectMake(inset, inset, totalW - borderWidth, totalH - borderWidth);
|
|
102
|
-
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:borderRadius];
|
|
103
|
-
[bg setFill];
|
|
104
|
-
[path fill];
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (border && borderWidth > 0) {
|
|
108
|
-
CGFloat inset = borderWidth / 2.0;
|
|
109
|
-
CGRect rect = CGRectMake(inset, inset, totalW - borderWidth, totalH - borderWidth);
|
|
110
|
-
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:borderRadius];
|
|
111
|
-
[border setStroke];
|
|
112
|
-
path.lineWidth = borderWidth;
|
|
113
|
-
[path stroke];
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
CGFloat glyphOffset = padH;
|
|
117
|
-
if (displayMode && totalW > intrinsicW) {
|
|
118
|
-
CGFloat slack = totalW - formulaW - padH * 2;
|
|
119
|
-
switch (alignment) {
|
|
120
|
-
case NSTextAlignmentCenter:
|
|
121
|
-
glyphOffset = padH + slack / 2.0;
|
|
122
|
-
break;
|
|
123
|
-
case NSTextAlignmentRight:
|
|
124
|
-
glyphOffset = padH + slack;
|
|
125
|
-
break;
|
|
126
|
-
default:
|
|
127
|
-
glyphOffset = padH;
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
94
|
CGContextSaveGState(ctx);
|
|
133
|
-
CGContextTranslateCTM(ctx,
|
|
134
|
-
|
|
95
|
+
CGContextTranslateCTM(ctx, 0, padV);
|
|
96
|
+
if (_renderResult) {
|
|
97
|
+
[_renderResult drawIn:ctx];
|
|
98
|
+
} else {
|
|
99
|
+
[_fallbackSource drawWithRect:CGRectMake(0, 0, _cachedSize.width, _cachedSize.height)
|
|
100
|
+
options:NSStringDrawingUsesLineFragmentOrigin
|
|
101
|
+
context:nil];
|
|
102
|
+
}
|
|
135
103
|
CGContextRestoreGState(ctx);
|
|
136
104
|
}];
|
|
137
105
|
}
|