@apollohg/react-native-rich-text-editor 2.0.0
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/LICENSE +160 -0
- package/README.md +259 -0
- package/RUST-STANDARD-LIBRARY-NOTICES.html +8266 -0
- package/ReactNativeProseEditor.podspec +59 -0
- package/THIRD_PARTY_NOTICES.md +31155 -0
- package/android/build.gradle +188 -0
- package/android/consumer-rules.pro +18 -0
- package/android/expo/build.gradle +17 -0
- package/android/src/debug/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +7 -0
- package/android/src/main/assets/editor-icons/MaterialIcons.json +2236 -0
- package/android/src/main/assets/editor-icons/MaterialIcons.ttf +0 -0
- package/android/src/main/java/com/apollohg/editor/AndroidApiCompat.kt +19 -0
- package/android/src/main/java/com/apollohg/editor/AndroidCollaborationTransport.kt +860 -0
- package/android/src/main/java/com/apollohg/editor/CaretGeometry.kt +91 -0
- package/android/src/main/java/com/apollohg/editor/CodeHighlighting.kt +141 -0
- package/android/src/main/java/com/apollohg/editor/DecodedBitmapBudget.kt +250 -0
- package/android/src/main/java/com/apollohg/editor/EditorAddons.kt +133 -0
- package/android/src/main/java/com/apollohg/editor/EditorBlockSpacing.kt +51 -0
- package/android/src/main/java/com/apollohg/editor/EditorBoxDrawable.kt +16 -0
- package/android/src/main/java/com/apollohg/editor/EditorBoxDrawing.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/EditorCheckboxSpan.kt +87 -0
- package/android/src/main/java/com/apollohg/editor/EditorCodeHighlighting.kt +120 -0
- package/android/src/main/java/com/apollohg/editor/EditorDecorationLayer.java +18 -0
- package/android/src/main/java/com/apollohg/editor/EditorDocumentLayout.kt +626 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditText.kt +1042 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextAnnotations.kt +191 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextCaret.kt +100 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextClipboard.kt +101 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextComposition.kt +220 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextConfiguration.kt +316 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextCorrection.kt +303 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDeferredUpdates.kt +327 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDeletion.kt +258 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDiagnostics.kt +83 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDragDrop.kt +67 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextExternalComposition.kt +357 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextHardwareInput.kt +277 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextImages.kt +280 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputLifecycle.kt +183 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputPreparation.kt +79 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputTraits.kt +384 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextLayout.kt +100 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextNativeMutation.kt +243 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextPlaceholder.kt +154 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRenderPatch.kt +347 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRendering.kt +313 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRustCommands.kt +281 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextSelection.kt +352 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextState.kt +113 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextTaskMarkers.kt +92 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextTextCommit.kt +327 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextToolbar.kt +84 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextUpdates.kt +245 -0
- package/android/src/main/java/com/apollohg/editor/EditorGlyphHeightCursorDrawable.kt +42 -0
- package/android/src/main/java/com/apollohg/editor/EditorHeightBehavior.kt +13 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputConnection.kt +923 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCoordinates.kt +191 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCorrection.kt +107 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCursorGeometry.kt +128 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputSnapshots.kt +134 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputSurroundingDeletion.kt +321 -0
- package/android/src/main/java/com/apollohg/editor/EditorKeyboardToolbarView.kt +851 -0
- package/android/src/main/java/com/apollohg/editor/EditorMentionStyle.kt +192 -0
- package/android/src/main/java/com/apollohg/editor/EditorReconciliationWatcher.kt +46 -0
- package/android/src/main/java/com/apollohg/editor/EditorStyleSheet.kt +303 -0
- package/android/src/main/java/com/apollohg/editor/EditorStyleSheetSpans.kt +253 -0
- package/android/src/main/java/com/apollohg/editor/EditorSurfaceInputConnection.kt +67 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextDecorationDrawing.kt +143 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurface.kt +712 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceDragDrop.kt +94 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceInteraction.kt +708 -0
- package/android/src/main/java/com/apollohg/editor/EditorTheme.kt +650 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Adapter.kt +912 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterMutations.kt +402 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterRendering.kt +123 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterSelection.kt +203 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Backend.kt +120 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Driver.kt +87 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Registry.kt +97 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2RenderValidation.kt +409 -0
- package/android/src/main/java/com/apollohg/editor/ExpoAutoGrowStyleSizePublisher.kt +34 -0
- package/android/src/main/java/com/apollohg/editor/ImageResizeOverlayView.kt +266 -0
- package/android/src/main/java/com/apollohg/editor/ImeTextCoordinateMapper.kt +102 -0
- package/android/src/main/java/com/apollohg/editor/KeyboardToolbarImeAnimationController.kt +101 -0
- package/android/src/main/java/com/apollohg/editor/MentionSuggestionChipView.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/NativeCollaborationTransportRegistry.kt +493 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoView.kt +813 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewAtoms.kt +68 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewBinding.kt +126 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewDiagnostics.kt +208 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewErrors.kt +146 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewEvents.kt +150 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewExternalComposition.kt +39 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewFocus.kt +176 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewLifecycle.kt +302 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewMentions.kt +259 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewNativeActions.kt +179 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewOutsideTap.kt +214 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPendingUpdates.kt +376 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewProperties.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPropertyRetries.kt +197 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewToolbar.kt +285 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewTypes.kt +28 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewUpdates.kt +271 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorModule.kt +687 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorOutsideTapDispatcher.kt +380 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorV2Numbers.kt +45 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorViewRegistry.kt +372 -0
- package/android/src/main/java/com/apollohg/editor/NativeImagePipeline.kt +22 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbar.kt +193 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbarIcons.kt +177 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbarItem.kt +274 -0
- package/android/src/main/java/com/apollohg/editor/OkHttpCollaborationSocket.kt +102 -0
- package/android/src/main/java/com/apollohg/editor/OrderedListMarkerFormatter.kt +130 -0
- package/android/src/main/java/com/apollohg/editor/PointerTransparentView.java +18 -0
- package/android/src/main/java/com/apollohg/editor/PositionBridge.kt +128 -0
- package/android/src/main/java/com/apollohg/editor/ProseViewerView.kt +854 -0
- package/android/src/main/java/com/apollohg/editor/RemoteSelectionOverlayView.kt +314 -0
- package/android/src/main/java/com/apollohg/editor/RenderBlockSpans.kt +314 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridge.kt +224 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeBlockStyles.kt +407 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeElements.kt +544 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeInlineAndAtoms.kt +631 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeParagraphs.kt +215 -0
- package/android/src/main/java/com/apollohg/editor/RenderImageDecoder.kt +748 -0
- package/android/src/main/java/com/apollohg/editor/RenderImageLoader.kt +900 -0
- package/android/src/main/java/com/apollohg/editor/RenderLayoutConstants.kt +117 -0
- package/android/src/main/java/com/apollohg/editor/RenderMediaSpans.kt +337 -0
- package/android/src/main/java/com/apollohg/editor/RenderParagraphSpans.kt +182 -0
- package/android/src/main/java/com/apollohg/editor/RichTextEditorView.kt +951 -0
- package/android/src/main/java/com/apollohg/editor/SharedNativeImagePipeline.kt +78 -0
- package/android/src/main/java/com/apollohg/editor/UniffiEditorV2Backend.kt +261 -0
- package/android/src/main/java/com/apollohg/editor/viewer/AndroidProseLayoutEngine.kt +1656 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FabricAttachmentSidecars.kt +80 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FabricLeaseHandleBridge.kt +59 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FallbackSelectionGeometry.kt +450 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseDrawingView.kt +678 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseInstrumentation.kt +608 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayout.kt +186 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutCache.kt +393 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutRegistry.kt +828 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseTheme.kt +316 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerManager.kt +900 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerPackage.kt +16 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedViewerAtoms.kt +89 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerCodeHighlighting.kt +91 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerDocument.kt +453 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerFontEnvironment.kt +282 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerImagePipeline.kt +460 -0
- package/android/src/main/jni/CMakeLists.txt +85 -0
- package/android/src/main/jni/PreparedProseViewerMeasurementsManager.cpp +334 -0
- package/android/src/main/jni/ReactNativeProseEditorSpec.h +17 -0
- package/android/src/main/jni/reactnativeproseeditor.h +6 -0
- package/android/src/main/res/values/attrs.xml +6 -0
- package/android/src/release/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +9 -0
- package/app.plugin.js +62 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseMeasurementsManager.h +62 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerComponentDescriptor.h +30 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.cpp +192 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.h +46 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerState.h +145 -0
- package/dist/AtomHost.d.ts +17 -0
- package/dist/AtomHost.js +135 -0
- package/dist/DefaultAtomChip.d.ts +2 -0
- package/dist/DefaultAtomChip.js +22 -0
- package/dist/EditorAddon.d.ts +32 -0
- package/dist/EditorAddon.js +29 -0
- package/dist/EditorAddonNormalization.d.ts +6 -0
- package/dist/EditorAddonNormalization.js +48 -0
- package/dist/EditorMentionThemeNormalization.d.ts +8 -0
- package/dist/EditorMentionThemeNormalization.js +22 -0
- package/dist/EditorMentionThemeValidation.d.ts +12 -0
- package/dist/EditorMentionThemeValidation.js +95 -0
- package/dist/EditorStyleSheet.d.ts +4 -0
- package/dist/EditorStyleSheet.js +10 -0
- package/dist/EditorStyleSheetNormalization.d.ts +3 -0
- package/dist/EditorStyleSheetNormalization.js +226 -0
- package/dist/EditorStyleSheetTypes.d.ts +151 -0
- package/dist/EditorStyleSheetTypes.js +2 -0
- package/dist/EditorTheme.d.ts +117 -0
- package/dist/EditorTheme.js +41 -0
- package/dist/EditorToolbar.d.ts +4 -0
- package/dist/EditorToolbar.js +17 -0
- package/dist/EditorToolbarComponent.d.ts +13 -0
- package/dist/EditorToolbarComponent.js +24 -0
- package/dist/EditorToolbarItems.d.ts +9 -0
- package/dist/EditorToolbarItems.js +58 -0
- package/dist/EditorToolbarRegistry.d.ts +59 -0
- package/dist/EditorToolbarRegistry.js +175 -0
- package/dist/EditorToolbarTypes.d.ts +273 -0
- package/dist/EditorToolbarTypes.js +2 -0
- package/dist/EditorToolbarVisuals.d.ts +154 -0
- package/dist/EditorToolbarVisuals.js +228 -0
- package/dist/EditorUpdateRevision.d.ts +8 -0
- package/dist/EditorUpdateRevision.js +22 -0
- package/dist/ExternalTextComposition.d.ts +45 -0
- package/dist/ExternalTextComposition.js +537 -0
- package/dist/ImageLoadingPolicy.d.ts +54 -0
- package/dist/ImageLoadingPolicy.js +60 -0
- package/dist/NativeEditorBoundaryError.d.ts +111 -0
- package/dist/NativeEditorBoundaryError.js +268 -0
- package/dist/NativeEditorBridge.d.ts +9 -0
- package/dist/NativeEditorBridge.js +37 -0
- package/dist/NativeEditorCollaborationTransport.d.ts +154 -0
- package/dist/NativeEditorCollaborationTransport.js +275 -0
- package/dist/NativeEditorCreateConfig.d.ts +16 -0
- package/dist/NativeEditorCreateConfig.js +249 -0
- package/dist/NativeEditorCreateJson.d.ts +76 -0
- package/dist/NativeEditorCreateJson.js +474 -0
- package/dist/NativeEditorCreateValidation.d.ts +32 -0
- package/dist/NativeEditorCreateValidation.js +150 -0
- package/dist/NativeEditorDocumentBridge.d.ts +72 -0
- package/dist/NativeEditorDocumentBridge.js +305 -0
- package/dist/NativeEditorDocumentHandle.d.ts +70 -0
- package/dist/NativeEditorDocumentHandle.js +89 -0
- package/dist/NativeEditorLocalAwareness.d.ts +34 -0
- package/dist/NativeEditorLocalAwareness.js +153 -0
- package/dist/NativeEditorNativeModule.d.ts +48 -0
- package/dist/NativeEditorNativeModule.js +34 -0
- package/dist/NativeEditorRenderNormalization.d.ts +22 -0
- package/dist/NativeEditorRenderNormalization.js +274 -0
- package/dist/NativeEditorResultNormalization.d.ts +108 -0
- package/dist/NativeEditorResultNormalization.js +400 -0
- package/dist/NativeEditorTypes.d.ts +318 -0
- package/dist/NativeEditorTypes.js +15 -0
- package/dist/NativeEditorV2Decimal.d.ts +5 -0
- package/dist/NativeEditorV2Decimal.js +18 -0
- package/dist/NativeProseViewer.d.ts +122 -0
- package/dist/NativeProseViewer.js +130 -0
- package/dist/NativeRichTextEditor.d.ts +3 -0
- package/dist/NativeRichTextEditor.js +6 -0
- package/dist/ResourceLimits.d.ts +100 -0
- package/dist/ResourceLimits.js +80 -0
- package/dist/RichTextEditor.d.ts +4 -0
- package/dist/RichTextEditor.js +25 -0
- package/dist/RichTextEditorNativeTypes.d.ts +122 -0
- package/dist/RichTextEditorNativeTypes.js +2 -0
- package/dist/RichTextEditorNativeView.d.ts +12 -0
- package/dist/RichTextEditorNativeView.js +15 -0
- package/dist/RichTextEditorSerialization.d.ts +53 -0
- package/dist/RichTextEditorSerialization.js +283 -0
- package/dist/RichTextEditorTypes.d.ts +281 -0
- package/dist/RichTextEditorTypes.js +2 -0
- package/dist/ViewerConfiguration.d.ts +22 -0
- package/dist/ViewerConfiguration.js +6 -0
- package/dist/YjsCollaboration.d.ts +146 -0
- package/dist/YjsCollaboration.js +496 -0
- package/dist/addons.d.ts +193 -0
- package/dist/addons.js +122 -0
- package/dist/atomConstants.d.ts +3 -0
- package/dist/atomConstants.js +6 -0
- package/dist/atomInstances.d.ts +35 -0
- package/dist/atomInstances.js +79 -0
- package/dist/atomPolicy.d.ts +4 -0
- package/dist/atomPolicy.js +47 -0
- package/dist/atomUpdates.d.ts +2 -0
- package/dist/atomUpdates.js +38 -0
- package/dist/atoms.d.ts +92 -0
- package/dist/atoms.js +222 -0
- package/dist/attributeValidation.d.ts +4 -0
- package/dist/attributeValidation.js +97 -0
- package/dist/contentExpression.d.ts +6 -0
- package/dist/contentExpression.js +335 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +78 -0
- package/dist/listMarkers.d.ts +15 -0
- package/dist/listMarkers.js +21 -0
- package/dist/schemaDefinition.d.ts +143 -0
- package/dist/schemaDefinition.js +206 -0
- package/dist/schemaDocument.d.ts +17 -0
- package/dist/schemaDocument.js +69 -0
- package/dist/schemaDocumentConstruction.d.ts +5 -0
- package/dist/schemaDocumentConstruction.js +125 -0
- package/dist/schemaNormalization.d.ts +29 -0
- package/dist/schemaNormalization.js +313 -0
- package/dist/schemaPresets.d.ts +68 -0
- package/dist/schemaPresets.js +198 -0
- package/dist/schemaResolution.d.ts +9 -0
- package/dist/schemaResolution.js +211 -0
- package/dist/schemas.d.ts +5 -0
- package/dist/schemas.js +28 -0
- package/dist/specs/PreparedProseViewerNativeComponent.d.ts +37 -0
- package/dist/specs/PreparedProseViewerNativeComponent.js +6 -0
- package/dist/useEditorToolbarInteractions.d.ts +12 -0
- package/dist/useEditorToolbarInteractions.js +218 -0
- package/dist/useEditorToolbarItems.d.ts +8 -0
- package/dist/useEditorToolbarItems.js +280 -0
- package/dist/useEditorToolbarPresentation.d.ts +4 -0
- package/dist/useEditorToolbarPresentation.js +203 -0
- package/dist/useEditorToolbarState.d.ts +63 -0
- package/dist/useEditorToolbarState.js +108 -0
- package/dist/useFocusPreservingFrames.d.ts +17 -0
- package/dist/useFocusPreservingFrames.js +108 -0
- package/dist/useNativeEditor.d.ts +66 -0
- package/dist/useNativeEditor.js +370 -0
- package/dist/useRichTextEditorCommands.d.ts +21 -0
- package/dist/useRichTextEditorCommands.js +299 -0
- package/dist/useRichTextEditorEvents.d.ts +18 -0
- package/dist/useRichTextEditorEvents.js +216 -0
- package/dist/useRichTextEditorMentions.d.ts +11 -0
- package/dist/useRichTextEditorMentions.js +316 -0
- package/dist/useRichTextEditorPresentation.d.ts +5 -0
- package/dist/useRichTextEditorPresentation.js +178 -0
- package/dist/useRichTextEditorState.d.ts +180 -0
- package/dist/useRichTextEditorState.js +405 -0
- package/dist/useRichTextEditorUpdates.d.ts +10 -0
- package/dist/useRichTextEditorUpdates.js +308 -0
- package/dist/useViewerAtoms.d.ts +38 -0
- package/dist/useViewerAtoms.js +288 -0
- package/expo-module.config.json +13 -0
- package/ios/EditorAddons.swift +354 -0
- package/ios/EditorCodeHighlighting.swift +184 -0
- package/ios/EditorCore.xcframework/Info.plist +44 -0
- package/ios/EditorCore.xcframework/ios-arm64/libeditor_core.a +0 -0
- package/ios/EditorCore.xcframework/ios-arm64_x86_64-simulator/libeditor_core.a +0 -0
- package/ios/EditorInteractionOverlays.swift +697 -0
- package/ios/EditorLayoutManager.swift +971 -0
- package/ios/EditorNodeTypes.swift +37 -0
- package/ios/EditorStyleSheet.swift +461 -0
- package/ios/EditorTextView+AttributedPatch.swift +305 -0
- package/ios/EditorTextView+Binding.swift +61 -0
- package/ios/EditorTextView+Caret.swift +333 -0
- package/ios/EditorTextView+Commands.swift +203 -0
- package/ios/EditorTextView+Delegate.swift +65 -0
- package/ios/EditorTextView+Diagnostics.swift +225 -0
- package/ios/EditorTextView+DragDrop.swift +290 -0
- package/ios/EditorTextView+ExternalComposition.swift +364 -0
- package/ios/EditorTextView+Images.swift +354 -0
- package/ios/EditorTextView+InputTraits.swift +200 -0
- package/ios/EditorTextView+KeyboardInput.swift +318 -0
- package/ios/EditorTextView+Layout.swift +245 -0
- package/ios/EditorTextView+MarkedText.swift +267 -0
- package/ios/EditorTextView+NativeInputLifecycle.swift +372 -0
- package/ios/EditorTextView+NativeMutation.swift +471 -0
- package/ios/EditorTextView+Reconciliation.swift +97 -0
- package/ios/EditorTextView+RenderPatch.swift +573 -0
- package/ios/EditorTextView+Rendering.swift +539 -0
- package/ios/EditorTextView+Selection.swift +542 -0
- package/ios/EditorTextView.swift +953 -0
- package/ios/EditorTheme.swift +626 -0
- package/ios/EditorV2Adapter+Commands.swift +204 -0
- package/ios/EditorV2Adapter+Envelope.swift +238 -0
- package/ios/EditorV2Adapter+Mutation.swift +392 -0
- package/ios/EditorV2Adapter+Registry.swift +185 -0
- package/ios/EditorV2Adapter+RenderState.swift +360 -0
- package/ios/EditorV2Adapter+RenderValidation.swift +420 -0
- package/ios/EditorV2Adapter+Selection.swift +329 -0
- package/ios/EditorV2Adapter+TextCommands.swift +430 -0
- package/ios/EditorV2Adapter.swift +376 -0
- package/ios/EditorV2Shadow.swift +353 -0
- package/ios/Generated_editor_core.swift +2378 -0
- package/ios/NativeCodeHighlighting.swift +159 -0
- package/ios/NativeCollaborationSocket.swift +144 -0
- package/ios/NativeCollaborationTransport+Protocol.swift +258 -0
- package/ios/NativeCollaborationTransport+Socket.swift +379 -0
- package/ios/NativeCollaborationTransport+Validation.swift +103 -0
- package/ios/NativeCollaborationTransport.swift +322 -0
- package/ios/NativeCollaborationTransportRegistry.swift +521 -0
- package/ios/NativeEditorExpoView+AccessoryRetry.swift +219 -0
- package/ios/NativeEditorExpoView+Binding.swift +268 -0
- package/ios/NativeEditorExpoView+Diagnostics.swift +66 -0
- package/ios/NativeEditorExpoView+Events.swift +131 -0
- package/ios/NativeEditorExpoView+Focus.swift +169 -0
- package/ios/NativeEditorExpoView+MentionRetry.swift +288 -0
- package/ios/NativeEditorExpoView+Mentions.swift +288 -0
- package/ios/NativeEditorExpoView+Properties.swift +300 -0
- package/ios/NativeEditorExpoView+Toolbar.swift +86 -0
- package/ios/NativeEditorExpoView+Updates.swift +312 -0
- package/ios/NativeEditorExpoView.swift +349 -0
- package/ios/NativeEditorModule.swift +856 -0
- package/ios/NativeEditorViewRegistry.swift +226 -0
- package/ios/NativeToolbar+ButtonStyle.swift +214 -0
- package/ios/NativeToolbar+Buttons.swift +228 -0
- package/ios/NativeToolbar+Diagnostics.swift +114 -0
- package/ios/NativeToolbar+Menu.swift +101 -0
- package/ios/NativeToolbar+Models.swift +519 -0
- package/ios/NativeToolbar+Placeholder.swift +39 -0
- package/ios/NativeToolbar.swift +612 -0
- package/ios/OrderedListMarkerFormatter.swift +103 -0
- package/ios/PositionBridge.swift +596 -0
- package/ios/ProseViewerView.swift +462 -0
- package/ios/RenderBridge+Atoms.swift +288 -0
- package/ios/RenderBridge+Attachments.swift +246 -0
- package/ios/RenderBridge+BlockBoundaries.swift +313 -0
- package/ios/RenderBridge+Style.swift +343 -0
- package/ios/RenderBridge.swift +704 -0
- package/ios/RichTextEditorView.swift +930 -0
- package/ios/SharedNativeImagePipeline+Cache.swift +189 -0
- package/ios/SharedNativeImagePipeline+Transport.swift +328 -0
- package/ios/SharedNativeImagePipeline.swift +533 -0
- package/ios/Viewer/CoreTextProseLayoutEngine+AttributedText.swift +436 -0
- package/ios/Viewer/CoreTextProseLayoutEngine+Models.swift +322 -0
- package/ios/Viewer/CoreTextProseLayoutEngine.swift +635 -0
- package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.h +4 -0
- package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.mm +767 -0
- package/ios/Viewer/Fabric/PreparedProseMeasurementsManager.mm +118 -0
- package/ios/Viewer/NativeSVGImageDecoder.h +9 -0
- package/ios/Viewer/NativeSVGImageDecoder.mm +106 -0
- package/ios/Viewer/NativeSVGPreflight.h +11 -0
- package/ios/Viewer/NativeSVGPreflight.mm +219 -0
- package/ios/Viewer/PreparedProseDrawingView.swift +639 -0
- package/ios/Viewer/PreparedProseInstrumentation.swift +387 -0
- package/ios/Viewer/PreparedProseLayout.swift +326 -0
- package/ios/Viewer/PreparedProseLayoutCache.swift +766 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+Artifacts.swift +377 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+Fabric.swift +582 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+FabricOwnership.swift +128 -0
- package/ios/Viewer/PreparedProseLayoutRegistry.swift +381 -0
- package/ios/Viewer/ViewerDocument.swift +575 -0
- package/ios/Viewer/ViewerFontEnvironment.swift +283 -0
- package/ios/Viewer/ViewerImagePipeline.swift +478 -0
- package/ios/editor_coreFFI/editor_coreFFI.h +1023 -0
- package/ios/editor_coreFFI/module.modulemap +7 -0
- package/package.json +151 -0
- package/react-native.config.js +17 -0
- package/rust/android/arm64-v8a/libeditor_core.so +0 -0
- package/rust/android/armeabi-v7a/libeditor_core.so +0 -0
- package/rust/android/x86/libeditor_core.so +0 -0
- package/rust/android/x86_64/libeditor_core.so +0 -0
- package/rust/bindings/kotlin/uniffi/editor_core/editor_core.kt +3146 -0
- package/src/AtomHost.tsx +180 -0
- package/src/DefaultAtomChip.tsx +27 -0
- package/src/EditorAddon.ts +65 -0
- package/src/EditorAddonNormalization.ts +49 -0
- package/src/EditorMentionThemeNormalization.ts +25 -0
- package/src/EditorMentionThemeValidation.ts +133 -0
- package/src/EditorStyleSheet.ts +9 -0
- package/src/EditorStyleSheetNormalization.ts +219 -0
- package/src/EditorStyleSheetTypes.ts +189 -0
- package/src/EditorTheme.ts +196 -0
- package/src/EditorToolbar.tsx +31 -0
- package/src/EditorToolbarComponent.tsx +23 -0
- package/src/EditorToolbarItems.tsx +64 -0
- package/src/EditorToolbarRegistry.tsx +254 -0
- package/src/EditorToolbarTypes.tsx +322 -0
- package/src/EditorToolbarVisuals.tsx +270 -0
- package/src/EditorUpdateRevision.ts +26 -0
- package/src/ExternalTextComposition.ts +658 -0
- package/src/ImageLoadingPolicy.ts +125 -0
- package/src/NativeEditorBoundaryError.ts +345 -0
- package/src/NativeEditorBridge.ts +93 -0
- package/src/NativeEditorCollaborationTransport.ts +493 -0
- package/src/NativeEditorCreateConfig.ts +326 -0
- package/src/NativeEditorCreateJson.ts +579 -0
- package/src/NativeEditorCreateValidation.ts +178 -0
- package/src/NativeEditorDocumentBridge.ts +485 -0
- package/src/NativeEditorDocumentHandle.ts +168 -0
- package/src/NativeEditorLocalAwareness.ts +168 -0
- package/src/NativeEditorNativeModule.ts +97 -0
- package/src/NativeEditorRenderNormalization.ts +320 -0
- package/src/NativeEditorResultNormalization.ts +469 -0
- package/src/NativeEditorTypes.ts +366 -0
- package/src/NativeEditorV2Decimal.ts +13 -0
- package/src/NativeProseViewer.tsx +356 -0
- package/src/NativeRichTextEditor.tsx +33 -0
- package/src/ResourceLimits.ts +187 -0
- package/src/RichTextEditor.tsx +27 -0
- package/src/RichTextEditorNativeTypes.tsx +144 -0
- package/src/RichTextEditorNativeView.tsx +21 -0
- package/src/RichTextEditorSerialization.tsx +381 -0
- package/src/RichTextEditorTypes.tsx +327 -0
- package/src/ViewerConfiguration.ts +23 -0
- package/src/YjsCollaboration.ts +692 -0
- package/src/addons.ts +311 -0
- package/src/atomConstants.ts +3 -0
- package/src/atomInstances.ts +123 -0
- package/src/atomPolicy.ts +47 -0
- package/src/atomUpdates.ts +52 -0
- package/src/atoms.ts +379 -0
- package/src/attributeValidation.ts +116 -0
- package/src/contentExpression.ts +338 -0
- package/src/index.ts +295 -0
- package/src/listMarkers.ts +18 -0
- package/src/schemaDefinition.ts +395 -0
- package/src/schemaDocument.ts +92 -0
- package/src/schemaDocumentConstruction.ts +148 -0
- package/src/schemaNormalization.ts +367 -0
- package/src/schemaPresets.ts +250 -0
- package/src/schemaResolution.ts +242 -0
- package/src/schemas.ts +43 -0
- package/src/specs/PreparedProseViewerNativeComponent.ts +40 -0
- package/src/useEditorToolbarInteractions.tsx +329 -0
- package/src/useEditorToolbarItems.tsx +390 -0
- package/src/useEditorToolbarPresentation.tsx +483 -0
- package/src/useEditorToolbarState.tsx +172 -0
- package/src/useFocusPreservingFrames.ts +171 -0
- package/src/useNativeEditor.ts +534 -0
- package/src/useRichTextEditorCommands.tsx +478 -0
- package/src/useRichTextEditorEvents.tsx +342 -0
- package/src/useRichTextEditorMentions.tsx +441 -0
- package/src/useRichTextEditorPresentation.tsx +563 -0
- package/src/useRichTextEditorState.tsx +620 -0
- package/src/useRichTextEditorUpdates.tsx +403 -0
- package/src/useViewerAtoms.tsx +427 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
package com.apollohg.editor
|
|
2
|
+
|
|
3
|
+
import org.json.JSONArray
|
|
4
|
+
import org.json.JSONObject
|
|
5
|
+
|
|
6
|
+
internal sealed interface SelectionSyncOutcome {
|
|
7
|
+
object Ok : SelectionSyncOutcome
|
|
8
|
+
data class Refreshed(val updateJson: String) : SelectionSyncOutcome
|
|
9
|
+
object Failed : SelectionSyncOutcome
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
internal fun EditorV2Adapter.clampScalar(scalar: Int): Int {
|
|
13
|
+
val extent = cachedScalarLength ?: return scalar
|
|
14
|
+
return scalar.coerceIn(0, extent)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
internal fun EditorV2Adapter.selectAtomNode(docPos: Int): String? {
|
|
18
|
+
val selection = JSONObject().put("type", "atom").put("docPos", docPos).put("edge", "node")
|
|
19
|
+
return when (
|
|
20
|
+
val result = callWithEnvelope(JSONObject().put("selection", selection)) {
|
|
21
|
+
backend.setSelection(editorId, it)
|
|
22
|
+
}
|
|
23
|
+
) {
|
|
24
|
+
is EditorV2CallResult.Err -> handleMutationError(result.error)
|
|
25
|
+
|
|
26
|
+
is EditorV2CallResult.Ok -> {
|
|
27
|
+
invalidateCachedAtomicState(null)
|
|
28
|
+
recoverNativeRender()
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
internal fun EditorV2Adapter.invalidateCachedAtomicState(selection: IntArray?) {
|
|
34
|
+
cachedAuthoritativeScalarSelection = selection?.copyOf()
|
|
35
|
+
cachedScalarLength = null
|
|
36
|
+
cachedActiveState = null
|
|
37
|
+
cachedHistoryState = null
|
|
38
|
+
cachedViewUpdateJson = null
|
|
39
|
+
cachedAtomicRenderJson = null
|
|
40
|
+
cachedAtomicRenderDocumentRevision = null
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
internal fun EditorV2Adapter.ensureSelection(anchor: Int, head: Int): SelectionSyncOutcome {
|
|
44
|
+
val clampedAnchor = clampScalar(anchor)
|
|
45
|
+
val clampedHead = clampScalar(head)
|
|
46
|
+
val last = lastSyncedScalarSelection
|
|
47
|
+
if (last != null && last[0] == clampedAnchor && last[1] == clampedHead) {
|
|
48
|
+
return SelectionSyncOutcome.Ok
|
|
49
|
+
}
|
|
50
|
+
// Affinity policy mirrors the engine's own cursor resolution: a
|
|
51
|
+
// collapsed caret prefers After with a deterministic Before fallback
|
|
52
|
+
// at text-boundary positions; a range uses Before. The fallback
|
|
53
|
+
// changes only the stickiness of the SAME position.
|
|
54
|
+
val collapsed = clampedAnchor == clampedHead
|
|
55
|
+
var result = callWithEnvelope(
|
|
56
|
+
selectionEnvelope(clampedAnchor, clampedHead, if (collapsed) "after" else "before")
|
|
57
|
+
) { requestJson ->
|
|
58
|
+
backend.setSelection(editorId, requestJson)
|
|
59
|
+
}
|
|
60
|
+
if (collapsed &&
|
|
61
|
+
result is EditorV2CallResult.Err &&
|
|
62
|
+
result.error.code == "POSITION_INVALID"
|
|
63
|
+
) {
|
|
64
|
+
result =
|
|
65
|
+
callWithEnvelope(
|
|
66
|
+
selectionEnvelope(clampedAnchor, clampedHead, "before")
|
|
67
|
+
) { requestJson ->
|
|
68
|
+
backend.setSelection(editorId, requestJson)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return when (result) {
|
|
72
|
+
is EditorV2CallResult.Ok -> {
|
|
73
|
+
parseMutationOutcome(result.value)?.let { outcome ->
|
|
74
|
+
if (outcome is MutationOutcome.Transaction) {
|
|
75
|
+
baseDocumentRevision = outcome.revision
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
val synchronizedSelection = intArrayOf(clampedAnchor, clampedHead)
|
|
79
|
+
lastSyncedScalarSelection = synchronizedSelection
|
|
80
|
+
cachedAuthoritativeScalarSelection = synchronizedSelection.copyOf()
|
|
81
|
+
// Selection changes can affect active state and state revision,
|
|
82
|
+
// but retain the last atomic history result until a document
|
|
83
|
+
// mutation supplies its next locked snapshot.
|
|
84
|
+
cachedActiveState = null
|
|
85
|
+
cachedViewUpdateJson = null
|
|
86
|
+
cachedAtomicRenderJson = null
|
|
87
|
+
cachedAtomicRenderDocumentRevision = null
|
|
88
|
+
SelectionSyncOutcome.Ok
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
is EditorV2CallResult.Err -> {
|
|
92
|
+
if (result.error.code == "REVISION_MISMATCH") {
|
|
93
|
+
val update = refreshInternal(null, stripViewSelection = false)
|
|
94
|
+
if (update != null) {
|
|
95
|
+
SelectionSyncOutcome.Refreshed(update)
|
|
96
|
+
} else {
|
|
97
|
+
SelectionSyncOutcome.Failed
|
|
98
|
+
}
|
|
99
|
+
} else {
|
|
100
|
+
emit(result.error)
|
|
101
|
+
SelectionSyncOutcome.Failed
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
internal fun EditorV2Adapter.textDocumentSelection(updateJson: String): IntArray? {
|
|
108
|
+
return try {
|
|
109
|
+
val selection = JSONObject(updateJson).getJSONObject("selection")
|
|
110
|
+
if (selection.optString("type") != "text") return null
|
|
111
|
+
intArrayOf(
|
|
112
|
+
scalarField(selection, "anchor") ?: return null,
|
|
113
|
+
scalarField(selection, "head") ?: return null
|
|
114
|
+
)
|
|
115
|
+
} catch (error: Exception) {
|
|
116
|
+
null
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
internal fun EditorV2Adapter.resolveSelectionMapping(anchor: Int, head: Int): IntArray? {
|
|
121
|
+
// Engine-authoritative scalar→doc selection mapping for the delegate
|
|
122
|
+
// callback's doc positions (v2 accessor).
|
|
123
|
+
val resolved = when (val result = backend.resolveScalarSelection(editorId, anchor, head)) {
|
|
124
|
+
is EditorV2CallResult.Err -> {
|
|
125
|
+
debugNotes.add("resolveScalarSelection ${result.error.domain}/${result.error.code}")
|
|
126
|
+
return null
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
is EditorV2CallResult.Ok -> result.value
|
|
130
|
+
}
|
|
131
|
+
return try {
|
|
132
|
+
val selection = JSONObject(resolved)
|
|
133
|
+
intArrayOf(
|
|
134
|
+
scalarField(selection, "anchor") ?: return null,
|
|
135
|
+
scalarField(selection, "head") ?: return null
|
|
136
|
+
)
|
|
137
|
+
} catch (error: Exception) {
|
|
138
|
+
null
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
internal fun EditorV2Adapter.publishCachedCollaborationSelection() {
|
|
143
|
+
if (!roomBound) return
|
|
144
|
+
val selection = cachedAuthoritativeScalarSelection ?: return
|
|
145
|
+
val mapping = resolveSelectionMapping(selection[0], selection[1]) ?: return
|
|
146
|
+
publishCollaborationSelection(mapping[0], mapping[1])
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
internal fun EditorV2Adapter.publishCollaborationSelection(docAnchor: Int, docHead: Int) {
|
|
150
|
+
if (!roomBound) return
|
|
151
|
+
val selectionJson = JSONObject()
|
|
152
|
+
.put("type", "text")
|
|
153
|
+
.put("anchor", docAnchor)
|
|
154
|
+
.put("head", docHead)
|
|
155
|
+
.toString()
|
|
156
|
+
when (
|
|
157
|
+
val result = backend.collaborationSetAwarenessSelection(
|
|
158
|
+
editorId,
|
|
159
|
+
selectionJson
|
|
160
|
+
)
|
|
161
|
+
) {
|
|
162
|
+
is EditorV2CallResult.Err -> emit(result.error)
|
|
163
|
+
|
|
164
|
+
is EditorV2CallResult.Ok -> {
|
|
165
|
+
val outboundChanged = try {
|
|
166
|
+
val value = JSONObject(result.value)
|
|
167
|
+
if (value.length() != 1 ||
|
|
168
|
+
!value.has("outboundChanged") ||
|
|
169
|
+
value.opt("outboundChanged") !is Boolean
|
|
170
|
+
) {
|
|
171
|
+
null
|
|
172
|
+
} else {
|
|
173
|
+
value.getBoolean("outboundChanged")
|
|
174
|
+
}
|
|
175
|
+
} catch (error: Exception) {
|
|
176
|
+
null
|
|
177
|
+
}
|
|
178
|
+
if (outboundChanged == null) {
|
|
179
|
+
emit(
|
|
180
|
+
EditorV2Adapter.contractError(
|
|
181
|
+
"awareness selection result violates the frozen shape"
|
|
182
|
+
)
|
|
183
|
+
)
|
|
184
|
+
} else if (outboundChanged) {
|
|
185
|
+
collaborationWake(editorId, CollaborationWakeReason.AWARENESS)
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
internal fun EditorV2Adapter.mapPosition(result: EditorV2CallResult<String>, key: String): Int? =
|
|
192
|
+
when (result) {
|
|
193
|
+
is EditorV2CallResult.Err -> {
|
|
194
|
+
emit(result.error)
|
|
195
|
+
null
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
is EditorV2CallResult.Ok -> try {
|
|
199
|
+
scalarField(JSONObject(result.value), key)
|
|
200
|
+
} catch (error: Exception) {
|
|
201
|
+
null
|
|
202
|
+
}
|
|
203
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
package com.apollohg.editor
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The v2 backend contract: the v2 engine verbs plus the v2
|
|
5
|
+
* render/selection/position accessor. The production implementation
|
|
6
|
+
* (`UniffiEditorV2Backend`) calls the real `editorV2*` UniFFI entries;
|
|
7
|
+
* tests substitute `FakeEditorV2Backend`.
|
|
8
|
+
*/
|
|
9
|
+
internal data class EditorV2Error(
|
|
10
|
+
val domain: String,
|
|
11
|
+
val code: String,
|
|
12
|
+
val message: String,
|
|
13
|
+
val requestId: String? = null,
|
|
14
|
+
val operationIndex: String? = null,
|
|
15
|
+
val limit: String? = null,
|
|
16
|
+
val actual: String? = null,
|
|
17
|
+
val detailsJson: String? = null
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
internal sealed interface EditorV2CallResult<out T> {
|
|
21
|
+
data class Ok<T>(val value: T) : EditorV2CallResult<T>
|
|
22
|
+
data class Err(val error: EditorV2Error) : EditorV2CallResult<Nothing>
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
internal data class EditorV2OutboundLease(val leaseId: String, val frame: ByteArray)
|
|
26
|
+
|
|
27
|
+
internal sealed interface EditorV2LeaseResult {
|
|
28
|
+
data class Value(val lease: EditorV2OutboundLease) : EditorV2LeaseResult
|
|
29
|
+
data object Empty : EditorV2LeaseResult
|
|
30
|
+
data class Err(val error: EditorV2Error) : EditorV2LeaseResult
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
internal interface EditorV2Backend {
|
|
34
|
+
fun create(configJson: String, snapshotState: ByteArray?): EditorV2CallResult<String>
|
|
35
|
+
fun destroy(editorId: String): EditorV2Error?
|
|
36
|
+
fun getState(editorId: String): EditorV2CallResult<String>
|
|
37
|
+
fun getDocumentJson(editorId: String): EditorV2CallResult<String>
|
|
38
|
+
fun getDocumentHtml(editorId: String): EditorV2CallResult<String>
|
|
39
|
+
fun getContentSnapshot(editorId: String): EditorV2CallResult<String>
|
|
40
|
+
fun applyInput(editorId: String, requestJson: String): EditorV2CallResult<String>
|
|
41
|
+
fun applyCommand(editorId: String, requestJson: String): EditorV2CallResult<String>
|
|
42
|
+
fun applyLocalApi(editorId: String, requestJson: String): EditorV2CallResult<String>
|
|
43
|
+
fun replaceDocument(editorId: String, requestJson: String): EditorV2CallResult<String>
|
|
44
|
+
fun setSelection(editorId: String, requestJson: String): EditorV2CallResult<String>
|
|
45
|
+
fun undo(editorId: String, requestJson: String): EditorV2CallResult<String>
|
|
46
|
+
fun redo(editorId: String, requestJson: String): EditorV2CallResult<String>
|
|
47
|
+
fun collaborationDrive(editorId: String, nowMillis: String): EditorV2CallResult<String>
|
|
48
|
+
fun collaborationSocketOpen(
|
|
49
|
+
editorId: String,
|
|
50
|
+
generation: String,
|
|
51
|
+
nowMillis: String
|
|
52
|
+
): EditorV2CallResult<String>
|
|
53
|
+
fun collaborationReceive(
|
|
54
|
+
editorId: String,
|
|
55
|
+
generation: String,
|
|
56
|
+
message: ByteArray,
|
|
57
|
+
nowMillis: String
|
|
58
|
+
): EditorV2CallResult<String>
|
|
59
|
+
fun collaborationSocketClose(
|
|
60
|
+
editorId: String,
|
|
61
|
+
generation: String,
|
|
62
|
+
code: UInt?,
|
|
63
|
+
reason: String?,
|
|
64
|
+
nowMillis: String
|
|
65
|
+
): EditorV2CallResult<String>
|
|
66
|
+
fun collaborationLeaseOutbound(editorId: String, generation: String): EditorV2LeaseResult
|
|
67
|
+
fun collaborationAckOutbound(
|
|
68
|
+
editorId: String,
|
|
69
|
+
generation: String,
|
|
70
|
+
leaseId: String
|
|
71
|
+
): EditorV2CallResult<String>
|
|
72
|
+
fun collaborationNackOutbound(
|
|
73
|
+
editorId: String,
|
|
74
|
+
generation: String,
|
|
75
|
+
leaseId: String
|
|
76
|
+
): EditorV2CallResult<String>
|
|
77
|
+
fun collaborationDetach(editorId: String): EditorV2Error?
|
|
78
|
+
fun collaborationReattach(editorId: String): EditorV2Error?
|
|
79
|
+
fun collaborationPeers(editorId: String): EditorV2CallResult<String>
|
|
80
|
+
fun collaborationSetAwarenessSelection(
|
|
81
|
+
editorId: String,
|
|
82
|
+
selectionJson: String
|
|
83
|
+
): EditorV2CallResult<String>
|
|
84
|
+
fun snapshotExport(editorId: String): EditorV2CallResult<Pair<String, ByteArray>>
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* The v2 render accessor: from the LIVE v2 session produce the
|
|
88
|
+
* complete locked atomic snapshot: render blocks/patch, selection,
|
|
89
|
+
* active/history state, canonical document/state revisions, and scalar
|
|
90
|
+
* extent. The adapter must parse and adopt this one result as-is; it
|
|
91
|
+
* must never stitch it to a separate `getState` response.
|
|
92
|
+
*/
|
|
93
|
+
fun renderUpdate(
|
|
94
|
+
editorId: String,
|
|
95
|
+
mirrorAnchor: Int?,
|
|
96
|
+
mirrorHead: Int?
|
|
97
|
+
): EditorV2CallResult<String>
|
|
98
|
+
fun renderNative(
|
|
99
|
+
editorId: String,
|
|
100
|
+
ownerId: String,
|
|
101
|
+
mirrorAnchor: Int?,
|
|
102
|
+
mirrorHead: Int?
|
|
103
|
+
): EditorV2CallResult<String>
|
|
104
|
+
fun pinPositionEpoch(
|
|
105
|
+
editorId: String,
|
|
106
|
+
ownerId: String,
|
|
107
|
+
documentRevision: String
|
|
108
|
+
): EditorV2CallResult<String>
|
|
109
|
+
fun applyNativeIntent(editorId: String, requestJson: String): EditorV2CallResult<String>
|
|
110
|
+
fun releaseNativeBinding(editorId: String, ownerId: String): EditorV2Error?
|
|
111
|
+
|
|
112
|
+
/** Engine-authoritative scalar→doc selection resolution for one session. */
|
|
113
|
+
fun resolveScalarSelection(editorId: String, anchor: Int, head: Int): EditorV2CallResult<String>
|
|
114
|
+
|
|
115
|
+
/** Lenient doc→scalar mapping (clamps at the document extent). */
|
|
116
|
+
fun docToScalar(editorId: String, docPos: Int): EditorV2CallResult<String>
|
|
117
|
+
|
|
118
|
+
/** Lenient scalar→doc mapping (clamps at the document extent). */
|
|
119
|
+
fun scalarToDoc(editorId: String, scalar: Int): EditorV2CallResult<String>
|
|
120
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
package com.apollohg.editor
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Render returned by a block-split request. A refresh-only render keeps the
|
|
5
|
+
* native view coherent but must not be treated as a locally committed split.
|
|
6
|
+
*/
|
|
7
|
+
internal data class EditorV2SplitRender(val updateJson: String, val committed: Boolean)
|
|
8
|
+
|
|
9
|
+
internal data class EditorV2SelectionSync(
|
|
10
|
+
val docAnchor: Int,
|
|
11
|
+
val docHead: Int,
|
|
12
|
+
val refreshedUpdateJson: String?
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
internal data class EditorV2NativeMutationRender(
|
|
16
|
+
val updateJson: String,
|
|
17
|
+
val changed: Boolean,
|
|
18
|
+
val documentChanged: Boolean
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
internal sealed interface EditorV2NativeIntentResult {
|
|
22
|
+
data class Applied(val render: EditorV2NativeMutationRender) : EditorV2NativeIntentResult
|
|
23
|
+
data class Recovered(val updateJson: String) : EditorV2NativeIntentResult
|
|
24
|
+
data object Rejected : EditorV2NativeIntentResult
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The v2 driver: the ONLY engine path for views.
|
|
29
|
+
*
|
|
30
|
+
* The views call this interface for every engine interaction; the legacy
|
|
31
|
+
* UniFFI free functions are gone. `EditorV2Adapter` supplies the
|
|
32
|
+
* implementation, whose typed v2 transactions/results are the only engine
|
|
33
|
+
* traffic for paired editors.
|
|
34
|
+
*/
|
|
35
|
+
internal interface EditorV2Driver {
|
|
36
|
+
fun insertText(text: String, atScalarPos: Int): String?
|
|
37
|
+
fun replaceTextRange(scalarFrom: Int, scalarTo: Int, text: String): String?
|
|
38
|
+
fun deleteScalarRange(scalarFrom: Int, scalarTo: Int): String?
|
|
39
|
+
fun replaceTextRangeNative(
|
|
40
|
+
scalarFrom: Int,
|
|
41
|
+
scalarTo: Int,
|
|
42
|
+
text: String
|
|
43
|
+
): EditorV2NativeIntentResult
|
|
44
|
+
fun deleteScalarRangeNative(scalarFrom: Int, scalarTo: Int): EditorV2NativeIntentResult
|
|
45
|
+
fun deleteBackwardAtSelection(anchor: Int, head: Int): String?
|
|
46
|
+
fun splitBlockAt(scalarPos: Int): EditorV2SplitRender?
|
|
47
|
+
fun deleteAndSplit(scalarFrom: Int, scalarTo: Int): EditorV2SplitRender?
|
|
48
|
+
fun moveSelection(anchor: Int, head: Int, destination: Int): String?
|
|
49
|
+
|
|
50
|
+
fun insertNode(nodeType: String, anchor: Int, head: Int): String?
|
|
51
|
+
fun insertContentHtmlAtSelection(html: String, anchor: Int, head: Int): String?
|
|
52
|
+
fun insertContentJsonAtSelection(json: String, anchor: Int, head: Int): String?
|
|
53
|
+
fun toggleMark(markName: String, anchor: Int, head: Int): String?
|
|
54
|
+
fun setMark(markName: String, attrsJson: String, anchor: Int, head: Int): String?
|
|
55
|
+
fun unsetMark(markName: String, anchor: Int, head: Int): String?
|
|
56
|
+
fun toggleHeading(level: Int, anchor: Int, head: Int): String?
|
|
57
|
+
fun toggleCodeBlock(anchor: Int, head: Int): String?
|
|
58
|
+
fun toggleBlockquote(anchor: Int, head: Int): String?
|
|
59
|
+
fun wrapInList(listType: String, anchor: Int, head: Int): String?
|
|
60
|
+
fun unwrapFromList(anchor: Int, head: Int): String?
|
|
61
|
+
fun indentListItem(anchor: Int, head: Int): String?
|
|
62
|
+
fun outdentListItem(anchor: Int, head: Int): String?
|
|
63
|
+
fun toggleTaskItemCheckedAtSelection(anchor: Int, head: Int): String?
|
|
64
|
+
fun resizeImageAtDocPos(docPos: Int, width: Int, height: Int): String?
|
|
65
|
+
|
|
66
|
+
fun undo(): String?
|
|
67
|
+
fun redo(): String?
|
|
68
|
+
|
|
69
|
+
fun syncSelection(anchor: Int, head: Int): EditorV2SelectionSync?
|
|
70
|
+
fun syncSelectionQuiet(anchor: Int, head: Int): String?
|
|
71
|
+
fun scalarPositionForDoc(docPos: Int): Int?
|
|
72
|
+
fun docPositionForScalar(scalar: Int): Int?
|
|
73
|
+
|
|
74
|
+
fun currentStateJson(): String?
|
|
75
|
+
fun documentHtml(): String?
|
|
76
|
+
fun documentJson(): String?
|
|
77
|
+
fun contentSnapshotJson(): String?
|
|
78
|
+
fun historyCanUndo(): Boolean?
|
|
79
|
+
fun historyCanRedo(): Boolean?
|
|
80
|
+
fun selectionJson(): String?
|
|
81
|
+
|
|
82
|
+
fun setContentHtml(html: String): String?
|
|
83
|
+
fun setContentJson(json: String): String?
|
|
84
|
+
|
|
85
|
+
/** Stale-revision recovery: refresh from Rust state, never retry the failed op. */
|
|
86
|
+
fun refreshFromRustState(mirrorSelection: IntArray?): String?
|
|
87
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
package com.apollohg.editor
|
|
2
|
+
|
|
3
|
+
import java.util.concurrent.ConcurrentHashMap
|
|
4
|
+
import java.util.concurrent.atomic.AtomicLong
|
|
5
|
+
|
|
6
|
+
internal enum class EditorV2DestroyReservationResult {
|
|
7
|
+
RESERVED,
|
|
8
|
+
ALREADY_IN_PROGRESS
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
internal fun <T> invokeDestroyTestingHook(hook: ((T) -> Unit)?, value: T) {
|
|
12
|
+
try {
|
|
13
|
+
hook?.invoke(value)
|
|
14
|
+
} catch (_: Throwable) {
|
|
15
|
+
// Destroy test hooks are observational and cannot alter the transaction.
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The v2 pairing registry keeps the public editor handle as its canonical
|
|
21
|
+
* decimal string. A separate, opaque view token exists only for the Android
|
|
22
|
+
* widget lifecycle; it never crosses the JS/native or native/Rust boundary.
|
|
23
|
+
*/
|
|
24
|
+
internal object EditorV2Registry {
|
|
25
|
+
private data class Pairing(
|
|
26
|
+
val handle: String,
|
|
27
|
+
val viewToken: Long,
|
|
28
|
+
val adapter: EditorV2Adapter
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
private val pairingsByHandle = ConcurrentHashMap<String, Pairing>()
|
|
32
|
+
private val pairingsByViewToken = ConcurrentHashMap<Long, Pairing>()
|
|
33
|
+
private val destroyingHandles = ConcurrentHashMap.newKeySet<String>()
|
|
34
|
+
private val nextViewToken = AtomicLong(0)
|
|
35
|
+
|
|
36
|
+
@Volatile
|
|
37
|
+
internal var onHandleDestroyReservationAcquiredForTesting: ((String) -> Unit)? = null
|
|
38
|
+
|
|
39
|
+
@Volatile
|
|
40
|
+
internal var onDestroyFfiResultReceivedForTesting: ((String) -> Unit)? = null
|
|
41
|
+
|
|
42
|
+
@Volatile
|
|
43
|
+
internal var onPairRemovedBeforeDestroyFinalizationForTesting: ((String) -> Unit)? = null
|
|
44
|
+
|
|
45
|
+
fun register(adapter: EditorV2Adapter): Long {
|
|
46
|
+
val token = nextViewToken.incrementAndGet()
|
|
47
|
+
check(token > 0L) { "native editor view token overflow" }
|
|
48
|
+
val pairing = Pairing(adapter.editorId, token, adapter)
|
|
49
|
+
pairingsByHandle[adapter.editorId] = pairing
|
|
50
|
+
pairingsByViewToken[token] = pairing
|
|
51
|
+
return token
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
fun viewTokenForHandle(handle: String): Long? = pairingsByHandle[handle]?.viewToken
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The public v2 handle owns the destroy transaction. It is deliberately
|
|
58
|
+
* separate from the mutable pairing so contenders still observe the
|
|
59
|
+
* transaction after the owner has removed that pairing.
|
|
60
|
+
*/
|
|
61
|
+
fun acquireHandleDestroyReservation(handle: String): EditorV2DestroyReservationResult {
|
|
62
|
+
if (!destroyingHandles.add(handle)) {
|
|
63
|
+
return EditorV2DestroyReservationResult.ALREADY_IN_PROGRESS
|
|
64
|
+
}
|
|
65
|
+
invokeDestroyTestingHook(onHandleDestroyReservationAcquiredForTesting, handle)
|
|
66
|
+
return EditorV2DestroyReservationResult.RESERVED
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
fun releaseHandleDestroyReservation(handle: String) {
|
|
70
|
+
destroyingHandles.remove(handle)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
internal fun isHandleDestroyReservedForTesting(handle: String): Boolean =
|
|
74
|
+
destroyingHandles.contains(handle)
|
|
75
|
+
|
|
76
|
+
fun adapterForViewToken(viewToken: Long): EditorV2Adapter? =
|
|
77
|
+
pairingsByViewToken[viewToken]?.adapter
|
|
78
|
+
|
|
79
|
+
fun handleForViewToken(viewToken: Long): String? = pairingsByViewToken[viewToken]?.handle
|
|
80
|
+
|
|
81
|
+
/** Cancel view-owned callbacks without releasing the pairing itself. */
|
|
82
|
+
fun cancelAutonomousErrorOwner(handle: String) {
|
|
83
|
+
pairingsByHandle[handle]?.adapter?.releaseAutonomousErrorOwner()
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
fun remove(handle: String): EditorV2Adapter? {
|
|
87
|
+
val pairing = pairingsByHandle.remove(handle) ?: return null
|
|
88
|
+
pairingsByViewToken.remove(pairing.viewToken)
|
|
89
|
+
pairing.adapter.releaseAutonomousErrorOwner()
|
|
90
|
+
return pairing.adapter
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Drop a pairing after the public v2 destroy entry has handled its session. */
|
|
94
|
+
fun dropPair(handle: String) {
|
|
95
|
+
remove(handle)
|
|
96
|
+
}
|
|
97
|
+
}
|