@manuscripts/track-changes-plugin 1.10.0 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/change-steps/processChangeSteps.js +10 -1
- package/dist/cjs/mutate/deleteAndMergeSplitNodes.js +1 -1
- package/dist/cjs/steps/trackTransaction.js +11 -9
- package/dist/es/change-steps/processChangeSteps.js +10 -1
- package/dist/es/mutate/deleteAndMergeSplitNodes.js +1 -1
- package/dist/es/steps/trackTransaction.js +12 -10
- package/dist/types/change-steps/processChangeSteps.d.ts +1 -1
- package/package.json +2 -2
|
@@ -43,7 +43,7 @@ const mergeTrackedMarks_1 = require("../mutate/mergeTrackedMarks");
|
|
|
43
43
|
const change_1 = require("../types/change");
|
|
44
44
|
const logger_1 = require("../utils/logger");
|
|
45
45
|
const trackUtils = __importStar(require("../utils/track-utils"));
|
|
46
|
-
function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
|
|
46
|
+
function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema, deletedNodeMapping) {
|
|
47
47
|
const mapping = new prosemirror_transform_1.Mapping();
|
|
48
48
|
const deleteAttrs = trackUtils.createNewDeleteAttrs(emptyAttrs);
|
|
49
49
|
let selectionPos = startPos;
|
|
@@ -62,6 +62,9 @@ function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
|
|
|
62
62
|
}
|
|
63
63
|
(0, deleteNode_1.deleteOrSetNodeDeleted)(c.node, mapping.map(c.pos), newTr, deleteAttrs);
|
|
64
64
|
const newestStep = newTr.steps[newTr.steps.length - 1];
|
|
65
|
+
if (isInserted) {
|
|
66
|
+
deletedNodeMapping.appendMap(newestStep.getMap());
|
|
67
|
+
}
|
|
65
68
|
if (step !== newestStep) {
|
|
66
69
|
mapping.appendMap(newestStep.getMap());
|
|
67
70
|
step = newestStep;
|
|
@@ -76,6 +79,9 @@ function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
|
|
|
76
79
|
}
|
|
77
80
|
const where = (0, deleteText_1.deleteTextIfInserted)(node, mapping.map(c.pos), newTr, schema, deleteAttrs, mapping.map(c.from), mapping.map(c.to));
|
|
78
81
|
const textNewestStep = newTr.steps[newTr.steps.length - 1];
|
|
82
|
+
if (node.marks.find((m) => m.type === schema.marks.tracked_insert)) {
|
|
83
|
+
deletedNodeMapping.appendMap(textNewestStep.getMap());
|
|
84
|
+
}
|
|
79
85
|
if (step !== textNewestStep) {
|
|
80
86
|
mapping.appendMap(textNewestStep.getMap());
|
|
81
87
|
step = textNewestStep;
|
|
@@ -87,6 +93,9 @@ function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
|
|
|
87
93
|
if (c.node.isText) {
|
|
88
94
|
insertPos = (0, deleteText_1.deleteTextIfInserted)(c.node, mapping.map(c.pos), newTr, schema, deleteAttrs, mapping.map(c.from), mapping.map(c.to));
|
|
89
95
|
const newestStep = newTr.steps[newTr.steps.length - 1];
|
|
96
|
+
if (c.node.marks.find((m) => m.type === schema.marks.tracked_insert)) {
|
|
97
|
+
deletedNodeMapping.appendMap(newestStep.getMap());
|
|
98
|
+
}
|
|
90
99
|
if (step !== newestStep) {
|
|
91
100
|
mapping.appendMap(newestStep.getMap());
|
|
92
101
|
step = newestStep;
|
|
@@ -51,7 +51,7 @@ function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema, trackA
|
|
|
51
51
|
if (!endTokenDeleted && startTokenDeleted) {
|
|
52
52
|
mergingStartSide = false;
|
|
53
53
|
}
|
|
54
|
-
const depth =
|
|
54
|
+
const depth = startDoc.resolve(pos).depth;
|
|
55
55
|
const mergeContent = mergingStartSide
|
|
56
56
|
? firstMergedNode === null || firstMergedNode === void 0 ? void 0 : firstMergedNode.mergedNodeContent
|
|
57
57
|
: lastMergedNode === null || lastMergedNode === void 0 ? void 0 : lastMergedNode.mergedNodeContent;
|
|
@@ -31,6 +31,7 @@ function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
31
31
|
};
|
|
32
32
|
const wasNodeSelection = tr.selection instanceof prosemirror_state_1.NodeSelection;
|
|
33
33
|
const setsNewSelection = tr.selectionSet;
|
|
34
|
+
const deletedNodeMapping = new prosemirror_transform_1.Mapping();
|
|
34
35
|
let iters = 0;
|
|
35
36
|
logger_1.log.info('ORIGINAL transaction', tr);
|
|
36
37
|
let trContext = {};
|
|
@@ -57,9 +58,12 @@ function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
57
58
|
}
|
|
58
59
|
const invertedStep = step.invert(tr.docs[i]);
|
|
59
60
|
const isDelete = step.from !== step.to && step.slice.content.size < invertedStep.slice.content.size;
|
|
60
|
-
|
|
61
|
+
let thisStepMapping = tr.mapping.slice(i + 1, i + 1);
|
|
62
|
+
if (isDelete) {
|
|
63
|
+
thisStepMapping = deletedNodeMapping;
|
|
64
|
+
}
|
|
61
65
|
const newStep = new prosemirror_transform_1.ReplaceStep(thisStepMapping.map(invertedStep.from), thisStepMapping.map(invertedStep.to), invertedStep.slice);
|
|
62
|
-
const stepResult = newTr.maybeStep(
|
|
66
|
+
const stepResult = newTr.maybeStep(newStep);
|
|
63
67
|
let [steps, startPos] = (0, trackReplaceStep_1.trackReplaceStep)(step, oldState, newTr, emptyAttrs, stepResult, tr.docs[i], tr);
|
|
64
68
|
if (steps.length === 1) {
|
|
65
69
|
const step = steps[0];
|
|
@@ -67,16 +71,14 @@ function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
67
71
|
continue;
|
|
68
72
|
}
|
|
69
73
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
steps = (0, mapChangeStep_1.mapChangeSteps)(steps, thisStepMapping);
|
|
73
|
-
}
|
|
74
|
+
startPos = thisStepMapping.map(startPos);
|
|
75
|
+
steps = (0, mapChangeStep_1.mapChangeSteps)(steps, thisStepMapping);
|
|
74
76
|
logger_1.log.info('CHANGES: ', steps);
|
|
75
77
|
const deleted = steps.filter((s) => s.type !== 'insert-slice');
|
|
76
78
|
const inserted = steps.filter((s) => s.type === 'insert-slice');
|
|
77
79
|
steps = (0, diffChangeSteps_1.diffChangeSteps)(deleted, inserted);
|
|
78
80
|
logger_1.log.info('DIFFED STEPS: ', steps);
|
|
79
|
-
const [mapping, selectionPos] = (0, processChangeSteps_1.processChangeSteps)(steps, startPos || tr.selection.head, newTr, emptyAttrs, oldState.schema);
|
|
81
|
+
const [mapping, selectionPos] = (0, processChangeSteps_1.processChangeSteps)(steps, startPos || tr.selection.head, newTr, emptyAttrs, oldState.schema, deletedNodeMapping);
|
|
80
82
|
if (!wasNodeSelection && !setsNewSelection) {
|
|
81
83
|
const sel = getSelectionStaticConstructor(tr.selection);
|
|
82
84
|
const near = sel.near(newTr.doc.resolve(selectionPos), -1);
|
|
@@ -90,11 +92,11 @@ function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
90
92
|
logger_1.log.info('INSERT STEPS: ', inserted);
|
|
91
93
|
steps = (0, diffChangeSteps_1.diffChangeSteps)(deleted, inserted);
|
|
92
94
|
logger_1.log.info('DIFFED STEPS: ', steps);
|
|
93
|
-
const [mapping, selectionPos] = (0, processChangeSteps_1.processChangeSteps)(steps, tr.selection.from, newTr, emptyAttrs, oldState.schema);
|
|
95
|
+
const [mapping, selectionPos] = (0, processChangeSteps_1.processChangeSteps)(steps, tr.selection.from, newTr, emptyAttrs, oldState.schema, deletedNodeMapping);
|
|
94
96
|
}
|
|
95
97
|
else if (step instanceof prosemirror_transform_1.AttrStep) {
|
|
96
98
|
const changeSteps = (0, trackAttrsChange_1.default)(step, oldState, tr, newTr, emptyAttrs, tr.docs[i]);
|
|
97
|
-
const [mapping, selectionPos] = (0, processChangeSteps_1.processChangeSteps)(changeSteps, tr.selection.from, newTr, emptyAttrs, oldState.schema);
|
|
99
|
+
const [mapping, selectionPos] = (0, processChangeSteps_1.processChangeSteps)(changeSteps, tr.selection.from, newTr, emptyAttrs, oldState.schema, deletedNodeMapping);
|
|
98
100
|
}
|
|
99
101
|
else if (step instanceof prosemirror_transform_1.AddMarkStep) {
|
|
100
102
|
const dataTracked = (_e = (0, nodeHelpers_1.getNodeTrackedData)(newTr.doc.nodeAt(step.from), oldState.schema)) === null || _e === void 0 ? void 0 : _e.pop();
|
|
@@ -17,7 +17,7 @@ import { mergeTrackedMarks } from '../mutate/mergeTrackedMarks';
|
|
|
17
17
|
import { CHANGE_OPERATION, CHANGE_STATUS } from '../types/change';
|
|
18
18
|
import { log } from '../utils/logger';
|
|
19
19
|
import * as trackUtils from '../utils/track-utils';
|
|
20
|
-
export function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema) {
|
|
20
|
+
export function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema, deletedNodeMapping) {
|
|
21
21
|
const mapping = new Mapping();
|
|
22
22
|
const deleteAttrs = trackUtils.createNewDeleteAttrs(emptyAttrs);
|
|
23
23
|
let selectionPos = startPos;
|
|
@@ -36,6 +36,9 @@ export function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema)
|
|
|
36
36
|
}
|
|
37
37
|
deleteOrSetNodeDeleted(c.node, mapping.map(c.pos), newTr, deleteAttrs);
|
|
38
38
|
const newestStep = newTr.steps[newTr.steps.length - 1];
|
|
39
|
+
if (isInserted) {
|
|
40
|
+
deletedNodeMapping.appendMap(newestStep.getMap());
|
|
41
|
+
}
|
|
39
42
|
if (step !== newestStep) {
|
|
40
43
|
mapping.appendMap(newestStep.getMap());
|
|
41
44
|
step = newestStep;
|
|
@@ -50,6 +53,9 @@ export function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema)
|
|
|
50
53
|
}
|
|
51
54
|
const where = deleteTextIfInserted(node, mapping.map(c.pos), newTr, schema, deleteAttrs, mapping.map(c.from), mapping.map(c.to));
|
|
52
55
|
const textNewestStep = newTr.steps[newTr.steps.length - 1];
|
|
56
|
+
if (node.marks.find((m) => m.type === schema.marks.tracked_insert)) {
|
|
57
|
+
deletedNodeMapping.appendMap(textNewestStep.getMap());
|
|
58
|
+
}
|
|
53
59
|
if (step !== textNewestStep) {
|
|
54
60
|
mapping.appendMap(textNewestStep.getMap());
|
|
55
61
|
step = textNewestStep;
|
|
@@ -61,6 +67,9 @@ export function processChangeSteps(changes, startPos, newTr, emptyAttrs, schema)
|
|
|
61
67
|
if (c.node.isText) {
|
|
62
68
|
insertPos = deleteTextIfInserted(c.node, mapping.map(c.pos), newTr, schema, deleteAttrs, mapping.map(c.from), mapping.map(c.to));
|
|
63
69
|
const newestStep = newTr.steps[newTr.steps.length - 1];
|
|
70
|
+
if (c.node.marks.find((m) => m.type === schema.marks.tracked_insert)) {
|
|
71
|
+
deletedNodeMapping.appendMap(newestStep.getMap());
|
|
72
|
+
}
|
|
64
73
|
if (step !== newestStep) {
|
|
65
74
|
mapping.appendMap(newestStep.getMap());
|
|
66
75
|
step = newestStep;
|
|
@@ -25,7 +25,7 @@ export function deleteAndMergeSplitNodes(from, to, gap, startDoc, newTr, schema,
|
|
|
25
25
|
if (!endTokenDeleted && startTokenDeleted) {
|
|
26
26
|
mergingStartSide = false;
|
|
27
27
|
}
|
|
28
|
-
const depth =
|
|
28
|
+
const depth = startDoc.resolve(pos).depth;
|
|
29
29
|
const mergeContent = mergingStartSide
|
|
30
30
|
? firstMergedNode === null || firstMergedNode === void 0 ? void 0 : firstMergedNode.mergedNodeContent
|
|
31
31
|
: lastMergedNode === null || lastMergedNode === void 0 ? void 0 : lastMergedNode.mergedNodeContent;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NodeSelection as NodeSelectionClass, TextSelection, } from 'prosemirror-state';
|
|
2
|
-
import { AddMarkStep, AttrStep, ReplaceAroundStep, ReplaceStep, } from 'prosemirror-transform';
|
|
2
|
+
import { AddMarkStep, AttrStep, Mapping, ReplaceAroundStep, ReplaceStep, } from 'prosemirror-transform';
|
|
3
3
|
import { diffChangeSteps } from '../change-steps/diffChangeSteps';
|
|
4
4
|
import { processChangeSteps } from '../change-steps/processChangeSteps';
|
|
5
5
|
import { updateChangeAttrs } from '../changes/updateChangeAttrs';
|
|
@@ -25,6 +25,7 @@ export function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
25
25
|
};
|
|
26
26
|
const wasNodeSelection = tr.selection instanceof NodeSelectionClass;
|
|
27
27
|
const setsNewSelection = tr.selectionSet;
|
|
28
|
+
const deletedNodeMapping = new Mapping();
|
|
28
29
|
let iters = 0;
|
|
29
30
|
log.info('ORIGINAL transaction', tr);
|
|
30
31
|
let trContext = {};
|
|
@@ -51,9 +52,12 @@ export function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
51
52
|
}
|
|
52
53
|
const invertedStep = step.invert(tr.docs[i]);
|
|
53
54
|
const isDelete = step.from !== step.to && step.slice.content.size < invertedStep.slice.content.size;
|
|
54
|
-
|
|
55
|
+
let thisStepMapping = tr.mapping.slice(i + 1, i + 1);
|
|
56
|
+
if (isDelete) {
|
|
57
|
+
thisStepMapping = deletedNodeMapping;
|
|
58
|
+
}
|
|
55
59
|
const newStep = new ReplaceStep(thisStepMapping.map(invertedStep.from), thisStepMapping.map(invertedStep.to), invertedStep.slice);
|
|
56
|
-
const stepResult = newTr.maybeStep(
|
|
60
|
+
const stepResult = newTr.maybeStep(newStep);
|
|
57
61
|
let [steps, startPos] = trackReplaceStep(step, oldState, newTr, emptyAttrs, stepResult, tr.docs[i], tr);
|
|
58
62
|
if (steps.length === 1) {
|
|
59
63
|
const step = steps[0];
|
|
@@ -61,16 +65,14 @@ export function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
61
65
|
continue;
|
|
62
66
|
}
|
|
63
67
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
steps = mapChangeSteps(steps, thisStepMapping);
|
|
67
|
-
}
|
|
68
|
+
startPos = thisStepMapping.map(startPos);
|
|
69
|
+
steps = mapChangeSteps(steps, thisStepMapping);
|
|
68
70
|
log.info('CHANGES: ', steps);
|
|
69
71
|
const deleted = steps.filter((s) => s.type !== 'insert-slice');
|
|
70
72
|
const inserted = steps.filter((s) => s.type === 'insert-slice');
|
|
71
73
|
steps = diffChangeSteps(deleted, inserted);
|
|
72
74
|
log.info('DIFFED STEPS: ', steps);
|
|
73
|
-
const [mapping, selectionPos] = processChangeSteps(steps, startPos || tr.selection.head, newTr, emptyAttrs, oldState.schema);
|
|
75
|
+
const [mapping, selectionPos] = processChangeSteps(steps, startPos || tr.selection.head, newTr, emptyAttrs, oldState.schema, deletedNodeMapping);
|
|
74
76
|
if (!wasNodeSelection && !setsNewSelection) {
|
|
75
77
|
const sel = getSelectionStaticConstructor(tr.selection);
|
|
76
78
|
const near = sel.near(newTr.doc.resolve(selectionPos), -1);
|
|
@@ -84,11 +86,11 @@ export function trackTransaction(tr, oldState, newTr, authorID) {
|
|
|
84
86
|
log.info('INSERT STEPS: ', inserted);
|
|
85
87
|
steps = diffChangeSteps(deleted, inserted);
|
|
86
88
|
log.info('DIFFED STEPS: ', steps);
|
|
87
|
-
const [mapping, selectionPos] = processChangeSteps(steps, tr.selection.from, newTr, emptyAttrs, oldState.schema);
|
|
89
|
+
const [mapping, selectionPos] = processChangeSteps(steps, tr.selection.from, newTr, emptyAttrs, oldState.schema, deletedNodeMapping);
|
|
88
90
|
}
|
|
89
91
|
else if (step instanceof AttrStep) {
|
|
90
92
|
const changeSteps = trackAttrsChange(step, oldState, tr, newTr, emptyAttrs, tr.docs[i]);
|
|
91
|
-
const [mapping, selectionPos] = processChangeSteps(changeSteps, tr.selection.from, newTr, emptyAttrs, oldState.schema);
|
|
93
|
+
const [mapping, selectionPos] = processChangeSteps(changeSteps, tr.selection.from, newTr, emptyAttrs, oldState.schema, deletedNodeMapping);
|
|
92
94
|
}
|
|
93
95
|
else if (step instanceof AddMarkStep) {
|
|
94
96
|
const dataTracked = (_e = getNodeTrackedData(newTr.doc.nodeAt(step.from), oldState.schema)) === null || _e === void 0 ? void 0 : _e.pop();
|
|
@@ -3,4 +3,4 @@ import type { Transaction } from 'prosemirror-state';
|
|
|
3
3
|
import { Mapping } from 'prosemirror-transform';
|
|
4
4
|
import { ChangeStep } from '../types/step';
|
|
5
5
|
import { NewEmptyAttrs } from '../types/track';
|
|
6
|
-
export declare function processChangeSteps(changes: ChangeStep[], startPos: number, newTr: Transaction, emptyAttrs: NewEmptyAttrs, schema: Schema): [Mapping, number];
|
|
6
|
+
export declare function processChangeSteps(changes: ChangeStep[], startPos: number, newTr: Transaction, emptyAttrs: NewEmptyAttrs, schema: Schema, deletedNodeMapping: Mapping): [Mapping, number];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manuscripts/track-changes-plugin",
|
|
3
|
-
"version": "1.10.
|
|
3
|
+
"version": "1.10.1",
|
|
4
4
|
"author": "Atypon Systems LLC",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/Atypon-OpenSource/manuscripts-track-changes-plugin",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@manuscripts/eslint-config": "^0.5.1",
|
|
29
|
-
"@manuscripts/transform": "
|
|
29
|
+
"@manuscripts/transform": "3.0.45",
|
|
30
30
|
"@types/debug": "^4.1.7",
|
|
31
31
|
"@types/jest": "27.5.1",
|
|
32
32
|
"@types/node": "^18.7.18",
|