quoin-editor 0.4.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +205 -0
- package/MIGRATION.md +233 -0
- package/README.md +78 -715
- package/dist/ai.cjs +1107 -0
- package/dist/ai.cjs.map +1 -0
- package/dist/ai.d.cts +68 -0
- package/dist/ai.d.ts +68 -0
- package/dist/ai.js +1107 -0
- package/dist/ai.js.map +1 -0
- package/dist/catalogue.cjs +59 -0
- package/dist/catalogue.cjs.map +1 -0
- package/dist/catalogue.d.cts +39 -0
- package/dist/catalogue.d.ts +39 -0
- package/dist/catalogue.js +59 -0
- package/dist/catalogue.js.map +1 -0
- package/dist/chunk-2QCRZ7OL.cjs +319 -0
- package/dist/chunk-2QCRZ7OL.cjs.map +1 -0
- package/dist/chunk-2VDK27IF.cjs +6666 -0
- package/dist/chunk-2VDK27IF.cjs.map +1 -0
- package/dist/chunk-47MLKSI2.js +326 -0
- package/dist/chunk-47MLKSI2.js.map +1 -0
- package/dist/chunk-5DNCCN6X.cjs +326 -0
- package/dist/chunk-5DNCCN6X.cjs.map +1 -0
- package/dist/chunk-AEJXZBVR.cjs +1378 -0
- package/dist/chunk-AEJXZBVR.cjs.map +1 -0
- package/dist/chunk-CDELOHDY.cjs +239 -0
- package/dist/chunk-CDELOHDY.cjs.map +1 -0
- package/dist/chunk-E75EHRPA.cjs +175 -0
- package/dist/chunk-E75EHRPA.cjs.map +1 -0
- package/dist/chunk-EL2OEJQC.cjs +562 -0
- package/dist/chunk-EL2OEJQC.cjs.map +1 -0
- package/dist/chunk-GLLXHMH2.cjs +25 -0
- package/dist/chunk-GLLXHMH2.cjs.map +1 -0
- package/dist/chunk-GTTPVJSD.cjs +3286 -0
- package/dist/chunk-GTTPVJSD.cjs.map +1 -0
- package/dist/chunk-HELJTLNC.cjs +100 -0
- package/dist/chunk-HELJTLNC.cjs.map +1 -0
- package/dist/chunk-HJIQT3S5.js +4047 -0
- package/dist/chunk-HJIQT3S5.js.map +1 -0
- package/dist/chunk-HZSSEYJS.cjs +504 -0
- package/dist/chunk-HZSSEYJS.cjs.map +1 -0
- package/dist/chunk-JDPTZUBW.js +184 -0
- package/dist/chunk-JDPTZUBW.js.map +1 -0
- package/dist/chunk-JEIFJHEI.js +14 -0
- package/dist/chunk-JEIFJHEI.js.map +1 -0
- package/dist/chunk-K574XHMM.js +25 -0
- package/dist/chunk-K574XHMM.js.map +1 -0
- package/dist/chunk-KAVU6T6J.js +249 -0
- package/dist/chunk-KAVU6T6J.js.map +1 -0
- package/dist/chunk-KXOBZGQO.js +1378 -0
- package/dist/chunk-KXOBZGQO.js.map +1 -0
- package/dist/chunk-LCQSG4M6.js +3335 -0
- package/dist/chunk-LCQSG4M6.js.map +1 -0
- package/dist/chunk-MQ2XQ4MX.js +100 -0
- package/dist/chunk-MQ2XQ4MX.js.map +1 -0
- package/dist/chunk-ND5XJVK2.cjs +3335 -0
- package/dist/chunk-ND5XJVK2.cjs.map +1 -0
- package/dist/chunk-NNDYYEW5.js +504 -0
- package/dist/chunk-NNDYYEW5.js.map +1 -0
- package/dist/chunk-NOKWNK2O.js +319 -0
- package/dist/chunk-NOKWNK2O.js.map +1 -0
- package/dist/chunk-OMOBMXD5.cjs +57 -0
- package/dist/chunk-OMOBMXD5.cjs.map +1 -0
- package/dist/chunk-PMWCQSQX.js +239 -0
- package/dist/chunk-PMWCQSQX.js.map +1 -0
- package/dist/chunk-POBM7MGR.js +30 -0
- package/dist/chunk-POBM7MGR.js.map +1 -0
- package/dist/chunk-PWUEPDA3.cjs +598 -0
- package/dist/chunk-PWUEPDA3.cjs.map +1 -0
- package/dist/chunk-PZ4GT5JO.cjs +4047 -0
- package/dist/chunk-PZ4GT5JO.cjs.map +1 -0
- package/dist/chunk-QAW5NH6S.cjs +14 -0
- package/dist/chunk-QAW5NH6S.cjs.map +1 -0
- package/dist/chunk-RDG4VI6E.cjs +706 -0
- package/dist/chunk-RDG4VI6E.cjs.map +1 -0
- package/dist/chunk-RUDWMKYX.js +562 -0
- package/dist/chunk-RUDWMKYX.js.map +1 -0
- package/dist/chunk-SG37UBDO.js +706 -0
- package/dist/chunk-SG37UBDO.js.map +1 -0
- package/dist/chunk-SLVDAHHK.cjs +30 -0
- package/dist/chunk-SLVDAHHK.cjs.map +1 -0
- package/dist/chunk-T7SW6OWV.js +598 -0
- package/dist/chunk-T7SW6OWV.js.map +1 -0
- package/dist/chunk-TC4DARU2.js +175 -0
- package/dist/chunk-TC4DARU2.js.map +1 -0
- package/dist/chunk-WQHV3MRE.cjs +184 -0
- package/dist/chunk-WQHV3MRE.cjs.map +1 -0
- package/dist/chunk-WXMYDXPN.cjs +33 -0
- package/dist/chunk-WXMYDXPN.cjs.map +1 -0
- package/dist/chunk-XEBWC7ZL.js +57 -0
- package/dist/chunk-XEBWC7ZL.js.map +1 -0
- package/dist/chunk-ZC24WB7Y.cjs +249 -0
- package/dist/chunk-ZC24WB7Y.cjs.map +1 -0
- package/dist/chunk-ZGZEJCRV.js +6666 -0
- package/dist/chunk-ZGZEJCRV.js.map +1 -0
- package/dist/chunk-ZHOSSWUM.js +33 -0
- package/dist/chunk-ZHOSSWUM.js.map +1 -0
- package/dist/chunk-ZS2WA357.js +3286 -0
- package/dist/chunk-ZS2WA357.js.map +1 -0
- package/dist/comments.cjs +993 -0
- package/dist/comments.cjs.map +1 -0
- package/dist/comments.d.cts +88 -0
- package/dist/comments.d.ts +88 -0
- package/dist/comments.js +993 -0
- package/dist/comments.js.map +1 -0
- package/dist/diff.cjs +343 -0
- package/dist/diff.cjs.map +1 -0
- package/dist/diff.d.cts +67 -0
- package/dist/diff.d.ts +67 -0
- package/dist/diff.js +343 -0
- package/dist/diff.js.map +1 -0
- package/dist/docx.cjs +854 -0
- package/dist/docx.cjs.map +1 -0
- package/dist/docx.d.cts +27 -0
- package/dist/docx.d.ts +27 -0
- package/dist/docx.js +854 -0
- package/dist/docx.js.map +1 -0
- package/dist/embed-provider-jXwlRmnp.d.cts +19 -0
- package/dist/embed-provider-jXwlRmnp.d.ts +19 -0
- package/dist/embed.cjs +17 -0
- package/dist/embed.cjs.map +1 -0
- package/dist/embed.d.cts +56 -0
- package/dist/embed.d.ts +56 -0
- package/dist/embed.js +17 -0
- package/dist/embed.js.map +1 -0
- package/dist/emoji-data.cjs +1968 -0
- package/dist/emoji-data.cjs.map +1 -0
- package/dist/emoji-data.js +1968 -0
- package/dist/emoji-data.js.map +1 -0
- package/dist/emoji-extension-C12gDPm6.d.cts +46 -0
- package/dist/emoji-extension-DpQ43HjE.d.ts +46 -0
- package/dist/emoji.cjs +18 -0
- package/dist/emoji.cjs.map +1 -0
- package/dist/emoji.d.cts +31 -0
- package/dist/emoji.d.ts +31 -0
- package/dist/emoji.js +18 -0
- package/dist/emoji.js.map +1 -0
- package/dist/engine.cjs +119 -0
- package/dist/engine.cjs.map +1 -0
- package/dist/engine.d.cts +144 -0
- package/dist/engine.d.ts +144 -0
- package/dist/engine.js +119 -0
- package/dist/engine.js.map +1 -0
- package/dist/find-extension-DKqLLSuP.d.ts +41 -0
- package/dist/find-extension-_sbZEt3R.d.cts +41 -0
- package/dist/find.cjs +20 -0
- package/dist/find.cjs.map +1 -0
- package/dist/find.d.cts +44 -0
- package/dist/find.d.ts +44 -0
- package/dist/find.js +20 -0
- package/dist/find.js.map +1 -0
- package/dist/headless.cjs +151 -518
- package/dist/headless.cjs.map +1 -1
- package/dist/headless.d.cts +102 -69
- package/dist/headless.d.ts +102 -69
- package/dist/headless.js +149 -467
- package/dist/headless.js.map +1 -1
- package/dist/index-CgD72kHB.d.cts +65 -0
- package/dist/index-DNYbTK3w.d.ts +65 -0
- package/dist/index.cjs +183 -2753
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +345 -253
- package/dist/index.d.ts +345 -253
- package/dist/index.js +168 -2696
- package/dist/index.js.map +1 -1
- package/dist/math.cjs +18 -0
- package/dist/math.cjs.map +1 -0
- package/dist/math.d.cts +49 -0
- package/dist/math.d.ts +49 -0
- package/dist/math.js +18 -0
- package/dist/math.js.map +1 -0
- package/dist/mention.cjs +18 -0
- package/dist/mention.cjs.map +1 -0
- package/dist/mention.d.cts +50 -0
- package/dist/mention.d.ts +50 -0
- package/dist/mention.js +18 -0
- package/dist/mention.js.map +1 -0
- package/dist/presence.cjs +565 -0
- package/dist/presence.cjs.map +1 -0
- package/dist/presence.d.cts +30 -0
- package/dist/presence.d.ts +30 -0
- package/dist/presence.js +565 -0
- package/dist/presence.js.map +1 -0
- package/dist/registry-CWBOSAHm.d.cts +121 -0
- package/dist/registry-CWBOSAHm.d.ts +121 -0
- package/dist/stats-extension-Bly88uio.d.ts +40 -0
- package/dist/stats-extension-CJPijvUb.d.cts +40 -0
- package/dist/stats.cjs +19 -0
- package/dist/stats.cjs.map +1 -0
- package/dist/stats.d.cts +19 -0
- package/dist/stats.d.ts +19 -0
- package/dist/stats.js +19 -0
- package/dist/stats.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/table-extension-BTLxFy2S.d.cts +57 -0
- package/dist/table-extension-Dzf4k6hI.d.ts +57 -0
- package/dist/table.cjs +50 -0
- package/dist/table.cjs.map +1 -0
- package/dist/table.d.cts +57 -0
- package/dist/table.d.ts +57 -0
- package/dist/table.js +50 -0
- package/dist/table.js.map +1 -0
- package/dist/to-html-C5t7xyaM.d.ts +21 -0
- package/dist/to-html-CNCITCln.d.cts +21 -0
- package/dist/toc-extension-B3-s6h2x.d.cts +25 -0
- package/dist/toc-extension-DWm5alVj.d.ts +25 -0
- package/dist/toc.cjs +18 -0
- package/dist/toc.cjs.map +1 -0
- package/dist/toc.d.cts +24 -0
- package/dist/toc.d.ts +24 -0
- package/dist/toc.js +18 -0
- package/dist/toc.js.map +1 -0
- package/dist/types-Cz7XJLaK.d.cts +366 -0
- package/dist/types-DULc8wwg.d.cts +120 -0
- package/dist/types-DULc8wwg.d.ts +120 -0
- package/dist/types-a1CRBlEh.d.ts +366 -0
- package/dist/view-controller-DSHw0ltQ.d.cts +118 -0
- package/dist/view-controller-UbpzblGl.d.ts +118 -0
- package/dist/view.cjs +23 -0
- package/dist/view.cjs.map +1 -0
- package/dist/view.d.cts +40 -0
- package/dist/view.d.ts +40 -0
- package/dist/view.js +23 -0
- package/dist/view.js.map +1 -0
- package/dist/yjs.cjs +1026 -0
- package/dist/yjs.cjs.map +1 -0
- package/dist/yjs.d.cts +22 -0
- package/dist/yjs.d.ts +22 -0
- package/dist/yjs.js +1026 -0
- package/dist/yjs.js.map +1 -0
- package/package.json +219 -20
package/dist/yjs.cjs
ADDED
|
@@ -0,0 +1,1026 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
var _chunkE75EHRPAcjs = require('./chunk-E75EHRPA.cjs');
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
var _chunkPZ4GT5JOcjs = require('./chunk-PZ4GT5JO.cjs');
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
var _chunk2QCRZ7OLcjs = require('./chunk-2QCRZ7OL.cjs');
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
var _chunkND5XJVK2cjs = require('./chunk-ND5XJVK2.cjs');
|
|
54
|
+
|
|
55
|
+
// src/engine/collab/apply-remote.ts
|
|
56
|
+
function applyRemote(editor, steps, selectionHint) {
|
|
57
|
+
const tr = editor.createTransaction().setOrigin("remote").setMeta("addToHistory", false);
|
|
58
|
+
for (const step of steps) tr.step(step);
|
|
59
|
+
if (selectionHint && _chunkPZ4GT5JOcjs.sameSelection.call(void 0, _chunkPZ4GT5JOcjs.validateSelection.call(void 0, tr.doc, editor.schema, selectionHint), selectionHint)) {
|
|
60
|
+
tr.setSelection(selectionHint);
|
|
61
|
+
}
|
|
62
|
+
editor.dispatch(tr);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// src/yjs/local-to-yjs.ts
|
|
66
|
+
var _yjs = require('yjs'); var Y4 = _interopRequireWildcard(_yjs); var Y = _interopRequireWildcard(_yjs); var Y2 = _interopRequireWildcard(_yjs); var Y3 = _interopRequireWildcard(_yjs); var Y5 = _interopRequireWildcard(_yjs); var Y6 = _interopRequireWildcard(_yjs);
|
|
67
|
+
|
|
68
|
+
// src/yjs/doc-shape.ts
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
// src/yjs/marks-codec.ts
|
|
72
|
+
var ESCAPE = "$";
|
|
73
|
+
var escapeKey = (key) => key in Object.prototype || key.startsWith(ESCAPE) ? ESCAPE + key : key;
|
|
74
|
+
var unescapeKey = (key) => key.startsWith(ESCAPE) ? key.slice(1) : key;
|
|
75
|
+
var onlyString = (attrs, key) => Object.keys(attrs).length === 1 && Object.hasOwn(attrs, key) && typeof attrs[key] === "string";
|
|
76
|
+
function markAttribute(mark) {
|
|
77
|
+
const key = _chunkND5XJVK2cjs.markKey.call(void 0, mark);
|
|
78
|
+
const { attrs } = mark;
|
|
79
|
+
const stacked = key !== mark.type;
|
|
80
|
+
if (attrs === void 0) return [escapeKey(key), !stacked];
|
|
81
|
+
if (stacked && onlyString(attrs, "id")) return [escapeKey(key), true];
|
|
82
|
+
if (onlyString(attrs, mark.type)) return [escapeKey(key), attrs[mark.type]];
|
|
83
|
+
return [escapeKey(key), attrs];
|
|
84
|
+
}
|
|
85
|
+
function stackedType(key) {
|
|
86
|
+
const colon = key.indexOf(":");
|
|
87
|
+
if (colon < 1) return null;
|
|
88
|
+
const type = key.slice(0, colon);
|
|
89
|
+
const id = key.slice(colon + 1);
|
|
90
|
+
return _chunkND5XJVK2cjs.markKey.call(void 0, { type, attrs: { id } }) === key ? [type, id] : null;
|
|
91
|
+
}
|
|
92
|
+
function markFromAttribute(attribute, value) {
|
|
93
|
+
const key = unescapeKey(attribute);
|
|
94
|
+
const stacked = stackedType(key);
|
|
95
|
+
const type = _nullishCoalesce(_optionalChain([stacked, 'optionalAccess', _2 => _2[0]]), () => ( key));
|
|
96
|
+
if (value === true) return stacked === null ? { type } : { type, attrs: { id: stacked[1] } };
|
|
97
|
+
if (value === false) return { type };
|
|
98
|
+
if (typeof value === "string") return { type, attrs: { [type]: value } };
|
|
99
|
+
return { type, attrs: value };
|
|
100
|
+
}
|
|
101
|
+
var marksToAttributes = (marks) => Object.fromEntries(marks.map(markAttribute));
|
|
102
|
+
var attributesToMarks = (attributes = {}) => Object.entries(attributes).map(([key, value]) => markFromAttribute(key, value));
|
|
103
|
+
|
|
104
|
+
// src/yjs/inline-codec.ts
|
|
105
|
+
var inlineOps = (inline) => inline.map((node) => ({
|
|
106
|
+
insert: node.kind === "text" ? node.text : { atom: node.type, attrs: node.attrs },
|
|
107
|
+
attributes: marksToAttributes(node.marks)
|
|
108
|
+
}));
|
|
109
|
+
function insertInline(target, at, inline) {
|
|
110
|
+
let offset = at;
|
|
111
|
+
for (const node of inline) {
|
|
112
|
+
const attributes = marksToAttributes(node.marks);
|
|
113
|
+
if (node.kind === "text") target.insert(offset, node.text, attributes);
|
|
114
|
+
else target.insertEmbed(offset, { atom: node.type, attrs: node.attrs }, attributes);
|
|
115
|
+
offset += _chunkND5XJVK2cjs.nodeLength.call(void 0, node);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function nodeOf({ insert, attributes }) {
|
|
119
|
+
const marks = attributesToMarks(attributes);
|
|
120
|
+
return typeof insert === "string" ? _chunkND5XJVK2cjs.text.call(void 0, insert, marks) : _chunkND5XJVK2cjs.atom.call(void 0, insert.atom, insert.attrs, marks);
|
|
121
|
+
}
|
|
122
|
+
var inlineOfOps = (ops) => _chunkND5XJVK2cjs.normalizeInline.call(void 0, ops.map(nodeOf));
|
|
123
|
+
|
|
124
|
+
// src/yjs/doc-shape.ts
|
|
125
|
+
var deleteText = (text2, at, length) => text2.applyDelta(at > 0 ? [{ retain: at }, { delete: length }] : [{ delete: length }]);
|
|
126
|
+
var regionStart = (name) => ({ r: name });
|
|
127
|
+
var isPlainObject = (value) => typeof value === "object" && value !== null && !(value instanceof Y.AbstractType);
|
|
128
|
+
var regionNameOf = (embed) => isPlainObject(embed) && typeof embed.r === "string" && embed.atom === void 0 ? embed.r : null;
|
|
129
|
+
var isAtomEmbed = (embed) => isPlainObject(embed) && typeof embed.atom === "string" && isPlainObject(embed.attrs);
|
|
130
|
+
var definedEntries = (attrs) => Object.entries(attrs).filter(([, value]) => value !== void 0);
|
|
131
|
+
function markerOf(block) {
|
|
132
|
+
return new Y.Map([
|
|
133
|
+
["id", block.id],
|
|
134
|
+
["type", block.type],
|
|
135
|
+
["indent", block.indent],
|
|
136
|
+
["attrs", new Y.Map(definedEntries(block.attrs))]
|
|
137
|
+
]);
|
|
138
|
+
}
|
|
139
|
+
function readMarker(map) {
|
|
140
|
+
const [id, type, indent, attrs] = ["id", "type", "indent", "attrs"].map((key) => map.get(key));
|
|
141
|
+
if (typeof id !== "string") return null;
|
|
142
|
+
return {
|
|
143
|
+
id,
|
|
144
|
+
type: typeof type === "string" ? type : "",
|
|
145
|
+
indent: typeof indent === "number" ? indent : 0,
|
|
146
|
+
attrs: attrs instanceof Y.Map ? attrs : null
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
function blockOps(block, map, open) {
|
|
150
|
+
const ops = [{ insert: map, attributes: {} }];
|
|
151
|
+
for (const [name, inline] of Object.entries(block.regions)) {
|
|
152
|
+
ops.push({ insert: regionStart(name), attributes: {} });
|
|
153
|
+
if (name === open) break;
|
|
154
|
+
ops.push(...inlineOps(inline));
|
|
155
|
+
}
|
|
156
|
+
return ops;
|
|
157
|
+
}
|
|
158
|
+
var writeOps = (text2, at, ops) => text2.applyDelta(at > 0 ? [{ retain: at }, ...ops] : ops);
|
|
159
|
+
function writeBlock(text2, at, block, map, open) {
|
|
160
|
+
writeOps(text2, at, blockOps(block, map, open));
|
|
161
|
+
}
|
|
162
|
+
function writeBlocks(text2, at, blocks) {
|
|
163
|
+
const maps = blocks.map(markerOf);
|
|
164
|
+
writeOps(text2, at, blocks.flatMap((block, i) => blockOps(block, maps[i])));
|
|
165
|
+
return maps;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// src/yjs/read-shared.ts
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
// src/yjs/required-regions.ts
|
|
172
|
+
var noRequiredRegions = () => [];
|
|
173
|
+
function requiredRegions(schema) {
|
|
174
|
+
const known = /* @__PURE__ */ new Map();
|
|
175
|
+
return (type) => {
|
|
176
|
+
let names = known.get(type);
|
|
177
|
+
if (names === void 0) {
|
|
178
|
+
const spec = schema.blocks.get(type);
|
|
179
|
+
names = _optionalChain([spec, 'optionalAccess', _3 => _3.flow]) === "text" ? Object.keys(spec.initial().regions) : [];
|
|
180
|
+
known.set(type, names);
|
|
181
|
+
}
|
|
182
|
+
return names;
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// src/yjs/read-shared.ts
|
|
187
|
+
function reader(required) {
|
|
188
|
+
const spans = [_chunkE75EHRPAcjs.emptySpan.call(void 0, )];
|
|
189
|
+
const entries = /* @__PURE__ */ new Map();
|
|
190
|
+
const markers = /* @__PURE__ */ new Map();
|
|
191
|
+
const order = [];
|
|
192
|
+
const held2 = /* @__PURE__ */ new Map();
|
|
193
|
+
const strays = [];
|
|
194
|
+
let span = spans[0];
|
|
195
|
+
let entry = null;
|
|
196
|
+
let open = null;
|
|
197
|
+
let stray = null;
|
|
198
|
+
let clean = true;
|
|
199
|
+
const segFor = (region2, host, at, ops = []) => {
|
|
200
|
+
const seg = { host, region: region2, at, length: 0 };
|
|
201
|
+
host.segs.push(seg);
|
|
202
|
+
held2.set(seg, ops);
|
|
203
|
+
return seg;
|
|
204
|
+
};
|
|
205
|
+
const opened = (region2) => {
|
|
206
|
+
const seg = segFor(region2, span, span.length + 1);
|
|
207
|
+
region2.segs.push(seg);
|
|
208
|
+
return seg;
|
|
209
|
+
};
|
|
210
|
+
function content(op, length) {
|
|
211
|
+
if (open !== null) {
|
|
212
|
+
open.length += length;
|
|
213
|
+
held2.get(open).push(op);
|
|
214
|
+
} else if (span.index === 0 || span.entry !== null) {
|
|
215
|
+
clean = false;
|
|
216
|
+
if (stray === null) {
|
|
217
|
+
stray = { host: span, at: span.length, length: 0, ops: [], after: _nullishCoalesce(order[order.length - 1], () => ( null)) };
|
|
218
|
+
strays.push(stray);
|
|
219
|
+
}
|
|
220
|
+
stray.length += length;
|
|
221
|
+
stray.ops.push(op);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function marker(map) {
|
|
225
|
+
span = _chunkE75EHRPAcjs.emptySpan.call(void 0, );
|
|
226
|
+
span.index = spans.length;
|
|
227
|
+
spans.push(span);
|
|
228
|
+
[open, stray] = [null, null];
|
|
229
|
+
const fields = readMarker(map);
|
|
230
|
+
const kept = fields !== null && !entries.has(fields.id);
|
|
231
|
+
entry = kept ? { id: fields.id, map, span, regions: [], copies: [] } : null;
|
|
232
|
+
if (entry !== null) {
|
|
233
|
+
span.entry = entry;
|
|
234
|
+
entries.set(entry.id, entry);
|
|
235
|
+
markers.set(entry, fields);
|
|
236
|
+
} else {
|
|
237
|
+
clean = false;
|
|
238
|
+
if (fields !== null) {
|
|
239
|
+
span.copyOf = entries.get(fields.id);
|
|
240
|
+
span.copyOf.copies.push(span);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function embed(value) {
|
|
245
|
+
const name = regionNameOf(value);
|
|
246
|
+
stray = null;
|
|
247
|
+
if (name !== null && entry !== null && !entry.regions.some((region2) => region2.name === name)) {
|
|
248
|
+
const region2 = { name, entry, segs: [] };
|
|
249
|
+
entry.regions.push(region2);
|
|
250
|
+
order.push(region2);
|
|
251
|
+
open = opened(region2);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
clean = false;
|
|
255
|
+
if (open !== null) open = opened(open.region);
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
read(op) {
|
|
259
|
+
const { insert } = op;
|
|
260
|
+
if (typeof insert === "string" || isAtomEmbed(insert)) {
|
|
261
|
+
const length = typeof insert === "string" ? insert.length : 1;
|
|
262
|
+
content(op, length);
|
|
263
|
+
span.length += length;
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
if (insert instanceof Y2.Map) marker(insert);
|
|
267
|
+
else embed(insert);
|
|
268
|
+
span.length += 1;
|
|
269
|
+
},
|
|
270
|
+
finish() {
|
|
271
|
+
const leading = [];
|
|
272
|
+
const read = [];
|
|
273
|
+
let unread = false;
|
|
274
|
+
for (const { host, at, length, ops, after } of strays) {
|
|
275
|
+
const region2 = _nullishCoalesce(after, () => ( order[0]));
|
|
276
|
+
unread ||= region2 === void 0;
|
|
277
|
+
if (region2 === void 0) continue;
|
|
278
|
+
const seg = segFor(region2, host, at, ops);
|
|
279
|
+
seg.length = length;
|
|
280
|
+
read.push(seg);
|
|
281
|
+
if (after === null) leading.push(seg);
|
|
282
|
+
else region2.segs.push(seg);
|
|
283
|
+
}
|
|
284
|
+
_optionalChain([order, 'access', _4 => _4[0], 'optionalAccess', _5 => _5.segs, 'access', _6 => _6.unshift, 'call', _7 => _7(...leading)]);
|
|
285
|
+
const blocks = [...entries.values()].map((kept) => {
|
|
286
|
+
const { type, indent, attrs } = markers.get(kept);
|
|
287
|
+
for (const name of required(type)) {
|
|
288
|
+
if (!kept.regions.some((region2) => region2.name === name)) kept.regions.push({ name, entry: kept, segs: [] });
|
|
289
|
+
}
|
|
290
|
+
const inline = (segs) => inlineOfOps(segs.flatMap((seg) => held2.get(seg)));
|
|
291
|
+
const regions = kept.regions.map(({ name, segs }) => [name, inline(segs)]);
|
|
292
|
+
return { id: kept.id, type, indent, attrs: _nullishCoalesce(_optionalChain([attrs, 'optionalAccess', _8 => _8.toJSON, 'call', _9 => _9()]), () => ( {})), regions: Object.fromEntries(regions) };
|
|
293
|
+
});
|
|
294
|
+
const layout = _chunkE75EHRPAcjs.createLayout.call(void 0, spans, entries, clean, { read, leading: new Set(leading), unread });
|
|
295
|
+
return { doc: _chunkND5XJVK2cjs.createDoc.call(void 0, blocks), layout };
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
function readShared(text2, required = noRequiredRegions) {
|
|
300
|
+
const read = reader(required);
|
|
301
|
+
for (const op of text2.toDelta()) read.read(op);
|
|
302
|
+
return read.finish();
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// src/yjs/shared.ts
|
|
306
|
+
function reread(shared) {
|
|
307
|
+
shared.layout = readShared(shared.text, shared.required).layout;
|
|
308
|
+
shared.stale = true;
|
|
309
|
+
}
|
|
310
|
+
function insertContent(shared, region2, offset, inline) {
|
|
311
|
+
if (inline.length === 0) return;
|
|
312
|
+
if (region2.segs.length === 0) return openRegion(shared, region2, inline);
|
|
313
|
+
const { seg, rel } = _chunkE75EHRPAcjs.pointOf.call(void 0, region2, offset);
|
|
314
|
+
insertInline(shared.text, _chunkE75EHRPAcjs.spanStart.call(void 0, shared.layout, seg.host) + rel, inline);
|
|
315
|
+
_chunkE75EHRPAcjs.grow.call(void 0, shared.layout, seg, rel, _chunkND5XJVK2cjs.inlineLength.call(void 0, inline));
|
|
316
|
+
}
|
|
317
|
+
function deleteContent(shared, region2, from, to) {
|
|
318
|
+
for (const { seg, rel, length } of _chunkE75EHRPAcjs.piecesOf.call(void 0, region2, from, to).reverse()) {
|
|
319
|
+
deleteText(shared.text, _chunkE75EHRPAcjs.spanStart.call(void 0, shared.layout, seg.host) + rel, length);
|
|
320
|
+
_chunkE75EHRPAcjs.grow.call(void 0, shared.layout, seg, rel, -length);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function formatContent(shared, region2, from, to, attributes) {
|
|
324
|
+
for (const { seg, rel, length } of _chunkE75EHRPAcjs.piecesOf.call(void 0, region2, from, to)) {
|
|
325
|
+
shared.text.format(_chunkE75EHRPAcjs.spanStart.call(void 0, shared.layout, seg.host) + rel, length, attributes);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
function openRegion(shared, { name, entry }, inline) {
|
|
329
|
+
const at = _chunkE75EHRPAcjs.spanStart.call(void 0, shared.layout, entry.span) + entry.span.length;
|
|
330
|
+
shared.text.insertEmbed(at, regionStart(name), {});
|
|
331
|
+
insertInline(shared.text, at + 1, inline);
|
|
332
|
+
reread(shared);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// src/yjs/sync-block.ts
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
// src/yjs/inline-span.ts
|
|
339
|
+
var units = (inline) => inline.flatMap(
|
|
340
|
+
(node) => node.kind === "text" ? Array.from({ length: node.text.length }, (_, i) => _chunkND5XJVK2cjs.text.call(void 0, node.text[i], node.marks)) : [node]
|
|
341
|
+
);
|
|
342
|
+
function changedSpan(before, after) {
|
|
343
|
+
const a = units(before);
|
|
344
|
+
const b = units(after);
|
|
345
|
+
let start = 0;
|
|
346
|
+
while (start < a.length && start < b.length && _chunkND5XJVK2cjs.equalNode.call(void 0, a[start], b[start])) start += 1;
|
|
347
|
+
let end = 0;
|
|
348
|
+
const shared = Math.min(a.length, b.length) - start;
|
|
349
|
+
while (end < shared && _chunkND5XJVK2cjs.equalNode.call(void 0, a[a.length - 1 - end], b[b.length - 1 - end])) end += 1;
|
|
350
|
+
return { from: start, to: _chunkND5XJVK2cjs.inlineLength.call(void 0, before) - end, slice: _chunkND5XJVK2cjs.sliceInline.call(void 0, after, start, _chunkND5XJVK2cjs.inlineLength.call(void 0, after) - end) };
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// src/yjs/plain.ts
|
|
354
|
+
function isPlain({ span, regions }) {
|
|
355
|
+
if (span.segs.length !== regions.length) return false;
|
|
356
|
+
let end = 1;
|
|
357
|
+
for (const { segs } of regions) {
|
|
358
|
+
if (segs.length !== 1 || segs[0].host !== span || segs[0].at !== end + 1) return false;
|
|
359
|
+
end = segs[0].at + segs[0].length;
|
|
360
|
+
}
|
|
361
|
+
return span.length === end;
|
|
362
|
+
}
|
|
363
|
+
function rewritten(entry, block, map = entry.map) {
|
|
364
|
+
const next = _chunkE75EHRPAcjs.cleanEntry.call(void 0, block, map);
|
|
365
|
+
next.copies.push(...entry.copies);
|
|
366
|
+
for (const copy of next.copies) copy.copyOf = next;
|
|
367
|
+
return next;
|
|
368
|
+
}
|
|
369
|
+
function crossesStray(layout, index) {
|
|
370
|
+
const { read, leading, unread } = layout.strays;
|
|
371
|
+
return unread || read.some((seg) => {
|
|
372
|
+
const region2 = _chunkE75EHRPAcjs.indexOf.call(void 0, layout, seg.region.entry.span);
|
|
373
|
+
return leading.has(seg) ? index <= region2 : region2 < index && index <= _chunkE75EHRPAcjs.indexOf.call(void 0, layout, seg.host);
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// src/yjs/write-blocks.ts
|
|
378
|
+
function insertBlocks(shared, next, blocks) {
|
|
379
|
+
const { layout, text: text2 } = shared;
|
|
380
|
+
const span = next === null ? null : layout.entries.get(next).span;
|
|
381
|
+
const index = span === null ? layout.spans.length : _chunkE75EHRPAcjs.indexOf.call(void 0, layout, span);
|
|
382
|
+
const crosses = blocks.some((block) => Object.keys(block.regions).length > 0) && crossesStray(layout, index);
|
|
383
|
+
const maps = writeBlocks(text2, span === null ? _chunkE75EHRPAcjs.textLength.call(void 0, layout) : _chunkE75EHRPAcjs.spanStart.call(void 0, layout, span), blocks);
|
|
384
|
+
if (crosses) reread(shared);
|
|
385
|
+
else _chunkE75EHRPAcjs.placeEntries.call(void 0, layout, index, 0, blocks.map((block, i) => _chunkE75EHRPAcjs.cleanEntry.call(void 0, block, maps[i])));
|
|
386
|
+
}
|
|
387
|
+
function ownParts(entry, span) {
|
|
388
|
+
const parts = [];
|
|
389
|
+
let at = 0;
|
|
390
|
+
const foreign = span.segs.filter((seg) => seg.region.entry !== entry).sort((a, b) => a.at - b.at);
|
|
391
|
+
for (const seg of foreign) {
|
|
392
|
+
if (seg.at > at) parts.push([at, seg.at - at]);
|
|
393
|
+
at = seg.at + seg.length;
|
|
394
|
+
}
|
|
395
|
+
if (span.length > at) parts.push([at, span.length - at]);
|
|
396
|
+
return parts;
|
|
397
|
+
}
|
|
398
|
+
function dropSpans(shared, spans) {
|
|
399
|
+
const { layout, text: text2 } = shared;
|
|
400
|
+
for (const span of [...spans].sort((a, b) => _chunkE75EHRPAcjs.indexOf.call(void 0, layout, b) - _chunkE75EHRPAcjs.indexOf.call(void 0, layout, a))) {
|
|
401
|
+
const at = _chunkE75EHRPAcjs.indexOf.call(void 0, layout, span);
|
|
402
|
+
deleteText(text2, _chunkE75EHRPAcjs.spanStart.call(void 0, layout, span), span.length);
|
|
403
|
+
_chunkE75EHRPAcjs.placeEntries.call(void 0, layout, at, 1, []);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
function unreadBefore(layout, span) {
|
|
407
|
+
const before = [];
|
|
408
|
+
for (let at = _chunkE75EHRPAcjs.indexOf.call(void 0, layout, span) - 1; at > 0 && layout.spans[at].entry === null; at--) {
|
|
409
|
+
before.push(layout.spans[at]);
|
|
410
|
+
}
|
|
411
|
+
return before;
|
|
412
|
+
}
|
|
413
|
+
function removeBlock(shared, id) {
|
|
414
|
+
const { layout, text: text2 } = shared;
|
|
415
|
+
const entry = layout.entries.get(id);
|
|
416
|
+
const unread = [...entry.copies, ...unreadBefore(layout, entry.span)];
|
|
417
|
+
if (isPlain(entry)) return dropSpans(shared, [.../* @__PURE__ */ new Set([entry.span, ...unread])]);
|
|
418
|
+
dropSpans(shared, [...new Set(unread)]);
|
|
419
|
+
const ranges = [];
|
|
420
|
+
const start = _chunkE75EHRPAcjs.spanStart.call(void 0, layout, entry.span);
|
|
421
|
+
ranges.push(...ownParts(entry, entry.span).map(([at, length]) => [start + at, length]));
|
|
422
|
+
for (const seg of entry.regions.flatMap((region2) => region2.segs)) {
|
|
423
|
+
if (seg.host !== entry.span) ranges.push([_chunkE75EHRPAcjs.spanStart.call(void 0, layout, seg.host) + seg.at, seg.length]);
|
|
424
|
+
}
|
|
425
|
+
for (const [at, length] of ranges.sort((a, b) => b[0] - a[0])) if (length > 0) deleteText(text2, at, length);
|
|
426
|
+
reread(shared);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// src/yjs/sync-block.ts
|
|
430
|
+
function syncAttrs(map, before, after) {
|
|
431
|
+
const current = map.get("attrs");
|
|
432
|
+
if (!(current instanceof Y3.Map)) {
|
|
433
|
+
map.set("attrs", new Y3.Map(definedEntries(after)));
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
const kept = new Map(definedEntries(after));
|
|
437
|
+
for (const key of [...current.keys()]) if (!kept.has(key)) current.delete(key);
|
|
438
|
+
for (const [key, value] of kept) if (!_chunk2QCRZ7OLcjs.sameValue.call(void 0, before[key], value)) current.set(key, value);
|
|
439
|
+
}
|
|
440
|
+
function keptNames(before, after) {
|
|
441
|
+
const kept = /* @__PURE__ */ new Set();
|
|
442
|
+
let from = 0;
|
|
443
|
+
for (const name of after) {
|
|
444
|
+
const at = before.indexOf(name, from);
|
|
445
|
+
if (at < 0) continue;
|
|
446
|
+
kept.add(name);
|
|
447
|
+
from = at + 1;
|
|
448
|
+
}
|
|
449
|
+
return kept;
|
|
450
|
+
}
|
|
451
|
+
function syncRegions(shared, entry, before, after) {
|
|
452
|
+
const { text: text2, layout } = shared;
|
|
453
|
+
const names = Object.keys(after.regions);
|
|
454
|
+
const kept = keptNames(Object.keys(before.regions), names);
|
|
455
|
+
const queue = Object.entries(before.regions);
|
|
456
|
+
let at = _chunkE75EHRPAcjs.spanStart.call(void 0, layout, entry.span) + 1;
|
|
457
|
+
const dropGone = () => {
|
|
458
|
+
while (queue.length > 0 && !kept.has(queue[0][0])) deleteText(text2, at, 1 + _chunkND5XJVK2cjs.inlineLength.call(void 0, queue.shift()[1]));
|
|
459
|
+
};
|
|
460
|
+
for (const name of names) {
|
|
461
|
+
dropGone();
|
|
462
|
+
const inline = after.regions[name];
|
|
463
|
+
if (kept.has(name)) {
|
|
464
|
+
const { from, to, slice } = changedSpan(queue.shift()[1], inline);
|
|
465
|
+
if (to > from) deleteText(text2, at + 1 + from, to - from);
|
|
466
|
+
insertInline(text2, at + 1 + from, slice);
|
|
467
|
+
} else {
|
|
468
|
+
text2.insertEmbed(at, regionStart(name), {});
|
|
469
|
+
insertInline(text2, at + 1, inline);
|
|
470
|
+
}
|
|
471
|
+
at += 1 + _chunkND5XJVK2cjs.inlineLength.call(void 0, inline);
|
|
472
|
+
}
|
|
473
|
+
dropGone();
|
|
474
|
+
_chunkE75EHRPAcjs.placeEntries.call(void 0, layout, _chunkE75EHRPAcjs.indexOf.call(void 0, layout, entry.span), 1, [rewritten(entry, after)]);
|
|
475
|
+
}
|
|
476
|
+
function syncBlock(shared, before, after, next) {
|
|
477
|
+
if (before === after) return;
|
|
478
|
+
const entry = shared.layout.entries.get(before.id);
|
|
479
|
+
const plain = isPlain(entry);
|
|
480
|
+
if (!plain && !_chunk2QCRZ7OLcjs.sameValue.call(void 0, Object.keys(before.regions), Object.keys(after.regions))) {
|
|
481
|
+
removeBlock(shared, before.id);
|
|
482
|
+
insertBlocks(shared, next, [after]);
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
if (before.type !== after.type) entry.map.set("type", after.type);
|
|
486
|
+
if (before.indent !== after.indent) entry.map.set("indent", after.indent);
|
|
487
|
+
syncAttrs(entry.map, before.attrs, after.attrs);
|
|
488
|
+
if (plain) {
|
|
489
|
+
const gains = Object.keys(before.regions).length === 0 && Object.keys(after.regions).length > 0;
|
|
490
|
+
const crosses = gains && crossesStray(shared.layout, _chunkE75EHRPAcjs.indexOf.call(void 0, shared.layout, entry.span));
|
|
491
|
+
syncRegions(shared, entry, before, after);
|
|
492
|
+
if (crosses) reread(shared);
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
for (const name of entry.regions.map((region2) => region2.name)) {
|
|
496
|
+
const [was, now] = [before.regions[name], after.regions[name]];
|
|
497
|
+
if (_chunkND5XJVK2cjs.equalInline.call(void 0, was, now)) continue;
|
|
498
|
+
const { from, to, slice } = changedSpan(was, now);
|
|
499
|
+
const region2 = _chunkE75EHRPAcjs.regionOf.call(void 0, shared.layout, before.id, name);
|
|
500
|
+
deleteContent(shared, region2, from, to);
|
|
501
|
+
insertContent(shared, region2, from, slice);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// src/yjs/sync-docs.ts
|
|
506
|
+
function syncDocs(shared, before, after) {
|
|
507
|
+
const order = before.blocks.map((block) => block.id);
|
|
508
|
+
for (const id of [...order]) {
|
|
509
|
+
if (after.index.has(id)) continue;
|
|
510
|
+
removeBlock(shared, id);
|
|
511
|
+
order.splice(order.indexOf(id), 1);
|
|
512
|
+
}
|
|
513
|
+
after.blocks.forEach((block, i) => {
|
|
514
|
+
if (order[i] === block.id) {
|
|
515
|
+
syncBlock(shared, before.blocks[before.index.get(block.id)], block, _nullishCoalesce(order[i + 1], () => ( null)));
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
const at = order.indexOf(block.id, i);
|
|
519
|
+
if (at > i) {
|
|
520
|
+
removeBlock(shared, block.id);
|
|
521
|
+
order.splice(at, 1);
|
|
522
|
+
}
|
|
523
|
+
insertBlocks(shared, _nullishCoalesce(order[i], () => ( null)), [block]);
|
|
524
|
+
order.splice(i, 0, block.id);
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
// src/yjs/split-join.ts
|
|
529
|
+
var held = (region2) => region2 !== void 0 && region2.segs.length > 0;
|
|
530
|
+
function writeSplit(shared, after, { block, region: region2, offset, created }) {
|
|
531
|
+
const { layout, text: text2 } = shared;
|
|
532
|
+
const entry = layout.entries.get(block);
|
|
533
|
+
const tail = _chunkND5XJVK2cjs.blockById.call(void 0, after, created.id);
|
|
534
|
+
const last = entry.regions[entry.regions.length - 1];
|
|
535
|
+
if (!held(last) || last.name !== region2 || Object.keys(tail.regions).at(-1) !== created.region) return false;
|
|
536
|
+
const { seg, rel } = _chunkE75EHRPAcjs.pointOf.call(void 0, last, offset);
|
|
537
|
+
const map = markerOf(tail);
|
|
538
|
+
writeBlock(text2, _chunkE75EHRPAcjs.spanStart.call(void 0, layout, seg.host) + rel, tail, map, created.region);
|
|
539
|
+
if (!isPlain(entry)) {
|
|
540
|
+
reread(shared);
|
|
541
|
+
return true;
|
|
542
|
+
}
|
|
543
|
+
const head = rewritten(entry, _chunkND5XJVK2cjs.blockById.call(void 0, after, block));
|
|
544
|
+
_chunkE75EHRPAcjs.placeEntries.call(void 0, layout, _chunkE75EHRPAcjs.indexOf.call(void 0, layout, entry.span), 1, [head, _chunkE75EHRPAcjs.cleanEntry.call(void 0, tail, map)]);
|
|
545
|
+
return true;
|
|
546
|
+
}
|
|
547
|
+
function writeJoin(shared, after, join2) {
|
|
548
|
+
const { target, targetRegion, source, sourceRegion } = join2;
|
|
549
|
+
const { layout, text: text2 } = shared;
|
|
550
|
+
const [into, from] = [target, source].map((id) => layout.entries.get(id));
|
|
551
|
+
const [end, start] = [into.regions.at(-1), from.regions[0]];
|
|
552
|
+
if (!held(end) || !held(start) || end.name !== targetRegion || start.name !== sourceRegion) return false;
|
|
553
|
+
const between = layout.spans.slice(_chunkE75EHRPAcjs.indexOf.call(void 0, layout, into.span) + 1, _chunkE75EHRPAcjs.indexOf.call(void 0, layout, from.span));
|
|
554
|
+
dropSpans(shared, [...from.copies, ...between]);
|
|
555
|
+
const at = _chunkE75EHRPAcjs.spanStart.call(void 0, layout, from.span);
|
|
556
|
+
if (!isPlain(into) || !isPlain(from)) {
|
|
557
|
+
const own = start.segs.find((seg) => seg.host === from.span);
|
|
558
|
+
deleteText(text2, at + own.at - 1, 1);
|
|
559
|
+
deleteText(text2, at, 1);
|
|
560
|
+
reread(shared);
|
|
561
|
+
return true;
|
|
562
|
+
}
|
|
563
|
+
const index = _chunkE75EHRPAcjs.indexOf.call(void 0, layout, into.span);
|
|
564
|
+
const moved = from.regions[0].segs[0].length;
|
|
565
|
+
const rest = from.span.length - 2 - moved;
|
|
566
|
+
if (rest > 0) deleteText(text2, at + 2 + moved, rest);
|
|
567
|
+
deleteText(text2, at, 2);
|
|
568
|
+
_chunkE75EHRPAcjs.placeEntries.call(void 0, layout, index, 2, [rewritten(into, _chunkND5XJVK2cjs.blockById.call(void 0, after, target))]);
|
|
569
|
+
return true;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// src/yjs/local-to-yjs.ts
|
|
573
|
+
var region = ({ shared, params }) => _chunkE75EHRPAcjs.regionOf.call(void 0, shared.layout, params.block, params.region);
|
|
574
|
+
var following = (doc, id) => _nullishCoalesce(_optionalChain([doc, 'access', _10 => _10.blocks, 'access', _11 => _11[doc.index.get(id) + 1], 'optionalAccess', _12 => _12.id]), () => ( null));
|
|
575
|
+
function replaceInline(context) {
|
|
576
|
+
const { from, to, slice } = context.params;
|
|
577
|
+
const target = region(context);
|
|
578
|
+
deleteContent(context.shared, target, from, to);
|
|
579
|
+
insertContent(context.shared, target, from, slice);
|
|
580
|
+
}
|
|
581
|
+
function format(context, keys) {
|
|
582
|
+
const { block, region: name, from, to } = context.params;
|
|
583
|
+
if (to === from) return;
|
|
584
|
+
const inline = _chunkND5XJVK2cjs.blockById.call(void 0, context.before, block).regions[name];
|
|
585
|
+
formatContent(context.shared, region(context), from, to, keys(_chunkND5XJVK2cjs.sliceInline.call(void 0, inline, from, to)));
|
|
586
|
+
}
|
|
587
|
+
function removedKeys(mark, inline) {
|
|
588
|
+
if (typeof mark !== "string") return { [markAttribute(mark)[0]]: null };
|
|
589
|
+
const marks = inline.flatMap((node) => node.marks.filter((candidate) => candidate.type === mark));
|
|
590
|
+
return Object.fromEntries(marks.map((found) => [markAttribute(found)[0], null]));
|
|
591
|
+
}
|
|
592
|
+
function setAttrs({ shared, after, params }) {
|
|
593
|
+
const id = params.block;
|
|
594
|
+
const { map } = shared.layout.entries.get(id);
|
|
595
|
+
const next = _chunkND5XJVK2cjs.blockById.call(void 0, after, id).attrs;
|
|
596
|
+
const attrs = map.get("attrs");
|
|
597
|
+
if (!(attrs instanceof Y4.Map)) return void map.set("attrs", new Y4.Map(definedEntries(next)));
|
|
598
|
+
for (const key of Object.keys(params.patch)) {
|
|
599
|
+
if (next[key] === void 0) attrs.delete(key);
|
|
600
|
+
else attrs.set(key, next[key]);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
function moveBlocks({ shared, before, after, params }) {
|
|
604
|
+
const { from, count, to } = params;
|
|
605
|
+
if (count === 0 || from === to) return;
|
|
606
|
+
const moved = before.blocks.slice(from, from + count);
|
|
607
|
+
for (const block of moved) removeBlock(shared, block.id);
|
|
608
|
+
insertBlocks(shared, _nullishCoalesce(_optionalChain([after, 'access', _13 => _13.blocks, 'access', _14 => _14[to + count], 'optionalAccess', _15 => _15.id]), () => ( null)), moved);
|
|
609
|
+
}
|
|
610
|
+
var WRITERS = {
|
|
611
|
+
replaceInline,
|
|
612
|
+
addMark: (context) => format(context, () => Object.fromEntries([markAttribute(context.params.mark)])),
|
|
613
|
+
removeMark: (context) => format(context, (inline) => removedKeys(context.params.mark, inline)),
|
|
614
|
+
setAttrs,
|
|
615
|
+
setIndent: ({ shared, params }) => shared.layout.entries.get(params.block).map.set("indent", params.indent),
|
|
616
|
+
insertBlocks: ({ shared, before, params }) => insertBlocks(shared, _nullishCoalesce(_optionalChain([before, 'access', _16 => _16.blocks, 'access', _17 => _17[params.index], 'optionalAccess', _18 => _18.id]), () => ( null)), params.blocks),
|
|
617
|
+
removeBlocks: ({ shared, before, params }) => {
|
|
618
|
+
const { index, count } = params;
|
|
619
|
+
for (const block of before.blocks.slice(index, index + count)) removeBlock(shared, block.id);
|
|
620
|
+
},
|
|
621
|
+
moveBlocks,
|
|
622
|
+
splitBlock: (context) => {
|
|
623
|
+
if (!writeSplit(context.shared, context.after, context.params)) {
|
|
624
|
+
syncDocs(context.shared, context.before, context.after);
|
|
625
|
+
}
|
|
626
|
+
},
|
|
627
|
+
joinBlocks: (context) => {
|
|
628
|
+
if (!writeJoin(context.shared, context.after, context.params)) {
|
|
629
|
+
syncDocs(context.shared, context.before, context.after);
|
|
630
|
+
}
|
|
631
|
+
},
|
|
632
|
+
replaceBlock: ({ shared, before, params }) => {
|
|
633
|
+
const block = params.block;
|
|
634
|
+
syncBlock(shared, _chunkND5XJVK2cjs.blockById.call(void 0, before, block.id), block, following(before, block.id));
|
|
635
|
+
}
|
|
636
|
+
};
|
|
637
|
+
function writeLocalSteps(shared, steps, docs) {
|
|
638
|
+
steps.forEach((step, i) => {
|
|
639
|
+
const [before, after] = [docs[i], docs[i + 1]];
|
|
640
|
+
const writer = WRITERS[step.stepType];
|
|
641
|
+
if (writer === void 0) syncDocs(shared, before, after);
|
|
642
|
+
else writer({ shared, before, after, params: step.toJSON() });
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
// src/yjs/own-change.ts
|
|
647
|
+
function ownChange(editor, steps, hint) {
|
|
648
|
+
const tr = editor.createTransaction().setOrigin("history").setMeta("addToHistory", false);
|
|
649
|
+
for (const step of steps) tr.step(step);
|
|
650
|
+
if (hint && _chunkPZ4GT5JOcjs.sameSelection.call(void 0, _chunkPZ4GT5JOcjs.validateSelection.call(void 0, tr.doc, editor.schema, hint), hint)) tr.setSelection(hint);
|
|
651
|
+
return tr;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
// src/yjs/seed.ts
|
|
655
|
+
function seedOrLoad(editor, text2, { origin, seed, required }) {
|
|
656
|
+
const { blocks } = editor.state.doc;
|
|
657
|
+
if (text2.length === 0 && seed === "if-empty") {
|
|
658
|
+
let maps = [];
|
|
659
|
+
text2.doc.transact(() => maps = writeBlocks(text2, 0, blocks), origin);
|
|
660
|
+
const entries = blocks.map((block, i) => _chunkE75EHRPAcjs.cleanEntry.call(void 0, block, maps[i]));
|
|
661
|
+
const spans = [_chunkE75EHRPAcjs.emptySpan.call(void 0, ), ...entries.map((entry) => entry.span)];
|
|
662
|
+
return _chunkE75EHRPAcjs.createLayout.call(void 0, spans, new Map(entries.map((entry) => [entry.id, entry])), true);
|
|
663
|
+
}
|
|
664
|
+
const { doc, layout } = readShared(text2, required);
|
|
665
|
+
if (!_chunkPZ4GT5JOcjs.sameDoc.call(void 0, doc, editor.state.doc)) applyRemote(editor, [_chunkPZ4GT5JOcjs.replaceDocStep.call(void 0, doc)]);
|
|
666
|
+
return layout;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
// src/yjs/undo-history.ts
|
|
670
|
+
|
|
671
|
+
var GROUP_DELAY = 500;
|
|
672
|
+
var SELECTION = "selection";
|
|
673
|
+
function groupOf(tr) {
|
|
674
|
+
if (tr.getMeta("closeHistory") === true) return null;
|
|
675
|
+
const named = tr.getMeta(_chunkPZ4GT5JOcjs.HISTORY_GROUP);
|
|
676
|
+
if (named !== void 0) return named;
|
|
677
|
+
const before = tr.before.selection;
|
|
678
|
+
if (tr.origin !== "input" || _optionalChain([before, 'optionalAccess', _19 => _19.kind]) !== "text") return null;
|
|
679
|
+
return JSON.stringify([before.head.block, before.head.region]);
|
|
680
|
+
}
|
|
681
|
+
function undoHistory(text2, origin) {
|
|
682
|
+
const manager = new Y5.UndoManager(text2, { trackedOrigins: /* @__PURE__ */ new Set([origin]), captureTimeout: Infinity });
|
|
683
|
+
let group = null;
|
|
684
|
+
let time = 0;
|
|
685
|
+
let before = null;
|
|
686
|
+
let hint = null;
|
|
687
|
+
manager.on("stack-item-added", ({ stackItem }) => stackItem.meta.set(SELECTION, before));
|
|
688
|
+
return {
|
|
689
|
+
manager,
|
|
690
|
+
record(tr) {
|
|
691
|
+
if (!tr.docChanged) {
|
|
692
|
+
if (tr.getMeta("closeHistory") === true) group = null;
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
const next = groupOf(tr);
|
|
696
|
+
if (next === null || next !== group || tr.time - time >= GROUP_DELAY) manager.stopCapturing();
|
|
697
|
+
group = next;
|
|
698
|
+
time = tr.time;
|
|
699
|
+
before = tr.before.selection;
|
|
700
|
+
},
|
|
701
|
+
travel(direction, editor) {
|
|
702
|
+
const stack = direction === "undo" ? manager.undoStack : manager.redoStack;
|
|
703
|
+
const item = stack.at(-1);
|
|
704
|
+
if (item === void 0) return false;
|
|
705
|
+
hint = _nullishCoalesce(item.meta.get(SELECTION), () => ( null));
|
|
706
|
+
before = editor.state.selection;
|
|
707
|
+
group = null;
|
|
708
|
+
try {
|
|
709
|
+
return (direction === "undo" ? manager.undo() : manager.redo()) !== null;
|
|
710
|
+
} finally {
|
|
711
|
+
hint = null;
|
|
712
|
+
}
|
|
713
|
+
},
|
|
714
|
+
hint: () => hint,
|
|
715
|
+
destroy: () => manager.destroy()
|
|
716
|
+
};
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
// src/yjs/read-split-join.ts
|
|
720
|
+
|
|
721
|
+
var bare = (op) => op === void 0 || op.attributes === void 0;
|
|
722
|
+
function split(layout, delta, required) {
|
|
723
|
+
const [at, ops] = _optionalChain([delta, 'access', _20 => _20[0], 'optionalAccess', _21 => _21.retain]) === void 0 ? [0, delta] : [delta[0].retain, delta.slice(1)];
|
|
724
|
+
const map = _optionalChain([ops, 'access', _22 => _22[0], 'optionalAccess', _23 => _23.insert]);
|
|
725
|
+
const name = regionNameOf(_optionalChain([ops, 'access', _24 => _24[1], 'optionalAccess', _25 => _25.insert]));
|
|
726
|
+
if (ops.length !== 2 || !(map instanceof Y6.Map) || name === null || !bare(delta[0])) return null;
|
|
727
|
+
const marker = readMarker(map);
|
|
728
|
+
const span = _chunkE75EHRPAcjs.spanAt.call(void 0, layout, at);
|
|
729
|
+
if (span.entry === null || !isPlain(span.entry)) return null;
|
|
730
|
+
const region2 = span.entry.regions.at(-1);
|
|
731
|
+
const seg = _optionalChain([region2, 'optionalAccess', _26 => _26.segs, 'access', _27 => _27[0]]);
|
|
732
|
+
const rel = at - _chunkE75EHRPAcjs.spanStart.call(void 0, layout, span);
|
|
733
|
+
if (marker === null || seg === void 0 || rel < seg.at || rel > seg.at + seg.length) return null;
|
|
734
|
+
if (required(marker.type).some((needed) => needed !== name)) return null;
|
|
735
|
+
const { id, type, indent, attrs } = marker;
|
|
736
|
+
const created = { id, type, indent, attrs: _nullishCoalesce(_optionalChain([attrs, 'optionalAccess', _28 => _28.toJSON, 'call', _29 => _29()]), () => ( {})), region: name, regions: {} };
|
|
737
|
+
return { step: _chunkPZ4GT5JOcjs.splitBlockStep.call(void 0, span.entry.id, region2.name, _chunkE75EHRPAcjs.offsetIn.call(void 0, seg, rel), created), map };
|
|
738
|
+
}
|
|
739
|
+
function join(layout, delta) {
|
|
740
|
+
const [at, ops] = _optionalChain([delta, 'access', _30 => _30[0], 'optionalAccess', _31 => _31.retain]) === void 0 ? [0, delta] : [delta[0].retain, delta.slice(1)];
|
|
741
|
+
if (ops.length !== 1 || ops[0].delete !== 2 || !bare(delta[0])) return null;
|
|
742
|
+
const span = _chunkE75EHRPAcjs.spanAt.call(void 0, layout, at, true);
|
|
743
|
+
const source = span.entry;
|
|
744
|
+
const target = _nullishCoalesce(_optionalChain([layout, 'access', _32 => _32.spans, 'access', _33 => _33[span.index - 1], 'optionalAccess', _34 => _34.entry]), () => ( null));
|
|
745
|
+
if (_chunkE75EHRPAcjs.spanStart.call(void 0, layout, span) !== at || source === null || target === null) return null;
|
|
746
|
+
if (source.regions.length !== 1 || target.regions.length === 0 || source.copies.length > 0) return null;
|
|
747
|
+
if (!isPlain(source) || !isPlain(target)) return null;
|
|
748
|
+
return _chunkPZ4GT5JOcjs.joinBlocksStep.call(void 0, target.id, target.regions.at(-1).name, source.id, source.regions[0].name);
|
|
749
|
+
}
|
|
750
|
+
function splitOrJoin(layout, delta, doc, required) {
|
|
751
|
+
const found = split(layout, delta, required);
|
|
752
|
+
const step = _nullishCoalesce(_optionalChain([found, 'optionalAccess', _35 => _35.step]), () => ( join(layout, delta)));
|
|
753
|
+
if (step === null) return null;
|
|
754
|
+
const after = step.apply(doc).doc;
|
|
755
|
+
const { block, target, created } = step.toJSON();
|
|
756
|
+
const kept = layout.entries.get(_nullishCoalesce(block, () => ( target)));
|
|
757
|
+
const entries = [rewritten(kept, _chunkND5XJVK2cjs.blockById.call(void 0, after, kept.id))];
|
|
758
|
+
if (found !== null) entries.push(_chunkE75EHRPAcjs.cleanEntry.call(void 0, _chunkND5XJVK2cjs.blockById.call(void 0, after, created.id), found.map));
|
|
759
|
+
_chunkE75EHRPAcjs.placeEntries.call(void 0, layout, _chunkE75EHRPAcjs.indexOf.call(void 0, layout, kept.span), found === null ? 2 : 1, entries);
|
|
760
|
+
return step;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
// src/yjs/text-steps.ts
|
|
764
|
+
function segAt(layout, at, item) {
|
|
765
|
+
const span = _chunkE75EHRPAcjs.spanAt.call(void 0, layout, at, item);
|
|
766
|
+
const rel = at - _chunkE75EHRPAcjs.spanStart.call(void 0, layout, span);
|
|
767
|
+
const seg = span.segs.find((candidate) => candidate.at <= rel && rel <= candidate.at + candidate.length);
|
|
768
|
+
return seg === void 0 ? null : { seg, rel };
|
|
769
|
+
}
|
|
770
|
+
function formatSteps(layout, at, length, attributes) {
|
|
771
|
+
const steps = [];
|
|
772
|
+
for (let span = _chunkE75EHRPAcjs.spanAt.call(void 0, layout, at, true); ; span = layout.spans[span.index + 1]) {
|
|
773
|
+
const start = _chunkE75EHRPAcjs.spanStart.call(void 0, layout, span);
|
|
774
|
+
if (start >= at + length) break;
|
|
775
|
+
for (const seg of span.segs) {
|
|
776
|
+
const from = Math.max(at - start, seg.at);
|
|
777
|
+
const to = Math.min(at + length - start, seg.at + seg.length);
|
|
778
|
+
if (to <= from) continue;
|
|
779
|
+
const { entry, name } = seg.region;
|
|
780
|
+
const [first, last] = [_chunkE75EHRPAcjs.offsetIn.call(void 0, seg, from), _chunkE75EHRPAcjs.offsetIn.call(void 0, seg, to)];
|
|
781
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
782
|
+
const mark = markFromAttribute(key, _nullishCoalesce(value, () => ( true)));
|
|
783
|
+
steps.push((value === null ? _chunkPZ4GT5JOcjs.removeMarkStep : (0, _chunkPZ4GT5JOcjs.addMarkStep))(entry.id, name, first, last, mark));
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
if (span.index + 1 >= layout.spans.length) break;
|
|
787
|
+
}
|
|
788
|
+
return steps;
|
|
789
|
+
}
|
|
790
|
+
function textSteps(layout, delta) {
|
|
791
|
+
const steps = [];
|
|
792
|
+
let at = 0;
|
|
793
|
+
for (const op of delta) {
|
|
794
|
+
if (op.retain !== void 0) {
|
|
795
|
+
if (op.attributes !== void 0) steps.push(...formatSteps(layout, at, op.retain, op.attributes));
|
|
796
|
+
at += op.retain;
|
|
797
|
+
} else if (op.delete !== void 0) {
|
|
798
|
+
const found = segAt(layout, at, true);
|
|
799
|
+
if (found === null || found.rel + op.delete > found.seg.at + found.seg.length) return null;
|
|
800
|
+
const from = _chunkE75EHRPAcjs.offsetIn.call(void 0, found.seg, found.rel);
|
|
801
|
+
const { entry, name } = found.seg.region;
|
|
802
|
+
steps.push(_chunkPZ4GT5JOcjs.replaceInlineStep.call(void 0, entry.id, name, from, from + op.delete, []));
|
|
803
|
+
_chunkE75EHRPAcjs.grow.call(void 0, layout, found.seg, found.rel, -op.delete);
|
|
804
|
+
} else {
|
|
805
|
+
const found = typeof op.insert === "string" || isAtomEmbed(op.insert) ? segAt(layout, at, false) : null;
|
|
806
|
+
if (found === null) return null;
|
|
807
|
+
const inline = inlineOfOps([op]);
|
|
808
|
+
const from = _chunkE75EHRPAcjs.offsetIn.call(void 0, found.seg, found.rel);
|
|
809
|
+
const { entry, name } = found.seg.region;
|
|
810
|
+
steps.push(_chunkPZ4GT5JOcjs.replaceInlineStep.call(void 0, entry.id, name, from, from, inline));
|
|
811
|
+
_chunkE75EHRPAcjs.grow.call(void 0, layout, found.seg, found.rel, _chunkND5XJVK2cjs.inlineLength.call(void 0, inline));
|
|
812
|
+
at += _chunkND5XJVK2cjs.inlineLength.call(void 0, inline);
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
return steps;
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
// src/yjs/yjs-to-steps.ts
|
|
819
|
+
var REREAD = new Error("reread");
|
|
820
|
+
function markerSteps(shared, event, doc) {
|
|
821
|
+
const target = event.target;
|
|
822
|
+
const marker = target.parent === shared.text ? target : target.parent;
|
|
823
|
+
const fields = readMarker(marker);
|
|
824
|
+
const block = fields === null ? void 0 : _chunkND5XJVK2cjs.blockById.call(void 0, doc, fields.id);
|
|
825
|
+
if (block === void 0 || _optionalChain([shared, 'access', _36 => _36.layout, 'access', _37 => _37.entries, 'access', _38 => _38.get, 'call', _39 => _39(block.id), 'optionalAccess', _40 => _40.map]) !== marker) return [];
|
|
826
|
+
const keys = [...event.keysChanged];
|
|
827
|
+
if (target !== marker) {
|
|
828
|
+
if (fields.attrs !== target) return [];
|
|
829
|
+
return [_chunkPZ4GT5JOcjs.setAttrsStep.call(void 0, block.id, Object.fromEntries(keys.map((key) => [key, target.get(key)])))];
|
|
830
|
+
}
|
|
831
|
+
if (keys.includes("id")) throw REREAD;
|
|
832
|
+
if (keys.every((key) => key === "indent")) return [_chunkPZ4GT5JOcjs.setIndentStep.call(void 0, block.id, fields.indent)];
|
|
833
|
+
const { type, indent, attrs } = fields;
|
|
834
|
+
const empty = shared.layout.entries.get(block.id).regions.some((region2) => region2.segs.length === 0);
|
|
835
|
+
if (empty || shared.required(type).some((name) => !Object.hasOwn(block.regions, name))) throw REREAD;
|
|
836
|
+
return [_chunkPZ4GT5JOcjs.replaceBlockStep.call(void 0, { ...block, type, indent, attrs: _nullishCoalesce(_optionalChain([attrs, 'optionalAccess', _41 => _41.toJSON, 'call', _42 => _42()]), () => ( {})) })];
|
|
837
|
+
}
|
|
838
|
+
function contentSteps(shared, events, doc) {
|
|
839
|
+
const textEvent = events.find((event) => event.target === shared.text);
|
|
840
|
+
const delta = _nullishCoalesce(_optionalChain([textEvent, 'optionalAccess', _43 => _43.delta]), () => ( []));
|
|
841
|
+
const structure = splitOrJoin(shared.layout, delta, doc, shared.required);
|
|
842
|
+
const steps = structure === null ? textSteps(shared.layout, delta) : [structure];
|
|
843
|
+
if (steps === null) throw REREAD;
|
|
844
|
+
let current = steps.reduce((changed, step) => step.apply(changed).doc, doc);
|
|
845
|
+
for (const event of events) {
|
|
846
|
+
if (event === textEvent) continue;
|
|
847
|
+
for (const step of markerSteps(shared, event, current)) {
|
|
848
|
+
current = step.apply(current).doc;
|
|
849
|
+
steps.push(step);
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
return steps;
|
|
853
|
+
}
|
|
854
|
+
function readRemote(shared, events, doc) {
|
|
855
|
+
try {
|
|
856
|
+
return { steps: contentSteps(shared, events, doc), structural: false };
|
|
857
|
+
} catch (e) {
|
|
858
|
+
const read = readShared(shared.text, shared.required);
|
|
859
|
+
shared.layout = read.layout;
|
|
860
|
+
const blocks = read.doc.blocks.map((block) => {
|
|
861
|
+
const held2 = _chunkND5XJVK2cjs.blockById.call(void 0, doc, block.id);
|
|
862
|
+
return held2 !== void 0 && _chunk2QCRZ7OLcjs.sameValue.call(void 0, held2, block) ? held2 : block;
|
|
863
|
+
});
|
|
864
|
+
const next = _chunkND5XJVK2cjs.createDoc.call(void 0, blocks);
|
|
865
|
+
return { steps: _chunkPZ4GT5JOcjs.sameDoc.call(void 0, next, doc) ? [] : [_chunkPZ4GT5JOcjs.replaceDocStep.call(void 0, next)], structural: true };
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
// src/yjs/binding.ts
|
|
870
|
+
function bind(editor, text2, { origins, seed }) {
|
|
871
|
+
const doc = text2.doc;
|
|
872
|
+
const required = requiredRegions(editor.state.schema);
|
|
873
|
+
const layout = seedOrLoad(editor, text2, { origin: origins.local, seed, required });
|
|
874
|
+
const shared = { text: text2, layout, stale: false, required };
|
|
875
|
+
const history = undoHistory(text2, origins.local);
|
|
876
|
+
const ours = (origin) => origin === origins.local || origin === origins.untracked;
|
|
877
|
+
let held2 = null;
|
|
878
|
+
const written = /* @__PURE__ */ new WeakSet();
|
|
879
|
+
const hold = (transaction) => {
|
|
880
|
+
if (!ours(transaction.origin)) held2 = _chunkE75EHRPAcjs.holdSelection.call(void 0, text2, shared.layout, editor.state.selection);
|
|
881
|
+
};
|
|
882
|
+
const observer = (events, transaction) => {
|
|
883
|
+
if (ours(transaction.origin)) return;
|
|
884
|
+
const { steps, structural } = readRemote(shared, events, editor.state.doc);
|
|
885
|
+
if (steps.length === 0) return;
|
|
886
|
+
if (transaction.origin !== history.manager)
|
|
887
|
+
return applyRemote(editor, steps, structural ? _chunkE75EHRPAcjs.restoreSelection.call(void 0, text2, shared.layout, held2) : null);
|
|
888
|
+
const tr = ownChange(editor, steps, history.hint());
|
|
889
|
+
written.add(tr);
|
|
890
|
+
editor.dispatch(tr);
|
|
891
|
+
};
|
|
892
|
+
const settle = () => {
|
|
893
|
+
shared.stale = false;
|
|
894
|
+
const read = readShared(text2, required);
|
|
895
|
+
shared.layout = read.layout;
|
|
896
|
+
if (!_chunkPZ4GT5JOcjs.sameDoc.call(void 0, read.doc, editor.state.doc)) applyRemote(editor, [_chunkPZ4GT5JOcjs.replaceDocStep.call(void 0, read.doc)]);
|
|
897
|
+
};
|
|
898
|
+
doc.on("beforeTransaction", hold);
|
|
899
|
+
text2.observeDeep(observer);
|
|
900
|
+
return {
|
|
901
|
+
editor,
|
|
902
|
+
history,
|
|
903
|
+
shared,
|
|
904
|
+
local(tr) {
|
|
905
|
+
if (written.has(tr)) return;
|
|
906
|
+
history.record(tr);
|
|
907
|
+
if (!tr.docChanged) return;
|
|
908
|
+
const docs = [...tr.docs, tr.doc];
|
|
909
|
+
const origin = tr.addToHistory ? origins.local : origins.untracked;
|
|
910
|
+
doc.transact(() => writeLocalSteps(shared, tr.steps, docs), origin);
|
|
911
|
+
if (shared.stale) settle();
|
|
912
|
+
},
|
|
913
|
+
travel: (direction) => history.travel(direction, editor),
|
|
914
|
+
stop() {
|
|
915
|
+
doc.off("beforeTransaction", hold);
|
|
916
|
+
text2.unobserveDeep(observer);
|
|
917
|
+
history.destroy();
|
|
918
|
+
}
|
|
919
|
+
};
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
// src/yjs/index.ts
|
|
923
|
+
function yjsCollaboration(options) {
|
|
924
|
+
const { doc, field = "quoin", awareness, user, seed = "if-empty" } = options;
|
|
925
|
+
const onError = _nullishCoalesce(options.onError, () => ( ((error) => console.error(error))));
|
|
926
|
+
const text2 = doc.getText(field);
|
|
927
|
+
const origins = { local: { user }, untracked: {} };
|
|
928
|
+
let binding = null;
|
|
929
|
+
const collaboration = {
|
|
930
|
+
doc,
|
|
931
|
+
text: text2,
|
|
932
|
+
awareness,
|
|
933
|
+
user,
|
|
934
|
+
origin: origins.local,
|
|
935
|
+
connect(editor) {
|
|
936
|
+
if (binding !== null) {
|
|
937
|
+
onError(new Error("A Yjs collaboration connects one editor at a time; this editor stays unconnected."));
|
|
938
|
+
return () => void 0;
|
|
939
|
+
}
|
|
940
|
+
const current = bind(editor, text2, { origins, seed });
|
|
941
|
+
binding = current;
|
|
942
|
+
return () => {
|
|
943
|
+
current.stop();
|
|
944
|
+
if (binding === current) binding = null;
|
|
945
|
+
};
|
|
946
|
+
},
|
|
947
|
+
onLocalTransaction: (tr, state) => {
|
|
948
|
+
if (_optionalChain([binding, 'optionalAccess', _44 => _44.editor, 'access', _45 => _45.state]) === state) binding.local(tr);
|
|
949
|
+
},
|
|
950
|
+
history: {
|
|
951
|
+
undo: () => _nullishCoalesce(_optionalChain([binding, 'optionalAccess', _46 => _46.travel, 'call', _47 => _47("undo")]), () => ( false)),
|
|
952
|
+
redo: () => _nullishCoalesce(_optionalChain([binding, 'optionalAccess', _48 => _48.travel, 'call', _49 => _49("redo")]), () => ( false)),
|
|
953
|
+
canUndo: () => _nullishCoalesce(_optionalChain([binding, 'optionalAccess', _50 => _50.history, 'access', _51 => _51.manager, 'access', _52 => _52.canUndo, 'call', _53 => _53()]), () => ( false)),
|
|
954
|
+
canRedo: () => _nullishCoalesce(_optionalChain([binding, 'optionalAccess', _54 => _54.history, 'access', _55 => _55.manager, 'access', _56 => _56.canRedo, 'call', _57 => _57()]), () => ( false))
|
|
955
|
+
}
|
|
956
|
+
};
|
|
957
|
+
_chunkE75EHRPAcjs.holdBinding.call(void 0, collaboration, () => binding);
|
|
958
|
+
return collaboration;
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
// src/engine/collab/collaboration-link.ts
|
|
962
|
+
var linkKey = _chunkPZ4GT5JOcjs.createPluginKey.call(void 0, "collaborationLink");
|
|
963
|
+
var linkPlugin = {
|
|
964
|
+
key: linkKey,
|
|
965
|
+
init: () => ({ mounts: 0, disconnect: null, warned: false }),
|
|
966
|
+
apply: (_tr, link) => link
|
|
967
|
+
};
|
|
968
|
+
var linkOf = (state) => _chunkPZ4GT5JOcjs.getPluginState.call(void 0, state, linkKey);
|
|
969
|
+
|
|
970
|
+
// src/engine/collab/warn-host-blocks.ts
|
|
971
|
+
function warnHostBlocks() {
|
|
972
|
+
if (typeof process !== "undefined" && _optionalChain([process, 'optionalAccess', _58 => _58.env, 'optionalAccess', _59 => _59.NODE_ENV]) === "production") return;
|
|
973
|
+
console.warn(
|
|
974
|
+
"Quoin: blocks were supplied to a collaborative editor and ignored, since the shared document holds its content. Supply its starting blocks once and keep the ones it emits."
|
|
975
|
+
);
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
// src/engine/collab/collaboration-extension.ts
|
|
979
|
+
var providerKey = _chunkPZ4GT5JOcjs.createPluginKey.call(void 0, _chunkPZ4GT5JOcjs.HISTORY_PROVIDER);
|
|
980
|
+
function providing(history) {
|
|
981
|
+
const provider = {
|
|
982
|
+
undo: (dryRun) => dryRun ? history.canUndo() : history.undo(),
|
|
983
|
+
redo: (dryRun) => dryRun ? history.canRedo() : history.redo()
|
|
984
|
+
};
|
|
985
|
+
return { key: providerKey, init: () => provider, apply: (_tr, value) => value };
|
|
986
|
+
}
|
|
987
|
+
function collaborationExtension(adapter) {
|
|
988
|
+
const { history } = adapter;
|
|
989
|
+
return _chunkPZ4GT5JOcjs.defineExtension.call(void 0, {
|
|
990
|
+
name: "collaboration",
|
|
991
|
+
plugins: history === void 0 ? [linkPlugin] : [linkPlugin, providing(history)],
|
|
992
|
+
onMount(editor) {
|
|
993
|
+
const link = linkOf(editor.state);
|
|
994
|
+
link.mounts += 1;
|
|
995
|
+
if (link.mounts === 1) {
|
|
996
|
+
try {
|
|
997
|
+
link.disconnect = adapter.connect(editor);
|
|
998
|
+
} catch (error) {
|
|
999
|
+
link.mounts = 0;
|
|
1000
|
+
throw error;
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
return () => {
|
|
1004
|
+
link.mounts -= 1;
|
|
1005
|
+
if (link.mounts === 0) _optionalChain([link, 'access', _60 => _60.disconnect, 'optionalCall', _61 => _61()]);
|
|
1006
|
+
};
|
|
1007
|
+
},
|
|
1008
|
+
onTransaction(tr, state) {
|
|
1009
|
+
const local = tr.origin !== "remote" && tr.origin !== "reconcile";
|
|
1010
|
+
if (local && linkOf(state).mounts > 0) adapter.onLocalTransaction(tr, state);
|
|
1011
|
+
},
|
|
1012
|
+
filterHostBlocks(_blocks, state) {
|
|
1013
|
+
const link = linkOf(state);
|
|
1014
|
+
if (link.mounts === 0) return true;
|
|
1015
|
+
if (!link.warned) warnHostBlocks();
|
|
1016
|
+
link.warned = true;
|
|
1017
|
+
return false;
|
|
1018
|
+
}
|
|
1019
|
+
});
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
|
|
1023
|
+
|
|
1024
|
+
|
|
1025
|
+
exports.applyRemote = applyRemote; exports.collaborationExtension = collaborationExtension; exports.yjsCollaboration = yjsCollaboration;
|
|
1026
|
+
//# sourceMappingURL=yjs.cjs.map
|