@stesura/react-prosemirror 3.2.11-stesura.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +21 -0
- package/README.md +939 -0
- package/dist/cjs/AbstractEditorView.js +4 -0
- package/dist/cjs/ReactEditorView.js +194 -0
- package/dist/cjs/StaticEditorView.js +89 -0
- package/dist/cjs/browser.js +53 -0
- package/dist/cjs/commands/reorderSiblings.js +72 -0
- package/dist/cjs/components/ChildNodeViews.js +418 -0
- package/dist/cjs/components/CursorWrapper.js +84 -0
- package/dist/cjs/components/EditorStateSelectorsProvider.js +90 -0
- package/dist/cjs/components/LayoutGroup.js +112 -0
- package/dist/cjs/components/NativeWidgetView.js +108 -0
- package/dist/cjs/components/OutputSpec.js +121 -0
- package/dist/cjs/components/ProseMirror.js +146 -0
- package/dist/cjs/components/ProseMirrorDoc.js +74 -0
- package/dist/cjs/components/SeparatorHackView.js +99 -0
- package/dist/cjs/components/TextNodeView.js +113 -0
- package/dist/cjs/components/TrailingHackView.js +87 -0
- package/dist/cjs/components/WidgetView.js +94 -0
- package/dist/cjs/components/WidgetViewComponentProps.js +4 -0
- package/dist/cjs/components/marks/DefaultMarkView.js +70 -0
- package/dist/cjs/components/marks/MarkView.js +85 -0
- package/dist/cjs/components/marks/MarkViewComponentProps.js +4 -0
- package/dist/cjs/components/marks/MarkViewConstructorView.js +116 -0
- package/dist/cjs/components/marks/ReactMarkView.js +109 -0
- package/dist/cjs/components/nodes/DefaultNodeView.js +68 -0
- package/dist/cjs/components/nodes/DocNodeView.js +97 -0
- package/dist/cjs/components/nodes/NodeView.js +129 -0
- package/dist/cjs/components/nodes/NodeViewComponentProps.js +4 -0
- package/dist/cjs/components/nodes/NodeViewConstructorView.js +145 -0
- package/dist/cjs/components/nodes/ReactNodeView.js +189 -0
- package/dist/cjs/constants.js +33 -0
- package/dist/cjs/contexts/ChildDescriptionsContext.js +19 -0
- package/dist/cjs/contexts/EditorContext.js +12 -0
- package/dist/cjs/contexts/EditorStateContext.js +12 -0
- package/dist/cjs/contexts/EditorStateStoreContext.js +45 -0
- package/dist/cjs/contexts/IgnoreMutationContext.js +12 -0
- package/dist/cjs/contexts/LayoutGroupContext.js +12 -0
- package/dist/cjs/contexts/NodeViewContext.js +12 -0
- package/dist/cjs/contexts/RenderStoreContext.js +54 -0
- package/dist/cjs/contexts/SelectNodeContext.js +12 -0
- package/dist/cjs/contexts/StopEventContext.js +12 -0
- package/dist/cjs/decorations/ReactWidgetType.js +58 -0
- package/dist/cjs/decorations/computeDocDeco.js +44 -0
- package/dist/cjs/decorations/internalTypes.js +4 -0
- package/dist/cjs/decorations/iterDeco.js +91 -0
- package/dist/cjs/decorations/viewDecorations.js +155 -0
- package/dist/cjs/dom.js +147 -0
- package/dist/cjs/findDOMNode.js +46 -0
- package/dist/cjs/hooks/useClientLayoutEffect.js +19 -0
- package/dist/cjs/hooks/useComponentEventListeners.js +72 -0
- package/dist/cjs/hooks/useEditor.js +130 -0
- package/dist/cjs/hooks/useEditorEffect.js +39 -0
- package/dist/cjs/hooks/useEditorEventCallback.js +38 -0
- package/dist/cjs/hooks/useEditorEventListener.js +34 -0
- package/dist/cjs/hooks/useEditorState.js +18 -0
- package/dist/cjs/hooks/useEditorStateSelector.js +17 -0
- package/dist/cjs/hooks/useEffectEvent.js +34 -0
- package/dist/cjs/hooks/useForceUpdate.js +15 -0
- package/dist/cjs/hooks/useIgnoreMutation.js +24 -0
- package/dist/cjs/hooks/useIsComposingIn.js +25 -0
- package/dist/cjs/hooks/useIsEditorStatic.js +15 -0
- package/dist/cjs/hooks/useIsNodeSelected.js +21 -0
- package/dist/cjs/hooks/useLayoutGroupEffect.js +20 -0
- package/dist/cjs/hooks/useMarkViewDescription.js +134 -0
- package/dist/cjs/hooks/useNodePos.js +18 -0
- package/dist/cjs/hooks/useNodeViewDescription.js +154 -0
- package/dist/cjs/hooks/useReactKeys.js +17 -0
- package/dist/cjs/hooks/useSelectNode.js +30 -0
- package/dist/cjs/hooks/useSetDom.js +57 -0
- package/dist/cjs/hooks/useStopEvent.js +24 -0
- package/dist/cjs/index.js +85 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/plugins/beforeInputPlugin.js +356 -0
- package/dist/cjs/plugins/reactKeys.js +121 -0
- package/dist/cjs/props.js +283 -0
- package/dist/cjs/refs.js +28 -0
- package/dist/cjs/testing/editorViewTestHelpers.js +109 -0
- package/dist/cjs/testing/setupProseMirrorView.js +94 -0
- package/dist/cjs/tiptap/ReactProseMirrorNodeView.js +26 -0
- package/dist/cjs/tiptap/TiptapEditor.js +34 -0
- package/dist/cjs/tiptap/TiptapEditorContent.js +143 -0
- package/dist/cjs/tiptap/TiptapEditorView.js +130 -0
- package/dist/cjs/tiptap/contexts/TiptapEditorContext.js +12 -0
- package/dist/cjs/tiptap/extensions/ReactProseMirror.js +40 -0
- package/dist/cjs/tiptap/extensions/ReactProseMirrorCommands.js +21 -0
- package/dist/cjs/tiptap/extensions/commands/updateAttributes.js +104 -0
- package/dist/cjs/tiptap/hooks/useEditor.js +318 -0
- package/dist/cjs/tiptap/hooks/useIsInReactProseMirror.js +15 -0
- package/dist/cjs/tiptap/hooks/useTiptapEditor.js +35 -0
- package/dist/cjs/tiptap/hooks/useTiptapEditorEffect.js +35 -0
- package/dist/cjs/tiptap/hooks/useTiptapEditorEventCallback.js +35 -0
- package/dist/cjs/tiptap/index.js +48 -0
- package/dist/cjs/tiptap/tiptapNodeView.js +245 -0
- package/dist/cjs/viewdesc.js +862 -0
- package/dist/esm/AbstractEditorView.js +1 -0
- package/dist/esm/ReactEditorView.js +194 -0
- package/dist/esm/StaticEditorView.js +79 -0
- package/dist/esm/browser.js +43 -0
- package/dist/esm/commands/reorderSiblings.js +63 -0
- package/dist/esm/components/ChildNodeViews.js +359 -0
- package/dist/esm/components/CursorWrapper.js +33 -0
- package/dist/esm/components/EditorStateSelectorsProvider.js +31 -0
- package/dist/esm/components/LayoutGroup.js +67 -0
- package/dist/esm/components/NativeWidgetView.js +57 -0
- package/dist/esm/components/OutputSpec.js +71 -0
- package/dist/esm/components/ProseMirror.js +95 -0
- package/dist/esm/components/ProseMirrorDoc.js +15 -0
- package/dist/esm/components/SeparatorHackView.js +48 -0
- package/dist/esm/components/TextNodeView.js +103 -0
- package/dist/esm/components/TrailingHackView.js +36 -0
- package/dist/esm/components/WidgetView.js +43 -0
- package/dist/esm/components/WidgetViewComponentProps.js +1 -0
- package/dist/esm/components/marks/DefaultMarkView.js +19 -0
- package/dist/esm/components/marks/MarkView.js +34 -0
- package/dist/esm/components/marks/MarkViewComponentProps.js +1 -0
- package/dist/esm/components/marks/MarkViewConstructorView.js +65 -0
- package/dist/esm/components/marks/ReactMarkView.js +58 -0
- package/dist/esm/components/nodes/DefaultNodeView.js +17 -0
- package/dist/esm/components/nodes/DocNodeView.js +46 -0
- package/dist/esm/components/nodes/NodeView.js +67 -0
- package/dist/esm/components/nodes/NodeViewComponentProps.js +1 -0
- package/dist/esm/components/nodes/NodeViewConstructorView.js +94 -0
- package/dist/esm/components/nodes/ReactNodeView.js +138 -0
- package/dist/esm/constants.js +15 -0
- package/dist/esm/contexts/ChildDescriptionsContext.js +9 -0
- package/dist/esm/contexts/EditorContext.js +7 -0
- package/dist/esm/contexts/EditorStateContext.js +2 -0
- package/dist/esm/contexts/EditorStateStoreContext.js +27 -0
- package/dist/esm/contexts/IgnoreMutationContext.js +2 -0
- package/dist/esm/contexts/LayoutGroupContext.js +2 -0
- package/dist/esm/contexts/NodeViewContext.js +2 -0
- package/dist/esm/contexts/RenderStoreContext.js +33 -0
- package/dist/esm/contexts/SelectNodeContext.js +2 -0
- package/dist/esm/contexts/StopEventContext.js +2 -0
- package/dist/esm/decorations/ReactWidgetType.js +40 -0
- package/dist/esm/decorations/computeDocDeco.js +44 -0
- package/dist/esm/decorations/internalTypes.js +1 -0
- package/dist/esm/decorations/iterDeco.js +85 -0
- package/dist/esm/decorations/viewDecorations.js +155 -0
- package/dist/esm/dom.js +110 -0
- package/dist/esm/findDOMNode.js +31 -0
- package/dist/esm/hooks/useClientLayoutEffect.js +9 -0
- package/dist/esm/hooks/useComponentEventListeners.js +87 -0
- package/dist/esm/hooks/useEditor.js +128 -0
- package/dist/esm/hooks/useEditorEffect.js +46 -0
- package/dist/esm/hooks/useEditorEventCallback.js +38 -0
- package/dist/esm/hooks/useEditorEventListener.js +28 -0
- package/dist/esm/hooks/useEditorState.js +10 -0
- package/dist/esm/hooks/useEditorStateSelector.js +14 -0
- package/dist/esm/hooks/useEffectEvent.js +24 -0
- package/dist/esm/hooks/useForceUpdate.js +8 -0
- package/dist/esm/hooks/useIgnoreMutation.js +14 -0
- package/dist/esm/hooks/useIsComposingIn.js +17 -0
- package/dist/esm/hooks/useIsEditorStatic.js +8 -0
- package/dist/esm/hooks/useIsNodeSelected.js +11 -0
- package/dist/esm/hooks/useLayoutGroupEffect.js +10 -0
- package/dist/esm/hooks/useMarkViewDescription.js +124 -0
- package/dist/esm/hooks/useNodePos.js +15 -0
- package/dist/esm/hooks/useNodeViewDescription.js +144 -0
- package/dist/esm/hooks/useReactKeys.js +7 -0
- package/dist/esm/hooks/useSelectNode.js +20 -0
- package/dist/esm/hooks/useSetDom.js +47 -0
- package/dist/esm/hooks/useStopEvent.js +14 -0
- package/dist/esm/index.js +19 -0
- package/dist/esm/plugins/beforeInputPlugin.js +346 -0
- package/dist/esm/plugins/reactKeys.js +106 -0
- package/dist/esm/props.js +267 -0
- package/dist/esm/refs.js +18 -0
- package/dist/esm/testing/editorViewTestHelpers.js +86 -0
- package/dist/esm/testing/setupProseMirrorView.js +76 -0
- package/dist/esm/tiptap/ReactProseMirrorNodeView.js +22 -0
- package/dist/esm/tiptap/TiptapEditor.js +24 -0
- package/dist/esm/tiptap/TiptapEditorContent.js +99 -0
- package/dist/esm/tiptap/TiptapEditorView.js +76 -0
- package/dist/esm/tiptap/contexts/TiptapEditorContext.js +2 -0
- package/dist/esm/tiptap/extensions/ReactProseMirror.js +30 -0
- package/dist/esm/tiptap/extensions/ReactProseMirrorCommands.js +11 -0
- package/dist/esm/tiptap/extensions/commands/updateAttributes.js +96 -0
- package/dist/esm/tiptap/hooks/useEditor.js +308 -0
- package/dist/esm/tiptap/hooks/useIsInReactProseMirror.js +9 -0
- package/dist/esm/tiptap/hooks/useTiptapEditor.js +31 -0
- package/dist/esm/tiptap/hooks/useTiptapEditorEffect.js +42 -0
- package/dist/esm/tiptap/hooks/useTiptapEditorEventCallback.js +35 -0
- package/dist/esm/tiptap/index.js +9 -0
- package/dist/esm/tiptap/tiptapNodeView.js +211 -0
- package/dist/esm/viewdesc.js +844 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/AbstractEditorView.d.ts +28 -0
- package/dist/types/ReactEditorView.d.ts +102 -0
- package/dist/types/StaticEditorView.d.ts +26 -0
- package/dist/types/__tests__/viewdesc.test.d.ts +1 -0
- package/dist/types/browser.d.ts +15 -0
- package/dist/types/commands/__tests__/reorderSiblings.test.d.ts +1 -0
- package/dist/types/commands/reorderSiblings.d.ts +14 -0
- package/dist/types/components/ChildNodeViews.d.ts +9 -0
- package/dist/types/components/CursorWrapper.d.ts +3 -0
- package/dist/types/components/EditorStateSelectorsProvider.d.ts +10 -0
- package/dist/types/components/LayoutGroup.d.ts +12 -0
- package/dist/types/components/NativeWidgetView.d.ts +8 -0
- package/dist/types/components/OutputSpec.d.ts +10 -0
- package/dist/types/components/ProseMirror.d.ts +14 -0
- package/dist/types/components/ProseMirrorDoc.d.ts +16 -0
- package/dist/types/components/SeparatorHackView.d.ts +6 -0
- package/dist/types/components/TextNodeView.d.ts +27 -0
- package/dist/types/components/TrailingHackView.d.ts +6 -0
- package/dist/types/components/WidgetView.d.ts +8 -0
- package/dist/types/components/WidgetViewComponentProps.d.ts +7 -0
- package/dist/types/components/__tests__/ProseMirror.composition.test.d.ts +17 -0
- package/dist/types/components/__tests__/ProseMirror.domchange.test.d.ts +1 -0
- package/dist/types/components/__tests__/ProseMirror.draw-decoration.test.d.ts +1 -0
- package/dist/types/components/__tests__/ProseMirror.draw.test.d.ts +1 -0
- package/dist/types/components/__tests__/ProseMirror.memory-leak.test.d.ts +6 -0
- package/dist/types/components/__tests__/ProseMirror.mobile.test.d.ts +1 -0
- package/dist/types/components/__tests__/ProseMirror.node-view.test.d.ts +1 -0
- package/dist/types/components/__tests__/ProseMirror.selection.test.d.ts +1 -0
- package/dist/types/components/__tests__/ProseMirror.test.d.ts +1 -0
- package/dist/types/components/__tests__/stableContexts.test.d.ts +10 -0
- package/dist/types/components/marks/DefaultMarkView.d.ts +3 -0
- package/dist/types/components/marks/MarkView.d.ts +10 -0
- package/dist/types/components/marks/MarkViewComponentProps.d.ts +11 -0
- package/dist/types/components/marks/MarkViewConstructorView.d.ts +12 -0
- package/dist/types/components/marks/ReactMarkView.d.ts +12 -0
- package/dist/types/components/nodes/DefaultNodeView.d.ts +3 -0
- package/dist/types/components/nodes/DocNodeView.d.ts +12 -0
- package/dist/types/components/nodes/NodeView.d.ts +14 -0
- package/dist/types/components/nodes/NodeViewComponentProps.d.ts +13 -0
- package/dist/types/components/nodes/NodeViewConstructorView.d.ts +12 -0
- package/dist/types/components/nodes/ReactNodeView.d.ts +13 -0
- package/dist/types/constants.d.ts +4 -0
- package/dist/types/contexts/ChildDescriptionsContext.d.ts +7 -0
- package/dist/types/contexts/EditorContext.d.ts +18 -0
- package/dist/types/contexts/EditorStateContext.d.ts +2 -0
- package/dist/types/contexts/EditorStateStoreContext.d.ts +9 -0
- package/dist/types/contexts/IgnoreMutationContext.d.ts +5 -0
- package/dist/types/contexts/LayoutGroupContext.d.ts +5 -0
- package/dist/types/contexts/NodeViewContext.d.ts +9 -0
- package/dist/types/contexts/RenderStoreContext.d.ts +24 -0
- package/dist/types/contexts/SelectNodeContext.d.ts +5 -0
- package/dist/types/contexts/StopEventContext.d.ts +5 -0
- package/dist/types/contexts/__tests__/DeferredLayoutEffects.test.d.ts +1 -0
- package/dist/types/decorations/ReactWidgetType.d.ts +40 -0
- package/dist/types/decorations/computeDocDeco.d.ts +14 -0
- package/dist/types/decorations/internalTypes.d.ts +20 -0
- package/dist/types/decorations/iterDeco.d.ts +3 -0
- package/dist/types/decorations/viewDecorations.d.ts +14 -0
- package/dist/types/dom.d.ts +22 -0
- package/dist/types/findDOMNode.d.ts +3 -0
- package/dist/types/hooks/__tests__/useEditorEffect.test.d.ts +1 -0
- package/dist/types/hooks/useClientLayoutEffect.d.ts +2 -0
- package/dist/types/hooks/useComponentEventListeners.d.ts +34 -0
- package/dist/types/hooks/useEditor.d.ts +37 -0
- package/dist/types/hooks/useEditorEffect.d.ts +21 -0
- package/dist/types/hooks/useEditorEventCallback.d.ts +13 -0
- package/dist/types/hooks/useEditorEventListener.d.ts +8 -0
- package/dist/types/hooks/useEditorState.d.ts +5 -0
- package/dist/types/hooks/useEditorStateSelector.d.ts +10 -0
- package/dist/types/hooks/useEffectEvent.d.ts +1 -0
- package/dist/types/hooks/useForceUpdate.d.ts +5 -0
- package/dist/types/hooks/useIgnoreMutation.d.ts +2 -0
- package/dist/types/hooks/useIsComposingIn.d.ts +4 -0
- package/dist/types/hooks/useIsEditorStatic.d.ts +5 -0
- package/dist/types/hooks/useIsNodeSelected.d.ts +1 -0
- package/dist/types/hooks/useLayoutGroupEffect.d.ts +3 -0
- package/dist/types/hooks/useMarkViewDescription.d.ts +15 -0
- package/dist/types/hooks/useNodePos.d.ts +9 -0
- package/dist/types/hooks/useNodeViewDescription.d.ts +16 -0
- package/dist/types/hooks/useReactKeys.d.ts +2 -0
- package/dist/types/hooks/useSelectNode.d.ts +2 -0
- package/dist/types/hooks/useSetDom.d.ts +2 -0
- package/dist/types/hooks/useStopEvent.d.ts +2 -0
- package/dist/types/index.d.ts +21 -0
- package/dist/types/plugins/__tests__/reactKeys.test.d.ts +1 -0
- package/dist/types/plugins/beforeInputPlugin.d.ts +2 -0
- package/dist/types/plugins/reactKeys.d.ts +23 -0
- package/dist/types/props.d.ts +1173 -0
- package/dist/types/refs.d.ts +2 -0
- package/dist/types/testing/editorViewTestHelpers.d.ts +24 -0
- package/dist/types/testing/setupProseMirrorView.d.ts +2 -0
- package/dist/types/tiptap/ReactProseMirrorNodeView.d.ts +15 -0
- package/dist/types/tiptap/TiptapEditor.d.ts +6 -0
- package/dist/types/tiptap/TiptapEditorContent.d.ts +28 -0
- package/dist/types/tiptap/TiptapEditorView.d.ts +16 -0
- package/dist/types/tiptap/contexts/TiptapEditorContext.d.ts +6 -0
- package/dist/types/tiptap/extensions/ReactProseMirror.d.ts +9 -0
- package/dist/types/tiptap/extensions/ReactProseMirrorCommands.d.ts +2 -0
- package/dist/types/tiptap/extensions/commands/updateAttributes.d.ts +24 -0
- package/dist/types/tiptap/hooks/useEditor.d.ts +38 -0
- package/dist/types/tiptap/hooks/useIsInReactProseMirror.d.ts +6 -0
- package/dist/types/tiptap/hooks/useTiptapEditor.d.ts +11 -0
- package/dist/types/tiptap/hooks/useTiptapEditorEffect.d.ts +21 -0
- package/dist/types/tiptap/hooks/useTiptapEditorEventCallback.d.ts +13 -0
- package/dist/types/tiptap/index.d.ts +9 -0
- package/dist/types/tiptap/tiptapNodeView.d.ts +50 -0
- package/dist/types/viewdesc.d.ts +179 -0
- package/package.json +167 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "beforeInputPlugin", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return beforeInputPlugin;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _prosemirrormodel = require("prosemirror-model");
|
|
12
|
+
const _prosemirrorstate = require("prosemirror-state");
|
|
13
|
+
const _ReactEditorView = require("../ReactEditorView.js");
|
|
14
|
+
const _browser = require("../browser.js");
|
|
15
|
+
const _CursorWrapper = require("../components/CursorWrapper.js");
|
|
16
|
+
const _ReactWidgetType = require("../decorations/ReactWidgetType.js");
|
|
17
|
+
const _viewdesc = require("../viewdesc.js");
|
|
18
|
+
const _reactKeys = require("./reactKeys.js");
|
|
19
|
+
function insertText(view, eventData) {
|
|
20
|
+
let options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
|
|
21
|
+
if (eventData === null) return false;
|
|
22
|
+
const from = options.from ?? view.state.selection.from;
|
|
23
|
+
const to = options.to ?? view.state.selection.to;
|
|
24
|
+
if (view.someProp("handleTextInput", (f)=>f(view, from, to, eventData, ()=>view.state.tr.insertText(eventData, from, to)))) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
const { tr } = view.state;
|
|
28
|
+
if (options.marks) tr.ensureMarks(options.marks);
|
|
29
|
+
tr.insertText(eventData, from, to);
|
|
30
|
+
view.dispatch(tr);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
// Taken from https://github.com/ProseMirror/prosemirror-gapcursor/blob/master/src/index.ts#L67-L84
|
|
34
|
+
// This is a hack that, when a composition starts while a gap cursor
|
|
35
|
+
// is active, quickly creates an inline context for the composition to
|
|
36
|
+
// happen in, to avoid it being aborted by the DOM selection being
|
|
37
|
+
// moved into a valid position.
|
|
38
|
+
//
|
|
39
|
+
// We can't rely on the actual hack from prosemirror-gapcursor, because
|
|
40
|
+
// it happens too late. We snapshot the DOM during compositionstart, but
|
|
41
|
+
// the gapcursor hack runs in beforeinput (after compositionstart).
|
|
42
|
+
function handleGapCursorComposition(view) {
|
|
43
|
+
// @ts-expect-error Internal property - jsonID
|
|
44
|
+
if (!(view.state.selection.jsonID === "gapcursor")) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const { $from } = view.state.selection;
|
|
48
|
+
const insert = $from.parent.contentMatchAt($from.index())// All schemas _must_ have a text node type
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
50
|
+
.findWrapping(view.state.schema.nodes.text);
|
|
51
|
+
if (!insert) return;
|
|
52
|
+
let fragment = _prosemirrormodel.Fragment.empty;
|
|
53
|
+
for(let i = insert.length - 1; i >= 0; i--){
|
|
54
|
+
fragment = _prosemirrormodel.Fragment.from(// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
55
|
+
insert[i].createAndFill(null, fragment));
|
|
56
|
+
}
|
|
57
|
+
const tr = view.state.tr.replace($from.pos, $from.pos, new _prosemirrormodel.Slice(fragment, 0, 0));
|
|
58
|
+
tr.setSelection(_prosemirrorstate.TextSelection.near(tr.doc.resolve($from.pos + 1)));
|
|
59
|
+
view.dispatch(tr);
|
|
60
|
+
}
|
|
61
|
+
const observeOptions = {
|
|
62
|
+
childList: true,
|
|
63
|
+
characterData: true,
|
|
64
|
+
characterDataOldValue: true,
|
|
65
|
+
attributes: true,
|
|
66
|
+
attributeOldValue: true,
|
|
67
|
+
subtree: true
|
|
68
|
+
};
|
|
69
|
+
function beforeInputPlugin() {
|
|
70
|
+
let observer = null;
|
|
71
|
+
let preCompositionSnapshot = null;
|
|
72
|
+
function teardownComposition(view, endedAt) {
|
|
73
|
+
view.input.composing = false;
|
|
74
|
+
if (observer) {
|
|
75
|
+
if (view.input.compositionNode && view.dom.contains(view.input.compositionNode)) {
|
|
76
|
+
view.domObserver.queue.push(...observer.takeRecords());
|
|
77
|
+
view.domObserver.flush();
|
|
78
|
+
} else {
|
|
79
|
+
const freezeFrom = _reactKeys.reactKeysPluginKey.getState(view.state)?.freezeFrom;
|
|
80
|
+
const frozenNode = freezeFrom == null ? null : view.state.doc.nodeAt(freezeFrom);
|
|
81
|
+
if (freezeFrom != null && frozenNode != null && preCompositionSnapshot) {
|
|
82
|
+
// This is a little hacky — it only works because we always abort
|
|
83
|
+
// compositions if the node after freezeFrom changes, so we can
|
|
84
|
+
// be sure that if a composition was canceled by the user/browser,
|
|
85
|
+
// the content hasn't changed since the composition started
|
|
86
|
+
view.dispatch(view.state.tr.replaceWith(freezeFrom + 1, freezeFrom + 1 + frozenNode.content.size, preCompositionSnapshot));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
observer.disconnect();
|
|
90
|
+
observer = null;
|
|
91
|
+
}
|
|
92
|
+
view.input.compositionEndedAt = endedAt;
|
|
93
|
+
view.input.compositionNode = null;
|
|
94
|
+
view.input.compositionNodes = [];
|
|
95
|
+
view.input.compositionID++;
|
|
96
|
+
}
|
|
97
|
+
function teardownCompositionAndUnfreeze(view, event) {
|
|
98
|
+
teardownComposition(view, event.timeStamp);
|
|
99
|
+
view.dispatch(view.state.tr.setMeta(_reactKeys.reactKeysPluginKey, {
|
|
100
|
+
cursorWrapper: null,
|
|
101
|
+
freezeFrom: null
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
return new _prosemirrorstate.Plugin({
|
|
105
|
+
view () {
|
|
106
|
+
return {
|
|
107
|
+
update (view) {
|
|
108
|
+
if (!(view instanceof _ReactEditorView.ReactEditorView)) return;
|
|
109
|
+
const frozen = _reactKeys.reactKeysPluginKey.getState(view.state)?.freezeFrom != null;
|
|
110
|
+
if (observer && view.composing && !frozen) {
|
|
111
|
+
teardownComposition(view, Date.now());
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
},
|
|
116
|
+
props: {
|
|
117
|
+
handleDOMEvents: {
|
|
118
|
+
compositionstart (view) {
|
|
119
|
+
if (!(view instanceof _ReactEditorView.ReactEditorView)) return false;
|
|
120
|
+
const storedMarks = view.state.selection.empty ? view.state.storedMarks : view.state.storedMarks ?? (view.state.selection instanceof _prosemirrorstate.TextSelection ? view.state.selection.$from.marksAcross(view.state.selection.$to) : null);
|
|
121
|
+
view.dispatch(view.state.tr.deleteSelection().setStoredMarks(storedMarks));
|
|
122
|
+
handleGapCursorComposition(view);
|
|
123
|
+
const { selection } = view.state;
|
|
124
|
+
const tr = view.state.tr.delete(selection.from, selection.to);
|
|
125
|
+
const $from = tr.doc.resolve(tr.mapping.map(selection.from));
|
|
126
|
+
const isEmptyTextblock = $from.parent.isTextblock && $from.parent.childCount === 0;
|
|
127
|
+
if (storedMarks != null || _browser.browser.safari && isEmptyTextblock) {
|
|
128
|
+
view.dispatch(view.state.tr.setMeta(_reactKeys.reactKeysPluginKey, {
|
|
129
|
+
cursorWrapper: (0, _ReactWidgetType.widget)(view.state.selection.from, _CursorWrapper.CursorWrapper, {
|
|
130
|
+
key: "cursor-wrapper",
|
|
131
|
+
...storedMarks !== null && {
|
|
132
|
+
marks: storedMarks
|
|
133
|
+
},
|
|
134
|
+
side: 0,
|
|
135
|
+
raw: true
|
|
136
|
+
})
|
|
137
|
+
}));
|
|
138
|
+
// Pin the DOM cursor to PM's canonical position before the IME
|
|
139
|
+
// captures wherever the browser happened to leave it. Without this,
|
|
140
|
+
// a cursor at a mark boundary lands in either the left or right text
|
|
141
|
+
// node depending on the user's last navigation direction, and the
|
|
142
|
+
// IME composes into whichever one it found.
|
|
143
|
+
} else if (view.state.selection.empty && view.domSelection()) {
|
|
144
|
+
view.domObserver.disconnectSelection();
|
|
145
|
+
try {
|
|
146
|
+
view.docView.setSelection(view.state.selection.anchor, view.state.selection.head, view, true // force — skip the isEquivalentPosition early-return
|
|
147
|
+
);
|
|
148
|
+
} finally{
|
|
149
|
+
view.domObserver.setCurSelection();
|
|
150
|
+
view.domObserver.connectSelection();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const freezeFrom = view.state.selection.$from.before();
|
|
154
|
+
view.dispatch(view.state.tr.setMeta(_reactKeys.reactKeysPluginKey, {
|
|
155
|
+
freezeFrom
|
|
156
|
+
}));
|
|
157
|
+
const frozenDom = view.nodeDOM(freezeFrom);
|
|
158
|
+
if (!frozenDom) {
|
|
159
|
+
view.dispatch(view.state.tr.setMeta(_reactKeys.reactKeysPluginKey, {
|
|
160
|
+
cursorWrapper: null,
|
|
161
|
+
freezeFrom: null
|
|
162
|
+
}));
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
preCompositionSnapshot = view.state.doc.nodeAt(freezeFrom)?.content ?? null;
|
|
166
|
+
view.input.composing = true;
|
|
167
|
+
observer = new MutationObserver((records)=>{
|
|
168
|
+
if (_reactKeys.reactKeysPluginKey.getState(view.state)?.freezeFrom == null) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
view.domObserver.queue.push(...records);
|
|
172
|
+
view.domObserver.flush();
|
|
173
|
+
syncCompositionViewDescs(view);
|
|
174
|
+
});
|
|
175
|
+
observer.observe(frozenDom, observeOptions);
|
|
176
|
+
return true;
|
|
177
|
+
},
|
|
178
|
+
compositionupdate () {
|
|
179
|
+
return true;
|
|
180
|
+
},
|
|
181
|
+
compositionend (view, event) {
|
|
182
|
+
if (!(view instanceof _ReactEditorView.ReactEditorView)) return false;
|
|
183
|
+
if (!view.composing) return false;
|
|
184
|
+
teardownCompositionAndUnfreeze(view, event);
|
|
185
|
+
return true;
|
|
186
|
+
},
|
|
187
|
+
contextmenu (view, event) {
|
|
188
|
+
if (!(view instanceof _ReactEditorView.ReactEditorView)) return false;
|
|
189
|
+
if (!view.composing) return false;
|
|
190
|
+
teardownCompositionAndUnfreeze(view, event);
|
|
191
|
+
return false;
|
|
192
|
+
},
|
|
193
|
+
mousedown (view, event) {
|
|
194
|
+
if (!(view instanceof _ReactEditorView.ReactEditorView)) return false;
|
|
195
|
+
if (!view.composing) return false;
|
|
196
|
+
teardownCompositionAndUnfreeze(view, event);
|
|
197
|
+
return false;
|
|
198
|
+
},
|
|
199
|
+
touchstart (view, event) {
|
|
200
|
+
if (!(view instanceof _ReactEditorView.ReactEditorView)) return false;
|
|
201
|
+
if (!view.composing) return false;
|
|
202
|
+
teardownCompositionAndUnfreeze(view, event);
|
|
203
|
+
return false;
|
|
204
|
+
},
|
|
205
|
+
beforeinput (view, event) {
|
|
206
|
+
if (event.inputType !== "insertFromComposition") {
|
|
207
|
+
event.preventDefault();
|
|
208
|
+
}
|
|
209
|
+
switch(event.inputType){
|
|
210
|
+
case "insertParagraph":
|
|
211
|
+
case "insertLineBreak":
|
|
212
|
+
{
|
|
213
|
+
// ProseMirror-view has a hack that runs the Enter event handlers
|
|
214
|
+
// on iOS, to avoid a bug in Safari with calling event.preventDefault() on
|
|
215
|
+
// Enter events.
|
|
216
|
+
//
|
|
217
|
+
// We want to prevent that hack, because we run the Enter event handlers
|
|
218
|
+
// here, where there is no such bug. So we set this flag, which prosemirror-view
|
|
219
|
+
// uses to check whether it should run the deferred event handlers.
|
|
220
|
+
view.input.lastIOSEnter = 0;
|
|
221
|
+
// Fire a synthetic keydown event to trigger ProseMirror's keymap
|
|
222
|
+
const keyEvent = new KeyboardEvent("keydown", {
|
|
223
|
+
bubbles: true,
|
|
224
|
+
cancelable: true,
|
|
225
|
+
key: "Enter",
|
|
226
|
+
code: "Enter",
|
|
227
|
+
keyCode: 13,
|
|
228
|
+
shiftKey: event.inputType === "insertLineBreak"
|
|
229
|
+
});
|
|
230
|
+
// Use someProp to directly call ProseMirror handlers
|
|
231
|
+
return view.someProp("handleKeyDown", (f)=>f(view, keyEvent)) ?? false;
|
|
232
|
+
}
|
|
233
|
+
case "insertReplacementText":
|
|
234
|
+
{
|
|
235
|
+
const ranges = event.getTargetRanges();
|
|
236
|
+
event.dataTransfer?.items[0]?.getAsString((data)=>{
|
|
237
|
+
for (const range of ranges){
|
|
238
|
+
const from = view.posAtDOM(range.startContainer, range.startOffset, 1);
|
|
239
|
+
const to = view.posAtDOM(range.endContainer, range.endOffset, 1);
|
|
240
|
+
insertText(view, data, {
|
|
241
|
+
from,
|
|
242
|
+
to
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
case "insertText":
|
|
249
|
+
{
|
|
250
|
+
const ranges = event.getTargetRanges();
|
|
251
|
+
if (ranges.length === 0 || ranges.length === 1 && ranges[0] && ranges[0].collapsed) {
|
|
252
|
+
insertText(view, event.data);
|
|
253
|
+
} else {
|
|
254
|
+
for (const range of ranges){
|
|
255
|
+
const from = view.posAtDOM(range.startContainer, range.startOffset, 1);
|
|
256
|
+
const to = view.posAtDOM(range.endContainer, range.endOffset, 1);
|
|
257
|
+
insertText(view, event.data, {
|
|
258
|
+
from,
|
|
259
|
+
to
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
case "deleteWordBackward":
|
|
266
|
+
case "deleteHardLineBackward":
|
|
267
|
+
case "deleteSoftLineBackward":
|
|
268
|
+
case "deleteContentBackward":
|
|
269
|
+
case "deleteWordForward":
|
|
270
|
+
case "deleteHardLineForward":
|
|
271
|
+
case "deleteSoftLineForward":
|
|
272
|
+
case "deleteContentForward":
|
|
273
|
+
case "deleteContent":
|
|
274
|
+
{
|
|
275
|
+
const targetRanges = event.getTargetRanges();
|
|
276
|
+
const { tr } = view.state;
|
|
277
|
+
for (const range of targetRanges){
|
|
278
|
+
const start = view.posAtDOM(range.startContainer, range.startOffset);
|
|
279
|
+
const end = view.posAtDOM(range.endContainer, range.endOffset);
|
|
280
|
+
const { doc } = view.state;
|
|
281
|
+
const marks = doc.resolve(start).marksAcross(doc.resolve(end));
|
|
282
|
+
tr.delete(start, end);
|
|
283
|
+
if (marks) {
|
|
284
|
+
tr.ensureMarks(marks);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
view.dispatch(tr);
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
default:
|
|
291
|
+
{
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return true;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
function syncCompositionViewDescs(view) {
|
|
302
|
+
const compositionNode = view.domObserver.lastChangedTextNode;
|
|
303
|
+
if (!compositionNode) return;
|
|
304
|
+
const freezeFrom = _reactKeys.reactKeysPluginKey.getState(view.state)?.freezeFrom;
|
|
305
|
+
if (freezeFrom == null) return;
|
|
306
|
+
const compositionBlock = view.state.doc.nodeAt(freezeFrom);
|
|
307
|
+
if (!compositionBlock) return;
|
|
308
|
+
const compositionBlockDesc = view.docView.descAt(freezeFrom);
|
|
309
|
+
if (!compositionBlockDesc) return;
|
|
310
|
+
const desc = view.docView.nearestDesc(compositionNode);
|
|
311
|
+
compositionBlockDesc.node = compositionBlock;
|
|
312
|
+
if (desc instanceof _viewdesc.TextViewDesc) {
|
|
313
|
+
if (compositionNode.nodeValue && desc.node.text !== compositionNode.nodeValue) {
|
|
314
|
+
desc.node = view.state.schema.text(compositionNode.nodeValue, desc.node.marks);
|
|
315
|
+
desc.nodeDOM = compositionNode;
|
|
316
|
+
compositionNode.pmViewDesc = desc;
|
|
317
|
+
}
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
if (desc instanceof _viewdesc.CompositionViewDesc) {
|
|
321
|
+
if (compositionNode.nodeValue != null && desc.text !== compositionNode.nodeValue) {
|
|
322
|
+
desc.dom = compositionNode;
|
|
323
|
+
desc.textDOM = compositionNode;
|
|
324
|
+
desc.text = compositionNode.nodeValue;
|
|
325
|
+
compositionNode.pmViewDesc = desc;
|
|
326
|
+
}
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
const parentDesc = desc?.contentDOM ? desc : compositionBlockDesc;
|
|
330
|
+
const children = parentDesc.children;
|
|
331
|
+
// Drop any text or composition desc in this container whose DOM the
|
|
332
|
+
// IME has detached. This covers two cases: a TextViewDesc the IME subsumed
|
|
333
|
+
// into the composition node, and (on Safari, which replaces the whole text
|
|
334
|
+
// node on each composition update) any orphaned composition view
|
|
335
|
+
// desc(s) left over from the previous composition steps.
|
|
336
|
+
for(let i = children.length - 1; i >= 0; i--){
|
|
337
|
+
const c = children[i];
|
|
338
|
+
if (!(c instanceof _viewdesc.TextViewDesc) && !(c instanceof _viewdesc.CompositionViewDesc)) {
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
const dom = c.dom;
|
|
342
|
+
if (view.dom.contains(dom)) continue;
|
|
343
|
+
children.splice(i, 1);
|
|
344
|
+
}
|
|
345
|
+
const contentStart = freezeFrom + 1;
|
|
346
|
+
const { from, to } = view.state.selection;
|
|
347
|
+
const textPos = (0, _viewdesc.findTextInFragment)(compositionBlock.content, compositionNode.nodeValue ?? "", from - contentStart, to - contentStart);
|
|
348
|
+
if (textPos < 0) return;
|
|
349
|
+
const startPos = contentStart + textPos;
|
|
350
|
+
let topDOM = compositionNode;
|
|
351
|
+
while(topDOM.parentNode && topDOM.parentNode !== parentDesc.contentDOM){
|
|
352
|
+
topDOM = topDOM.parentNode;
|
|
353
|
+
}
|
|
354
|
+
const insertIndex = children.findLastIndex((c)=>c.posBefore <= startPos) + 1;
|
|
355
|
+
children.splice(insertIndex, 0, new _viewdesc.CompositionViewDesc(parentDesc, ()=>startPos, topDOM, compositionNode, compositionNode.nodeValue ?? ""));
|
|
356
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
createNodeKey: function() {
|
|
13
|
+
return createNodeKey;
|
|
14
|
+
},
|
|
15
|
+
reactKeys: function() {
|
|
16
|
+
return reactKeys;
|
|
17
|
+
},
|
|
18
|
+
reactKeysPluginKey: function() {
|
|
19
|
+
return reactKeysPluginKey;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const _prosemirrorstate = require("prosemirror-state");
|
|
23
|
+
const _prosemirrortransform = require("prosemirror-transform");
|
|
24
|
+
const _prosemirrorview = require("prosemirror-view");
|
|
25
|
+
const _ReactWidgetType = require("../decorations/ReactWidgetType.js");
|
|
26
|
+
// These steps keep every node's size, so no node moves, appears or
|
|
27
|
+
// disappears. Mark steps are not among them: they can split text nodes,
|
|
28
|
+
// which then need keys.
|
|
29
|
+
const keepsNodePositions = (step)=>step instanceof _prosemirrortransform.AttrStep || step instanceof _prosemirrortransform.DocAttrStep || step instanceof _prosemirrortransform.AddNodeMarkStep || step instanceof _prosemirrortransform.RemoveNodeMarkStep;
|
|
30
|
+
function createNodeKey() {
|
|
31
|
+
const key = Math.floor(Math.random() * 0xffffffffffff).toString(16);
|
|
32
|
+
return key;
|
|
33
|
+
}
|
|
34
|
+
const reactKeysPluginKey = new _prosemirrorstate.PluginKey("@handlewithcare/react-prosemirror/reactKeys");
|
|
35
|
+
function reactKeys() {
|
|
36
|
+
return new _prosemirrorstate.Plugin({
|
|
37
|
+
key: reactKeysPluginKey,
|
|
38
|
+
state: {
|
|
39
|
+
init (_, state) {
|
|
40
|
+
const next = {
|
|
41
|
+
posToKey: new Map(),
|
|
42
|
+
keyToPos: new Map(),
|
|
43
|
+
cursorWrapper: null,
|
|
44
|
+
freezeFrom: null
|
|
45
|
+
};
|
|
46
|
+
state.doc.descendants((_, pos)=>{
|
|
47
|
+
const key = createNodeKey();
|
|
48
|
+
next.posToKey.set(pos, key);
|
|
49
|
+
next.keyToPos.set(key, pos);
|
|
50
|
+
return true;
|
|
51
|
+
});
|
|
52
|
+
return next;
|
|
53
|
+
},
|
|
54
|
+
/**
|
|
55
|
+
* Keeps node keys stable across transactions.
|
|
56
|
+
*
|
|
57
|
+
* To accomplish this, we map each node position forwards
|
|
58
|
+
* through the transaction to identify its current position,
|
|
59
|
+
* and assign its key to that new position, dropping it if the
|
|
60
|
+
* node was deleted.
|
|
61
|
+
*/ apply (tr, value, oldState, newState) {
|
|
62
|
+
const meta = tr.getMeta(reactKeysPluginKey);
|
|
63
|
+
const overrides = meta && "overrides" in meta ? meta.overrides : {};
|
|
64
|
+
const cursorWrapper = meta && "cursorWrapper" in meta ? meta.cursorWrapper : undefined;
|
|
65
|
+
const freezeFrom = meta && "freezeFrom" in meta ? meta.freezeFrom : undefined;
|
|
66
|
+
const next = {
|
|
67
|
+
posToKey: new Map(),
|
|
68
|
+
keyToPos: new Map(),
|
|
69
|
+
cursorWrapper: cursorWrapper === undefined ? value.cursorWrapper ? (0, _ReactWidgetType.widget)(tr.mapping.map(value.cursorWrapper.from, -1), value.cursorWrapper.type.Component, value.cursorWrapper.spec) : null : cursorWrapper,
|
|
70
|
+
freezeFrom: freezeFrom === undefined ? value.freezeFrom !== null ? tr.mapping.map(value.freezeFrom, -1) : null : freezeFrom
|
|
71
|
+
};
|
|
72
|
+
if (value.freezeFrom !== null && next.freezeFrom !== null && tr.getMeta("composition") == null) {
|
|
73
|
+
const oldBlock = oldState.doc.nodeAt(value.freezeFrom);
|
|
74
|
+
const newBlock = newState.doc.nodeAt(next.freezeFrom);
|
|
75
|
+
if (newBlock && !oldBlock?.eq(newBlock)) {
|
|
76
|
+
next.freezeFrom = null;
|
|
77
|
+
next.cursorWrapper = null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (!tr.docChanged || !meta?.overrides && tr.steps.every(keepsNodePositions)) {
|
|
81
|
+
return {
|
|
82
|
+
...value,
|
|
83
|
+
cursorWrapper: next.cursorWrapper,
|
|
84
|
+
freezeFrom: next.freezeFrom
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const posToKeyEntries = Array.from(value.posToKey.entries()).sort((param, param1)=>{
|
|
88
|
+
let [a] = param, [b] = param1;
|
|
89
|
+
return a - b;
|
|
90
|
+
});
|
|
91
|
+
for (const [pos, key] of posToKeyEntries){
|
|
92
|
+
const override = overrides?.[pos];
|
|
93
|
+
const { pos: newPos, deleted } = override === undefined ? tr.mapping.mapResult(pos) : {
|
|
94
|
+
pos: override,
|
|
95
|
+
deleted: false
|
|
96
|
+
};
|
|
97
|
+
if (deleted) continue;
|
|
98
|
+
next.posToKey.set(newPos, key);
|
|
99
|
+
next.keyToPos.set(key, newPos);
|
|
100
|
+
}
|
|
101
|
+
newState.doc.descendants((_, pos)=>{
|
|
102
|
+
if (next.posToKey.has(pos)) return true;
|
|
103
|
+
const key = createNodeKey();
|
|
104
|
+
next.posToKey.set(pos, key);
|
|
105
|
+
next.keyToPos.set(key, pos);
|
|
106
|
+
return true;
|
|
107
|
+
});
|
|
108
|
+
return next;
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
props: {
|
|
112
|
+
decorations (state) {
|
|
113
|
+
const deco = reactKeysPluginKey.getState(state)?.cursorWrapper;
|
|
114
|
+
if (!deco) return _prosemirrorview.DecorationSet.empty;
|
|
115
|
+
return _prosemirrorview.DecorationSet.create(state.doc, [
|
|
116
|
+
deco
|
|
117
|
+
]);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|