Files
outline/shared/editor/lib/prosemirror-recreate-transform/getReplaceStep.ts
2023-09-21 05:44:23 -07:00

32 lines
915 B
TypeScript

import { Node } from "prosemirror-model";
import { ReplaceStep } from "prosemirror-transform";
export function getReplaceStep(fromDoc: Node, toDoc: Node) {
let start = toDoc.content.findDiffStart(fromDoc.content);
if (start === null) {
return false;
}
let { a: endA, b: endB } = toDoc.content.findDiffEnd(fromDoc.content) as {
a: number;
b: number;
};
const overlap = start - Math.min(endA, endB);
if (overlap > 0) {
// If there is an overlap, there is some freedom of choice in how to calculate the
// start/end boundary. for an inserted/removed slice. We choose the extreme with
// the lowest depth value.
if (
fromDoc.resolve(start - overlap).depth <
toDoc.resolve(endA + overlap).depth
) {
start -= overlap;
} else {
endA += overlap;
endB += overlap;
}
}
return new ReplaceStep(start, endB, toDoc.slice(start, endA));
}