@prosekit/core 0.0.0-next-20240715033214 → 0.0.0-next-20240715045302
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/dist/{chunk-YWQGKV6X.js → chunk-UDQXAK7F.js} +379 -195
- package/dist/prosekit-core-test.js +66 -26
- package/dist/prosekit-core.js +585 -287
- package/package.json +2 -2
package/dist/prosekit-core.js
CHANGED
@@ -35,7 +35,7 @@ import {
|
|
35
35
|
stateFromJSON,
|
36
36
|
toReversed,
|
37
37
|
union
|
38
|
-
} from "./chunk-
|
38
|
+
} from "./chunk-UDQXAK7F.js";
|
39
39
|
|
40
40
|
// src/commands/add-mark.ts
|
41
41
|
import "@prosekit/pm/model";
|
@@ -43,8 +43,14 @@ import "@prosekit/pm/state";
|
|
43
43
|
function addMark(options) {
|
44
44
|
return (state, dispatch) => {
|
45
45
|
var _a, _b;
|
46
|
-
|
47
|
-
|
46
|
+
const mark = getMarkType(state.schema, options.type).create(options.attrs);
|
47
|
+
const from = (_a = options.from) != null ? _a : state.selection.from;
|
48
|
+
const to = (_b = options.to) != null ? _b : state.selection.to;
|
49
|
+
if (from > to) {
|
50
|
+
return false;
|
51
|
+
}
|
52
|
+
dispatch == null ? void 0 : dispatch(state.tr.addMark(from, to, mark));
|
53
|
+
return true;
|
48
54
|
};
|
49
55
|
}
|
50
56
|
|
@@ -52,26 +58,52 @@ function addMark(options) {
|
|
52
58
|
import { TextSelection } from "@prosekit/pm/state";
|
53
59
|
function expandMark(options) {
|
54
60
|
return (state, dispatch) => {
|
55
|
-
|
56
|
-
|
61
|
+
const markType = getMarkType(state.schema, options.type);
|
62
|
+
const predicate = (mark) => mark.type === markType;
|
63
|
+
const from = expandMarkBefore(state.selection.$from, predicate);
|
64
|
+
const to = expandMarkAfter(state.selection.$to, predicate);
|
65
|
+
if (from === state.selection.from && to === state.selection.to) {
|
66
|
+
return false;
|
67
|
+
}
|
68
|
+
if (dispatch) {
|
69
|
+
dispatch(state.tr.setSelection(TextSelection.create(state.doc, from, to)));
|
70
|
+
}
|
71
|
+
return true;
|
57
72
|
};
|
58
73
|
}
|
59
74
|
function expandMarkBefore($pos, predicate) {
|
60
|
-
|
61
|
-
if (!$pos.marks().some(predicate))
|
75
|
+
const { parent } = $pos;
|
76
|
+
if (!$pos.marks().some(predicate)) {
|
62
77
|
return $pos.pos;
|
63
|
-
|
64
|
-
|
65
|
-
|
78
|
+
}
|
79
|
+
const index = $pos.index();
|
80
|
+
let boundaryIndex = index;
|
81
|
+
for (let i = index; i >= 0; i--) {
|
82
|
+
const node = parent.child(i);
|
83
|
+
if (node.marks.some(predicate)) {
|
84
|
+
boundaryIndex = i;
|
85
|
+
} else {
|
86
|
+
break;
|
87
|
+
}
|
88
|
+
}
|
66
89
|
return $pos.posAtIndex(boundaryIndex);
|
67
90
|
}
|
68
91
|
function expandMarkAfter($pos, predicate) {
|
69
|
-
|
70
|
-
if (!$pos.marks().some(predicate))
|
92
|
+
const { parent } = $pos;
|
93
|
+
if (!$pos.marks().some(predicate)) {
|
71
94
|
return $pos.pos;
|
72
|
-
|
73
|
-
|
74
|
-
|
95
|
+
}
|
96
|
+
const index = Math.max(0, $pos.indexAfter() - 1);
|
97
|
+
const childCount = parent.childCount;
|
98
|
+
let boundaryIndex = index;
|
99
|
+
for (let i = index; i < childCount; i++) {
|
100
|
+
const node = parent.child(i);
|
101
|
+
if (node.marks.some(predicate)) {
|
102
|
+
boundaryIndex = i;
|
103
|
+
} else {
|
104
|
+
break;
|
105
|
+
}
|
106
|
+
}
|
75
107
|
return $pos.posAtIndex(boundaryIndex) + parent.child(boundaryIndex).nodeSize;
|
76
108
|
}
|
77
109
|
|
@@ -82,7 +114,9 @@ import { insertPoint } from "@prosekit/pm/transform";
|
|
82
114
|
// src/utils/set-selection-around.ts
|
83
115
|
import { TextSelection as TextSelection2 } from "@prosekit/pm/state";
|
84
116
|
function setSelectionAround(tr, pos) {
|
85
|
-
|
117
|
+
const docSize = tr.doc.content.size;
|
118
|
+
const $pos = tr.doc.resolve(pos > docSize ? docSize : pos < 0 ? 0 : pos);
|
119
|
+
const selection = TextSelection2.between($pos, $pos);
|
86
120
|
tr.setSelection(selection);
|
87
121
|
}
|
88
122
|
|
@@ -90,19 +124,20 @@ function setSelectionAround(tr, pos) {
|
|
90
124
|
function insertNode(options) {
|
91
125
|
return (state, dispatch) => {
|
92
126
|
var _a;
|
93
|
-
|
127
|
+
const node = options.node ? options.node : options.type ? getNodeType(state.schema, options.type).createAndFill(options.attrs) : null;
|
94
128
|
assert(node, "You must provide either a node or a type");
|
95
|
-
|
129
|
+
const insertPos = insertPoint(
|
96
130
|
state.doc,
|
97
131
|
(_a = options.pos) != null ? _a : state.selection.anchor,
|
98
132
|
node.type
|
99
133
|
);
|
100
|
-
if (insertPos == null) return
|
134
|
+
if (insertPos == null) return false;
|
101
135
|
if (dispatch) {
|
102
|
-
|
103
|
-
setSelectionAround(tr, insertPos + node.nodeSize)
|
136
|
+
const tr = state.tr.insert(insertPos, node);
|
137
|
+
setSelectionAround(tr, insertPos + node.nodeSize);
|
138
|
+
dispatch(tr);
|
104
139
|
}
|
105
|
-
return
|
140
|
+
return true;
|
106
141
|
};
|
107
142
|
}
|
108
143
|
|
@@ -112,21 +147,31 @@ import "@prosekit/pm/state";
|
|
112
147
|
function removeMark(options) {
|
113
148
|
return (state, dispatch) => {
|
114
149
|
var _a, _b;
|
115
|
-
|
116
|
-
|
150
|
+
const markType = getMarkType(state.schema, options.type);
|
151
|
+
const mark = options.attrs ? markType.create(options.attrs) : markType;
|
152
|
+
const from = (_a = options.from) != null ? _a : state.selection.from;
|
153
|
+
const to = (_b = options.to) != null ? _b : state.selection.to;
|
154
|
+
if (from > to) {
|
155
|
+
return false;
|
156
|
+
}
|
157
|
+
dispatch == null ? void 0 : dispatch(state.tr.removeMark(from, to, mark));
|
158
|
+
return true;
|
117
159
|
};
|
118
160
|
}
|
119
161
|
|
120
162
|
// src/utils/find-parent-node.ts
|
121
163
|
function findParentNode(nodeType, $pos) {
|
122
|
-
for (let depth = $pos.depth; depth > 0; depth -= 1)
|
123
|
-
|
124
|
-
|
164
|
+
for (let depth = $pos.depth; depth > 0; depth -= 1) {
|
165
|
+
const node = $pos.node(depth);
|
166
|
+
if (node.type === nodeType) {
|
167
|
+
const from = $pos.before(depth);
|
168
|
+
const to = $pos.after(depth);
|
125
169
|
return {
|
126
170
|
from,
|
127
171
|
to
|
128
172
|
};
|
129
173
|
}
|
174
|
+
}
|
130
175
|
return {
|
131
176
|
from: null,
|
132
177
|
to: null
|
@@ -136,8 +181,14 @@ function findParentNode(nodeType, $pos) {
|
|
136
181
|
// src/commands/remove-node.ts
|
137
182
|
function removeNode(options) {
|
138
183
|
return (state, dispatch) => {
|
139
|
-
|
140
|
-
|
184
|
+
const nodeType = getNodeType(state.schema, options.type);
|
185
|
+
const $pos = typeof options.pos === "number" ? state.doc.resolve(options.pos) : state.selection.$anchor;
|
186
|
+
const { from, to } = findParentNode(nodeType, $pos);
|
187
|
+
if (from == null || to == null || from > to) {
|
188
|
+
return false;
|
189
|
+
}
|
190
|
+
dispatch == null ? void 0 : dispatch(state.tr.delete(from, to));
|
191
|
+
return true;
|
141
192
|
};
|
142
193
|
}
|
143
194
|
|
@@ -147,9 +198,10 @@ import "@prosekit/pm/state";
|
|
147
198
|
// src/utils/get-custom-selection.ts
|
148
199
|
import { TextSelection as TextSelection3 } from "@prosekit/pm/state";
|
149
200
|
function getCustomSelection(state, from, to) {
|
150
|
-
|
201
|
+
const pos = from != null ? from : to;
|
151
202
|
if (pos != null) {
|
152
|
-
|
203
|
+
const $from = state.doc.resolve(from != null ? from : pos);
|
204
|
+
const $to = state.doc.resolve(to != null ? to : pos);
|
153
205
|
return TextSelection3.between($from, $to);
|
154
206
|
}
|
155
207
|
return state.selection;
|
@@ -158,28 +210,31 @@ function getCustomSelection(state, from, to) {
|
|
158
210
|
// src/commands/set-block-type.ts
|
159
211
|
function setBlockType(options) {
|
160
212
|
return (state, dispatch) => {
|
161
|
-
|
213
|
+
const nodeType = getNodeType(state.schema, options.type);
|
214
|
+
const selection = getCustomSelection(state, options.from, options.to);
|
215
|
+
const attrs = options.attrs;
|
216
|
+
let applicable = false;
|
162
217
|
for (let i = 0; i < selection.ranges.length && !applicable; i++) {
|
163
|
-
|
218
|
+
const {
|
164
219
|
$from: { pos: from },
|
165
220
|
$to: { pos: to }
|
166
221
|
} = selection.ranges[i];
|
167
222
|
state.doc.nodesBetween(from, to, (node, pos) => {
|
168
|
-
if (applicable) return
|
169
|
-
if (!
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
223
|
+
if (applicable) return false;
|
224
|
+
if (!node.isTextblock || node.hasMarkup(nodeType, attrs)) return;
|
225
|
+
if (node.type == nodeType) {
|
226
|
+
applicable = true;
|
227
|
+
} else {
|
228
|
+
const $pos = state.doc.resolve(pos), index = $pos.index();
|
229
|
+
applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);
|
230
|
+
}
|
176
231
|
});
|
177
232
|
}
|
178
|
-
if (!applicable) return
|
233
|
+
if (!applicable) return false;
|
179
234
|
if (dispatch) {
|
180
|
-
|
181
|
-
for (
|
182
|
-
|
235
|
+
const tr = state.tr;
|
236
|
+
for (const range of selection.ranges) {
|
237
|
+
const {
|
183
238
|
$from: { pos: from },
|
184
239
|
$to: { pos: to }
|
185
240
|
} = range;
|
@@ -187,34 +242,48 @@ function setBlockType(options) {
|
|
187
242
|
}
|
188
243
|
dispatch(tr.scrollIntoView());
|
189
244
|
}
|
190
|
-
return
|
245
|
+
return true;
|
191
246
|
};
|
192
247
|
}
|
193
248
|
|
194
249
|
// src/utils/get-node-types.ts
|
195
250
|
import "@prosekit/pm/model";
|
196
251
|
function getNodeTypes(schema, types) {
|
197
|
-
|
252
|
+
if (Array.isArray(types)) {
|
253
|
+
return types.map((type) => getNodeType(schema, type));
|
254
|
+
}
|
255
|
+
return [getNodeType(schema, types)];
|
198
256
|
}
|
199
257
|
|
200
258
|
// src/commands/set-node-attrs.ts
|
201
259
|
function setNodeAttrs(options) {
|
202
260
|
return (state, dispatch) => {
|
203
261
|
var _a, _b;
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
262
|
+
const nodeTypes = getNodeTypes(state.schema, options.type);
|
263
|
+
const from = (_a = options.pos) != null ? _a : state.selection.from;
|
264
|
+
const to = (_b = options.pos) != null ? _b : state.selection.to;
|
265
|
+
const positions = [];
|
266
|
+
state.doc.nodesBetween(from, to, (node, pos) => {
|
267
|
+
if (nodeTypes.includes(node.type)) {
|
268
|
+
positions.push(pos);
|
269
|
+
}
|
270
|
+
if (!dispatch && positions.length > 0) {
|
271
|
+
return false;
|
272
|
+
}
|
273
|
+
});
|
274
|
+
if (positions.length === 0) {
|
275
|
+
return false;
|
276
|
+
}
|
210
277
|
if (dispatch) {
|
211
|
-
|
212
|
-
for (
|
213
|
-
for (
|
278
|
+
const { tr } = state;
|
279
|
+
for (const pos of positions) {
|
280
|
+
for (const [key, value] of Object.entries(options.attrs)) {
|
214
281
|
tr.setNodeAttribute(pos, key, value);
|
282
|
+
}
|
283
|
+
}
|
215
284
|
dispatch(tr);
|
216
285
|
}
|
217
|
-
return
|
286
|
+
return true;
|
218
287
|
};
|
219
288
|
}
|
220
289
|
|
@@ -222,56 +291,76 @@ function setNodeAttrs(options) {
|
|
222
291
|
import "@prosekit/pm/model";
|
223
292
|
import "@prosekit/pm/state";
|
224
293
|
function markApplies(doc, ranges, type) {
|
225
|
-
for (
|
226
|
-
let can = $from.depth == 0 ? doc.inlineContent && doc.type.allowsMarkType(type) :
|
227
|
-
|
228
|
-
if (can) return
|
294
|
+
for (const { $from, $to } of ranges) {
|
295
|
+
let can = $from.depth == 0 ? doc.inlineContent && doc.type.allowsMarkType(type) : false;
|
296
|
+
doc.nodesBetween($from.pos, $to.pos, (node) => {
|
297
|
+
if (can) return false;
|
229
298
|
can = node.inlineContent && node.type.allowsMarkType(type);
|
230
|
-
})
|
299
|
+
});
|
300
|
+
if (can) return true;
|
231
301
|
}
|
232
|
-
return
|
302
|
+
return false;
|
233
303
|
}
|
234
304
|
function baseToggleMark(markType, attrs = null, options) {
|
235
|
-
|
305
|
+
const removeWhenPresent = (options && options.removeWhenPresent) !== false;
|
236
306
|
return function(state, dispatch) {
|
237
|
-
|
307
|
+
const { empty, $cursor, ranges } = state.selection;
|
238
308
|
if (empty && !$cursor || !markApplies(state.doc, ranges, markType))
|
239
|
-
return
|
240
|
-
if (dispatch)
|
241
|
-
if ($cursor)
|
242
|
-
markType.isInSet(state.storedMarks || $cursor.marks())
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
309
|
+
return false;
|
310
|
+
if (dispatch) {
|
311
|
+
if ($cursor) {
|
312
|
+
if (markType.isInSet(state.storedMarks || $cursor.marks()))
|
313
|
+
dispatch(state.tr.removeStoredMark(markType));
|
314
|
+
else dispatch(state.tr.addStoredMark(markType.create(attrs)));
|
315
|
+
} else {
|
316
|
+
let add;
|
317
|
+
const tr = state.tr;
|
318
|
+
if (removeWhenPresent) {
|
319
|
+
add = !ranges.some(
|
320
|
+
(r) => state.doc.rangeHasMark(r.$from.pos, r.$to.pos, markType)
|
321
|
+
);
|
322
|
+
} else {
|
323
|
+
add = !ranges.every((r) => {
|
324
|
+
let missing = false;
|
325
|
+
tr.doc.nodesBetween(r.$from.pos, r.$to.pos, (node, pos, parent) => {
|
326
|
+
if (missing) return false;
|
327
|
+
missing = !markType.isInSet(node.marks) && !!parent && parent.type.allowsMarkType(markType) && !(node.isText && /^\s*$/.test(
|
328
|
+
node.textBetween(
|
329
|
+
Math.max(0, r.$from.pos - pos),
|
330
|
+
Math.min(node.nodeSize, r.$to.pos - pos)
|
331
|
+
)
|
332
|
+
));
|
333
|
+
});
|
334
|
+
return !missing;
|
335
|
+
});
|
336
|
+
}
|
337
|
+
for (const { $from, $to } of ranges) {
|
338
|
+
if (!add) {
|
261
339
|
tr.removeMark($from.pos, $to.pos, markType);
|
262
|
-
else {
|
263
|
-
let from = $from.pos, to = $to.pos
|
264
|
-
|
340
|
+
} else {
|
341
|
+
let from = $from.pos, to = $to.pos;
|
342
|
+
const start = $from.nodeAfter, end = $to.nodeBefore;
|
343
|
+
const spaceStart = start && start.isText ? /^\s*/.exec(start.text)[0].length : 0;
|
344
|
+
const spaceEnd = end && end.isText ? /\s*$/.exec(end.text)[0].length : 0;
|
345
|
+
if (from + spaceStart < to) {
|
346
|
+
from += spaceStart;
|
347
|
+
to -= spaceEnd;
|
348
|
+
}
|
349
|
+
tr.addMark(from, to, markType.create(attrs));
|
265
350
|
}
|
351
|
+
}
|
266
352
|
dispatch(tr.scrollIntoView());
|
267
353
|
}
|
268
|
-
|
354
|
+
}
|
355
|
+
return true;
|
269
356
|
};
|
270
357
|
}
|
271
358
|
function toggleMark({ type, attrs }) {
|
272
|
-
return (state, dispatch, view) =>
|
273
|
-
|
274
|
-
|
359
|
+
return (state, dispatch, view) => {
|
360
|
+
return baseToggleMark(getMarkType(state.schema, type), attrs, {
|
361
|
+
removeWhenPresent: false
|
362
|
+
})(state, dispatch, view);
|
363
|
+
};
|
275
364
|
}
|
276
365
|
|
277
366
|
// src/commands/toggle-node.ts
|
@@ -281,10 +370,13 @@ import "@prosekit/pm/state";
|
|
281
370
|
function toggleNode({ type, attrs }) {
|
282
371
|
return (state, dispatch, view) => {
|
283
372
|
if (isNodeActive(state, type, attrs)) {
|
284
|
-
|
285
|
-
|
373
|
+
const defaultType = state.schema.topNodeType.contentMatch.defaultType;
|
374
|
+
if (!defaultType) {
|
375
|
+
return false;
|
376
|
+
}
|
377
|
+
return setBlockType2(defaultType)(state, dispatch, view);
|
286
378
|
} else {
|
287
|
-
|
379
|
+
const nodeType = getNodeType(state.schema, type);
|
288
380
|
return setBlockType2(nodeType, attrs)(state, dispatch, view);
|
289
381
|
}
|
290
382
|
};
|
@@ -297,31 +389,40 @@ import { ReplaceAroundStep } from "@prosekit/pm/transform";
|
|
297
389
|
function unsetBlockType(options) {
|
298
390
|
return (state, dispatch) => {
|
299
391
|
var _a, _b;
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
392
|
+
const from = (_a = options == null ? void 0 : options.from) != null ? _a : state.selection.from;
|
393
|
+
const to = (_b = options == null ? void 0 : options.to) != null ? _b : state.selection.to;
|
394
|
+
if (from > to) return false;
|
395
|
+
const tr = state.tr;
|
396
|
+
if (unsetTextBlockType(tr, from, to)) {
|
397
|
+
dispatch == null ? void 0 : dispatch(tr);
|
398
|
+
return true;
|
399
|
+
}
|
400
|
+
return false;
|
304
401
|
};
|
305
402
|
}
|
306
403
|
function unsetTextBlockType(tr, from, to) {
|
307
|
-
|
308
|
-
|
309
|
-
if (!parent || !node.isTextblock) return
|
310
|
-
|
404
|
+
const mapFrom = tr.steps.length;
|
405
|
+
tr.doc.nodesBetween(from, to, (node, pos, parent, index) => {
|
406
|
+
if (!parent || !node.isTextblock) return true;
|
407
|
+
const defaultType = parent.contentMatchAt(index).defaultType;
|
311
408
|
if (defaultType && defaultType.isTextblock && node.type !== defaultType && defaultType.validContent(node.content)) {
|
312
|
-
|
409
|
+
const mapping = tr.mapping.slice(mapFrom);
|
410
|
+
const start = mapping.map(pos, 1);
|
411
|
+
const end = mapping.map(pos + node.nodeSize, 1);
|
412
|
+
const step = new ReplaceAroundStep(
|
313
413
|
start,
|
314
414
|
end,
|
315
415
|
start + 1,
|
316
416
|
end - 1,
|
317
417
|
new Slice(Fragment.from(defaultType.create()), 0, 0),
|
318
418
|
1,
|
319
|
-
|
419
|
+
true
|
320
420
|
);
|
321
421
|
tr.step(step);
|
322
422
|
}
|
323
|
-
return
|
324
|
-
})
|
423
|
+
return false;
|
424
|
+
});
|
425
|
+
return tr.steps.length > mapFrom;
|
325
426
|
}
|
326
427
|
|
327
428
|
// src/commands/unset-mark.ts
|
@@ -329,8 +430,11 @@ import "@prosekit/pm/state";
|
|
329
430
|
function unsetMark(options) {
|
330
431
|
return (state, dispatch) => {
|
331
432
|
var _a, _b;
|
332
|
-
|
333
|
-
|
433
|
+
const from = (_a = options == null ? void 0 : options.from) != null ? _a : state.selection.from;
|
434
|
+
const to = (_b = options == null ? void 0 : options.to) != null ? _b : state.selection.to;
|
435
|
+
if (from > to) return false;
|
436
|
+
dispatch == null ? void 0 : dispatch(state.tr.removeMark(from, to));
|
437
|
+
return true;
|
334
438
|
};
|
335
439
|
}
|
336
440
|
|
@@ -340,17 +444,21 @@ import "@prosekit/pm/state";
|
|
340
444
|
import { findWrapping } from "@prosekit/pm/transform";
|
341
445
|
function wrap({ nodeType, attrs }) {
|
342
446
|
return (state, dispatch) => {
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
447
|
+
const { $from, $to } = state.selection;
|
448
|
+
const range = $from.blockRange($to);
|
449
|
+
if (!range) return false;
|
450
|
+
const wrapping = findWrapping(range, nodeType, attrs);
|
451
|
+
if (!wrapping) return false;
|
452
|
+
dispatch == null ? void 0 : dispatch(state.tr.wrap(range, wrapping));
|
453
|
+
return true;
|
347
454
|
};
|
348
455
|
}
|
349
456
|
|
350
457
|
// src/editor/with-priority.ts
|
351
458
|
function withPriority(extension, priority) {
|
352
|
-
|
353
|
-
|
459
|
+
const result = union(extension);
|
460
|
+
result.priority = priority;
|
461
|
+
return result;
|
354
462
|
}
|
355
463
|
|
356
464
|
// src/commands/insert-text.ts
|
@@ -359,20 +467,31 @@ function insertText({
|
|
359
467
|
from,
|
360
468
|
to
|
361
469
|
}) {
|
362
|
-
return (state, dispatch) =>
|
470
|
+
return (state, dispatch) => {
|
471
|
+
if (text) {
|
472
|
+
dispatch == null ? void 0 : dispatch(state.tr.insertText(text, from, to));
|
473
|
+
}
|
474
|
+
return true;
|
475
|
+
};
|
363
476
|
}
|
364
477
|
|
365
478
|
// src/commands/select-all.ts
|
366
479
|
import { AllSelection } from "@prosekit/pm/state";
|
367
480
|
function selectAll() {
|
368
|
-
return (state, dispatch) =>
|
481
|
+
return (state, dispatch) => {
|
482
|
+
dispatch == null ? void 0 : dispatch(state.tr.setSelection(new AllSelection(state.doc)));
|
483
|
+
return true;
|
484
|
+
};
|
369
485
|
}
|
370
486
|
|
371
487
|
// src/facets/command.ts
|
372
488
|
var commandFacet = defineFacet({
|
373
|
-
reducer: (inputs) =>
|
489
|
+
reducer: (inputs) => {
|
490
|
+
const commands2 = Object.assign({}, ...inputs);
|
491
|
+
return { commands: commands2 };
|
492
|
+
},
|
374
493
|
parent: rootFacet,
|
375
|
-
singleton:
|
494
|
+
singleton: true
|
376
495
|
});
|
377
496
|
|
378
497
|
// src/extensions/command.ts
|
@@ -404,34 +523,49 @@ import OrderedMap from "orderedmap";
|
|
404
523
|
var schemaSpecFacet = defineFacet({
|
405
524
|
reducer: (specs) => {
|
406
525
|
var _a;
|
407
|
-
let nodes = OrderedMap.from({})
|
408
|
-
|
409
|
-
|
526
|
+
let nodes = OrderedMap.from({});
|
527
|
+
let marks = OrderedMap.from({});
|
528
|
+
let topNode = void 0;
|
529
|
+
for (const spec of specs) {
|
530
|
+
nodes = nodes.append(spec.nodes);
|
531
|
+
marks = marks.append((_a = spec.marks) != null ? _a : {});
|
532
|
+
topNode = topNode != null ? topNode : spec.topNode;
|
533
|
+
}
|
410
534
|
return { nodes, marks, topNode };
|
411
535
|
},
|
412
536
|
parent: schemaFacet,
|
413
|
-
singleton:
|
537
|
+
singleton: true
|
414
538
|
});
|
415
539
|
|
416
540
|
// src/utils/is-element.ts
|
417
|
-
var hasElement = typeof Element
|
541
|
+
var hasElement = typeof Element !== "undefined";
|
418
542
|
function isElement(value) {
|
419
543
|
return hasElement && value instanceof Element;
|
420
544
|
}
|
421
545
|
|
422
546
|
// src/extensions/node-spec.ts
|
423
547
|
function defineNodeSpec(options) {
|
424
|
-
|
548
|
+
const payload = [options, void 0];
|
549
|
+
return defineFacetPayload(nodeSpecFacet, [payload]);
|
425
550
|
}
|
426
551
|
function defineNodeAttr(options) {
|
427
|
-
|
552
|
+
const payload = [void 0, options];
|
553
|
+
return defineFacetPayload(nodeSpecFacet, [payload]);
|
428
554
|
}
|
429
555
|
var nodeSpecFacet = defineFacet({
|
430
556
|
reducer: (payloads) => {
|
431
|
-
let nodes = OrderedMap2.from({})
|
432
|
-
|
433
|
-
|
434
|
-
|
557
|
+
let nodes = OrderedMap2.from({});
|
558
|
+
let topNodeName = void 0;
|
559
|
+
const specPayloads = payloads.map((input) => input[0]).filter(isNotNull);
|
560
|
+
const attrPayloads = payloads.map((input) => input[1]).filter(isNotNull);
|
561
|
+
for (const { name, topNode, ...spec } of specPayloads) {
|
562
|
+
assert(!nodes.get(name), `Node type ${name} can only be defined once`);
|
563
|
+
if (topNode) {
|
564
|
+
topNodeName = name;
|
565
|
+
}
|
566
|
+
nodes = nodes.addToStart(name, spec);
|
567
|
+
}
|
568
|
+
for (const {
|
435
569
|
type,
|
436
570
|
attr,
|
437
571
|
default: defaultValue,
|
@@ -439,57 +573,87 @@ var nodeSpecFacet = defineFacet({
|
|
439
573
|
toDOM,
|
440
574
|
parseDOM
|
441
575
|
} of attrPayloads) {
|
442
|
-
|
443
|
-
|
576
|
+
const spec = nodes.get(type);
|
577
|
+
assert(spec, `Node type ${type} must be defined`);
|
578
|
+
if (!spec.attrs) {
|
579
|
+
spec.attrs = {};
|
580
|
+
}
|
581
|
+
spec.attrs[attr] = {
|
444
582
|
default: defaultValue,
|
445
583
|
splittable
|
446
|
-
}
|
447
|
-
|
584
|
+
};
|
585
|
+
if (toDOM && spec.toDOM) {
|
586
|
+
const existingToDom = spec.toDOM;
|
448
587
|
spec.toDOM = (node) => {
|
449
|
-
|
450
|
-
if (!dom)
|
588
|
+
const dom = existingToDom(node);
|
589
|
+
if (!dom) {
|
451
590
|
return dom;
|
452
|
-
|
453
|
-
|
591
|
+
}
|
592
|
+
const attrDOM = toDOM(node.attrs[attr]);
|
593
|
+
if (!attrDOM) {
|
594
|
+
return dom;
|
595
|
+
}
|
596
|
+
const [key, value] = attrDOM;
|
597
|
+
if (!key) {
|
454
598
|
return dom;
|
455
|
-
|
456
|
-
|
457
|
-
dom[
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
599
|
+
}
|
600
|
+
if (Array.isArray(dom)) {
|
601
|
+
if (typeof dom[1] === "object") {
|
602
|
+
return [
|
603
|
+
dom[0],
|
604
|
+
setObjectAttribute(
|
605
|
+
dom[1],
|
606
|
+
key,
|
607
|
+
value
|
608
|
+
),
|
609
|
+
...dom.slice(2)
|
610
|
+
];
|
611
|
+
} else {
|
612
|
+
return [dom[0], { [key]: value }, ...dom.slice(1)];
|
613
|
+
}
|
614
|
+
} else if (isElement(dom)) {
|
615
|
+
setElementAttribute(dom, key, value);
|
616
|
+
} else if (typeof dom === "object" && "dom" in dom && isElement(dom.dom)) {
|
617
|
+
setElementAttribute(dom.dom, key, value);
|
618
|
+
}
|
619
|
+
return dom;
|
465
620
|
};
|
466
621
|
}
|
467
|
-
if (parseDOM && spec.parseDOM)
|
468
|
-
for (
|
469
|
-
|
622
|
+
if (parseDOM && spec.parseDOM) {
|
623
|
+
for (const rule of spec.parseDOM) {
|
624
|
+
const existingGetAttrs = rule.getAttrs;
|
625
|
+
const existingAttrs = rule.attrs;
|
470
626
|
rule.getAttrs = (dom) => {
|
471
627
|
var _a;
|
472
|
-
|
473
|
-
if (attrs ===
|
628
|
+
const attrs = (_a = existingGetAttrs == null ? void 0 : existingGetAttrs(dom)) != null ? _a : existingAttrs;
|
629
|
+
if (attrs === false || !dom || !isElement(dom)) {
|
474
630
|
return attrs != null ? attrs : null;
|
475
|
-
|
631
|
+
}
|
632
|
+
const value = parseDOM(dom);
|
476
633
|
return {
|
477
634
|
...attrs,
|
478
635
|
[attr]: value
|
479
636
|
};
|
480
637
|
};
|
481
638
|
}
|
639
|
+
}
|
482
640
|
}
|
483
641
|
return { nodes, topNode: topNodeName };
|
484
642
|
},
|
485
643
|
parent: schemaSpecFacet,
|
486
|
-
singleton:
|
644
|
+
singleton: true
|
487
645
|
});
|
488
646
|
function setObjectAttribute(obj, key, value) {
|
489
|
-
|
647
|
+
if (key === "style") {
|
648
|
+
value = `${value}${obj.style || ""}`;
|
649
|
+
}
|
650
|
+
return { ...obj, [key]: value };
|
490
651
|
}
|
491
652
|
function setElementAttribute(element, key, value) {
|
492
|
-
key === "style"
|
653
|
+
if (key === "style") {
|
654
|
+
value = `${value}${element.getAttribute("style") || ""}`;
|
655
|
+
}
|
656
|
+
element.setAttribute(key, value);
|
493
657
|
}
|
494
658
|
|
495
659
|
// src/extensions/doc.ts
|
@@ -497,7 +661,7 @@ function defineDoc() {
|
|
497
661
|
return defineNodeSpec({
|
498
662
|
name: "doc",
|
499
663
|
content: "block+",
|
500
|
-
topNode:
|
664
|
+
topNode: true
|
501
665
|
});
|
502
666
|
}
|
503
667
|
|
@@ -508,27 +672,35 @@ import { PluginKey, ProseMirrorPlugin as ProseMirrorPlugin2 } from "@prosekit/pm
|
|
508
672
|
import "@prosekit/pm/model";
|
509
673
|
import { Plugin } from "@prosekit/pm/state";
|
510
674
|
function definePlugin(plugin) {
|
511
|
-
if (plugin instanceof Plugin)
|
675
|
+
if (plugin instanceof Plugin) {
|
512
676
|
return defineFacetPayload(pluginFacet, [() => [plugin]]);
|
513
|
-
|
677
|
+
}
|
678
|
+
if (Array.isArray(plugin) && plugin.every((p) => p instanceof Plugin)) {
|
514
679
|
return defineFacetPayload(pluginFacet, [() => plugin]);
|
515
|
-
|
680
|
+
}
|
681
|
+
if (typeof plugin === "function") {
|
516
682
|
return defineFacetPayload(pluginFacet, [plugin]);
|
683
|
+
}
|
517
684
|
throw new TypeError("Invalid plugin");
|
518
685
|
}
|
519
686
|
var pluginFacet = defineFacet({
|
520
|
-
reducer: (payloads) =>
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
687
|
+
reducer: (payloads) => {
|
688
|
+
return ({ schema }) => {
|
689
|
+
const plugins = [];
|
690
|
+
for (const payload of payloads) {
|
691
|
+
if (payload instanceof Plugin) {
|
692
|
+
plugins.push(payload);
|
693
|
+
} else if (Array.isArray(payload) && payload.every((p) => p instanceof Plugin)) {
|
694
|
+
plugins.push(...payload);
|
695
|
+
} else if (typeof payload === "function") {
|
696
|
+
plugins.push(...[payload({ schema })].flat());
|
697
|
+
} else {
|
698
|
+
throw new ProseKitError("Invalid plugin");
|
699
|
+
}
|
700
|
+
}
|
701
|
+
plugins.reverse();
|
702
|
+
return { plugins };
|
703
|
+
};
|
532
704
|
},
|
533
705
|
parent: stateFacet
|
534
706
|
});
|
@@ -545,19 +717,28 @@ function defineUnmountHandler(handler) {
|
|
545
717
|
}
|
546
718
|
var pluginViewFacet = defineFacet({
|
547
719
|
reduce: () => {
|
548
|
-
let mountHandlers = []
|
720
|
+
let mountHandlers = [];
|
721
|
+
let updateHandlers = [];
|
722
|
+
let unmountHandlers = [];
|
723
|
+
const plugin = new ProseMirrorPlugin2({
|
549
724
|
key: pluginKey,
|
550
|
-
view: (view) =>
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
725
|
+
view: (view) => {
|
726
|
+
mountHandlers.forEach((fn) => fn(view));
|
727
|
+
return {
|
728
|
+
update: (view2, prevState) => {
|
729
|
+
updateHandlers.forEach((fn) => fn(view2, prevState));
|
730
|
+
},
|
731
|
+
destroy: () => {
|
732
|
+
unmountHandlers.forEach((fn) => fn());
|
733
|
+
}
|
734
|
+
};
|
735
|
+
}
|
736
|
+
});
|
737
|
+
const register = (input) => {
|
738
|
+
mountHandlers = [];
|
739
|
+
updateHandlers = [];
|
740
|
+
unmountHandlers = [];
|
741
|
+
for (const args of input) {
|
561
742
|
switch (args[0]) {
|
562
743
|
case "mount":
|
563
744
|
mountHandlers.push(args[1]);
|
@@ -569,19 +750,24 @@ var pluginViewFacet = defineFacet({
|
|
569
750
|
unmountHandlers.push(args[1]);
|
570
751
|
break;
|
571
752
|
}
|
753
|
+
}
|
572
754
|
};
|
573
|
-
return function(input) {
|
574
|
-
|
755
|
+
return function reducer(input) {
|
756
|
+
register(input);
|
757
|
+
return plugin;
|
575
758
|
};
|
576
759
|
},
|
577
760
|
parent: pluginFacet,
|
578
|
-
singleton:
|
579
|
-
})
|
761
|
+
singleton: true
|
762
|
+
});
|
763
|
+
var pluginKey = new PluginKey("prosekit-plugin-view-handler");
|
580
764
|
|
581
765
|
// src/extensions/events/doc-change.ts
|
582
766
|
function defineDocChangeHandler(handler) {
|
583
767
|
return defineUpdateHandler((view, prevState) => {
|
584
|
-
view.state.doc.eq(prevState.doc)
|
768
|
+
if (!view.state.doc.eq(prevState.doc)) {
|
769
|
+
handler(view, prevState);
|
770
|
+
}
|
585
771
|
});
|
586
772
|
}
|
587
773
|
|
@@ -595,20 +781,26 @@ function combineEventHandlers() {
|
|
595
781
|
_handlers = toReversed(handlers);
|
596
782
|
}
|
597
783
|
function combinedEventHandler(...args) {
|
598
|
-
for (
|
599
|
-
if (handler(...args))
|
600
|
-
return
|
601
|
-
|
784
|
+
for (const handler of _handlers) {
|
785
|
+
if (handler(...args)) {
|
786
|
+
return true;
|
787
|
+
}
|
788
|
+
}
|
789
|
+
return false;
|
602
790
|
}
|
603
791
|
return [setHandlers, combinedEventHandler];
|
604
792
|
}
|
605
793
|
|
606
794
|
// src/utils/group-entries.ts
|
607
795
|
function groupEntries(entries) {
|
608
|
-
|
609
|
-
for (
|
610
|
-
|
611
|
-
|
796
|
+
const map = {};
|
797
|
+
for (const [key, value] of entries) {
|
798
|
+
const values = map[key];
|
799
|
+
if (!values) {
|
800
|
+
map[key] = [value];
|
801
|
+
} else {
|
802
|
+
values.push(value);
|
803
|
+
}
|
612
804
|
}
|
613
805
|
return map;
|
614
806
|
}
|
@@ -621,33 +813,42 @@ function defineDOMEventHandler(event, handler) {
|
|
621
813
|
}
|
622
814
|
var domEventFacet = defineFacet({
|
623
815
|
reduce: () => {
|
624
|
-
|
816
|
+
const setHandlersMap = {};
|
817
|
+
const combinedHandlerMap = {};
|
818
|
+
let plugin;
|
819
|
+
const update = (payloads) => {
|
625
820
|
var _a;
|
626
|
-
let hasNewEvent =
|
627
|
-
for (
|
821
|
+
let hasNewEvent = false;
|
822
|
+
for (const [event] of payloads) {
|
628
823
|
if (!setHandlersMap[event]) {
|
629
|
-
hasNewEvent =
|
630
|
-
|
824
|
+
hasNewEvent = true;
|
825
|
+
const [setHandlers, combinedHandler] = combineEventHandlers();
|
631
826
|
setHandlersMap[event] = setHandlers;
|
632
|
-
|
827
|
+
const e = (view, eventObject) => {
|
828
|
+
return combinedHandler(view, eventObject);
|
829
|
+
};
|
633
830
|
combinedHandlerMap[event] = e;
|
634
831
|
}
|
635
|
-
|
636
|
-
|
637
|
-
|
832
|
+
}
|
833
|
+
const map = groupEntries(payloads);
|
834
|
+
for (const [event, setHandlers] of Object.entries(setHandlersMap)) {
|
835
|
+
const handlers = (_a = map[event]) != null ? _a : [];
|
638
836
|
setHandlers(handlers);
|
639
837
|
}
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
838
|
+
if (hasNewEvent) {
|
839
|
+
plugin = new ProseMirrorPlugin3({
|
840
|
+
key: new PluginKey2("prosekit-dom-event-handler"),
|
841
|
+
props: { handleDOMEvents: combinedHandlerMap }
|
842
|
+
});
|
843
|
+
}
|
644
844
|
};
|
645
|
-
return function(inputs) {
|
646
|
-
|
845
|
+
return function reducer(inputs) {
|
846
|
+
update(inputs);
|
847
|
+
return plugin != null ? plugin : [];
|
647
848
|
};
|
648
849
|
},
|
649
850
|
parent: pluginFacet,
|
650
|
-
singleton:
|
851
|
+
singleton: true
|
651
852
|
});
|
652
853
|
|
653
854
|
// src/extensions/events/editor-event.ts
|
@@ -690,18 +891,45 @@ function defineScrollToSelectionHandler(handler) {
|
|
690
891
|
}
|
691
892
|
var editorEventFacet = defineFacet({
|
692
893
|
reduce: () => {
|
693
|
-
|
694
|
-
return (entries) =>
|
894
|
+
const [update, plugin] = setupEditorEventPlugin();
|
895
|
+
return (entries) => {
|
896
|
+
update(entries);
|
897
|
+
return plugin;
|
898
|
+
};
|
695
899
|
},
|
696
900
|
parent: pluginFacet,
|
697
|
-
singleton:
|
901
|
+
singleton: true
|
698
902
|
});
|
699
903
|
function setupEditorEventPlugin() {
|
700
|
-
|
904
|
+
const [setKeyDownHandlers, handleKeyDown] = combineEventHandlers();
|
905
|
+
const [setKeyPressHandlers, handleKeyPress] = combineEventHandlers();
|
906
|
+
const [setTextInputHandlers, handleTextInput] = combineEventHandlers();
|
907
|
+
const [setClickOnHandlers, handleClickOn] = combineEventHandlers();
|
908
|
+
const [setClickHandlers, handleClick] = combineEventHandlers();
|
909
|
+
const [setDoubleClickOnHandlers, handleDoubleClickOn] = combineEventHandlers();
|
910
|
+
const [setDoubleClickHandlers, handleDoubleClick] = combineEventHandlers();
|
911
|
+
const [setTripleClickOnHandlers, handleTripleClickOn] = combineEventHandlers();
|
912
|
+
const [setTripleClickHandlers, handleTripleClick] = combineEventHandlers();
|
913
|
+
const [setPasteHandlers, handlePaste] = combineEventHandlers();
|
914
|
+
const [setDropHandlers, handleDrop] = combineEventHandlers();
|
915
|
+
const [setScrollToSelectionHandlers, handleScrollToSelection] = combineEventHandlers();
|
916
|
+
const update = (entries) => {
|
701
917
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
|
702
|
-
|
703
|
-
setKeyDownHandlers((_a = map.keyDown) != null ? _a : [])
|
704
|
-
|
918
|
+
const map = groupEntries(entries);
|
919
|
+
setKeyDownHandlers((_a = map.keyDown) != null ? _a : []);
|
920
|
+
setKeyPressHandlers((_b = map.keyPress) != null ? _b : []);
|
921
|
+
setTextInputHandlers((_c = map.textInput) != null ? _c : []);
|
922
|
+
setClickOnHandlers((_d = map.clickOn) != null ? _d : []);
|
923
|
+
setClickHandlers((_e = map.click) != null ? _e : []);
|
924
|
+
setDoubleClickOnHandlers((_f = map.doubleClickOn) != null ? _f : []);
|
925
|
+
setDoubleClickHandlers((_g = map.doubleClick) != null ? _g : []);
|
926
|
+
setTripleClickOnHandlers((_h = map.tripleClickOn) != null ? _h : []);
|
927
|
+
setTripleClickHandlers((_i = map.tripleClick) != null ? _i : []);
|
928
|
+
setPasteHandlers((_j = map.paste) != null ? _j : []);
|
929
|
+
setDropHandlers((_k = map.drop) != null ? _k : []);
|
930
|
+
setScrollToSelectionHandlers((_l = map.scrollToSelection) != null ? _l : []);
|
931
|
+
};
|
932
|
+
const plugin = new ProseMirrorPlugin4({
|
705
933
|
key: new PluginKey3("prosekit-editor-event"),
|
706
934
|
props: {
|
707
935
|
handleKeyDown,
|
@@ -723,9 +951,11 @@ function setupEditorEventPlugin() {
|
|
723
951
|
|
724
952
|
// src/extensions/events/focus.ts
|
725
953
|
function defineFocusChangeHandler(handler) {
|
954
|
+
const handleFocus = () => handler(true);
|
955
|
+
const handleBlur = () => handler(false);
|
726
956
|
return defineFacetPayload(domEventFacet, [
|
727
|
-
["focus",
|
728
|
-
["blur",
|
957
|
+
["focus", handleFocus],
|
958
|
+
["blur", handleBlur]
|
729
959
|
]);
|
730
960
|
}
|
731
961
|
|
@@ -733,7 +963,7 @@ function defineFocusChangeHandler(handler) {
|
|
733
963
|
import { history, redo, undo } from "@prosekit/pm/history";
|
734
964
|
|
735
965
|
// src/utils/env.ts
|
736
|
-
var isApple = typeof navigator
|
966
|
+
var isApple = typeof navigator !== "undefined" ? /Mac|iP(hone|[ao]d)/.test(navigator.platform) : false;
|
737
967
|
|
738
968
|
// src/extensions/keymap.ts
|
739
969
|
import { chainCommands } from "@prosekit/pm/commands";
|
@@ -744,25 +974,36 @@ function defineKeymap(keymap2) {
|
|
744
974
|
}
|
745
975
|
var keymapFacet = defineFacet({
|
746
976
|
reduce: () => {
|
747
|
-
let handler
|
977
|
+
let handler;
|
978
|
+
const handlerWrapper = (view, event) => {
|
979
|
+
if (handler) return handler(view, event);
|
980
|
+
return false;
|
981
|
+
};
|
982
|
+
const plugin = new Plugin2({
|
748
983
|
key: keymapPluginKey,
|
749
984
|
props: { handleKeyDown: handlerWrapper }
|
750
985
|
});
|
751
|
-
return (keymaps) =>
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
986
|
+
return (keymaps) => {
|
987
|
+
handler = keydownHandler(
|
988
|
+
mergeKeymaps(
|
989
|
+
// The keymap at the end have a higher priority.
|
990
|
+
toReversed(keymaps)
|
991
|
+
)
|
992
|
+
);
|
993
|
+
return plugin;
|
994
|
+
};
|
757
995
|
},
|
758
996
|
parent: pluginFacet,
|
759
|
-
singleton:
|
997
|
+
singleton: true
|
760
998
|
});
|
761
999
|
function mergeKeymaps(keymaps) {
|
762
|
-
|
763
|
-
for (
|
764
|
-
for (
|
765
|
-
|
1000
|
+
const bindings = {};
|
1001
|
+
for (const keymap2 of keymaps) {
|
1002
|
+
for (const [key, command] of Object.entries(keymap2)) {
|
1003
|
+
const commands2 = bindings[key] || (bindings[key] = []);
|
1004
|
+
commands2.push(command);
|
1005
|
+
}
|
1006
|
+
}
|
766
1007
|
return Object.fromEntries(
|
767
1008
|
Object.entries(bindings).map(([key, commands2]) => [
|
768
1009
|
key,
|
@@ -777,7 +1018,9 @@ var keymap = {
|
|
777
1018
|
"Mod-z": undo,
|
778
1019
|
"Shift-Mod-z": redo
|
779
1020
|
};
|
780
|
-
|
1021
|
+
if (!isApple) {
|
1022
|
+
keymap["Mod-y"] = redo;
|
1023
|
+
}
|
781
1024
|
var commands = {
|
782
1025
|
undo: () => undo,
|
783
1026
|
redo: () => redo
|
@@ -810,81 +1053,112 @@ var customEnter = chainCommands2(
|
|
810
1053
|
createParagraphNear,
|
811
1054
|
liftEmptyBlock,
|
812
1055
|
splitSplittableBlock
|
813
|
-
)
|
1056
|
+
);
|
1057
|
+
var customBackspace = chainCommands2(
|
814
1058
|
deleteSelection,
|
815
1059
|
joinTextblockBackward,
|
816
1060
|
selectNodeBackward
|
817
|
-
)
|
1061
|
+
);
|
1062
|
+
var customBaseKeymap = {
|
818
1063
|
...baseKeymap,
|
819
1064
|
Enter: customEnter,
|
820
1065
|
Backspace: customBackspace
|
821
1066
|
};
|
822
1067
|
function defineBaseKeymap(options) {
|
823
1068
|
var _a;
|
824
|
-
|
1069
|
+
const priority = (_a = options == null ? void 0 : options.priority) != null ? _a : 1 /* low */;
|
825
1070
|
return withPriority(defineKeymap(customBaseKeymap), priority);
|
826
1071
|
}
|
827
1072
|
|
828
1073
|
// src/extensions/mark-spec.ts
|
829
1074
|
function defineMarkSpec(options) {
|
830
|
-
|
1075
|
+
const payload = [options, void 0];
|
1076
|
+
return defineFacetPayload(markSpecFacet, [payload]);
|
831
1077
|
}
|
832
1078
|
function defineMarkAttr(options) {
|
833
|
-
|
1079
|
+
const payload = [void 0, options];
|
1080
|
+
return defineFacetPayload(markSpecFacet, [payload]);
|
834
1081
|
}
|
835
1082
|
var markSpecFacet = defineFacet({
|
836
1083
|
reducer: (payloads) => {
|
837
|
-
|
838
|
-
|
839
|
-
|
1084
|
+
const marks = {};
|
1085
|
+
const specPayloads = payloads.map((input) => input[0]).filter(isNotNull);
|
1086
|
+
const attrPayloads = payloads.map((input) => input[1]).filter(isNotNull);
|
1087
|
+
for (const { name, ...spec } of specPayloads) {
|
1088
|
+
if (marks[name]) {
|
840
1089
|
throw new ProseKitError(`Mark type ${name} has already been defined`);
|
1090
|
+
}
|
841
1091
|
marks[name] = spec;
|
842
1092
|
}
|
843
|
-
for (
|
1093
|
+
for (const {
|
844
1094
|
type,
|
845
1095
|
attr,
|
846
1096
|
default: defaultValue,
|
847
1097
|
toDOM,
|
848
1098
|
parseDOM
|
849
1099
|
} of attrPayloads) {
|
850
|
-
|
851
|
-
if (!spec)
|
1100
|
+
const spec = marks[type];
|
1101
|
+
if (!spec) {
|
852
1102
|
throw new ProseKitError(
|
853
1103
|
`Mark type ${type} must be defined before defining attributes`
|
854
1104
|
);
|
855
|
-
|
856
|
-
|
1105
|
+
}
|
1106
|
+
if (!spec.attrs) {
|
1107
|
+
spec.attrs = {};
|
1108
|
+
}
|
1109
|
+
spec.attrs[attr] = { default: defaultValue };
|
1110
|
+
if (toDOM && spec.toDOM) {
|
1111
|
+
const existingToDom = spec.toDOM;
|
857
1112
|
spec.toDOM = (mark, inline) => {
|
858
|
-
|
859
|
-
if (!dom)
|
1113
|
+
const dom = existingToDom(mark, inline);
|
1114
|
+
if (!dom) {
|
860
1115
|
return dom;
|
861
|
-
|
862
|
-
|
1116
|
+
}
|
1117
|
+
const attrDOM = toDOM(mark.attrs[attr]);
|
1118
|
+
if (!attrDOM) {
|
1119
|
+
return dom;
|
1120
|
+
}
|
1121
|
+
const [key, value] = attrDOM;
|
1122
|
+
if (!key) {
|
863
1123
|
return dom;
|
864
|
-
|
865
|
-
|
1124
|
+
}
|
1125
|
+
if (Array.isArray(dom)) {
|
1126
|
+
if (typeof dom[1] === "object") {
|
1127
|
+
return [dom[0], { ...dom[1], [key]: value }, ...dom.slice(2)];
|
1128
|
+
} else {
|
1129
|
+
return [dom[0], { [key]: value }, ...dom.slice(1)];
|
1130
|
+
}
|
1131
|
+
} else if (isElement(dom)) {
|
1132
|
+
dom.setAttribute(key, value);
|
1133
|
+
} else if (typeof dom === "object" && "dom" in dom && isElement(dom.dom)) {
|
1134
|
+
dom.dom.setAttribute(key, value);
|
1135
|
+
}
|
1136
|
+
return dom;
|
866
1137
|
};
|
867
1138
|
}
|
868
|
-
if (parseDOM && spec.parseDOM)
|
869
|
-
for (
|
870
|
-
|
1139
|
+
if (parseDOM && spec.parseDOM) {
|
1140
|
+
for (const rule of spec.parseDOM) {
|
1141
|
+
const existingGetAttrs = rule.getAttrs;
|
1142
|
+
const existingAttrs = rule.attrs;
|
871
1143
|
rule.getAttrs = (dom) => {
|
872
1144
|
var _a;
|
873
|
-
|
874
|
-
if (attrs ===
|
1145
|
+
const attrs = (_a = existingGetAttrs == null ? void 0 : existingGetAttrs(dom)) != null ? _a : existingAttrs;
|
1146
|
+
if (attrs === false || !dom || !isElement(dom)) {
|
875
1147
|
return attrs != null ? attrs : null;
|
876
|
-
|
1148
|
+
}
|
1149
|
+
const value = parseDOM(dom);
|
877
1150
|
return {
|
878
1151
|
...attrs,
|
879
1152
|
[attr]: value
|
880
1153
|
};
|
881
1154
|
};
|
882
1155
|
}
|
1156
|
+
}
|
883
1157
|
}
|
884
1158
|
return { marks, nodes: {} };
|
885
1159
|
},
|
886
1160
|
parent: schemaSpecFacet,
|
887
|
-
singleton:
|
1161
|
+
singleton: true
|
888
1162
|
});
|
889
1163
|
|
890
1164
|
// src/extensions/node-view.ts
|
@@ -895,9 +1169,12 @@ function defineNodeView(options) {
|
|
895
1169
|
}
|
896
1170
|
var nodeViewFacet = defineFacet({
|
897
1171
|
reducer: (inputs) => {
|
898
|
-
|
899
|
-
for (
|
900
|
-
|
1172
|
+
const nodeViews = {};
|
1173
|
+
for (const input of inputs) {
|
1174
|
+
if (!nodeViews[input.name]) {
|
1175
|
+
nodeViews[input.name] = input.constructor;
|
1176
|
+
}
|
1177
|
+
}
|
901
1178
|
return () => [
|
902
1179
|
new ProseMirrorPlugin5({
|
903
1180
|
key: new PluginKey5("prosekit-node-view"),
|
@@ -912,17 +1189,22 @@ var nodeViewFacet = defineFacet({
|
|
912
1189
|
import { PluginKey as PluginKey6, ProseMirrorPlugin as ProseMirrorPlugin6 } from "@prosekit/pm/state";
|
913
1190
|
import "@prosekit/pm/view";
|
914
1191
|
function defineNodeViewFactory(options) {
|
915
|
-
|
1192
|
+
const input = [options, null];
|
1193
|
+
return defineFacetPayload(nodeViewFactoryFacet, [input]);
|
916
1194
|
}
|
917
1195
|
function defineNodeViewComponent(options) {
|
918
|
-
|
1196
|
+
const input = [null, options];
|
1197
|
+
return defineFacetPayload(nodeViewFactoryFacet, [input]);
|
919
1198
|
}
|
920
1199
|
var nodeViewFactoryFacet = defineFacet({
|
921
1200
|
reducer: (inputs) => {
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
1201
|
+
const nodeViews = {};
|
1202
|
+
const factories = inputs.map((x) => x[0]).filter(isNotNull);
|
1203
|
+
const options = inputs.map((x) => x[1]).filter(isNotNull);
|
1204
|
+
for (const { group, name, args } of options) {
|
1205
|
+
const factory = factories.find((factory2) => factory2.group === group);
|
1206
|
+
if (!factory) continue;
|
1207
|
+
nodeViews[name] = factory.factory(args);
|
926
1208
|
}
|
927
1209
|
return () => [
|
928
1210
|
new ProseMirrorPlugin6({
|
@@ -960,8 +1242,13 @@ function defineText() {
|
|
960
1242
|
|
961
1243
|
// src/utils/cache.ts
|
962
1244
|
function cache(fn) {
|
963
|
-
let result;
|
964
|
-
return () =>
|
1245
|
+
let result = void 0;
|
1246
|
+
return () => {
|
1247
|
+
if (result === void 0) {
|
1248
|
+
result = fn();
|
1249
|
+
}
|
1250
|
+
return result;
|
1251
|
+
};
|
965
1252
|
}
|
966
1253
|
|
967
1254
|
// src/utils/can-use-regex-lookbehind.ts
|
@@ -969,7 +1256,7 @@ var canUseRegexLookbehind = cache(() => {
|
|
969
1256
|
try {
|
970
1257
|
return "ab".replace(new RegExp("(?<=a)b", "g"), "c") === "ac";
|
971
1258
|
} catch (error) {
|
972
|
-
return
|
1259
|
+
return false;
|
973
1260
|
}
|
974
1261
|
});
|
975
1262
|
|
@@ -980,14 +1267,17 @@ var clsx = clsxLite;
|
|
980
1267
|
// src/utils/collect-nodes.ts
|
981
1268
|
import { ProseMirrorFragment, ProseMirrorNode as ProseMirrorNode2 } from "@prosekit/pm/model";
|
982
1269
|
function collectNodes(content) {
|
983
|
-
if (Array.isArray(content))
|
1270
|
+
if (Array.isArray(content)) {
|
984
1271
|
return content.flatMap(collectNodes);
|
985
|
-
|
1272
|
+
}
|
1273
|
+
if (content instanceof ProseMirrorNode2) {
|
986
1274
|
return [content];
|
1275
|
+
}
|
987
1276
|
if (content instanceof ProseMirrorFragment) {
|
988
|
-
|
989
|
-
for (let i = 0; i < content.childCount; i++)
|
1277
|
+
const nodes = [];
|
1278
|
+
for (let i = 0; i < content.childCount; i++) {
|
990
1279
|
nodes.push(content.child(i));
|
1280
|
+
}
|
991
1281
|
return nodes;
|
992
1282
|
}
|
993
1283
|
throw new ProseKitError(`Invalid node content: ${typeof content}`);
|
@@ -996,7 +1286,7 @@ function collectNodes(content) {
|
|
996
1286
|
// src/utils/default-block-at.ts
|
997
1287
|
function defaultBlockAt(match) {
|
998
1288
|
for (let i = 0; i < match.edgeCount; i++) {
|
999
|
-
|
1289
|
+
const { type } = match.edge(i);
|
1000
1290
|
if (type.isTextblock && !type.hasRequiredAttrs()) return type;
|
1001
1291
|
}
|
1002
1292
|
return null;
|
@@ -1005,13 +1295,16 @@ function defaultBlockAt(match) {
|
|
1005
1295
|
// src/utils/get-id.ts
|
1006
1296
|
var id = 0;
|
1007
1297
|
function getId() {
|
1008
|
-
|
1298
|
+
id = (id + 1) % Number.MAX_SAFE_INTEGER;
|
1299
|
+
return `id:${id}`;
|
1009
1300
|
}
|
1010
1301
|
|
1011
1302
|
// src/utils/is-at-block-start.ts
|
1012
1303
|
function isAtBlockStart(state, view) {
|
1013
|
-
|
1014
|
-
|
1304
|
+
const { $cursor } = state.selection;
|
1305
|
+
if (!$cursor || (view ? !view.endOfTextblock("backward", state) : $cursor.parentOffset > 0))
|
1306
|
+
return null;
|
1307
|
+
return $cursor;
|
1015
1308
|
}
|
1016
1309
|
|
1017
1310
|
// src/utils/is-in-code-block.ts
|
@@ -1024,7 +1317,7 @@ function isInCodeBlock(selection) {
|
|
1024
1317
|
|
1025
1318
|
// src/utils/maybe-run.ts
|
1026
1319
|
function maybeRun(value, ...args) {
|
1027
|
-
return typeof value
|
1320
|
+
return typeof value === "function" ? value(...args) : value;
|
1028
1321
|
}
|
1029
1322
|
|
1030
1323
|
// src/utils/unicode.ts
|
@@ -1032,7 +1325,12 @@ var OBJECT_REPLACEMENT_CHARACTER = "\uFFFC";
|
|
1032
1325
|
|
1033
1326
|
// src/utils/with-skip-code-block.ts
|
1034
1327
|
function withSkipCodeBlock(command) {
|
1035
|
-
return (state, dispatch, view) =>
|
1328
|
+
return (state, dispatch, view) => {
|
1329
|
+
if (isInCodeBlock(state.selection)) {
|
1330
|
+
return false;
|
1331
|
+
}
|
1332
|
+
return command(state, dispatch, view);
|
1333
|
+
};
|
1036
1334
|
}
|
1037
1335
|
export {
|
1038
1336
|
Editor,
|