@kerebron/extension-basic-editor 0.1.1 → 0.1.3
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/esm/editor/src/CoreEditor.d.ts.map +1 -1
- package/esm/editor/src/CoreEditor.js +5 -5
- package/esm/editor/src/nodeToTreeString.d.ts.map +1 -1
- package/esm/editor/src/nodeToTreeString.js +5 -2
- package/esm/editor/src/utilities/createNodeFromContent.d.ts.map +1 -1
- package/esm/editor/src/utilities/createNodeFromContent.js +1 -1
- package/esm/extension-basic-editor/src/ExtensionHtml.d.ts.map +1 -1
- package/esm/extension-basic-editor/src/ExtensionHtml.js +3 -2
- package/esm/extension-basic-editor/src/MarkChange.d.ts.map +1 -1
- package/esm/extension-basic-editor/src/NodeImage.d.ts +1 -19
- package/esm/extension-basic-editor/src/NodeImage.d.ts.map +1 -1
- package/esm/extension-basic-editor/src/NodeImage.js +0 -22
- package/package.json +1 -4
- package/esm/extension-automerge/src/CursorPlugin.d.ts +0 -16
- package/esm/extension-automerge/src/CursorPlugin.d.ts.map +0 -1
- package/esm/extension-automerge/src/CursorPlugin.js +0 -114
- package/esm/extension-automerge/src/ExtensionAutomerge.d.ts +0 -26
- package/esm/extension-automerge/src/ExtensionAutomerge.d.ts.map +0 -1
- package/esm/extension-automerge/src/ExtensionAutomerge.js +0 -136
- package/esm/extension-automerge/src/MarkUnknown.d.ts +0 -8
- package/esm/extension-automerge/src/MarkUnknown.d.ts.map +0 -1
- package/esm/extension-automerge/src/MarkUnknown.js +0 -26
- package/esm/extension-automerge/src/NodeUnknown.d.ts +0 -8
- package/esm/extension-automerge/src/NodeUnknown.d.ts.map +0 -1
- package/esm/extension-automerge/src/NodeUnknown.js +0 -28
- package/esm/extension-automerge/src/NodeUnknownBlock.d.ts +0 -11
- package/esm/extension-automerge/src/NodeUnknownBlock.d.ts.map +0 -1
- package/esm/extension-automerge/src/NodeUnknownBlock.js +0 -36
- package/esm/extension-automerge/src/SchemaAdapter.d.ts +0 -70
- package/esm/extension-automerge/src/SchemaAdapter.d.ts.map +0 -1
- package/esm/extension-automerge/src/SchemaAdapter.js +0 -188
- package/esm/extension-automerge/src/SyncPlugin.d.ts +0 -16
- package/esm/extension-automerge/src/SyncPlugin.d.ts.map +0 -1
- package/esm/extension-automerge/src/SyncPlugin.js +0 -147
- package/esm/extension-automerge/src/amToPm.d.ts +0 -9
- package/esm/extension-automerge/src/amToPm.d.ts.map +0 -1
- package/esm/extension-automerge/src/amToPm.js +0 -245
- package/esm/extension-automerge/src/amTraversal.d.ts +0 -62
- package/esm/extension-automerge/src/amTraversal.d.ts.map +0 -1
- package/esm/extension-automerge/src/amTraversal.js +0 -688
- package/esm/extension-automerge/src/loader.d.ts +0 -8
- package/esm/extension-automerge/src/loader.d.ts.map +0 -1
- package/esm/extension-automerge/src/loader.js +0 -54
- package/esm/extension-automerge/src/maintainSpans.d.ts +0 -9
- package/esm/extension-automerge/src/maintainSpans.d.ts.map +0 -1
- package/esm/extension-automerge/src/maintainSpans.js +0 -464
- package/esm/extension-automerge/src/pmToAm.d.ts +0 -6
- package/esm/extension-automerge/src/pmToAm.d.ts.map +0 -1
- package/esm/extension-automerge/src/pmToAm.js +0 -183
- package/esm/extension-automerge/src/pmTraversal.d.ts +0 -26
- package/esm/extension-automerge/src/pmTraversal.d.ts.map +0 -1
- package/esm/extension-automerge/src/pmTraversal.js +0 -102
- package/esm/extension-automerge/src/types.d.ts +0 -42
- package/esm/extension-automerge/src/types.d.ts.map +0 -1
- package/esm/extension-automerge/src/types.js +0 -94
- package/esm/extension-automerge/src/utils.d.ts +0 -3
- package/esm/extension-automerge/src/utils.d.ts.map +0 -1
- package/esm/extension-automerge/src/utils.js +0 -18
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import { next as automerge } from '@automerge/automerge/slim';
|
|
2
|
-
import { pmNodeToSpans, pmRangeToAmRange } from './pmTraversal.js';
|
|
3
|
-
import { amMarksFromPmMarks } from './SchemaAdapter.js';
|
|
4
|
-
export function pmToAm(adapter, spans, steps,
|
|
5
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
|
-
doc, pmDoc, path) {
|
|
7
|
-
let unappliedMarks = [];
|
|
8
|
-
function flushMarks() {
|
|
9
|
-
if (unappliedMarks.length > 0) {
|
|
10
|
-
applyAddMarkSteps(adapter, spans, unappliedMarks, doc, path);
|
|
11
|
-
unappliedMarks = [];
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
for (const step of steps) {
|
|
15
|
-
const stepId = step.toJSON()['stepType'];
|
|
16
|
-
if (stepId === 'addMark') {
|
|
17
|
-
unappliedMarks.push(step);
|
|
18
|
-
continue;
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
flushMarks();
|
|
22
|
-
}
|
|
23
|
-
oneStep(adapter, spans, stepId, step, doc, pmDoc, path);
|
|
24
|
-
const nextDoc = step.apply(pmDoc).doc;
|
|
25
|
-
if (nextDoc == null) {
|
|
26
|
-
throw new Error('Could not apply step to document');
|
|
27
|
-
}
|
|
28
|
-
pmDoc = nextDoc;
|
|
29
|
-
spans = automerge.spans(doc, path);
|
|
30
|
-
}
|
|
31
|
-
flushMarks();
|
|
32
|
-
}
|
|
33
|
-
function oneStep(adapter, spans, stepId, step,
|
|
34
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
35
|
-
doc, pmDoc, path) {
|
|
36
|
-
if (stepId === 'replace') {
|
|
37
|
-
replaceStep(adapter, spans, step, doc, path, pmDoc);
|
|
38
|
-
}
|
|
39
|
-
else if (stepId === 'replaceAround') {
|
|
40
|
-
replaceAroundStep(adapter, step, doc, pmDoc, path);
|
|
41
|
-
}
|
|
42
|
-
else if (stepId === 'removeMark') {
|
|
43
|
-
removeMarkStep(adapter, spans, step, doc, path);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
|
-
function replaceStep(adapter, spans, step, doc, field, pmDoc) {
|
|
48
|
-
if (step.slice.content.childCount === 1 &&
|
|
49
|
-
step.slice.content.firstChild?.isText) {
|
|
50
|
-
// This is a text insertion or deletion
|
|
51
|
-
const amRange = pmRangeToAmRange(adapter, spans, {
|
|
52
|
-
from: step.from,
|
|
53
|
-
to: step.to,
|
|
54
|
-
});
|
|
55
|
-
if (amRange == null) {
|
|
56
|
-
throw new Error(`Could not find range (${step.from}, ${step.to}) in render tree`);
|
|
57
|
-
}
|
|
58
|
-
let { start, end } = amRange;
|
|
59
|
-
if (start > end) {
|
|
60
|
-
// eslint-disable-next-line @typescript-eslint/no-extra-semi
|
|
61
|
-
[start, end] = [end, start];
|
|
62
|
-
}
|
|
63
|
-
const toDelete = end - start;
|
|
64
|
-
automerge.splice(doc, field, start, toDelete, step.slice.content.firstChild.text);
|
|
65
|
-
const marks = step.slice.content.firstChild.marks;
|
|
66
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
67
|
-
const length = step.slice.content.firstChild.text.length;
|
|
68
|
-
reconcileMarks(adapter, doc, field, start, length, marks);
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
const applied = step.apply(pmDoc).doc;
|
|
72
|
-
if (applied == null) {
|
|
73
|
-
throw new Error('Could not apply step to document');
|
|
74
|
-
}
|
|
75
|
-
const newSpans = pmNodeToSpans(adapter, applied);
|
|
76
|
-
automerge.updateSpans(doc, field, newSpans);
|
|
77
|
-
}
|
|
78
|
-
function replaceAroundStep(adapter, step,
|
|
79
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
80
|
-
doc, pmDoc, field) {
|
|
81
|
-
const applied = step.apply(pmDoc).doc;
|
|
82
|
-
if (applied == null) {
|
|
83
|
-
throw new Error('Could not apply step to document');
|
|
84
|
-
}
|
|
85
|
-
const newSpans = pmNodeToSpans(adapter, applied);
|
|
86
|
-
automerge.updateSpans(doc, field, newSpans);
|
|
87
|
-
}
|
|
88
|
-
function applyAddMarkSteps(adapter, spans, steps, doc, field) {
|
|
89
|
-
const marks = steps.map((step) => {
|
|
90
|
-
const amRange = pmRangeToAmRange(adapter, spans, {
|
|
91
|
-
from: step.from,
|
|
92
|
-
to: step.to,
|
|
93
|
-
});
|
|
94
|
-
if (amRange == null) {
|
|
95
|
-
throw new Error(`Could not find range (${step.from}, ${step.to}) in render tree`);
|
|
96
|
-
}
|
|
97
|
-
const markName = step.mark.type.name;
|
|
98
|
-
const expand = step.mark.type.spec.inclusive ? 'both' : 'none';
|
|
99
|
-
const value = markAttrsToMarkValue(step.mark.type, step.mark.attrs);
|
|
100
|
-
return { range: amRange, markName, expand, value };
|
|
101
|
-
});
|
|
102
|
-
const groupedMarks = marks.reduce((acc, mark) => {
|
|
103
|
-
const lastGroup = acc[acc.length - 1];
|
|
104
|
-
if (lastGroup == null) {
|
|
105
|
-
return [mark];
|
|
106
|
-
}
|
|
107
|
-
if (lastGroup.markName === mark.markName &&
|
|
108
|
-
lastGroup.expand === mark.expand &&
|
|
109
|
-
lastGroup.value === mark.value) {
|
|
110
|
-
if (lastGroup.range.end === mark.range.start) {
|
|
111
|
-
lastGroup.range.end = mark.range.end;
|
|
112
|
-
return acc;
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
const spansBetween = spans.slice(lastGroup.range.end, mark.range.start);
|
|
116
|
-
if (spansBetween.every((s) => s.type === 'block')) {
|
|
117
|
-
lastGroup.range.end = mark.range.end;
|
|
118
|
-
return acc;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
acc.push(mark);
|
|
123
|
-
return acc;
|
|
124
|
-
}, []);
|
|
125
|
-
for (const mark of groupedMarks) {
|
|
126
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
127
|
-
automerge.mark(
|
|
128
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
129
|
-
doc, field, { start: mark.range.start, end: mark.range.end, expand: mark.expand }, mark.markName, mark.value);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
function removeMarkStep(adapter, spans, step, doc, field) {
|
|
133
|
-
const amRange = pmRangeToAmRange(adapter, spans, {
|
|
134
|
-
from: step.from,
|
|
135
|
-
to: step.to,
|
|
136
|
-
});
|
|
137
|
-
if (amRange == null) {
|
|
138
|
-
throw new Error(`Could not find range (${step.from}, ${step.to}) in render tree`);
|
|
139
|
-
}
|
|
140
|
-
const { start, end } = amRange;
|
|
141
|
-
if (start == null || end == null) {
|
|
142
|
-
throw new Error(`Could not find step.from (${step.from}) or step.to (${step.to}) in render tree`);
|
|
143
|
-
}
|
|
144
|
-
const markName = step.mark.type.name;
|
|
145
|
-
const expand = step.mark.type.spec.inclusive ? 'both' : 'none';
|
|
146
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
147
|
-
automerge.unmark(doc, field, { start, end, expand }, markName);
|
|
148
|
-
}
|
|
149
|
-
function reconcileMarks(adapter, doc, path, index, length, marks) {
|
|
150
|
-
const currentMarks = automerge.marksAt(doc, path, index);
|
|
151
|
-
const newMarks = amMarksFromPmMarks(adapter, marks);
|
|
152
|
-
const newMarkNames = new Set(Object.keys(newMarks));
|
|
153
|
-
const currentMarkNames = new Set(Object.keys(currentMarks));
|
|
154
|
-
for (const markName of newMarkNames) {
|
|
155
|
-
if (!currentMarkNames.has(markName) ||
|
|
156
|
-
newMarks[markName] !== currentMarks[markName]) {
|
|
157
|
-
automerge.mark(doc, path, { start: index, end: index + length, expand: 'both' }, markName, newMarks[markName]);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
for (const markName of currentMarkNames) {
|
|
161
|
-
const markMapping = adapter.markMappings.find((m) => m.automergeMarkName === markName);
|
|
162
|
-
if (markMapping == null) {
|
|
163
|
-
continue;
|
|
164
|
-
}
|
|
165
|
-
if (!newMarkNames.has(markName)) {
|
|
166
|
-
automerge.unmark(doc, path, { start: index, end: index + length, expand: 'both' }, markName);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
function markAttrsToMarkValue(markType, attrs) {
|
|
171
|
-
if (markType.name === 'link') {
|
|
172
|
-
return JSON.stringify(attrs);
|
|
173
|
-
}
|
|
174
|
-
else if (markType.name === 'strong' ||
|
|
175
|
-
markType.name === 'em' ||
|
|
176
|
-
markType.name === 'code') {
|
|
177
|
-
return true;
|
|
178
|
-
}
|
|
179
|
-
else {
|
|
180
|
-
// Maybe we should just throw here?
|
|
181
|
-
return true;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { next as automerge } from '@automerge/automerge/slim';
|
|
2
|
-
import { Node } from 'prosemirror-model';
|
|
3
|
-
import { SchemaAdapter } from './SchemaAdapter.js';
|
|
4
|
-
export declare function pmNodeToSpans(adapter: SchemaAdapter, node: Node): ({
|
|
5
|
-
type: 'block';
|
|
6
|
-
value: {
|
|
7
|
-
type: automerge.RawString;
|
|
8
|
-
parents: automerge.RawString[];
|
|
9
|
-
attrs: {
|
|
10
|
-
[key: string]: automerge.MaterializeValue;
|
|
11
|
-
};
|
|
12
|
-
isEmbed: boolean;
|
|
13
|
-
};
|
|
14
|
-
} | {
|
|
15
|
-
type: 'text';
|
|
16
|
-
value: string;
|
|
17
|
-
marks?: automerge.MarkSet;
|
|
18
|
-
})[];
|
|
19
|
-
export declare function pmRangeToAmRange(adapter: SchemaAdapter, spans: automerge.Span[], { from, to }: {
|
|
20
|
-
from: number;
|
|
21
|
-
to: number;
|
|
22
|
-
}): {
|
|
23
|
-
start: number;
|
|
24
|
-
end: number;
|
|
25
|
-
} | null;
|
|
26
|
-
//# sourceMappingURL=pmTraversal.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pmTraversal.d.ts","sourceRoot":"","sources":["../../../src/extension-automerge/src/pmTraversal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAGL,IAAI,EAGL,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,IAAI,GACT,CACC;IACA,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE;QACL,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC;QAC1B,OAAO,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;QAC/B,KAAK,EAAE;YAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAA;SAAE,CAAC;QACrD,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH,GACC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAC,OAAO,CAAA;CAAE,CAC7D,EAAE,CAgCF;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,EACvB,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA4EvC"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import { next as automerge } from '@automerge/automerge/slim';
|
|
2
|
-
import { eventsWithIndexChanges, traverseNode, traverseSpans, } from './amTraversal.js';
|
|
3
|
-
export function pmNodeToSpans(adapter, node) {
|
|
4
|
-
const events = traverseNode(adapter, node);
|
|
5
|
-
const result = [];
|
|
6
|
-
for (const event of events) {
|
|
7
|
-
if (event.type == 'block') {
|
|
8
|
-
const attrs = { ...event.block.attrs };
|
|
9
|
-
delete attrs.isAmgBlock;
|
|
10
|
-
result.push({
|
|
11
|
-
type: 'block',
|
|
12
|
-
value: {
|
|
13
|
-
type: new automerge.RawString(event.block.type),
|
|
14
|
-
parents: event.block.parents.map((p) => new automerge.RawString(p)),
|
|
15
|
-
attrs,
|
|
16
|
-
isEmbed: event.block.isEmbed,
|
|
17
|
-
},
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
else if (event.type == 'text') {
|
|
21
|
-
result.push({ type: 'text', value: event.text, marks: event.marks });
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return result;
|
|
25
|
-
}
|
|
26
|
-
export function pmRangeToAmRange(adapter, spans, { from, to }) {
|
|
27
|
-
const events = eventsWithIndexChanges(traverseSpans(adapter, spans));
|
|
28
|
-
let amStart = null;
|
|
29
|
-
let amEnd = null;
|
|
30
|
-
let maxPmIdxSeen = null;
|
|
31
|
-
let maxAmIdxSeen = null;
|
|
32
|
-
if (from === 0) {
|
|
33
|
-
amStart = 0;
|
|
34
|
-
}
|
|
35
|
-
while (maxPmIdxSeen == null ||
|
|
36
|
-
maxPmIdxSeen <= to ||
|
|
37
|
-
amStart == null ||
|
|
38
|
-
amEnd == null) {
|
|
39
|
-
const next = events.next();
|
|
40
|
-
if (next.done) {
|
|
41
|
-
break;
|
|
42
|
-
}
|
|
43
|
-
const state = next.value;
|
|
44
|
-
maxPmIdxSeen = state.after.pmIdx;
|
|
45
|
-
maxAmIdxSeen = state.after.amIdx;
|
|
46
|
-
if (amStart == null) {
|
|
47
|
-
if (state.after.pmIdx < from) {
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
if (state.event.type === 'text') {
|
|
51
|
-
if (state.before.pmIdx > from) {
|
|
52
|
-
// We already passed the start but this is the first automerge event
|
|
53
|
-
// we've seen
|
|
54
|
-
amStart = Math.max(state.before.amIdx, 0) + 1;
|
|
55
|
-
}
|
|
56
|
-
else if (state.before.pmIdx + state.event.text.length > from) {
|
|
57
|
-
// The target `from` is in the middle of this text
|
|
58
|
-
const diff = from - state.before.pmIdx;
|
|
59
|
-
//amStart = Math.max(state.before.amIdx, 0) + diff + 1
|
|
60
|
-
amStart = state.before.amIdx + diff + 1;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
amStart = Math.max(state.after.amIdx, 0) + 1;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
else if (state.after.pmIdx >= from) {
|
|
67
|
-
// we are only interested in blocks which start _after_ the from index
|
|
68
|
-
amStart = state.after.amIdx + 1;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
if (amEnd == null) {
|
|
72
|
-
if (state.after.pmIdx < to) {
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
if (state.event.type === 'text') {
|
|
76
|
-
if (state.before.pmIdx >= to) {
|
|
77
|
-
amEnd = state.before.amIdx + 1;
|
|
78
|
-
}
|
|
79
|
-
else if (state.before.pmIdx + state.event.text.length > to) {
|
|
80
|
-
const diff = to - state.before.pmIdx;
|
|
81
|
-
//amEnd = Math.max(state.before.amIdx, 0) + diff + 1
|
|
82
|
-
amEnd = state.before.amIdx + diff + 1;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
if (state.before.pmIdx >= to) {
|
|
87
|
-
amEnd = state.before.amIdx + 1;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
if (amStart != null) {
|
|
93
|
-
if (amEnd == null) {
|
|
94
|
-
amEnd = maxAmIdxSeen ? maxAmIdxSeen + 1 : amStart;
|
|
95
|
-
}
|
|
96
|
-
return { start: amStart, end: amEnd };
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
const endOfDoc = maxAmIdxSeen ? maxAmIdxSeen + 1 : 0;
|
|
100
|
-
return { start: endOfDoc, end: endOfDoc };
|
|
101
|
-
}
|
|
102
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { next as automerge } from '@automerge/automerge/slim';
|
|
2
|
-
export type ChangeFn<T> = (doc: T, field: string) => void;
|
|
3
|
-
export type DocHandle<T> = {
|
|
4
|
-
docSync(): T | undefined;
|
|
5
|
-
change: (fn: (doc: T) => void) => void;
|
|
6
|
-
on(event: 'change', callback: (p: DocHandleChangePayload<T>) => void): void;
|
|
7
|
-
off(event: 'change', callback: (p: DocHandleChangePayload<T>) => void): void;
|
|
8
|
-
};
|
|
9
|
-
export interface DocHandleChangePayload<T> {
|
|
10
|
-
/** The handle that changed */
|
|
11
|
-
handle: DocHandle<T>;
|
|
12
|
-
/** The value of the document after the change */
|
|
13
|
-
doc: automerge.Doc<T>;
|
|
14
|
-
/** The patches representing the change that occurred */
|
|
15
|
-
patches: automerge.Patch[];
|
|
16
|
-
/** Information about the change */
|
|
17
|
-
patchInfo: automerge.PatchInfo<T>;
|
|
18
|
-
}
|
|
19
|
-
export type BlockType = string;
|
|
20
|
-
export declare function isBlockMarker(obj: unknown): obj is BlockMarker;
|
|
21
|
-
export declare function validBlockType(type: unknown): type is BlockType;
|
|
22
|
-
export type BlockMarker = {
|
|
23
|
-
type: automerge.RawString;
|
|
24
|
-
parents: automerge.RawString[];
|
|
25
|
-
attrs: {
|
|
26
|
-
[key: string]: automerge.MaterializeValue;
|
|
27
|
-
};
|
|
28
|
-
isEmbed?: boolean;
|
|
29
|
-
};
|
|
30
|
-
export declare function blockSpanToBlockMarker(span: {
|
|
31
|
-
[key: string]: automerge.MaterializeValue;
|
|
32
|
-
}): BlockMarker;
|
|
33
|
-
export type Span = {
|
|
34
|
-
type: 'text';
|
|
35
|
-
value: string;
|
|
36
|
-
marks?: automerge.MarkSet;
|
|
37
|
-
} | {
|
|
38
|
-
type: 'block';
|
|
39
|
-
value: BlockMarker;
|
|
40
|
-
};
|
|
41
|
-
export declare function amSpanToSpan(span: automerge.Span): Span;
|
|
42
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/extension-automerge/src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAS1D,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACzB,OAAO,IAAI,CAAC,GAAG,SAAS,CAAC;IACzB,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC;IACvC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5E,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC;CAC9E,CAAC;AAEF,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC,8BAA8B;IAC9B,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACrB,iDAAiD;IACjD,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtB,wDAAwD;IACxD,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC;IAC3B,mCAAmC;IACnC,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;CACnC;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,WAAW,CAsB9D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,SAAS,CAc/D;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC;IAC1B,OAAO,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;IAC/B,KAAK,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAA;KAAE,CAAC;IACrD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC;CAC3C,GAAG,WAAW,CAsCd;AAcD,MAAM,MAAM,IAAI,GACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAC,OAAO,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;AAE1C,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,GAAG,IAAI,CAMvD"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { next as automerge } from '@automerge/automerge/slim';
|
|
2
|
-
export function isBlockMarker(obj) {
|
|
3
|
-
if (obj == null) {
|
|
4
|
-
return false;
|
|
5
|
-
}
|
|
6
|
-
if (typeof obj !== 'object') {
|
|
7
|
-
return false;
|
|
8
|
-
}
|
|
9
|
-
if (!('type' in obj)) {
|
|
10
|
-
return false;
|
|
11
|
-
}
|
|
12
|
-
if (!('parents' in obj) || !Array.isArray(obj.parents)) {
|
|
13
|
-
return false;
|
|
14
|
-
}
|
|
15
|
-
if (!validBlockType(obj.type)) {
|
|
16
|
-
return false;
|
|
17
|
-
}
|
|
18
|
-
for (const parent of obj.parents) {
|
|
19
|
-
if (!validBlockType(parent)) {
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return true;
|
|
24
|
-
}
|
|
25
|
-
export function validBlockType(type) {
|
|
26
|
-
if (!(type instanceof automerge.RawString)) {
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
return [
|
|
30
|
-
'list_item',
|
|
31
|
-
'ordered_list',
|
|
32
|
-
'bullet_list',
|
|
33
|
-
'paragraph',
|
|
34
|
-
'heading',
|
|
35
|
-
'aside',
|
|
36
|
-
'image',
|
|
37
|
-
'blockquote',
|
|
38
|
-
].includes(type.val);
|
|
39
|
-
}
|
|
40
|
-
export function blockSpanToBlockMarker(span) {
|
|
41
|
-
const { type: spanType, parents: spanParents, attrs: spanAttrs, isEmbed: spanIsEmbed, } = span;
|
|
42
|
-
let type;
|
|
43
|
-
if (!(spanType instanceof automerge.RawString)) {
|
|
44
|
-
if ('string' === typeof (spanType?.val)) {
|
|
45
|
-
type = new automerge.RawString(spanType.val);
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
type = new automerge.RawString('paragraph');
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
type = spanType;
|
|
53
|
-
}
|
|
54
|
-
const attrs = {};
|
|
55
|
-
if (spanAttrs && typeof spanAttrs == 'object') {
|
|
56
|
-
for (const [key, value] of Object.entries(spanAttrs)) {
|
|
57
|
-
attrs[key] = value;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
let parents;
|
|
61
|
-
if (!isArrayOfRawString(spanParents)) {
|
|
62
|
-
if (Array.isArray(spanParents)) {
|
|
63
|
-
parents = spanParents.filter((spanType) => 'string' === typeof (spanType?.val))
|
|
64
|
-
.map((spanType) => new automerge.RawString(spanType.val));
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
parents = [];
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
parents = spanParents;
|
|
72
|
-
}
|
|
73
|
-
const isEmbed = !!spanIsEmbed;
|
|
74
|
-
return { type, parents, attrs, isEmbed };
|
|
75
|
-
}
|
|
76
|
-
function isArrayOfRawString(obj) {
|
|
77
|
-
if (!Array.isArray(obj)) {
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
80
|
-
for (const item of obj) {
|
|
81
|
-
if (!(item instanceof automerge.RawString)) {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
export function amSpanToSpan(span) {
|
|
88
|
-
if (span.type === 'text') {
|
|
89
|
-
return { type: 'text', value: span.value, marks: span.marks };
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
return { type: 'block', value: blockSpanToBlockMarker(span.value) };
|
|
93
|
-
}
|
|
94
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/extension-automerge/src/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAMvD;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAM/D"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export function isArrayEqual(a, b) {
|
|
2
|
-
if (a.length !== b.length)
|
|
3
|
-
return false;
|
|
4
|
-
for (let i = 0; i < a.length; i++) {
|
|
5
|
-
if (a[i] !== b[i])
|
|
6
|
-
return false;
|
|
7
|
-
}
|
|
8
|
-
return true;
|
|
9
|
-
}
|
|
10
|
-
export function isPrefixOfArray(prefix, a) {
|
|
11
|
-
if (prefix.length > a.length)
|
|
12
|
-
return false;
|
|
13
|
-
for (let i = 0; i < prefix.length; i++) {
|
|
14
|
-
if (prefix[i] !== a[i])
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
return true;
|
|
18
|
-
}
|