@thomasfosterau/effect-richtext 0.0.0 → 0.1.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 +48 -0
- package/README.md +117 -1
- package/dist/_virtual/_rolldown/runtime.js +12 -0
- package/dist/commands/commands.d.ts +323 -0
- package/dist/commands/commands.js +722 -0
- package/dist/commands/internal.js +43 -0
- package/dist/commands/keymaps.d.ts +46 -0
- package/dist/commands/keymaps.js +64 -0
- package/dist/commands.d.ts +3 -0
- package/dist/commands.js +3 -0
- package/dist/compat/commands.d.ts +250 -0
- package/dist/compat/commands.js +275 -0
- package/dist/compat/internal/core.d.ts +20 -0
- package/dist/compat/internal/core.js +148 -0
- package/dist/compat/internal/props.js +82 -0
- package/dist/compat/keymap.d.ts +21 -0
- package/dist/compat/keymap.js +38 -0
- package/dist/compat/model.d.ts +893 -0
- package/dist/compat/model.js +1212 -0
- package/dist/compat/orderedmap.d.ts +74 -0
- package/dist/compat/orderedmap.js +124 -0
- package/dist/compat/schema-basic.d.ts +38 -0
- package/dist/compat/schema-basic.js +238 -0
- package/dist/compat/schema-list.d.ts +81 -0
- package/dist/compat/schema-list.js +156 -0
- package/dist/compat/state.d.ts +415 -0
- package/dist/compat/state.js +689 -0
- package/dist/compat/test-builder.d.ts +98 -0
- package/dist/compat/test-builder.js +197 -0
- package/dist/compat/transform.d.ts +458 -0
- package/dist/compat/transform.js +803 -0
- package/dist/compat/view.d.ts +411 -0
- package/dist/compat/view.js +409 -0
- package/dist/dropcursor.d.ts +46 -0
- package/dist/dropcursor.js +176 -0
- package/dist/extensions/defaults.d.ts +716 -0
- package/dist/extensions/defaults.js +209 -0
- package/dist/extensions/editor.d.ts +246 -0
- package/dist/extensions/editor.js +271 -0
- package/dist/extensions/extension.d.ts +375 -0
- package/dist/extensions/extension.js +233 -0
- package/dist/extensions.d.ts +4 -0
- package/dist/extensions.js +4 -0
- package/dist/gapcursor.d.ts +66 -0
- package/dist/gapcursor.js +273 -0
- package/dist/history.d.ts +178 -0
- package/dist/history.js +412 -0
- package/dist/html.d.ts +158 -0
- package/dist/html.js +164 -0
- package/dist/inputrules.d.ts +271 -0
- package/dist/inputrules.js +321 -0
- package/dist/internal/attempt.js +15 -0
- package/dist/internal/json.js +29 -0
- package/dist/keymap/keymap.d.ts +130 -0
- package/dist/keymap/keymap.js +159 -0
- package/dist/keymap.d.ts +2 -0
- package/dist/keymap.js +1 -0
- package/dist/markdown/errors.d.ts +23 -0
- package/dist/markdown/errors.js +26 -0
- package/dist/markdown/from_markdown.d.ts +185 -0
- package/dist/markdown/from_markdown.js +266 -0
- package/dist/markdown/schema.d.ts +522 -0
- package/dist/markdown/schema.js +292 -0
- package/dist/markdown/to_markdown.d.ts +251 -0
- package/dist/markdown/to_markdown.js +413 -0
- package/dist/markdown.d.ts +5 -0
- package/dist/markdown.js +5 -0
- package/dist/model/attrsCodec.js +48 -0
- package/dist/model/comparedeep.js +17 -0
- package/dist/model/content.d.ts +232 -0
- package/dist/model/content.js +630 -0
- package/dist/model/diff.js +66 -0
- package/dist/model/dom.d.ts +3 -0
- package/dist/model/errors.d.ts +90 -0
- package/dist/model/errors.js +76 -0
- package/dist/model/fragment.d.ts +131 -0
- package/dist/model/fragment.js +262 -0
- package/dist/model/from_dom.d.ts +299 -0
- package/dist/model/from_dom.js +618 -0
- package/dist/model/json.d.ts +37 -0
- package/dist/model/json.js +126 -0
- package/dist/model/mark.d.ts +73 -0
- package/dist/model/mark.js +121 -0
- package/dist/model/node.d.ts +267 -0
- package/dist/model/node.js +434 -0
- package/dist/model/replace.d.ts +78 -0
- package/dist/model/replace.js +207 -0
- package/dist/model/resolvedpos.d.ts +196 -0
- package/dist/model/resolvedpos.js +305 -0
- package/dist/model/schema.d.ts +740 -0
- package/dist/model/schema.js +451 -0
- package/dist/model/to_dom.d.ts +169 -0
- package/dist/model/to_dom.js +238 -0
- package/dist/model.d.ts +12 -0
- package/dist/model.js +12 -0
- package/dist/placeholder.d.ts +53 -0
- package/dist/placeholder.js +79 -0
- package/dist/reactive/observer.d.ts +54 -0
- package/dist/reactive/observer.js +61 -0
- package/dist/reactive/selectors.d.ts +22 -0
- package/dist/reactive/selectors.js +61 -0
- package/dist/reactive/stateref.d.ts +72 -0
- package/dist/reactive/stateref.js +71 -0
- package/dist/reactive/streams.d.ts +83 -0
- package/dist/reactive/streams.js +85 -0
- package/dist/reactive.d.ts +16 -0
- package/dist/reactive.js +26 -0
- package/dist/schema-basic.d.ts +448 -0
- package/dist/schema-basic.js +269 -0
- package/dist/schema-list/commands.d.ts +66 -0
- package/dist/schema-list/commands.js +203 -0
- package/dist/schema-list.d.ts +92 -0
- package/dist/schema-list.js +100 -0
- package/dist/state/errors.d.ts +39 -0
- package/dist/state/errors.js +32 -0
- package/dist/state/plugin.d.ts +232 -0
- package/dist/state/plugin.js +82 -0
- package/dist/state/selection.d.ts +297 -0
- package/dist/state/selection.js +486 -0
- package/dist/state/state.d.ts +212 -0
- package/dist/state/state.js +489 -0
- package/dist/state/transaction.d.ts +145 -0
- package/dist/state/transaction.js +195 -0
- package/dist/state.d.ts +6 -0
- package/dist/state.js +6 -0
- package/dist/test-builder.d.ts +3582 -0
- package/dist/test-builder.js +239 -0
- package/dist/transform/attr_step.d.ts +60 -0
- package/dist/transform/attr_step.js +105 -0
- package/dist/transform/errors.d.ts +50 -0
- package/dist/transform/errors.js +35 -0
- package/dist/transform/map.d.ts +182 -0
- package/dist/transform/map.js +280 -0
- package/dist/transform/mark.js +98 -0
- package/dist/transform/mark_set_step.js +69 -0
- package/dist/transform/mark_step.d.ts +113 -0
- package/dist/transform/mark_step.js +225 -0
- package/dist/transform/replace.d.ts +18 -0
- package/dist/transform/replace.js +381 -0
- package/dist/transform/replace_step.d.ts +109 -0
- package/dist/transform/replace_step.js +175 -0
- package/dist/transform/step.d.ts +157 -0
- package/dist/transform/step.js +168 -0
- package/dist/transform/structure.d.ts +89 -0
- package/dist/transform/structure.js +350 -0
- package/dist/transform/transform.d.ts +248 -0
- package/dist/transform/transform.js +373 -0
- package/dist/transform.d.ts +10 -0
- package/dist/transform.js +10 -0
- package/dist/view/browser.js +39 -0
- package/dist/view/capturekeys.js +282 -0
- package/dist/view/clipboard.d.ts +8 -0
- package/dist/view/clipboard.js +245 -0
- package/dist/view/decoration.d.ts +339 -0
- package/dist/view/decoration.js +566 -0
- package/dist/view/dom.d.ts +18 -0
- package/dist/view/dom.js +140 -0
- package/dist/view/domchange.js +295 -0
- package/dist/view/domcoords.d.ts +22 -0
- package/dist/view/domcoords.js +448 -0
- package/dist/view/domobserver.d.ts +47 -0
- package/dist/view/domobserver.js +328 -0
- package/dist/view/errors.d.ts +18 -0
- package/dist/view/errors.js +21 -0
- package/dist/view/input.d.ts +58 -0
- package/dist/view/input.js +704 -0
- package/dist/view/selection.js +198 -0
- package/dist/view/view.d.ts +699 -0
- package/dist/view/view.js +623 -0
- package/dist/view/viewdesc.d.ts +236 -0
- package/dist/view/viewdesc.js +1205 -0
- package/dist/view-css.d.ts +43 -0
- package/dist/view-css.js +124 -0
- package/dist/view.d.ts +6 -0
- package/dist/view.js +4 -0
- package/package.json +200 -4
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { Selection } from "../state/selection.js";
|
|
2
|
+
import { chrome, gecko, ie, ie_version, safari } from "./browser.js";
|
|
3
|
+
import { domIndex, isEquivalentPosition, parentNode, selectionCollapsed } from "./dom.js";
|
|
4
|
+
import { hasFocusAndSelection, selectionFromDOM, selectionToDOM } from "./selection.js";
|
|
5
|
+
// src/view/domobserver.ts
|
|
6
|
+
/**
|
|
7
|
+
* Observing DOM mutations and selection changes.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
const observeOptions = {
|
|
12
|
+
childList: true,
|
|
13
|
+
characterData: true,
|
|
14
|
+
characterDataOldValue: true,
|
|
15
|
+
attributes: true,
|
|
16
|
+
attributeOldValue: true,
|
|
17
|
+
subtree: true
|
|
18
|
+
};
|
|
19
|
+
const useCharData = ie && ie_version <= 11;
|
|
20
|
+
var SelectionState = class {
|
|
21
|
+
constructor() {
|
|
22
|
+
this.anchorNode = null;
|
|
23
|
+
this.anchorOffset = 0;
|
|
24
|
+
this.focusNode = null;
|
|
25
|
+
this.focusOffset = 0;
|
|
26
|
+
}
|
|
27
|
+
set(sel) {
|
|
28
|
+
this.anchorNode = sel.anchorNode;
|
|
29
|
+
this.anchorOffset = sel.anchorOffset;
|
|
30
|
+
this.focusNode = sel.focusNode;
|
|
31
|
+
this.focusOffset = sel.focusOffset;
|
|
32
|
+
}
|
|
33
|
+
clear() {
|
|
34
|
+
this.anchorNode = this.focusNode = null;
|
|
35
|
+
}
|
|
36
|
+
eq(sel) {
|
|
37
|
+
return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset && sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
/** @internal */
|
|
41
|
+
var DOMObserver = class {
|
|
42
|
+
constructor(view, handleDOMChange) {
|
|
43
|
+
this.view = view;
|
|
44
|
+
this.handleDOMChange = handleDOMChange;
|
|
45
|
+
this.queue = [];
|
|
46
|
+
this.flushingSoon = -1;
|
|
47
|
+
this.observer = null;
|
|
48
|
+
this.currentSelection = new SelectionState();
|
|
49
|
+
this.onCharData = null;
|
|
50
|
+
this.suppressingSelectionUpdates = false;
|
|
51
|
+
this.lastChangedTextNode = null;
|
|
52
|
+
this.observer = window.MutationObserver && new window.MutationObserver((mutations) => {
|
|
53
|
+
for (let i = 0; i < mutations.length; i++) this.queue.push(mutations[i]);
|
|
54
|
+
if (ie && ie_version <= 11 && mutations.some((m) => m.type == "childList" && m.removedNodes.length || m.type == "characterData" && m.oldValue.length > m.target.nodeValue.length)) this.flushSoon();
|
|
55
|
+
else if (safari && view.composing && mutations.some((m) => m.type == "childList" && m.target.nodeName == "TR")) {
|
|
56
|
+
view.input.badSafariComposition = true;
|
|
57
|
+
this.flushSoon();
|
|
58
|
+
} else this.flush();
|
|
59
|
+
});
|
|
60
|
+
if (useCharData) this.onCharData = (e) => {
|
|
61
|
+
this.queue.push({
|
|
62
|
+
target: e.target,
|
|
63
|
+
type: "characterData",
|
|
64
|
+
oldValue: e.prevValue
|
|
65
|
+
});
|
|
66
|
+
this.flushSoon();
|
|
67
|
+
};
|
|
68
|
+
this.onSelectionChange = this.onSelectionChange.bind(this);
|
|
69
|
+
}
|
|
70
|
+
flushSoon() {
|
|
71
|
+
if (this.flushingSoon < 0) this.flushingSoon = window.setTimeout(() => {
|
|
72
|
+
this.flushingSoon = -1;
|
|
73
|
+
this.flush();
|
|
74
|
+
}, 20);
|
|
75
|
+
}
|
|
76
|
+
forceFlush() {
|
|
77
|
+
if (this.flushingSoon > -1) {
|
|
78
|
+
window.clearTimeout(this.flushingSoon);
|
|
79
|
+
this.flushingSoon = -1;
|
|
80
|
+
this.flush();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
start() {
|
|
84
|
+
if (this.observer) {
|
|
85
|
+
this.observer.takeRecords();
|
|
86
|
+
this.observer.observe(this.view.dom, observeOptions);
|
|
87
|
+
}
|
|
88
|
+
if (this.onCharData) this.view.dom.addEventListener("DOMCharacterDataModified", this.onCharData);
|
|
89
|
+
this.connectSelection();
|
|
90
|
+
}
|
|
91
|
+
stop() {
|
|
92
|
+
if (this.observer) {
|
|
93
|
+
const take = this.observer.takeRecords();
|
|
94
|
+
if (take.length) {
|
|
95
|
+
for (let i = 0; i < take.length; i++) this.queue.push(take[i]);
|
|
96
|
+
window.setTimeout(() => this.flush(), 20);
|
|
97
|
+
}
|
|
98
|
+
this.observer.disconnect();
|
|
99
|
+
}
|
|
100
|
+
if (this.onCharData) this.view.dom.removeEventListener("DOMCharacterDataModified", this.onCharData);
|
|
101
|
+
this.disconnectSelection();
|
|
102
|
+
}
|
|
103
|
+
connectSelection() {
|
|
104
|
+
this.view.dom.ownerDocument.addEventListener("selectionchange", this.onSelectionChange);
|
|
105
|
+
}
|
|
106
|
+
disconnectSelection() {
|
|
107
|
+
this.view.dom.ownerDocument.removeEventListener("selectionchange", this.onSelectionChange);
|
|
108
|
+
}
|
|
109
|
+
suppressSelectionUpdates() {
|
|
110
|
+
this.suppressingSelectionUpdates = true;
|
|
111
|
+
setTimeout(() => this.suppressingSelectionUpdates = false, 50);
|
|
112
|
+
}
|
|
113
|
+
onSelectionChange() {
|
|
114
|
+
if (!hasFocusAndSelection(this.view)) return;
|
|
115
|
+
if (this.suppressingSelectionUpdates) return selectionToDOM(this.view);
|
|
116
|
+
if (ie && ie_version <= 11 && !this.view.state.selection.empty) {
|
|
117
|
+
const sel = this.view.domSelectionRange();
|
|
118
|
+
if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset)) return this.flushSoon();
|
|
119
|
+
}
|
|
120
|
+
this.flush();
|
|
121
|
+
}
|
|
122
|
+
setCurSelection() {
|
|
123
|
+
this.currentSelection.set(this.view.domSelectionRange());
|
|
124
|
+
}
|
|
125
|
+
ignoreSelectionChange(sel) {
|
|
126
|
+
if (!sel.focusNode) return true;
|
|
127
|
+
const ancestors = /* @__PURE__ */ new WeakSet();
|
|
128
|
+
let container;
|
|
129
|
+
for (let scan = sel.focusNode; scan; scan = parentNode(scan)) ancestors.add(scan);
|
|
130
|
+
for (let scan = sel.anchorNode; scan; scan = parentNode(scan)) if (ancestors.has(scan)) {
|
|
131
|
+
container = scan;
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
const desc = container && this.view.docView.nearestDesc(container);
|
|
135
|
+
if (desc && desc.ignoreMutation({
|
|
136
|
+
type: "selection",
|
|
137
|
+
target: container.nodeType == 3 ? container.parentNode : container
|
|
138
|
+
})) {
|
|
139
|
+
this.setCurSelection();
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
pendingRecords() {
|
|
145
|
+
if (this.observer) for (const mut of this.observer.takeRecords()) this.queue.push(mut);
|
|
146
|
+
return this.queue;
|
|
147
|
+
}
|
|
148
|
+
flush() {
|
|
149
|
+
const { view } = this;
|
|
150
|
+
if (!view.docView || this.flushingSoon > -1) return;
|
|
151
|
+
const now = Date.now();
|
|
152
|
+
const mutations = this.pendingRecords();
|
|
153
|
+
if (mutations.length) this.queue = [];
|
|
154
|
+
const selRange = !this.suppressingSelectionUpdates && hasFocusAndSelection(view) ? view.domSelectionRange() : void 0;
|
|
155
|
+
const newSel = !!selRange && !this.currentSelection.eq(selRange) && !this.ignoreSelectionChange(selRange);
|
|
156
|
+
let from = -1, to = -1, typeOver = false;
|
|
157
|
+
const added = [];
|
|
158
|
+
if (view.editable) for (let i = 0; i < mutations.length; i++) {
|
|
159
|
+
const result = this.registerMutation(mutations[i], added);
|
|
160
|
+
if (result) {
|
|
161
|
+
from = from < 0 ? result.from : Math.min(result.from, from);
|
|
162
|
+
to = to < 0 ? result.to : Math.max(result.to, to);
|
|
163
|
+
if (result.typeOver) typeOver = true;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (added.some((n) => n.nodeName == "BR") && (view.input.lastKeyCode == 8 || view.input.lastKeyCode == 46 || chrome && (view.composing || view.input.compositionEndedAt > now - 50) && mutations.some((m) => m.type == "childList" && m.removedNodes.length))) {
|
|
167
|
+
for (const node of added) if (node.nodeName == "BR" && node.parentNode) {
|
|
168
|
+
let after = node.nextSibling;
|
|
169
|
+
while (after && after.nodeType == 1) {
|
|
170
|
+
if (after.contentEditable == "false") {
|
|
171
|
+
node.parentNode.removeChild(node);
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
after = after.firstChild;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
} else if (gecko && added.length) {
|
|
178
|
+
const brs = added.filter((n) => n.nodeName == "BR");
|
|
179
|
+
if (brs.length == 2) {
|
|
180
|
+
const [a, b] = brs;
|
|
181
|
+
if (a.parentNode && a.parentNode.parentNode == b.parentNode) b.remove();
|
|
182
|
+
else a.remove();
|
|
183
|
+
} else {
|
|
184
|
+
const { focusNode } = this.currentSelection;
|
|
185
|
+
for (const br of brs) {
|
|
186
|
+
const parent = br.parentNode;
|
|
187
|
+
if (parent && parent.nodeName == "LI" && (!focusNode || blockParent(view, focusNode) != parent)) br.remove();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
let readSel = null;
|
|
192
|
+
if (from < 0 && newSel && view.input.lastFocus > now - 200 && Math.max(view.input.lastTouch, view.input.lastClick.time) < now - 300 && selectionCollapsed(selRange) && (readSel = selectionFromDOM(view)) && readSel.eq(Selection.near(view.state.doc.resolveUnsafe(0), 1))) {
|
|
193
|
+
view.input.lastFocus = 0;
|
|
194
|
+
selectionToDOM(view);
|
|
195
|
+
this.currentSelection.set(selRange);
|
|
196
|
+
view.scrollToSelection();
|
|
197
|
+
} else if (from > -1 || newSel) {
|
|
198
|
+
if (from > -1) {
|
|
199
|
+
view.docView.markDirty(from, to);
|
|
200
|
+
checkCSS(view);
|
|
201
|
+
}
|
|
202
|
+
if (view.input.badSafariComposition) {
|
|
203
|
+
view.input.badSafariComposition = false;
|
|
204
|
+
fixUpBadSafariComposition(view, added);
|
|
205
|
+
}
|
|
206
|
+
this.handleDOMChange(from, to, typeOver, added);
|
|
207
|
+
if (view.docView && view.docView.dirty) view.updateState(view.state);
|
|
208
|
+
else if (selRange && !this.currentSelection.eq(selRange)) selectionToDOM(view);
|
|
209
|
+
if (selRange) this.currentSelection.set(selRange);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
registerMutation(mut, added) {
|
|
213
|
+
if (added.indexOf(mut.target) > -1) return null;
|
|
214
|
+
const desc = this.view.docView.nearestDesc(mut.target);
|
|
215
|
+
if (mut.type == "attributes" && (desc == this.view.docView || mut.attributeName == "contenteditable" || mut.attributeName == "style" && !mut.oldValue && !mut.target.getAttribute("style"))) return null;
|
|
216
|
+
if (!desc || desc.ignoreMutation(mut)) return null;
|
|
217
|
+
if (mut.type == "childList") {
|
|
218
|
+
for (let i = 0; i < mut.addedNodes.length; i++) {
|
|
219
|
+
const node = mut.addedNodes[i];
|
|
220
|
+
added.push(node);
|
|
221
|
+
if (node.nodeType == 3) this.lastChangedTextNode = node;
|
|
222
|
+
}
|
|
223
|
+
if (desc.contentDOM && desc.contentDOM != desc.dom && !desc.contentDOM.contains(mut.target)) return {
|
|
224
|
+
from: desc.posBefore,
|
|
225
|
+
to: desc.posAfter
|
|
226
|
+
};
|
|
227
|
+
let prev = mut.previousSibling, next = mut.nextSibling;
|
|
228
|
+
if (ie && ie_version <= 11 && mut.addedNodes.length) for (let i = 0; i < mut.addedNodes.length; i++) {
|
|
229
|
+
const { nextSibling, previousSibling } = mut.addedNodes[i];
|
|
230
|
+
if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0) prev = previousSibling;
|
|
231
|
+
if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0) next = nextSibling;
|
|
232
|
+
}
|
|
233
|
+
const fromOffset = prev && prev.parentNode == mut.target ? domIndex(prev) + 1 : 0;
|
|
234
|
+
const from = desc.localPosFromDOM(mut.target, fromOffset, -1);
|
|
235
|
+
const toOffset = next && next.parentNode == mut.target ? domIndex(next) : mut.target.childNodes.length;
|
|
236
|
+
return {
|
|
237
|
+
from,
|
|
238
|
+
to: desc.localPosFromDOM(mut.target, toOffset, 1)
|
|
239
|
+
};
|
|
240
|
+
} else if (mut.type == "attributes") return {
|
|
241
|
+
from: desc.posAtStart - desc.border,
|
|
242
|
+
to: desc.posAtEnd + desc.border
|
|
243
|
+
};
|
|
244
|
+
else {
|
|
245
|
+
this.lastChangedTextNode = mut.target;
|
|
246
|
+
return {
|
|
247
|
+
from: desc.posAtStart,
|
|
248
|
+
to: desc.posAtEnd,
|
|
249
|
+
typeOver: mut.target.nodeValue == mut.oldValue
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
const cssChecked = /* @__PURE__ */ new WeakMap();
|
|
255
|
+
let cssCheckWarned = false;
|
|
256
|
+
function checkCSS(view) {
|
|
257
|
+
if (cssChecked.has(view)) return;
|
|
258
|
+
cssChecked.set(view, null);
|
|
259
|
+
if ([
|
|
260
|
+
"normal",
|
|
261
|
+
"nowrap",
|
|
262
|
+
"pre-line"
|
|
263
|
+
].indexOf(getComputedStyle(view.dom).whiteSpace) !== -1) {
|
|
264
|
+
view.requiresGeckoHackNode = gecko;
|
|
265
|
+
if (cssCheckWarned) return;
|
|
266
|
+
console["warn"]("ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.");
|
|
267
|
+
cssCheckWarned = true;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function rangeToSelectionRange(view, range) {
|
|
271
|
+
let anchorNode = range.startContainer, anchorOffset = range.startOffset;
|
|
272
|
+
let focusNode = range.endContainer, focusOffset = range.endOffset;
|
|
273
|
+
const currentAnchor = view.domAtPos(view.state.selection.anchor);
|
|
274
|
+
if (isEquivalentPosition(currentAnchor.node, currentAnchor.offset, focusNode, focusOffset)) [anchorNode, anchorOffset, focusNode, focusOffset] = [
|
|
275
|
+
focusNode,
|
|
276
|
+
focusOffset,
|
|
277
|
+
anchorNode,
|
|
278
|
+
anchorOffset
|
|
279
|
+
];
|
|
280
|
+
return {
|
|
281
|
+
anchorNode,
|
|
282
|
+
anchorOffset,
|
|
283
|
+
focusNode,
|
|
284
|
+
focusOffset
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
/** @internal */
|
|
288
|
+
function safariShadowSelectionRange(view, selection) {
|
|
289
|
+
if (selection.getComposedRanges) {
|
|
290
|
+
const range = selection.getComposedRanges(view.root)[0];
|
|
291
|
+
if (range) return rangeToSelectionRange(view, range);
|
|
292
|
+
}
|
|
293
|
+
let found;
|
|
294
|
+
function read(event) {
|
|
295
|
+
event.preventDefault();
|
|
296
|
+
event.stopImmediatePropagation();
|
|
297
|
+
found = event.getTargetRanges()[0];
|
|
298
|
+
}
|
|
299
|
+
view.dom.addEventListener("beforeinput", read, true);
|
|
300
|
+
document.execCommand("indent");
|
|
301
|
+
view.dom.removeEventListener("beforeinput", read, true);
|
|
302
|
+
return found ? rangeToSelectionRange(view, found) : null;
|
|
303
|
+
}
|
|
304
|
+
function blockParent(view, node) {
|
|
305
|
+
for (let p = node.parentNode; p && p != view.dom; p = p.parentNode) {
|
|
306
|
+
const desc = view.docView.nearestDesc(p, true);
|
|
307
|
+
if (desc && desc.node.isBlock) return p;
|
|
308
|
+
}
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
function fixUpBadSafariComposition(view, addedNodes) {
|
|
312
|
+
const { focusNode, focusOffset } = view.domSelectionRange();
|
|
313
|
+
for (const node of addedNodes) if (node.parentNode?.nodeName == "TR") {
|
|
314
|
+
let nextCell = node.nextSibling;
|
|
315
|
+
while (nextCell && nextCell.nodeName != "TD" && nextCell.nodeName != "TH") nextCell = nextCell.nextSibling;
|
|
316
|
+
if (nextCell) {
|
|
317
|
+
let parent = nextCell;
|
|
318
|
+
for (;;) {
|
|
319
|
+
const first = parent.firstChild;
|
|
320
|
+
if (!first || first.nodeType != 1 || first.contentEditable == "false" || /^(BR|IMG)$/.test(first.nodeName)) break;
|
|
321
|
+
parent = first;
|
|
322
|
+
}
|
|
323
|
+
parent.insertBefore(node, parent.firstChild);
|
|
324
|
+
if (focusNode == node) view.domSelection().collapse(node, focusOffset);
|
|
325
|
+
} else node.parentNode.removeChild(node);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
export { DOMObserver, safariShadowSelectionRange };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as Schema from "effect/Schema";
|
|
2
|
+
declare const ViewError_base: Schema.Class<ViewError, Schema.TaggedStruct<"ViewError", {
|
|
3
|
+
readonly message: Schema.String;
|
|
4
|
+
}>, import("effect/Cause").YieldableError>;
|
|
5
|
+
/**
|
|
6
|
+
* An invalid view operation, such as asking for the document position
|
|
7
|
+
* of a DOM position that is not inside the editor.
|
|
8
|
+
*
|
|
9
|
+
* @since 0.1.0
|
|
10
|
+
* @category errors
|
|
11
|
+
*/
|
|
12
|
+
export declare class ViewError extends ViewError_base {}
|
|
13
|
+
/**
|
|
14
|
+
* @since 0.1.0
|
|
15
|
+
* @category guards
|
|
16
|
+
*/
|
|
17
|
+
export declare const isViewError: (u: unknown) => u is ViewError;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as Schema from "effect/Schema";
|
|
2
|
+
// src/view/errors.ts
|
|
3
|
+
/**
|
|
4
|
+
* Tagged errors raised by the view layer.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.1.0
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* An invalid view operation, such as asking for the document position
|
|
10
|
+
* of a DOM position that is not inside the editor.
|
|
11
|
+
*
|
|
12
|
+
* @since 0.1.0
|
|
13
|
+
* @category errors
|
|
14
|
+
*/
|
|
15
|
+
var ViewError = class extends Schema.TaggedError()("ViewError", { message: Schema.String }) {};
|
|
16
|
+
/**
|
|
17
|
+
* @since 0.1.0
|
|
18
|
+
* @category guards
|
|
19
|
+
*/
|
|
20
|
+
const isViewError = (u) => u instanceof ViewError;
|
|
21
|
+
export { ViewError, isViewError };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Node } from "../model/node.js";
|
|
2
|
+
import "../model.js";
|
|
3
|
+
import "../state.js";
|
|
4
|
+
import { EditorView } from "./view.js";
|
|
5
|
+
import { ViewDesc } from "./viewdesc.js";
|
|
6
|
+
type AnyView = EditorView<any, any, any>;
|
|
7
|
+
/** @internal */
|
|
8
|
+
export declare class InputState {
|
|
9
|
+
shiftKey: boolean;
|
|
10
|
+
mouseDown: MouseDown | null;
|
|
11
|
+
lastKeyCode: number | null;
|
|
12
|
+
lastKeyCodeTime: number;
|
|
13
|
+
lastKeyDispatched: boolean;
|
|
14
|
+
lastClick: {
|
|
15
|
+
time: number;
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
type: string;
|
|
19
|
+
button: number;
|
|
20
|
+
};
|
|
21
|
+
lastSelectionOrigin: string | null;
|
|
22
|
+
lastSelectionTime: number;
|
|
23
|
+
lastIOSEnter: number;
|
|
24
|
+
lastIOSEnterFallbackTimeout: any;
|
|
25
|
+
lastFocus: number;
|
|
26
|
+
lastTouch: number;
|
|
27
|
+
lastChromeDelete: number;
|
|
28
|
+
composing: boolean;
|
|
29
|
+
compositionNode: Text | null;
|
|
30
|
+
composingTimeout: any;
|
|
31
|
+
compositionNodes: Array<ViewDesc>;
|
|
32
|
+
compositionEndedAt: number;
|
|
33
|
+
compositionID: number;
|
|
34
|
+
badSafariComposition: boolean;
|
|
35
|
+
compositionPendingChanges: number;
|
|
36
|
+
domChangeCount: number;
|
|
37
|
+
eventHandlers: {
|
|
38
|
+
[event: string]: (event: Event) => void;
|
|
39
|
+
};
|
|
40
|
+
hideSelectionGuard: (() => void) | null;
|
|
41
|
+
}
|
|
42
|
+
declare abstract class MouseDown {
|
|
43
|
+
readonly view: AnyView;
|
|
44
|
+
mightDrag: {
|
|
45
|
+
node: Node<any, any>;
|
|
46
|
+
pos: number;
|
|
47
|
+
addAttr: boolean;
|
|
48
|
+
setUneditable: boolean;
|
|
49
|
+
} | null;
|
|
50
|
+
constructor(view: AnyView);
|
|
51
|
+
up(_event: MouseEvent): void;
|
|
52
|
+
move(event: MouseEvent): void;
|
|
53
|
+
done(): void;
|
|
54
|
+
delaySelUpdate(): boolean;
|
|
55
|
+
}
|
|
56
|
+
/** @internal */
|
|
57
|
+
export declare function endComposition(view: AnyView, restarting?: boolean): boolean;
|
|
58
|
+
export {};
|