@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,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.constructDefaultEmptyDocument = constructDefaultEmptyDocument;
|
|
4
|
+
const contentExpression_1 = require("./contentExpression");
|
|
5
|
+
const schemaNormalization_1 = require("./schemaNormalization");
|
|
6
|
+
function constructDefaultEmptyDocument(schema, resolvedLimits, admittedCollections) {
|
|
7
|
+
const docNode = schema.nodes.find((node) => node.role === 'doc');
|
|
8
|
+
if (!docNode)
|
|
9
|
+
throw new Error('schema cannot construct a default document: missing doc role');
|
|
10
|
+
const budget = { nodes: 0, work: 0, exhausted: false };
|
|
11
|
+
const workLimit = Math.min(contentExpression_1.DEFAULT_CONTENT_MAX_NODES, resolvedLimits.maxSchemaNodes * 64 + resolvedLimits.maxSchemaExpressionBytes * 32);
|
|
12
|
+
const consumeWork = () => {
|
|
13
|
+
if (budget.work >= workLimit) {
|
|
14
|
+
budget.exhausted = true;
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
budget.work += 1;
|
|
18
|
+
return true;
|
|
19
|
+
};
|
|
20
|
+
const candidatePriority = (candidate) => {
|
|
21
|
+
if (candidate.role === 'textBlock' &&
|
|
22
|
+
(candidate.htmlTag === 'p' || candidate.name === 'paragraph')) {
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
return candidate.role === 'textBlock' ? 1 : 2;
|
|
26
|
+
};
|
|
27
|
+
const candidatesBySymbol = new Map();
|
|
28
|
+
let candidateIndexAdmitted = true;
|
|
29
|
+
const addCandidate = (symbol, candidate) => {
|
|
30
|
+
if (!consumeWork())
|
|
31
|
+
return false;
|
|
32
|
+
const candidates = candidatesBySymbol.get(symbol);
|
|
33
|
+
if (candidates)
|
|
34
|
+
candidates.push(candidate);
|
|
35
|
+
else
|
|
36
|
+
candidatesBySymbol.set(symbol, [candidate]);
|
|
37
|
+
return true;
|
|
38
|
+
};
|
|
39
|
+
for (const candidate of schema.nodes) {
|
|
40
|
+
if (!addCandidate(candidate.name, candidate)) {
|
|
41
|
+
candidateIndexAdmitted = false;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
for (const group of admittedCollections.groupsByNode.get(candidate) ?? []) {
|
|
45
|
+
if (group !== candidate.name && !addCandidate(group, candidate)) {
|
|
46
|
+
candidateIndexAdmitted = false;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (!candidateIndexAdmitted)
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
for (const candidates of candidatesBySymbol.values()) {
|
|
54
|
+
const sortingWork = Math.max(candidates.length, Math.ceil(candidates.length * Math.log2(Math.max(2, candidates.length))));
|
|
55
|
+
for (let index = 0; index < sortingWork; index += 1) {
|
|
56
|
+
if (!consumeWork()) {
|
|
57
|
+
candidateIndexAdmitted = false;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (!candidateIndexAdmitted)
|
|
62
|
+
break;
|
|
63
|
+
candidates.sort((left, right) => candidatePriority(left) - candidatePriority(right) ||
|
|
64
|
+
left.name.localeCompare(right.name));
|
|
65
|
+
}
|
|
66
|
+
if (!candidateIndexAdmitted) {
|
|
67
|
+
throw (0, schemaNormalization_1.schemaBoundaryError)(workLimit, workLimit + 1);
|
|
68
|
+
}
|
|
69
|
+
const constructNode = (node, visiting, depth) => {
|
|
70
|
+
if (depth > Math.min(contentExpression_1.CONTENT_EXPRESSION_MAX_DEPTH, resolvedLimits.maxDocumentDepth) ||
|
|
71
|
+
!consumeWork()) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
if (node.role === 'text' || visiting.has(node.name))
|
|
75
|
+
return undefined;
|
|
76
|
+
const attrs = admittedCollections.attrsByNode.get(node) ?? [];
|
|
77
|
+
for (const _attr of attrs) {
|
|
78
|
+
if (!consumeWork()) {
|
|
79
|
+
budget.exhausted = true;
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (attrs.some(([, spec]) => spec.default === undefined)) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
visiting.add(node.name);
|
|
87
|
+
const children = (0, contentExpression_1.minimalContentMatch)(node.content ?? '', (symbol) => {
|
|
88
|
+
for (const candidate of candidatesBySymbol.get(symbol) ?? []) {
|
|
89
|
+
if (!consumeWork())
|
|
90
|
+
return undefined;
|
|
91
|
+
const constructed = constructNode(candidate, visiting, depth + 1);
|
|
92
|
+
if (constructed)
|
|
93
|
+
return constructed;
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}, consumeWork);
|
|
97
|
+
visiting.delete(node.name);
|
|
98
|
+
if (!children)
|
|
99
|
+
return undefined;
|
|
100
|
+
if (budget.nodes >= resolvedLimits.maxDocumentNodes) {
|
|
101
|
+
budget.exhausted = true;
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
budget.nodes += 1;
|
|
105
|
+
const result = { type: node.json?.type ?? node.name };
|
|
106
|
+
if (children.length > 0)
|
|
107
|
+
result.content = children;
|
|
108
|
+
const projectedAttrs = Object.entries(node.json?.attrs ?? {});
|
|
109
|
+
if (attrs.length > 0 || projectedAttrs.length > 0) {
|
|
110
|
+
result.attrs = Object.fromEntries([
|
|
111
|
+
...attrs.map(([name, spec]) => [name, spec.default]),
|
|
112
|
+
...projectedAttrs,
|
|
113
|
+
]);
|
|
114
|
+
}
|
|
115
|
+
return result;
|
|
116
|
+
};
|
|
117
|
+
const document = constructNode(docNode, new Set(), 0);
|
|
118
|
+
if (!document) {
|
|
119
|
+
if (budget.exhausted || budget.work >= workLimit) {
|
|
120
|
+
throw (0, schemaNormalization_1.schemaBoundaryError)(workLimit, workLimit + 1);
|
|
121
|
+
}
|
|
122
|
+
throw new Error(`schema cannot construct a default document for '${docNode.name}'`);
|
|
123
|
+
}
|
|
124
|
+
return document;
|
|
125
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type NodeSpec, type AttrSpec, type NodeJSONProjection, type NodeHtmlRules, type SchemaDefinition } from './schemaDefinition';
|
|
2
|
+
import { NativeEditorBoundaryError } from './NativeEditorBoundaryError';
|
|
3
|
+
export declare function schemaBoundaryError(limit: number, actual: number): NativeEditorBoundaryError;
|
|
4
|
+
/** Mirror native's invalid-schema fallback before constructing an empty doc. */
|
|
5
|
+
export declare function utf8ByteLengthUpTo(value: string, maximum: number): number;
|
|
6
|
+
export declare function forEachGroupToken(group: string, visit: (token: string) => void, consumeCharacter?: () => boolean, consumeToken?: () => boolean): boolean;
|
|
7
|
+
export interface SchemaWorkBudget {
|
|
8
|
+
readonly limit: number;
|
|
9
|
+
work: number;
|
|
10
|
+
exhausted: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface AdmittedSchemaCollections {
|
|
13
|
+
readonly groupsByNode: ReadonlyMap<NodeSpec, readonly string[]>;
|
|
14
|
+
readonly attrsByNode: ReadonlyMap<NodeSpec, ReadonlyArray<[string, AttrSpec]>>;
|
|
15
|
+
}
|
|
16
|
+
export declare function consumeSchemaWork(budget: SchemaWorkBudget): boolean;
|
|
17
|
+
export declare function consumeSchemaWorkAmount(budget: SchemaWorkBudget, amount: number): boolean;
|
|
18
|
+
export declare function consumeSchemaStringWork(budget: SchemaWorkBudget, value: string): boolean;
|
|
19
|
+
export declare function collectOwnAttrs(value: unknown, budget: SchemaWorkBudget): Array<[string, AttrSpec]> | null;
|
|
20
|
+
export declare function isSafeHtmlTag(tag: string): boolean;
|
|
21
|
+
export declare function isSafeHtmlAttr(name: string): boolean;
|
|
22
|
+
export declare function normalizeAttrs(value: unknown): Record<string, AttrSpec>;
|
|
23
|
+
export declare function normalizeNodeJSONProjection(value: unknown): NodeJSONProjection | null | undefined;
|
|
24
|
+
export declare function isSafeAtomHtmlTag(tag: string): boolean;
|
|
25
|
+
export declare function isSafeAtomHtmlAttr(name: string): boolean;
|
|
26
|
+
export declare function normalizeNodeHtmlRules(value: unknown): NodeHtmlRules | null | undefined;
|
|
27
|
+
export declare function projectionAttrsOverlap(left: Record<string, unknown>, right: Record<string, unknown>): boolean;
|
|
28
|
+
export declare function legacyHeadingProjectionName(projection: NodeJSONProjection): string | undefined;
|
|
29
|
+
export declare function normalizeSchemaDefinition(schema: SchemaDefinition, budget?: SchemaWorkBudget): SchemaDefinition | null;
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.schemaBoundaryError = schemaBoundaryError;
|
|
4
|
+
exports.utf8ByteLengthUpTo = utf8ByteLengthUpTo;
|
|
5
|
+
exports.forEachGroupToken = forEachGroupToken;
|
|
6
|
+
exports.consumeSchemaWork = consumeSchemaWork;
|
|
7
|
+
exports.consumeSchemaWorkAmount = consumeSchemaWorkAmount;
|
|
8
|
+
exports.consumeSchemaStringWork = consumeSchemaStringWork;
|
|
9
|
+
exports.collectOwnAttrs = collectOwnAttrs;
|
|
10
|
+
exports.isSafeHtmlTag = isSafeHtmlTag;
|
|
11
|
+
exports.isSafeHtmlAttr = isSafeHtmlAttr;
|
|
12
|
+
exports.normalizeAttrs = normalizeAttrs;
|
|
13
|
+
exports.normalizeNodeJSONProjection = normalizeNodeJSONProjection;
|
|
14
|
+
exports.isSafeAtomHtmlTag = isSafeAtomHtmlTag;
|
|
15
|
+
exports.isSafeAtomHtmlAttr = isSafeAtomHtmlAttr;
|
|
16
|
+
exports.normalizeNodeHtmlRules = normalizeNodeHtmlRules;
|
|
17
|
+
exports.projectionAttrsOverlap = projectionAttrsOverlap;
|
|
18
|
+
exports.legacyHeadingProjectionName = legacyHeadingProjectionName;
|
|
19
|
+
exports.normalizeSchemaDefinition = normalizeSchemaDefinition;
|
|
20
|
+
const attributeValidation_1 = require("./attributeValidation");
|
|
21
|
+
const atomPolicy_1 = require("./atomPolicy");
|
|
22
|
+
const schemaDefinition_1 = require("./schemaDefinition");
|
|
23
|
+
const NativeEditorBoundaryError_1 = require("./NativeEditorBoundaryError");
|
|
24
|
+
function schemaBoundaryError(limit, actual) {
|
|
25
|
+
return new NativeEditorBoundaryError_1.NativeEditorBoundaryError('SCHEMA_INVALID', `schema work exceeds configured limit ${limit}`, limit, actual);
|
|
26
|
+
}
|
|
27
|
+
/** Mirror native's invalid-schema fallback before constructing an empty doc. */
|
|
28
|
+
function utf8ByteLengthUpTo(value, maximum) {
|
|
29
|
+
let bytes = 0;
|
|
30
|
+
for (const char of value) {
|
|
31
|
+
const codePoint = char.codePointAt(0) ?? 0;
|
|
32
|
+
bytes += codePoint <= 0x7f ? 1 : codePoint <= 0x7ff ? 2 : codePoint <= 0xffff ? 3 : 4;
|
|
33
|
+
if (bytes > maximum)
|
|
34
|
+
return bytes;
|
|
35
|
+
}
|
|
36
|
+
return bytes;
|
|
37
|
+
}
|
|
38
|
+
function forEachGroupToken(group, visit, consumeCharacter, consumeToken) {
|
|
39
|
+
let tokenStart = -1;
|
|
40
|
+
for (let index = 0; index <= group.length; index += 1) {
|
|
41
|
+
if (index < group.length && consumeCharacter && !consumeCharacter())
|
|
42
|
+
return false;
|
|
43
|
+
const isBoundary = index === group.length || /\s/.test(group[index]);
|
|
44
|
+
if (!isBoundary && tokenStart < 0)
|
|
45
|
+
tokenStart = index;
|
|
46
|
+
if (isBoundary && tokenStart >= 0) {
|
|
47
|
+
if (consumeToken && !consumeToken())
|
|
48
|
+
return false;
|
|
49
|
+
visit(group.slice(tokenStart, index));
|
|
50
|
+
tokenStart = -1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
function consumeSchemaWork(budget) {
|
|
56
|
+
return consumeSchemaWorkAmount(budget, 1);
|
|
57
|
+
}
|
|
58
|
+
function consumeSchemaWorkAmount(budget, amount) {
|
|
59
|
+
if (amount > budget.limit - budget.work) {
|
|
60
|
+
budget.exhausted = true;
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
budget.work += amount;
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
function consumeSchemaStringWork(budget, value) {
|
|
67
|
+
return consumeSchemaWorkAmount(budget, utf8ByteLengthUpTo(value, budget.limit) + 1);
|
|
68
|
+
}
|
|
69
|
+
function collectOwnAttrs(value, budget) {
|
|
70
|
+
if (value == null || typeof value !== 'object' || Array.isArray(value))
|
|
71
|
+
return [];
|
|
72
|
+
const attrs = [];
|
|
73
|
+
for (const name in value) {
|
|
74
|
+
if (!Object.prototype.hasOwnProperty.call(value, name))
|
|
75
|
+
continue;
|
|
76
|
+
if (!consumeSchemaWork(budget))
|
|
77
|
+
return attrs;
|
|
78
|
+
attrs.push([name, value[name]]);
|
|
79
|
+
}
|
|
80
|
+
return attrs;
|
|
81
|
+
}
|
|
82
|
+
function isSafeHtmlTag(tag) {
|
|
83
|
+
if (tag.length === 0 || tag[0] < 'a' || tag[0] > 'z')
|
|
84
|
+
return false;
|
|
85
|
+
for (let index = 1; index < tag.length; index += 1) {
|
|
86
|
+
const char = tag[index];
|
|
87
|
+
if (!((char >= 'a' && char <= 'z') || (char >= '0' && char <= '9') || char === '-')) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
function isSafeHtmlAttr(name) {
|
|
94
|
+
if (name.length === 0)
|
|
95
|
+
return false;
|
|
96
|
+
const isAlpha = (char) => (char >= 'A' && char <= 'Z') || (char >= 'a' && char <= 'z');
|
|
97
|
+
if (!(isAlpha(name[0]) || name[0] === '_' || name[0] === ':'))
|
|
98
|
+
return false;
|
|
99
|
+
for (let index = 1; index < name.length; index += 1) {
|
|
100
|
+
const char = name[index];
|
|
101
|
+
if (!(isAlpha(char) ||
|
|
102
|
+
(char >= '0' && char <= '9') ||
|
|
103
|
+
char === '_' ||
|
|
104
|
+
char === ':' ||
|
|
105
|
+
char === '.' ||
|
|
106
|
+
char === '-')) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
function normalizeAttrs(value) {
|
|
113
|
+
if (value == null || typeof value !== 'object' || Array.isArray(value))
|
|
114
|
+
return {};
|
|
115
|
+
return Object.fromEntries(Object.entries(value).map(([name, rawSpec]) => {
|
|
116
|
+
if (rawSpec == null || typeof rawSpec !== 'object' || Array.isArray(rawSpec)) {
|
|
117
|
+
return [name, {}];
|
|
118
|
+
}
|
|
119
|
+
(0, attributeValidation_1.validateAttributeSpec)(rawSpec, name);
|
|
120
|
+
return [
|
|
121
|
+
name,
|
|
122
|
+
Object.fromEntries(Object.entries(rawSpec).filter(([, entry]) => entry !== undefined)),
|
|
123
|
+
];
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
function normalizeNodeJSONProjection(value) {
|
|
127
|
+
if (value === undefined)
|
|
128
|
+
return undefined;
|
|
129
|
+
if (value == null || typeof value !== 'object' || Array.isArray(value))
|
|
130
|
+
return null;
|
|
131
|
+
const raw = value;
|
|
132
|
+
if (typeof raw.type !== 'string' || raw.type.length === 0)
|
|
133
|
+
return null;
|
|
134
|
+
if (raw.attrs === undefined)
|
|
135
|
+
return { type: raw.type };
|
|
136
|
+
if (raw.attrs == null || typeof raw.attrs !== 'object' || Array.isArray(raw.attrs))
|
|
137
|
+
return null;
|
|
138
|
+
const attrs = {};
|
|
139
|
+
for (const [name, attrValue] of Object.entries(raw.attrs)) {
|
|
140
|
+
if (!isSafeHtmlAttr(name))
|
|
141
|
+
return null;
|
|
142
|
+
if (attrValue !== null &&
|
|
143
|
+
typeof attrValue !== 'string' &&
|
|
144
|
+
typeof attrValue !== 'boolean' &&
|
|
145
|
+
!(typeof attrValue === 'number' && Number.isFinite(attrValue))) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
attrs[name] = attrValue;
|
|
149
|
+
}
|
|
150
|
+
return Object.keys(attrs).length === 0 ? { type: raw.type } : { type: raw.type, attrs };
|
|
151
|
+
}
|
|
152
|
+
function isSafeAtomHtmlTag(tag) {
|
|
153
|
+
return atomPolicy_1.ATOM_HTML_IDENTIFIER.test(tag) && !atomPolicy_1.ATOM_HTML_DENIED_TAGS.has(tag);
|
|
154
|
+
}
|
|
155
|
+
function isSafeAtomHtmlAttr(name) {
|
|
156
|
+
return (atomPolicy_1.ATOM_HTML_IDENTIFIER.test(name) &&
|
|
157
|
+
!name.startsWith('on') &&
|
|
158
|
+
!atomPolicy_1.ATOM_HTML_DENIED_ATTRS.has(name));
|
|
159
|
+
}
|
|
160
|
+
function normalizeNodeHtmlRules(value) {
|
|
161
|
+
if (value === undefined)
|
|
162
|
+
return undefined;
|
|
163
|
+
if (value == null || typeof value !== 'object' || Array.isArray(value))
|
|
164
|
+
return null;
|
|
165
|
+
const raw = value;
|
|
166
|
+
if (Object.keys(raw).some((key) => key !== 'tag' && key !== 'staticAttrs' && key !== 'attrMap') ||
|
|
167
|
+
typeof raw.tag !== 'string' ||
|
|
168
|
+
!isSafeAtomHtmlTag(raw.tag)) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
const normalizeMap = (candidate, validateName) => {
|
|
172
|
+
if (candidate === undefined)
|
|
173
|
+
return undefined;
|
|
174
|
+
if (candidate == null || typeof candidate !== 'object' || Array.isArray(candidate)) {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
const normalized = {};
|
|
178
|
+
for (const [name, mapped] of Object.entries(candidate)) {
|
|
179
|
+
if (!validateName(name) || typeof mapped !== 'string')
|
|
180
|
+
return null;
|
|
181
|
+
normalized[name] = mapped;
|
|
182
|
+
}
|
|
183
|
+
return normalized;
|
|
184
|
+
};
|
|
185
|
+
const staticAttrs = normalizeMap(raw.staticAttrs, isSafeAtomHtmlAttr);
|
|
186
|
+
const attrMap = normalizeMap(raw.attrMap, isSafeHtmlAttr);
|
|
187
|
+
if (staticAttrs === null ||
|
|
188
|
+
attrMap === null ||
|
|
189
|
+
(attrMap != null && Object.values(attrMap).some((name) => !isSafeAtomHtmlAttr(name)))) {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
tag: raw.tag,
|
|
194
|
+
...(staticAttrs == null ? {} : { staticAttrs }),
|
|
195
|
+
...(attrMap == null ? {} : { attrMap }),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
function projectionAttrsOverlap(left, right) {
|
|
199
|
+
return Object.entries(left).every(([name, value]) => !Object.prototype.hasOwnProperty.call(right, name) || right[name] === value);
|
|
200
|
+
}
|
|
201
|
+
function legacyHeadingProjectionName(projection) {
|
|
202
|
+
if (projection.type !== 'heading')
|
|
203
|
+
return undefined;
|
|
204
|
+
const value = projection.attrs?.level;
|
|
205
|
+
let level;
|
|
206
|
+
if (typeof value === 'number' && Number.isInteger(value)) {
|
|
207
|
+
level = value;
|
|
208
|
+
}
|
|
209
|
+
else if (typeof value === 'string' && value.length <= 3 && /^\+?\d+$/.test(value)) {
|
|
210
|
+
level = Number(value);
|
|
211
|
+
}
|
|
212
|
+
return level != null && level >= 1 && level <= 6 ? `h${level}` : undefined;
|
|
213
|
+
}
|
|
214
|
+
function normalizeSchemaDefinition(schema, budget) {
|
|
215
|
+
const normalizeRole = (role) => {
|
|
216
|
+
switch (role) {
|
|
217
|
+
case 'doc':
|
|
218
|
+
case 'textBlock':
|
|
219
|
+
case 'list':
|
|
220
|
+
case 'listItem':
|
|
221
|
+
case 'text':
|
|
222
|
+
case 'hardBreak':
|
|
223
|
+
case 'inline':
|
|
224
|
+
return role;
|
|
225
|
+
default:
|
|
226
|
+
return 'block';
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
const nodes = [];
|
|
230
|
+
for (let nodeIndex = 0; nodeIndex < schema.nodes.length; nodeIndex += 1) {
|
|
231
|
+
const rawNode = schema.nodes[nodeIndex];
|
|
232
|
+
if (rawNode == null || typeof rawNode !== 'object' || typeof rawNode.name !== 'string') {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
const raw = rawNode;
|
|
236
|
+
const htmlTag = typeof raw.htmlTag === 'string' ? raw.htmlTag : undefined;
|
|
237
|
+
const html = normalizeNodeHtmlRules(raw.html);
|
|
238
|
+
const attrs = normalizeAttrs(raw.attrs);
|
|
239
|
+
const json = normalizeNodeJSONProjection(raw.json);
|
|
240
|
+
if ((htmlTag != null && !isSafeHtmlTag(htmlTag)) ||
|
|
241
|
+
html === null ||
|
|
242
|
+
json === null ||
|
|
243
|
+
Object.keys(attrs).some((name) => !isSafeHtmlAttr(name))) {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
nodes.push({
|
|
247
|
+
name: rawNode.name,
|
|
248
|
+
content: typeof raw.content === 'string' ? raw.content : '',
|
|
249
|
+
...(typeof raw.group === 'string' ? { group: raw.group } : {}),
|
|
250
|
+
...(Object.keys(attrs).length > 0 ? { attrs } : {}),
|
|
251
|
+
role: normalizeRole(raw.role),
|
|
252
|
+
...(htmlTag == null ? {} : { htmlTag }),
|
|
253
|
+
...(html == null ? {} : { html }),
|
|
254
|
+
...(json == null ? {} : { json }),
|
|
255
|
+
isVoid: typeof raw.isVoid === 'boolean' ? raw.isVoid : false,
|
|
256
|
+
...(typeof raw.deletableOnBackspace === 'boolean'
|
|
257
|
+
? { deletableOnBackspace: raw.deletableOnBackspace }
|
|
258
|
+
: {}),
|
|
259
|
+
...(typeof raw.allowUndeclaredAttrs === 'boolean'
|
|
260
|
+
? { allowUndeclaredAttrs: raw.allowUndeclaredAttrs }
|
|
261
|
+
: {}),
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
const nativeNodeNames = new Set(nodes.map((node) => node.name));
|
|
265
|
+
const projectedNodes = nodes.filter((node) => node.json != null);
|
|
266
|
+
for (let index = 0; index < projectedNodes.length; index += 1) {
|
|
267
|
+
const node = projectedNodes[index];
|
|
268
|
+
const projection = node.json;
|
|
269
|
+
const legacyHeadingName = legacyHeadingProjectionName(projection);
|
|
270
|
+
if (nativeNodeNames.has(projection.type) ||
|
|
271
|
+
atomPolicy_1.RESERVED_WIRE_NODE_TYPES.has(projection.type) ||
|
|
272
|
+
(legacyHeadingName != null &&
|
|
273
|
+
legacyHeadingName !== node.name &&
|
|
274
|
+
nativeNodeNames.has(legacyHeadingName)) ||
|
|
275
|
+
Object.keys(projection.attrs ?? {}).some((name) => Object.prototype.hasOwnProperty.call(node.attrs ?? {}, name))) {
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
for (let previousIndex = 0; previousIndex < index; previousIndex += 1) {
|
|
279
|
+
if (budget != null && !consumeSchemaWork(budget)) {
|
|
280
|
+
throw schemaBoundaryError(budget.limit, budget.limit + 1);
|
|
281
|
+
}
|
|
282
|
+
const previous = projectedNodes[previousIndex];
|
|
283
|
+
if (previous.json?.type === projection.type &&
|
|
284
|
+
projectionAttrsOverlap(projection.attrs ?? {}, previous.json.attrs ?? {})) {
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
const marks = [];
|
|
290
|
+
for (let markIndex = 0; markIndex < schema.marks.length; markIndex += 1) {
|
|
291
|
+
const rawMark = schema.marks[markIndex];
|
|
292
|
+
if (rawMark == null || typeof rawMark !== 'object' || typeof rawMark.name !== 'string') {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
const raw = rawMark;
|
|
296
|
+
const htmlTag = typeof raw.htmlTag === 'string' ? raw.htmlTag.toLowerCase() : undefined;
|
|
297
|
+
const attrs = normalizeAttrs(raw.attrs);
|
|
298
|
+
if ((htmlTag != null && !schemaDefinition_1.ALLOWED_MARK_HTML_TAGS.has(htmlTag)) ||
|
|
299
|
+
Object.keys(attrs).some((name) => !isSafeHtmlAttr(name))) {
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
marks.push({
|
|
303
|
+
name: rawMark.name,
|
|
304
|
+
...(Object.keys(attrs).length > 0 ? { attrs } : {}),
|
|
305
|
+
...(typeof raw.excludes === 'string' ? { excludes: raw.excludes } : {}),
|
|
306
|
+
...(htmlTag == null ? {} : { htmlTag: htmlTag }),
|
|
307
|
+
...(typeof raw.allowUndeclaredAttrs === 'boolean'
|
|
308
|
+
? { allowUndeclaredAttrs: raw.allowUndeclaredAttrs }
|
|
309
|
+
: {}),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
return { nodes, marks };
|
|
313
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { DocumentJSON } from './NativeEditorBridge';
|
|
2
|
+
import { type EditorResourceLimits } from './ResourceLimits';
|
|
3
|
+
import { type SchemaDefinition, type SchemaNodeSpec, type NodeSpec, type SchemaSpec } from './schemaDefinition';
|
|
4
|
+
/** Attributes of the built-in image node. */
|
|
5
|
+
export interface ImageNodeAttributes {
|
|
6
|
+
/** Image source: an `https:` URL, or a `data:` URL when base64 images are allowed. */
|
|
7
|
+
src: string;
|
|
8
|
+
alt?: string | null;
|
|
9
|
+
title?: string | null;
|
|
10
|
+
/** Intrinsic width in layout units. Null lets the renderer choose. */
|
|
11
|
+
width?: number | null;
|
|
12
|
+
/** Intrinsic height in layout units. Null lets the renderer choose. */
|
|
13
|
+
height?: number | null;
|
|
14
|
+
}
|
|
15
|
+
/** A schema together with the facts derived from it. See {@link resolveDocumentDescriptor}. */
|
|
16
|
+
export interface ResolvedDocumentSchema {
|
|
17
|
+
/** The schema itself, defaulted to {@link defaultSchema} when none was supplied. */
|
|
18
|
+
schema: SchemaDefinition;
|
|
19
|
+
/** Name of the node with `role: 'doc'` — the `type` of a document's root. */
|
|
20
|
+
documentNodeName: string;
|
|
21
|
+
/** The smallest document this schema admits. Used by `clearContent()`. */
|
|
22
|
+
emptyDocument: DocumentJSON;
|
|
23
|
+
}
|
|
24
|
+
export type DocumentDescriptorLimits = Pick<EditorResourceLimits, 'maxSchemaNodes' | 'maxSchemaExpressionBytes' | 'maxDocumentNodes' | 'maxDocumentDepth'>;
|
|
25
|
+
/** Node name the built-in image node is stored under. */
|
|
26
|
+
export declare const IMAGE_NODE_NAME = "image";
|
|
27
|
+
export declare const HEADING_LEVELS: readonly [1, 2, 3, 4, 5, 6];
|
|
28
|
+
/**
|
|
29
|
+
* The built-in image node spec: a void block node carrying
|
|
30
|
+
* {@link ImageNodeAttributes}. Add it through {@link withImagesSchema}.
|
|
31
|
+
*
|
|
32
|
+
* @param name Node name to declare it under. Defaults to {@link IMAGE_NODE_NAME}.
|
|
33
|
+
*/
|
|
34
|
+
export declare function imageSchemaNodeSpec(): SchemaNodeSpec;
|
|
35
|
+
export declare function imageNodeSpec(name?: string): NodeSpec;
|
|
36
|
+
/**
|
|
37
|
+
* Return `schema` with the image node added, or `schema` unchanged when it
|
|
38
|
+
* already declares one. {@link tiptapCompatibleSchema} already includes it.
|
|
39
|
+
*/
|
|
40
|
+
export declare function withImagesSchema(schema: SchemaDefinition): SchemaDefinition;
|
|
41
|
+
/**
|
|
42
|
+
* Wrap inline or block nodes in a document root, producing a fragment ready
|
|
43
|
+
* for `insertContentJson`.
|
|
44
|
+
*
|
|
45
|
+
* @param descriptor Document node name to wrap in. Defaults to `doc`; pass a
|
|
46
|
+
* {@link ResolvedDocumentSchema} when the schema names its root differently.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildDocumentFragmentJson(content: DocumentJSON[], descriptor?: Pick<ResolvedDocumentSchema, 'documentNodeName'>): DocumentJSON;
|
|
49
|
+
/**
|
|
50
|
+
* Build a document fragment holding one image node, ready for
|
|
51
|
+
* `insertContentJson`. `RichTextEditorRef.insertImage` does this for
|
|
52
|
+
* you; use this when assembling a larger insertion by hand.
|
|
53
|
+
*/
|
|
54
|
+
export declare function buildImageFragmentJson(attrs: ImageNodeAttributes, descriptor?: Pick<ResolvedDocumentSchema, 'documentNodeName'>): DocumentJSON;
|
|
55
|
+
/**
|
|
56
|
+
* Keyed authoring definition for the Tiptap-compatible camelCase schema.
|
|
57
|
+
*/
|
|
58
|
+
export declare const tiptapCompatibleSchemaSpec: SchemaSpec;
|
|
59
|
+
/** Tiptap-compatible serializable schema using camelCase node names. */
|
|
60
|
+
export declare const tiptapCompatibleSchema: SchemaDefinition;
|
|
61
|
+
/** Keyed authoring definition using ProseMirror names, including upstream `codeBlock`. */
|
|
62
|
+
export declare const prosemirrorSchemaSpec: SchemaSpec;
|
|
63
|
+
/** ProseMirror-compatible serializable schema, including upstream `codeBlock`. */
|
|
64
|
+
export declare const prosemirrorSchema: SchemaDefinition;
|
|
65
|
+
/** Keyed authoring definition used when callers do not provide a schema. */
|
|
66
|
+
export declare const defaultSchemaSpec: SchemaSpec;
|
|
67
|
+
/** Schema used when callers do not provide one. */
|
|
68
|
+
export declare const defaultSchema: SchemaDefinition;
|