prosemirror-changeset
Advanced tools
+118
| import { Node } from 'prosemirror-model'; | ||
| import { StepMap } from 'prosemirror-transform'; | ||
| /** | ||
| Stores metadata for a part of a change. | ||
| */ | ||
| declare class Span<Data = any> { | ||
| /** | ||
| The length of this span. | ||
| */ | ||
| readonly length: number; | ||
| /** | ||
| The data associated with this span. | ||
| */ | ||
| readonly data: Data; | ||
| } | ||
| /** | ||
| A replaced range with metadata associated with it. | ||
| */ | ||
| declare class Change<Data = any> { | ||
| /** | ||
| The start of the range deleted/replaced in the old document. | ||
| */ | ||
| readonly fromA: number; | ||
| /** | ||
| The end of the range in the old document. | ||
| */ | ||
| readonly toA: number; | ||
| /** | ||
| The start of the range inserted in the new document. | ||
| */ | ||
| readonly fromB: number; | ||
| /** | ||
| The end of the range in the new document. | ||
| */ | ||
| readonly toB: number; | ||
| /** | ||
| Data associated with the deleted content. The length of these | ||
| spans adds up to `this.toA - this.fromA`. | ||
| */ | ||
| readonly deleted: readonly Span<Data>[]; | ||
| /** | ||
| Data associated with the inserted content. Length adds up to | ||
| `this.toB - this.toA`. | ||
| */ | ||
| readonly inserted: readonly Span<Data>[]; | ||
| /** | ||
| This merges two changesets (the end document of x should be the | ||
| start document of y) into a single one spanning the start of x to | ||
| the end of y. | ||
| */ | ||
| static merge<Data>(x: readonly Change<Data>[], y: readonly Change<Data>[], combine: (dataA: Data, dataB: Data) => Data): readonly Change<Data>[]; | ||
| } | ||
| /** | ||
| Simplifies a set of changes for presentation. This makes the | ||
| assumption that having both insertions and deletions within a word | ||
| is confusing, and, when such changes occur without a word boundary | ||
| between them, they should be expanded to cover the entire set of | ||
| words (in the new document) they touch. An exception is made for | ||
| single-character replacements. | ||
| */ | ||
| declare function simplifyChanges(changes: readonly Change[], doc: Node): Change<any>[]; | ||
| /** | ||
| A change set tracks the changes to a document from a given point | ||
| in the past. It condenses a number of step maps down to a flat | ||
| sequence of replacements, and simplifies replacments that | ||
| partially undo themselves by comparing their content. | ||
| */ | ||
| declare class ChangeSet<Data = any> { | ||
| /** | ||
| Replaced regions. | ||
| */ | ||
| readonly changes: readonly Change<Data>[]; | ||
| /** | ||
| Computes a new changeset by adding the given step maps and | ||
| metadata (either as an array, per-map, or as a single value to be | ||
| associated with all maps) to the current set. Will not mutate the | ||
| old set. | ||
| Note that due to simplification that happens after each add, | ||
| incrementally adding steps might create a different final set | ||
| than adding all those changes at once, since different document | ||
| tokens might be matched during simplification depending on the | ||
| boundaries of the current changed ranges. | ||
| */ | ||
| addSteps(newDoc: Node, maps: readonly StepMap[], data: Data | readonly Data[]): ChangeSet<Data>; | ||
| /** | ||
| The starting document of the change set. | ||
| */ | ||
| get startDoc(): Node; | ||
| /** | ||
| Map the span's data values in the given set through a function | ||
| and construct a new set with the resulting data. | ||
| */ | ||
| map(f: (range: Span<Data>) => Data): ChangeSet<Data>; | ||
| /** | ||
| Compare two changesets and return the range in which they are | ||
| changed, if any. If the document changed between the maps, pass | ||
| the maps for the steps that changed it as second argument, and | ||
| make sure the method is called on the old set and passed the new | ||
| set. The returned positions will be in new document coordinates. | ||
| */ | ||
| changedRange(b: ChangeSet, maps?: readonly StepMap[]): { | ||
| from: number; | ||
| to: number; | ||
| } | null; | ||
| /** | ||
| Create a changeset with the given base object and configuration. | ||
| The `combine` function is used to compare and combine metadata—it | ||
| should return null when metadata isn't compatible, and a combined | ||
| version for a merged range when it is. | ||
| */ | ||
| static create<Data = any>(doc: Node, combine?: (dataA: Data, dataB: Data) => Data): ChangeSet<Data>; | ||
| } | ||
| export { Change, ChangeSet, Span, simplifyChanges }; |
+6
-0
@@ -0,1 +1,7 @@ | ||
| ## 2.2.1 (2023-05-17) | ||
| ### Bug fixes | ||
| Include CommonJS type declarations in the package to please new TypeScript resolution settings. | ||
| ## 2.2.0 (2022-05-30) | ||
@@ -2,0 +8,0 @@ |
+1
-1
@@ -1,2 +0,2 @@ | ||
| Copyright (C) 2017 by Marijn Haverbeke <marijnh@gmail.com> and others | ||
| Copyright (C) 2017 by Marijn Haverbeke <marijn@haverbeke.berlin> and others | ||
@@ -3,0 +3,0 @@ Permission is hereby granted, free of charge, to any person obtaining a copy |
+2
-2
| { | ||
| "name": "prosemirror-changeset", | ||
| "version": "2.2.0", | ||
| "version": "2.2.1", | ||
| "description": "Distills a series of editing steps into deleted and added ranges", | ||
@@ -18,3 +18,3 @@ "type": "module", | ||
| "name": "Marijn Haverbeke", | ||
| "email": "marijnh@gmail.com", | ||
| "email": "marijn@haverbeke.berlin", | ||
| "web": "http://marijnhaverbeke.nl" | ||
@@ -21,0 +21,0 @@ } |
-605
| // Convert the given range of a fragment to tokens, where node open | ||
| // tokens are encoded as strings holding the node name, characters as | ||
| // their character code, and node close tokens as -1. | ||
| function tokens(frag, start, end, target) { | ||
| for (var i = 0, off = 0; i < frag.childCount; i++) { | ||
| var child = frag.child(i), endOff = off + child.nodeSize; | ||
| var from = Math.max(off, start), to = Math.min(endOff, end); | ||
| if (from < to) { | ||
| if (child.isText) { | ||
| for (var j = from; j < to; j++) { target.push(child.text.charCodeAt(j - off)); } | ||
| } else if (child.isLeaf) { | ||
| target.push(child.type.name); | ||
| } else { | ||
| if (from == off) { target.push(child.type.name); } | ||
| tokens(child.content, Math.max(off + 1, from) - off - 1, Math.min(endOff - 1, to) - off - 1, target); | ||
| if (to == endOff) { target.push(-1); } | ||
| } | ||
| } | ||
| off = endOff; | ||
| } | ||
| return target | ||
| } | ||
| // The code below will refuse to compute a diff with more than 5000 | ||
| // insertions or deletions, which takes about 300ms to reach on my | ||
| // machine. This is a safeguard against runaway computations. | ||
| var MAX_DIFF_SIZE = 5000; | ||
| // This obscure mess of constants computes the minimum length of an | ||
| // unchanged range (not at the start/end of the compared content). The | ||
| // idea is to make it higher in bigger replacements, so that you don't | ||
| // get a diff soup of coincidentally identical letters when replacing | ||
| // a paragraph. | ||
| function minUnchanged(sizeA, sizeB) { | ||
| return Math.min(15, Math.max(2, Math.floor(Math.max(sizeA, sizeB) / 10))) | ||
| } | ||
| // : (Fragment, Fragment, Change) → [Change] | ||
| function computeDiff(fragA, fragB, range) { | ||
| var tokA = tokens(fragA, range.fromA, range.toA, []); | ||
| var tokB = tokens(fragB, range.fromB, range.toB, []); | ||
| // Scan from both sides to cheaply eliminate work | ||
| var start = 0, endA = tokA.length, endB = tokB.length; | ||
| while (start < tokA.length && start < tokB.length && tokA[start] === tokB[start]) { start++; } | ||
| if (start == tokA.length && start == tokB.length) { return [] } | ||
| while (endA > start && endB > start && tokA[endA - 1] === tokB[endB - 1]) { endA--, endB--; } | ||
| // If the result is simple _or_ too big to cheaply compute, return | ||
| // the remaining region as the diff | ||
| if (endA == start || endB == start || (endA == endB && endA == start + 1)) | ||
| { return [range.slice(start, endA, start, endB)] } | ||
| // This is an implementation of Myers' diff algorithm | ||
| // See https://neil.fraser.name/writing/diff/myers.pdf and | ||
| // https://blog.jcoglan.com/2017/02/12/the-myers-diff-algorithm-part-1/ | ||
| var lenA = endA - start, lenB = endB - start; | ||
| var max = Math.min(MAX_DIFF_SIZE, lenA + lenB), off = max + 1; | ||
| var history = []; | ||
| var frontier = []; | ||
| for (var len = off * 2, i = 0; i < len; i++) { frontier[i] = -1; } | ||
| for (var size = 0; size <= max; size++) { | ||
| for (var diag = -size; diag <= size; diag += 2) { | ||
| var next = frontier[diag + 1 + max], prev = frontier[diag - 1 + max]; | ||
| var x = next < prev ? prev : next + 1, y = x + diag; | ||
| while (x < lenA && y < lenB && tokA[start + x] === tokB[start + y]) { x++, y++; } | ||
| frontier[diag + max] = x; | ||
| // Found a match | ||
| if (x >= lenA && y >= lenB) { | ||
| // Trace back through the history to build up a set of changed ranges. | ||
| var diff = [], minSpan = minUnchanged(endA - start, endB - start); | ||
| // Used to add steps to a diff one at a time, back to front, merging | ||
| // ones that are less than minSpan tokens apart | ||
| var fromA = -1, toA = -1, fromB = -1, toB = -1; | ||
| var add = function (fA, tA, fB, tB) { | ||
| if (fromA > -1 && fromA < tA + minSpan) { | ||
| fromA = fA; fromB = fB; | ||
| } else { | ||
| if (fromA > -1) | ||
| { diff.push(range.slice(fromA, toA, fromB, toB)); } | ||
| fromA = fA; toA = tA; | ||
| fromB = fB; toB = tB; | ||
| } | ||
| }; | ||
| for (var i$1 = size - 1; i$1 >= 0; i$1--) { | ||
| var next$1 = frontier[diag + 1 + max], prev$1 = frontier[diag - 1 + max]; | ||
| if (next$1 < prev$1) { // Deletion | ||
| diag--; | ||
| x = prev$1 + start; y = x + diag; | ||
| add(x, x, y, y + 1); | ||
| } else { // Insertion | ||
| diag++; | ||
| x = next$1 + start; y = x + diag; | ||
| add(x, x + 1, y, y); | ||
| } | ||
| frontier = history[i$1 >> 1]; | ||
| } | ||
| if (fromA > -1) { diff.push(range.slice(fromA, toA, fromB, toB)); } | ||
| return diff.reverse() | ||
| } | ||
| } | ||
| // Since only either odd or even diagonals are read from each | ||
| // frontier, we only copy them every other iteration. | ||
| if (size % 2 == 0) { history.push(frontier.slice()); } | ||
| } | ||
| // The loop exited, meaning the maximum amount of work was done. | ||
| // Just return a change spanning the entire range. | ||
| return [range.slice(start, endA, start, endB)] | ||
| } | ||
| // ::- Stores metadata for a part of a change. | ||
| var Span = function Span(length, data) { | ||
| // :: number | ||
| this.length = length; | ||
| // :: any | ||
| this.data = data; | ||
| }; | ||
| Span.prototype.cut = function cut (length) { | ||
| return length == this.length ? this : new Span(length, this.data) | ||
| }; | ||
| Span.slice = function slice (spans, from, to) { | ||
| if (from == to) { return Span.none } | ||
| if (from == 0 && to == Span.len(spans)) { return spans } | ||
| var result = []; | ||
| for (var i = 0, off = 0; off < to; i++) { | ||
| var span = spans[i], end = off + span.length; | ||
| var overlap = Math.min(to, end) - Math.max(from, off); | ||
| if (overlap > 0) { result.push(span.cut(overlap)); } | ||
| off = end; | ||
| } | ||
| return result | ||
| }; | ||
| Span.join = function join (a, b, combine) { | ||
| if (a.length == 0) { return b } | ||
| if (b.length == 0) { return a } | ||
| var combined = combine(a[a.length - 1].data, b[0].data); | ||
| if (combined == null) { return a.concat(b) } | ||
| var result = a.slice(0, a.length - 1); | ||
| result.push(new Span(a[a.length - 1].length + b[0].length, combined)); | ||
| for (var i = 1; i < b.length; i++) { result.push(b[i]); } | ||
| return result | ||
| }; | ||
| Span.len = function len (spans) { | ||
| var len = 0; | ||
| for (var i = 0; i < spans.length; i++) { len += spans[i].length; } | ||
| return len | ||
| }; | ||
| Span.none = []; | ||
| // ::- A replaced range with metadata associated with it. | ||
| var Change = function Change(fromA, toA, fromB, toB, deleted, inserted) { | ||
| // :: number The start of the range deleted/replaced in the old | ||
| // document. | ||
| this.fromA = fromA; | ||
| // :: number The end of the range in the old document. | ||
| this.toA = toA; | ||
| // :: number The start of the range inserted in the new document. | ||
| this.fromB = fromB; | ||
| // :: number The end of the range in the new document. | ||
| this.toB = toB; | ||
| // :: [Span] Data associated with the deleted content. The length | ||
| // of these spans adds up to `this.toA - this.fromA`. | ||
| this.deleted = deleted; | ||
| // :: [Span] Data associated with the inserted content. Length | ||
| // adds up to `this.toB - this.toA`. | ||
| this.inserted = inserted; | ||
| }; | ||
| var prototypeAccessors$1 = { lenA: { configurable: true },lenB: { configurable: true } }; | ||
| prototypeAccessors$1.lenA.get = function () { return this.toA - this.fromA }; | ||
| prototypeAccessors$1.lenB.get = function () { return this.toB - this.fromB }; | ||
| Change.prototype.slice = function slice (startA, endA, startB, endB) { | ||
| if (startA == 0 && startB == 0 && endA == this.toA - this.fromA && | ||
| endB == this.toB - this.fromB) { return this } | ||
| return new Change(this.fromA + startA, this.fromA + endA, | ||
| this.fromB + startB, this.fromB + endB, | ||
| Span.slice(this.deleted, startA, endA), | ||
| Span.slice(this.inserted, startB, endB)) | ||
| }; | ||
| // : ([Change], [Change], (any, any) → any) → [Change] | ||
| // This merges two changesets (the end document of x should be the | ||
| // start document of y) into a single one spanning the start of x to | ||
| // the end of y. | ||
| Change.merge = function merge (x, y, combine) { | ||
| if (x.length == 0) { return y } | ||
| if (y.length == 0) { return x } | ||
| var result = []; | ||
| // Iterate over both sets in parallel, using the middle coordinate | ||
| // system (B in x, A in y) to synchronize. | ||
| for (var iX = 0, iY = 0, curX = x[0], curY = y[0];;) { | ||
| if (!curX && !curY) { | ||
| return result | ||
| } else if (curX && (!curY || curX.toB < curY.fromA)) { // curX entirely in front of curY | ||
| var off = iY ? y[iY - 1].toB - y[iY - 1].toA : 0; | ||
| result.push(off == 0 ? curX : | ||
| new Change(curX.fromA, curX.toA, curX.fromB + off, curX.toB + off, | ||
| curX.deleted, curX.inserted)); | ||
| curX = iX++ == x.length ? null : x[iX]; | ||
| } else if (curY && (!curX || curY.toA < curX.fromB)) { // curY entirely in front of curX | ||
| var off$1 = iX ? x[iX - 1].toB - x[iX - 1].toA : 0; | ||
| result.push(off$1 == 0 ? curY : | ||
| new Change(curY.fromA - off$1, curY.toA - off$1, curY.fromB, curY.toB, | ||
| curY.deleted, curY.inserted)); | ||
| curY = iY++ == y.length ? null : y[iY]; | ||
| } else { // Touch, need to merge | ||
| // The rules for merging ranges are that deletions from the | ||
| // old set and insertions from the new are kept. Areas of the | ||
| // middle document covered by a but not by b are insertions | ||
| // from a that need to be added, and areas covered by b but | ||
| // not a are deletions from b that need to be added. | ||
| var pos = Math.min(curX.fromB, curY.fromA); | ||
| var fromA = Math.min(curX.fromA, curY.fromA - (iX ? x[iX - 1].toB - x[iX - 1].toA : 0)), toA = fromA; | ||
| var fromB = Math.min(curY.fromB, curX.fromB + (iY ? y[iY - 1].toB - y[iY - 1].toA : 0)), toB = fromB; | ||
| var deleted = Span.none, inserted = Span.none; | ||
| // Used to prevent appending ins/del range for the same Change twice | ||
| var enteredX = false, enteredY = false; | ||
| // Need to have an inner loop since any number of further | ||
| // ranges might be touching this group | ||
| for (;;) { | ||
| var nextX = !curX ? 2e8 : pos >= curX.fromB ? curX.toB : curX.fromB; | ||
| var nextY = !curY ? 2e8 : pos >= curY.fromA ? curY.toA : curY.fromA; | ||
| var next = Math.min(nextX, nextY); | ||
| var inX = curX && pos >= curX.fromB, inY = curY && pos >= curY.fromA; | ||
| if (!inX && !inY) { break } | ||
| if (inX && pos == curX.fromB && !enteredX) { | ||
| deleted = Span.join(deleted, curX.deleted, combine); | ||
| toA += curX.lenA; | ||
| enteredX = true; | ||
| } | ||
| if (inX && !inY) { | ||
| inserted = Span.join(inserted, Span.slice(curX.inserted, pos - curX.fromB, next - curX.fromB), combine); | ||
| toB += next - pos; | ||
| } | ||
| if (inY && pos == curY.fromA && !enteredY) { | ||
| inserted = Span.join(inserted, curY.inserted, combine); | ||
| toB += curY.lenB; | ||
| enteredY = true; | ||
| } | ||
| if (inY && !inX) { | ||
| deleted = Span.join(deleted, Span.slice(curY.deleted, pos - curY.fromA, next - curY.fromA), combine); | ||
| toA += next - pos; | ||
| } | ||
| if (inX && next == curX.toB) { | ||
| curX = iX++ == x.length ? null : x[iX]; | ||
| enteredX = false; | ||
| } | ||
| if (inY && next == curY.toA) { | ||
| curY = iY++ == y.length ? null : y[iY]; | ||
| enteredY = false; | ||
| } | ||
| pos = next; | ||
| } | ||
| if (fromA < toA || fromB < toB) | ||
| { result.push(new Change(fromA, toA, fromB, toB, deleted, inserted)); } | ||
| } | ||
| } | ||
| }; | ||
| Object.defineProperties( Change.prototype, prototypeAccessors$1 ); | ||
| var letter; | ||
| // If the runtime support unicode properties in regexps, that's a good | ||
| // source of info on whether something is a letter. | ||
| try { letter = new RegExp("[\\p{Alphabetic}_]", "u"); } catch(_) {} | ||
| // Otherwise, we see if the character changes when upper/lowercased, | ||
| // or if it is part of these common single-case scripts. | ||
| var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; | ||
| function isLetter(code) { | ||
| if (code < 128) | ||
| { return code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 79 && code <= 122 } | ||
| var ch = String.fromCharCode(code); | ||
| if (letter) { return letter.test(ch) } | ||
| return ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch) | ||
| } | ||
| // Convert a range of document into a string, so that we can easily | ||
| // access characters at a given position. Treat non-text tokens as | ||
| // spaces so that they aren't considered part of a word. | ||
| function getText(frag, start, end) { | ||
| var out = ""; | ||
| function convert(frag, start, end) { | ||
| for (var i = 0, off = 0; i < frag.childCount; i++) { | ||
| var child = frag.child(i), endOff = off + child.nodeSize; | ||
| var from = Math.max(off, start), to = Math.min(endOff, end); | ||
| if (from < to) { | ||
| if (child.isText) { | ||
| out += child.text.slice(Math.max(0, start - off), Math.min(child.text.length, end - off)); | ||
| } else if (child.isLeaf) { | ||
| out += " "; | ||
| } else { | ||
| if (from == off) { out += " "; } | ||
| convert(child.content, Math.max(0, from - off - 1), Math.min(child.content.size, end - off)); | ||
| if (to == endOff) { out += " "; } | ||
| } | ||
| } | ||
| off = endOff; | ||
| } | ||
| } | ||
| convert(frag, start, end); | ||
| return out | ||
| } | ||
| // The distance changes have to be apart for us to not consider them | ||
| // candidates for merging. | ||
| var MAX_SIMPLIFY_DISTANCE = 30; | ||
| // :: ([Change], Node) → [Change] | ||
| // Simplifies a set of changes for presentation. This makes the | ||
| // assumption that having both insertions and deletions within a word | ||
| // is confusing, and, when such changes occur without a word boundary | ||
| // between them, they should be expanded to cover the entire set of | ||
| // words (in the new document) they touch. An exception is made for | ||
| // single-character replacements. | ||
| function simplifyChanges(changes, doc) { | ||
| var result = []; | ||
| for (var i = 0; i < changes.length; i++) { | ||
| var end = changes[i].toB, start = i; | ||
| while (i < changes.length - 1 && changes[i + 1].fromB <= end + MAX_SIMPLIFY_DISTANCE) | ||
| { end = changes[++i].toB; } | ||
| simplifyAdjacentChanges(changes, start, i + 1, doc, result); | ||
| } | ||
| return result | ||
| } | ||
| function simplifyAdjacentChanges(changes, from, to, doc, target) { | ||
| var start = Math.max(0, changes[from].fromB - MAX_SIMPLIFY_DISTANCE); | ||
| var end = Math.min(doc.content.size, changes[to - 1].toB + MAX_SIMPLIFY_DISTANCE); | ||
| var text = getText(doc.content, start, end); | ||
| for (var i = from; i < to; i++) { | ||
| var startI = i, last = changes[i], deleted = last.lenA, inserted = last.lenB; | ||
| while (i < to - 1) { | ||
| var next = changes[i + 1], boundary = false; | ||
| var prevLetter = last.toB == end ? false : isLetter(text.charCodeAt(last.toB - 1 - start)); | ||
| for (var pos = last.toB; !boundary && pos < next.fromB; pos++) { | ||
| var nextLetter = pos == end ? false : isLetter(text.charCodeAt(pos - start)); | ||
| if ((!prevLetter || !nextLetter) && pos != changes[startI].fromB) { boundary = true; } | ||
| prevLetter = nextLetter; | ||
| } | ||
| if (boundary) { break } | ||
| deleted += next.lenA; inserted += next.lenB; | ||
| last = next; | ||
| i++; | ||
| } | ||
| if (inserted > 0 && deleted > 0 && !(inserted == 1 && deleted == 1)) { | ||
| var from$1 = changes[startI].fromB, to$1 = changes[i].toB; | ||
| if (from$1 < end && isLetter(text.charCodeAt(from$1 - start))) | ||
| { while (from$1 > start && isLetter(text.charCodeAt(from$1 - 1 - start))) { from$1--; } } | ||
| if (to$1 > start && isLetter(text.charCodeAt(to$1 - 1 - start))) | ||
| { while (to$1 < end && isLetter(text.charCodeAt(to$1 - start))) { to$1++; } } | ||
| var joined = fillChange(changes.slice(startI, i + 1), from$1, to$1); | ||
| var last$1 = target.length ? target[target.length - 1] : null; | ||
| if (last$1 && last$1.toA == joined.fromA) | ||
| { target[target.length - 1] = new Change(last$1.fromA, joined.toA, last$1.fromB, joined.toB, | ||
| last$1.deleted.concat(joined.deleted), last$1.inserted.concat(joined.inserted)); } | ||
| else | ||
| { target.push(joined); } | ||
| } else { | ||
| for (var j = startI; j <= i; j++) { target.push(changes[j]); } | ||
| } | ||
| } | ||
| return changes | ||
| } | ||
| function combine(a, b) { return a === b ? a : null } | ||
| function fillChange(changes, fromB, toB) { | ||
| var fromA = changes[0].fromA - (changes[0].fromB - fromB); | ||
| var last = changes[changes.length - 1]; | ||
| var toA = last.toA + (toB - last.toB); | ||
| var deleted = Span.none, inserted = Span.none; | ||
| var delData = (changes[0].deleted.length ? changes[0].deleted : changes[0].inserted)[0].data; | ||
| var insData = (changes[0].inserted.length ? changes[0].inserted : changes[0].deleted)[0].data; | ||
| for (var posA = fromA, posB = fromB, i = 0;; i++) { | ||
| var next = i == changes.length ? null : changes[i]; | ||
| var endA = next ? next.fromA : toA, endB = next ? next.fromB : toB; | ||
| if (endA > posA) { deleted = Span.join(deleted, [new Span(endA - posA, delData)], combine); } | ||
| if (endB > posB) { inserted = Span.join(inserted, [new Span(endB - posB, insData)], combine); } | ||
| if (!next) { break } | ||
| deleted = Span.join(deleted, next.deleted, combine); | ||
| inserted = Span.join(inserted, next.inserted, combine); | ||
| if (deleted.length) { delData = deleted[deleted.length - 1].data; } | ||
| if (inserted.length) { insData = inserted[inserted.length - 1].data; } | ||
| posA = next.toA; posB = next.toB; | ||
| } | ||
| return new Change(fromA, toA, fromB, toB, deleted, inserted) | ||
| } | ||
| // ::- A change set tracks the changes to a document from a given | ||
| // point in the past. It condenses a number of step maps down to a | ||
| // flat sequence of replacements, and simplifies replacments that | ||
| // partially undo themselves by comparing their content. | ||
| var ChangeSet = function ChangeSet(config, changes) { | ||
| this.config = config; | ||
| // :: [Change] Replaced regions. | ||
| this.changes = changes; | ||
| }; | ||
| var prototypeAccessors = { startDoc: { configurable: true } }; | ||
| // :: (Node, [StepMap], union<[any], any>) → ChangeSet | ||
| // Computes a new changeset by adding the given step maps and | ||
| // metadata (either as an array, per-map, or as a single value to be | ||
| // associated with all maps) to the current set. Will not mutate the | ||
| // old set. | ||
| // | ||
| // Note that due to simplification that happens after each add, | ||
| // incrementally adding steps might create a different final set | ||
| // than adding all those changes at once, since different document | ||
| // tokens might be matched during simplification depending on the | ||
| // boundaries of the current changed ranges. | ||
| ChangeSet.prototype.addSteps = function addSteps (newDoc, maps, data) { | ||
| var this$1$1 = this; | ||
| // This works by inspecting the position maps for the changes, | ||
| // which indicate what parts of the document were replaced by new | ||
| // content, and the size of that new content. It uses these to | ||
| // build up Change objects. | ||
| // | ||
| // These change objects are put in sets and merged together using | ||
| // Change.merge, giving us the changes created by the new steps. | ||
| // Those changes can then be merged with the existing set of | ||
| // changes. | ||
| // | ||
| // For each change that was touched by the new steps, we recompute | ||
| // a diff to try to minimize the change by dropping matching | ||
| // pieces of the old and new document from the change. | ||
| var stepChanges = []; | ||
| // Add spans for new steps. | ||
| var loop = function ( i ) { | ||
| var d = Array.isArray(data) ? data[i] : data; | ||
| var off = 0; | ||
| maps[i].forEach(function (fromA, toA, fromB, toB) { | ||
| stepChanges.push(new Change(fromA + off, toA + off, fromB, toB, | ||
| fromA == toA ? Span.none : [new Span(toA - fromA, d)], | ||
| fromB == toB ? Span.none : [new Span(toB - fromB, d)])); | ||
| off = (toB - fromB) - (toA - fromA); | ||
| }); | ||
| }; | ||
| for (var i = 0; i < maps.length; i++) loop( i ); | ||
| if (stepChanges.length == 0) { return this } | ||
| var newChanges = mergeAll(stepChanges, this.config.combine); | ||
| var changes = Change.merge(this.changes, newChanges, this.config.combine); | ||
| // Minimize changes when possible | ||
| var loop$1 = function ( i$2 ) { | ||
| var change = changes[i$2]; | ||
| if (change.fromA == change.toA || change.fromB == change.toB || | ||
| // Only look at changes that touch newly added changed ranges | ||
| !newChanges.some(function (r) { return r.toB > change.fromB && r.fromB < change.toB; })) { return } | ||
| var diff = computeDiff(this$1$1.config.doc.content, newDoc.content, change); | ||
| // Fast path: If they are completely different, don't do anything | ||
| if (diff.length == 1 && diff[0].fromB == 0 && diff[0].toB == change.toB - change.fromB) | ||
| { return } | ||
| if (diff.length == 1) { | ||
| changes[i$2] = diff[0]; | ||
| } else { | ||
| changes.splice.apply(changes, [ i$2, 1 ].concat( diff )); | ||
| i$2 += diff.length - 1; | ||
| } | ||
| i$1 = i$2; | ||
| }; | ||
| for (var i$1 = 0; i$1 < changes.length; i$1++) loop$1( i$1 ); | ||
| return new ChangeSet(this.config, changes) | ||
| }; | ||
| // :: Node | ||
| // The starting document of the change set. | ||
| prototypeAccessors.startDoc.get = function () { return this.config.doc }; | ||
| // :: (f: (range: Change) → any) → ChangeSet | ||
| // Map the span's data values in the given set through a function | ||
| // and construct a new set with the resulting data. | ||
| ChangeSet.prototype.map = function map (f) { | ||
| return new ChangeSet(this.config, this.changes.map(function (change) { | ||
| var data = f(change); | ||
| return data === change.data ? change : | ||
| new Change(change.fromA, change.toA, change.fromB, change.toB, data) | ||
| })) | ||
| }; | ||
| // :: (ChangeSet, ?[StepMap]) → ?{from: number, to: number} | ||
| // Compare two changesets and return the range in which they are | ||
| // changed, if any. If the document changed between the maps, pass | ||
| // the maps for the steps that changed it as second argument, and | ||
| // make sure the method is called on the old set and passed the new | ||
| // set. The returned positions will be in new document coordinates. | ||
| ChangeSet.prototype.changedRange = function changedRange (b, maps) { | ||
| if (b == this) { return null } | ||
| var touched = maps && touchedRange(maps); | ||
| var moved = touched ? (touched.toB - touched.fromB) - (touched.toA - touched.fromA) : 0; | ||
| function map(p) { | ||
| return !touched || p <= touched.fromA ? p : p + moved | ||
| } | ||
| var from = touched ? touched.fromB : 2e8, to = touched ? touched.toB : -2e8; | ||
| function add(start, end) { | ||
| if ( end === void 0 ) end = start; | ||
| from = Math.min(start, from); to = Math.max(end, to); | ||
| } | ||
| var rA = this.changes, rB = b.changes; | ||
| for (var iA = 0, iB = 0; iA < rA.length && iB < rB.length;) { | ||
| var rangeA = rA[iA], rangeB = rB[iB]; | ||
| if (rangeA && rangeB && sameRanges(rangeA, rangeB, map)) { iA++; iB++; } | ||
| else if (rangeB && (!rangeA || map(rangeA.fromB) >= rangeB.fromB)) { add(rangeB.fromB, rangeB.toB); iB++; } | ||
| else { add(map(rangeA.fromB), map(rangeA.toB)); iA++; } | ||
| } | ||
| return from <= to ? {from: from, to: to} : null | ||
| }; | ||
| // :: (Node, ?(a: any, b: any) → any) → ChangeSet | ||
| // Create a changeset with the given base object and configuration. | ||
| // The `combine` function is used to compare and combine metadata—it | ||
| // should return null when metadata isn't compatible, and a combined | ||
| // version for a merged range when it is. | ||
| ChangeSet.create = function create (doc, combine) { | ||
| if ( combine === void 0 ) combine = function (a, b) { return a === b ? a : null; }; | ||
| return new ChangeSet({combine: combine, doc: doc}, [], []) | ||
| }; | ||
| Object.defineProperties( ChangeSet.prototype, prototypeAccessors ); | ||
| // Exported for testing | ||
| ChangeSet.computeDiff = computeDiff; | ||
| // : ([[Change]], (any, any) → any, number, number) → [Change] | ||
| // Divide-and-conquer approach to merging a series of ranges. | ||
| function mergeAll(ranges, combine, start, end) { | ||
| if ( start === void 0 ) start = 0; | ||
| if ( end === void 0 ) end = ranges.length; | ||
| if (end == start + 1) { return [ranges[start]] } | ||
| var mid = (start + end) >> 1; | ||
| return Change.merge(mergeAll(ranges, combine, start, mid), | ||
| mergeAll(ranges, combine, mid, end), combine) | ||
| } | ||
| function endRange(maps) { | ||
| var from = 2e8, to = -2e8; | ||
| for (var i = 0; i < maps.length; i++) { | ||
| var map = maps[i]; | ||
| if (from != 2e8) { | ||
| from = map.map(from, -1); | ||
| to = map.map(to, 1); | ||
| } | ||
| map.forEach(function (_s, _e, start, end) { | ||
| from = Math.min(from, start); | ||
| to = Math.max(to, end); | ||
| }); | ||
| } | ||
| return from == 2e8 ? null : {from: from, to: to} | ||
| } | ||
| function touchedRange(maps) { | ||
| var b = endRange(maps); | ||
| if (!b) { return null } | ||
| var a = endRange(maps.map(function (m) { return m.invert(); }).reverse()); | ||
| return {fromA: a.from, toA: a.to, fromB: b.from, toB: b.to} | ||
| } | ||
| function sameRanges(a, b, map) { | ||
| return map(a.fromB) == b.fromB && map(a.toB) == b.toB && | ||
| sameSpans(a.deleted, b.deleted) && sameSpans(a.inserted, b.inserted) | ||
| } | ||
| function sameSpans(a, b) { | ||
| if (a.length != b.length) { return false } | ||
| for (var i = 0; i < a.length; i++) | ||
| { if (a[i].length != b[i].length || a[i].data !== b[i].data) { return false } } | ||
| return true | ||
| } | ||
| export { Change, ChangeSet, Span, simplifyChanges }; | ||
| //# sourceMappingURL=index.es.js.map |
| {"version":3,"file":"index.es.js","sources":["../src/diff.js","../src/change.js","../src/simplify.js","../src/changeset.js"],"sourcesContent":["// Convert the given range of a fragment to tokens, where node open\n// tokens are encoded as strings holding the node name, characters as\n// their character code, and node close tokens as -1.\nfunction tokens(frag, start, end, target) {\n for (let i = 0, off = 0; i < frag.childCount; i++) {\n let child = frag.child(i), endOff = off + child.nodeSize\n let from = Math.max(off, start), to = Math.min(endOff, end)\n if (from < to) {\n if (child.isText) {\n for (let j = from; j < to; j++) target.push(child.text.charCodeAt(j - off))\n } else if (child.isLeaf) {\n target.push(child.type.name)\n } else {\n if (from == off) target.push(child.type.name)\n tokens(child.content, Math.max(off + 1, from) - off - 1, Math.min(endOff - 1, to) - off - 1, target)\n if (to == endOff) target.push(-1)\n }\n }\n off = endOff\n }\n return target\n}\n\n// The code below will refuse to compute a diff with more than 5000\n// insertions or deletions, which takes about 300ms to reach on my\n// machine. This is a safeguard against runaway computations.\nconst MAX_DIFF_SIZE = 5000\n\n// This obscure mess of constants computes the minimum length of an\n// unchanged range (not at the start/end of the compared content). The\n// idea is to make it higher in bigger replacements, so that you don't\n// get a diff soup of coincidentally identical letters when replacing\n// a paragraph.\nfunction minUnchanged(sizeA, sizeB) {\n return Math.min(15, Math.max(2, Math.floor(Math.max(sizeA, sizeB) / 10)))\n}\n\n// : (Fragment, Fragment, Change) → [Change]\nexport function computeDiff(fragA, fragB, range) {\n let tokA = tokens(fragA, range.fromA, range.toA, [])\n let tokB = tokens(fragB, range.fromB, range.toB, [])\n\n // Scan from both sides to cheaply eliminate work\n let start = 0, endA = tokA.length, endB = tokB.length\n while (start < tokA.length && start < tokB.length && tokA[start] === tokB[start]) start++\n if (start == tokA.length && start == tokB.length) return []\n while (endA > start && endB > start && tokA[endA - 1] === tokB[endB - 1]) endA--, endB--\n // If the result is simple _or_ too big to cheaply compute, return\n // the remaining region as the diff\n if (endA == start || endB == start || (endA == endB && endA == start + 1))\n return [range.slice(start, endA, start, endB)]\n\n // This is an implementation of Myers' diff algorithm\n // See https://neil.fraser.name/writing/diff/myers.pdf and\n // https://blog.jcoglan.com/2017/02/12/the-myers-diff-algorithm-part-1/\n\n let lenA = endA - start, lenB = endB - start\n let max = Math.min(MAX_DIFF_SIZE, lenA + lenB), off = max + 1\n let history = []\n let frontier = []\n for (let len = off * 2, i = 0; i < len; i++) frontier[i] = -1\n\n for (let size = 0; size <= max; size++) {\n for (let diag = -size; diag <= size; diag += 2) {\n let next = frontier[diag + 1 + max], prev = frontier[diag - 1 + max]\n let x = next < prev ? prev : next + 1, y = x + diag\n while (x < lenA && y < lenB && tokA[start + x] === tokB[start + y]) x++, y++\n frontier[diag + max] = x\n // Found a match\n if (x >= lenA && y >= lenB) {\n // Trace back through the history to build up a set of changed ranges.\n let diff = [], minSpan = minUnchanged(endA - start, endB - start)\n // Used to add steps to a diff one at a time, back to front, merging\n // ones that are less than minSpan tokens apart\n let fromA = -1, toA = -1, fromB = -1, toB = -1\n let add = (fA, tA, fB, tB) => {\n if (fromA > -1 && fromA < tA + minSpan) {\n fromA = fA; fromB = fB\n } else {\n if (fromA > -1)\n diff.push(range.slice(fromA, toA, fromB, toB))\n fromA = fA; toA = tA\n fromB = fB; toB = tB\n }\n }\n\n for (let i = size - 1; i >= 0; i--) {\n let next = frontier[diag + 1 + max], prev = frontier[diag - 1 + max]\n if (next < prev) { // Deletion\n diag--\n x = prev + start; y = x + diag\n add(x, x, y, y + 1)\n } else { // Insertion\n diag++\n x = next + start; y = x + diag\n add(x, x + 1, y, y)\n }\n frontier = history[i >> 1]\n }\n if (fromA > -1) diff.push(range.slice(fromA, toA, fromB, toB))\n return diff.reverse()\n }\n }\n // Since only either odd or even diagonals are read from each\n // frontier, we only copy them every other iteration.\n if (size % 2 == 0) history.push(frontier.slice())\n }\n // The loop exited, meaning the maximum amount of work was done.\n // Just return a change spanning the entire range.\n return [range.slice(start, endA, start, endB)]\n}\n","// ::- Stores metadata for a part of a change.\nexport class Span {\n constructor(length, data) {\n // :: number\n this.length = length\n // :: any\n this.data = data\n }\n\n cut(length) {\n return length == this.length ? this : new Span(length, this.data)\n }\n\n static slice(spans, from, to) {\n if (from == to) return Span.none\n if (from == 0 && to == Span.len(spans)) return spans\n let result = []\n for (let i = 0, off = 0; off < to; i++) {\n let span = spans[i], end = off + span.length\n let overlap = Math.min(to, end) - Math.max(from, off)\n if (overlap > 0) result.push(span.cut(overlap))\n off = end\n }\n return result\n }\n\n static join(a, b, combine) {\n if (a.length == 0) return b\n if (b.length == 0) return a\n let combined = combine(a[a.length - 1].data, b[0].data)\n if (combined == null) return a.concat(b)\n let result = a.slice(0, a.length - 1)\n result.push(new Span(a[a.length - 1].length + b[0].length, combined))\n for (let i = 1; i < b.length; i++) result.push(b[i])\n return result\n }\n\n static len(spans) {\n let len = 0\n for (let i = 0; i < spans.length; i++) len += spans[i].length\n return len\n }\n}\n\nSpan.none = []\n\n// ::- A replaced range with metadata associated with it.\nexport class Change {\n constructor(fromA, toA, fromB, toB, deleted, inserted) {\n // :: number The start of the range deleted/replaced in the old\n // document.\n this.fromA = fromA\n // :: number The end of the range in the old document.\n this.toA = toA\n // :: number The start of the range inserted in the new document.\n this.fromB = fromB\n // :: number The end of the range in the new document.\n this.toB = toB\n // :: [Span] Data associated with the deleted content. The length\n // of these spans adds up to `this.toA - this.fromA`.\n this.deleted = deleted\n // :: [Span] Data associated with the inserted content. Length\n // adds up to `this.toB - this.toA`.\n this.inserted = inserted\n }\n\n get lenA() { return this.toA - this.fromA }\n get lenB() { return this.toB - this.fromB }\n\n slice(startA, endA, startB, endB) {\n if (startA == 0 && startB == 0 && endA == this.toA - this.fromA &&\n endB == this.toB - this.fromB) return this\n return new Change(this.fromA + startA, this.fromA + endA,\n this.fromB + startB, this.fromB + endB,\n Span.slice(this.deleted, startA, endA),\n Span.slice(this.inserted, startB, endB))\n }\n\n // : ([Change], [Change], (any, any) → any) → [Change]\n // This merges two changesets (the end document of x should be the\n // start document of y) into a single one spanning the start of x to\n // the end of y.\n static merge(x, y, combine) {\n if (x.length == 0) return y\n if (y.length == 0) return x\n\n let result = []\n // Iterate over both sets in parallel, using the middle coordinate\n // system (B in x, A in y) to synchronize.\n for (let iX = 0, iY = 0, curX = x[0], curY = y[0];;) {\n if (!curX && !curY) {\n return result\n } else if (curX && (!curY || curX.toB < curY.fromA)) { // curX entirely in front of curY\n let off = iY ? y[iY - 1].toB - y[iY - 1].toA : 0\n result.push(off == 0 ? curX :\n new Change(curX.fromA, curX.toA, curX.fromB + off, curX.toB + off,\n curX.deleted, curX.inserted))\n curX = iX++ == x.length ? null : x[iX]\n } else if (curY && (!curX || curY.toA < curX.fromB)) { // curY entirely in front of curX\n let off = iX ? x[iX - 1].toB - x[iX - 1].toA : 0\n result.push(off == 0 ? curY :\n new Change(curY.fromA - off, curY.toA - off, curY.fromB, curY.toB,\n curY.deleted, curY.inserted))\n curY = iY++ == y.length ? null : y[iY]\n } else { // Touch, need to merge\n // The rules for merging ranges are that deletions from the\n // old set and insertions from the new are kept. Areas of the\n // middle document covered by a but not by b are insertions\n // from a that need to be added, and areas covered by b but\n // not a are deletions from b that need to be added.\n let pos = Math.min(curX.fromB, curY.fromA)\n let fromA = Math.min(curX.fromA, curY.fromA - (iX ? x[iX - 1].toB - x[iX - 1].toA : 0)), toA = fromA\n let fromB = Math.min(curY.fromB, curX.fromB + (iY ? y[iY - 1].toB - y[iY - 1].toA : 0)), toB = fromB\n let deleted = Span.none, inserted = Span.none\n\n // Used to prevent appending ins/del range for the same Change twice\n let enteredX = false, enteredY = false\n\n // Need to have an inner loop since any number of further\n // ranges might be touching this group\n for (;;) {\n let nextX = !curX ? 2e8 : pos >= curX.fromB ? curX.toB : curX.fromB\n let nextY = !curY ? 2e8 : pos >= curY.fromA ? curY.toA : curY.fromA\n let next = Math.min(nextX, nextY)\n let inX = curX && pos >= curX.fromB, inY = curY && pos >= curY.fromA\n if (!inX && !inY) break\n if (inX && pos == curX.fromB && !enteredX) {\n deleted = Span.join(deleted, curX.deleted, combine)\n toA += curX.lenA\n enteredX = true\n }\n if (inX && !inY) {\n inserted = Span.join(inserted, Span.slice(curX.inserted, pos - curX.fromB, next - curX.fromB), combine)\n toB += next - pos\n }\n if (inY && pos == curY.fromA && !enteredY) {\n inserted = Span.join(inserted, curY.inserted, combine)\n toB += curY.lenB\n enteredY = true\n }\n if (inY && !inX) {\n deleted = Span.join(deleted, Span.slice(curY.deleted, pos - curY.fromA, next - curY.fromA), combine)\n toA += next - pos\n }\n\n if (inX && next == curX.toB) {\n curX = iX++ == x.length ? null : x[iX]\n enteredX = false\n }\n if (inY && next == curY.toA) {\n curY = iY++ == y.length ? null : y[iY]\n enteredY = false\n }\n pos = next\n }\n if (fromA < toA || fromB < toB)\n result.push(new Change(fromA, toA, fromB, toB, deleted, inserted))\n }\n }\n }\n}\n","import {Span, Change} from \"./change\"\n\nlet letter\n// If the runtime support unicode properties in regexps, that's a good\n// source of info on whether something is a letter.\ntry { letter = new RegExp(\"[\\\\p{Alphabetic}_]\", \"u\") } catch(_) {}\n\n// Otherwise, we see if the character changes when upper/lowercased,\n// or if it is part of these common single-case scripts.\nconst nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/\n\nfunction isLetter(code) {\n if (code < 128)\n return code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 79 && code <= 122\n let ch = String.fromCharCode(code)\n if (letter) return letter.test(ch)\n return ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)\n}\n\n// Convert a range of document into a string, so that we can easily\n// access characters at a given position. Treat non-text tokens as\n// spaces so that they aren't considered part of a word.\nfunction getText(frag, start, end) {\n let out = \"\"\n function convert(frag, start, end) {\n for (let i = 0, off = 0; i < frag.childCount; i++) {\n let child = frag.child(i), endOff = off + child.nodeSize\n let from = Math.max(off, start), to = Math.min(endOff, end)\n if (from < to) {\n if (child.isText) {\n out += child.text.slice(Math.max(0, start - off), Math.min(child.text.length, end - off))\n } else if (child.isLeaf) {\n out += \" \"\n } else {\n if (from == off) out += \" \"\n convert(child.content, Math.max(0, from - off - 1), Math.min(child.content.size, end - off))\n if (to == endOff) out += \" \"\n }\n }\n off = endOff\n }\n }\n convert(frag, start, end)\n return out\n}\n\n// The distance changes have to be apart for us to not consider them\n// candidates for merging.\nconst MAX_SIMPLIFY_DISTANCE = 30\n\n// :: ([Change], Node) → [Change]\n// Simplifies a set of changes for presentation. This makes the\n// assumption that having both insertions and deletions within a word\n// is confusing, and, when such changes occur without a word boundary\n// between them, they should be expanded to cover the entire set of\n// words (in the new document) they touch. An exception is made for\n// single-character replacements.\nexport function simplifyChanges(changes, doc) {\n let result = []\n for (let i = 0; i < changes.length; i++) {\n let end = changes[i].toB, start = i\n while (i < changes.length - 1 && changes[i + 1].fromB <= end + MAX_SIMPLIFY_DISTANCE)\n end = changes[++i].toB\n simplifyAdjacentChanges(changes, start, i + 1, doc, result)\n }\n return result\n}\n\nfunction simplifyAdjacentChanges(changes, from, to, doc, target) {\n let start = Math.max(0, changes[from].fromB - MAX_SIMPLIFY_DISTANCE)\n let end = Math.min(doc.content.size, changes[to - 1].toB + MAX_SIMPLIFY_DISTANCE)\n let text = getText(doc.content, start, end)\n\n for (let i = from; i < to; i++) {\n let startI = i, last = changes[i], deleted = last.lenA, inserted = last.lenB\n while (i < to - 1) {\n let next = changes[i + 1], boundary = false\n let prevLetter = last.toB == end ? false : isLetter(text.charCodeAt(last.toB - 1 - start))\n for (let pos = last.toB; !boundary && pos < next.fromB; pos++) {\n let nextLetter = pos == end ? false : isLetter(text.charCodeAt(pos - start))\n if ((!prevLetter || !nextLetter) && pos != changes[startI].fromB) boundary = true\n prevLetter = nextLetter\n }\n if (boundary) break\n deleted += next.lenA; inserted += next.lenB\n last = next\n i++\n }\n\n if (inserted > 0 && deleted > 0 && !(inserted == 1 && deleted == 1)) {\n let from = changes[startI].fromB, to = changes[i].toB\n if (from < end && isLetter(text.charCodeAt(from - start)))\n while (from > start && isLetter(text.charCodeAt(from - 1 - start))) from--\n if (to > start && isLetter(text.charCodeAt(to - 1 - start)))\n while (to < end && isLetter(text.charCodeAt(to - start))) to++\n let joined = fillChange(changes.slice(startI, i + 1), from, to)\n let last = target.length ? target[target.length - 1] : null\n if (last && last.toA == joined.fromA)\n target[target.length - 1] = new Change(last.fromA, joined.toA, last.fromB, joined.toB,\n last.deleted.concat(joined.deleted), last.inserted.concat(joined.inserted))\n else\n target.push(joined)\n } else {\n for (let j = startI; j <= i; j++) target.push(changes[j])\n }\n }\n return changes\n}\n\nfunction combine(a, b) { return a === b ? a : null }\n\nfunction fillChange(changes, fromB, toB) {\n let fromA = changes[0].fromA - (changes[0].fromB - fromB)\n let last = changes[changes.length - 1]\n let toA = last.toA + (toB - last.toB)\n let deleted = Span.none, inserted = Span.none\n let delData = (changes[0].deleted.length ? changes[0].deleted : changes[0].inserted)[0].data\n let insData = (changes[0].inserted.length ? changes[0].inserted : changes[0].deleted)[0].data\n for (let posA = fromA, posB = fromB, i = 0;; i++) {\n let next = i == changes.length ? null : changes[i]\n let endA = next ? next.fromA : toA, endB = next ? next.fromB : toB\n if (endA > posA) deleted = Span.join(deleted, [new Span(endA - posA, delData)], combine)\n if (endB > posB) inserted = Span.join(inserted, [new Span(endB - posB, insData)], combine)\n if (!next) break\n deleted = Span.join(deleted, next.deleted, combine)\n inserted = Span.join(inserted, next.inserted, combine)\n if (deleted.length) delData = deleted[deleted.length - 1].data\n if (inserted.length) insData = inserted[inserted.length - 1].data\n posA = next.toA; posB = next.toB\n }\n return new Change(fromA, toA, fromB, toB, deleted, inserted)\n}\n","import {computeDiff} from \"./diff\"\nimport {Change, Span} from \"./change\"\nexport {Change, Span}\nexport {simplifyChanges} from \"./simplify\"\n\n// ::- A change set tracks the changes to a document from a given\n// point in the past. It condenses a number of step maps down to a\n// flat sequence of replacements, and simplifies replacments that\n// partially undo themselves by comparing their content.\nexport class ChangeSet {\n constructor(config, changes) {\n this.config = config\n // :: [Change] Replaced regions.\n this.changes = changes\n }\n\n // :: (Node, [StepMap], union<[any], any>) → ChangeSet\n // Computes a new changeset by adding the given step maps and\n // metadata (either as an array, per-map, or as a single value to be\n // associated with all maps) to the current set. Will not mutate the\n // old set.\n //\n // Note that due to simplification that happens after each add,\n // incrementally adding steps might create a different final set\n // than adding all those changes at once, since different document\n // tokens might be matched during simplification depending on the\n // boundaries of the current changed ranges.\n addSteps(newDoc, maps, data) {\n // This works by inspecting the position maps for the changes,\n // which indicate what parts of the document were replaced by new\n // content, and the size of that new content. It uses these to\n // build up Change objects.\n //\n // These change objects are put in sets and merged together using\n // Change.merge, giving us the changes created by the new steps.\n // Those changes can then be merged with the existing set of\n // changes.\n //\n // For each change that was touched by the new steps, we recompute\n // a diff to try to minimize the change by dropping matching\n // pieces of the old and new document from the change.\n\n let stepChanges = []\n // Add spans for new steps.\n for (let i = 0; i < maps.length; i++) {\n let d = Array.isArray(data) ? data[i] : data\n let off = 0\n maps[i].forEach((fromA, toA, fromB, toB) => {\n\n stepChanges.push(new Change(fromA + off, toA + off, fromB, toB,\n fromA == toA ? Span.none : [new Span(toA - fromA, d)],\n fromB == toB ? Span.none : [new Span(toB - fromB, d)]))\n\n off = (toB - fromB) - (toA - fromA)\n })\n }\n if (stepChanges.length == 0) return this\n\n let newChanges = mergeAll(stepChanges, this.config.combine)\n let changes = Change.merge(this.changes, newChanges, this.config.combine)\n\n // Minimize changes when possible\n for (let i = 0; i < changes.length; i++) {\n let change = changes[i]\n if (change.fromA == change.toA || change.fromB == change.toB ||\n // Only look at changes that touch newly added changed ranges\n !newChanges.some(r => r.toB > change.fromB && r.fromB < change.toB)) continue\n let diff = computeDiff(this.config.doc.content, newDoc.content, change)\n\n // Fast path: If they are completely different, don't do anything\n if (diff.length == 1 && diff[0].fromB == 0 && diff[0].toB == change.toB - change.fromB)\n continue\n\n if (diff.length == 1) {\n changes[i] = diff[0]\n } else {\n changes.splice(i, 1, ...diff)\n i += diff.length - 1\n }\n }\n\n return new ChangeSet(this.config, changes)\n }\n\n // :: Node\n // The starting document of the change set.\n get startDoc() { return this.config.doc }\n\n // :: (f: (range: Change) → any) → ChangeSet\n // Map the span's data values in the given set through a function\n // and construct a new set with the resulting data.\n map(f) {\n return new ChangeSet(this.config, this.changes.map(change => {\n let data = f(change)\n return data === change.data ? change :\n new Change(change.fromA, change.toA, change.fromB, change.toB, data)\n }))\n }\n\n // :: (ChangeSet, ?[StepMap]) → ?{from: number, to: number}\n // Compare two changesets and return the range in which they are\n // changed, if any. If the document changed between the maps, pass\n // the maps for the steps that changed it as second argument, and\n // make sure the method is called on the old set and passed the new\n // set. The returned positions will be in new document coordinates.\n changedRange(b, maps) {\n if (b == this) return null\n let touched = maps && touchedRange(maps)\n let moved = touched ? (touched.toB - touched.fromB) - (touched.toA - touched.fromA) : 0\n function map(p) {\n return !touched || p <= touched.fromA ? p : p + moved\n }\n\n let from = touched ? touched.fromB : 2e8, to = touched ? touched.toB : -2e8\n function add(start, end = start) {\n from = Math.min(start, from); to = Math.max(end, to)\n }\n\n let rA = this.changes, rB = b.changes\n for (let iA = 0, iB = 0; iA < rA.length && iB < rB.length;) {\n let rangeA = rA[iA], rangeB = rB[iB]\n if (rangeA && rangeB && sameRanges(rangeA, rangeB, map)) { iA++; iB++ }\n else if (rangeB && (!rangeA || map(rangeA.fromB) >= rangeB.fromB)) { add(rangeB.fromB, rangeB.toB); iB++ }\n else { add(map(rangeA.fromB), map(rangeA.toB)); iA++ }\n }\n\n return from <= to ? {from, to} : null\n }\n\n // :: (Node, ?(a: any, b: any) → any) → ChangeSet\n // Create a changeset with the given base object and configuration.\n // The `combine` function is used to compare and combine metadata—it\n // should return null when metadata isn't compatible, and a combined\n // version for a merged range when it is.\n static create(doc, combine = (a, b) => a === b ? a : null) {\n return new ChangeSet({combine, doc}, [], [])\n }\n}\n\n// Exported for testing\nChangeSet.computeDiff = computeDiff\n\n// : ([[Change]], (any, any) → any, number, number) → [Change]\n// Divide-and-conquer approach to merging a series of ranges.\nfunction mergeAll(ranges, combine, start = 0, end = ranges.length) {\n if (end == start + 1) return [ranges[start]]\n let mid = (start + end) >> 1\n return Change.merge(mergeAll(ranges, combine, start, mid),\n mergeAll(ranges, combine, mid, end), combine)\n}\n\nfunction endRange(maps) {\n let from = 2e8, to = -2e8\n for (let i = 0; i < maps.length; i++) {\n let map = maps[i]\n if (from != 2e8) {\n from = map.map(from, -1)\n to = map.map(to, 1)\n }\n map.forEach((_s, _e, start, end) => {\n from = Math.min(from, start)\n to = Math.max(to, end)\n })\n }\n return from == 2e8 ? null : {from, to}\n}\n\nfunction touchedRange(maps) {\n let b = endRange(maps)\n if (!b) return null\n let a = endRange(maps.map(m => m.invert()).reverse())\n return {fromA: a.from, toA: a.to, fromB: b.from, toB: b.to}\n}\n\nfunction sameRanges(a, b, map) {\n return map(a.fromB) == b.fromB && map(a.toB) == b.toB &&\n sameSpans(a.deleted, b.deleted) && sameSpans(a.inserted, b.inserted)\n}\n\nfunction sameSpans(a, b) {\n if (a.length != b.length) return false\n for (let i = 0; i < a.length; i++)\n if (a[i].length != b[i].length || a[i].data !== b[i].data) return false\n return true\n}\n"],"names":["let","const","i","next","prev","prototypeAccessors","off","from","to","last","this"],"mappings":"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"} |
| {"version":3,"file":"index.js","sources":["../src/diff.js","../src/change.js","../src/simplify.js","../src/changeset.js"],"sourcesContent":["// Convert the given range of a fragment to tokens, where node open\n// tokens are encoded as strings holding the node name, characters as\n// their character code, and node close tokens as -1.\nfunction tokens(frag, start, end, target) {\n for (let i = 0, off = 0; i < frag.childCount; i++) {\n let child = frag.child(i), endOff = off + child.nodeSize\n let from = Math.max(off, start), to = Math.min(endOff, end)\n if (from < to) {\n if (child.isText) {\n for (let j = from; j < to; j++) target.push(child.text.charCodeAt(j - off))\n } else if (child.isLeaf) {\n target.push(child.type.name)\n } else {\n if (from == off) target.push(child.type.name)\n tokens(child.content, Math.max(off + 1, from) - off - 1, Math.min(endOff - 1, to) - off - 1, target)\n if (to == endOff) target.push(-1)\n }\n }\n off = endOff\n }\n return target\n}\n\n// The code below will refuse to compute a diff with more than 5000\n// insertions or deletions, which takes about 300ms to reach on my\n// machine. This is a safeguard against runaway computations.\nconst MAX_DIFF_SIZE = 5000\n\n// This obscure mess of constants computes the minimum length of an\n// unchanged range (not at the start/end of the compared content). The\n// idea is to make it higher in bigger replacements, so that you don't\n// get a diff soup of coincidentally identical letters when replacing\n// a paragraph.\nfunction minUnchanged(sizeA, sizeB) {\n return Math.min(15, Math.max(2, Math.floor(Math.max(sizeA, sizeB) / 10)))\n}\n\n// : (Fragment, Fragment, Change) → [Change]\nexport function computeDiff(fragA, fragB, range) {\n let tokA = tokens(fragA, range.fromA, range.toA, [])\n let tokB = tokens(fragB, range.fromB, range.toB, [])\n\n // Scan from both sides to cheaply eliminate work\n let start = 0, endA = tokA.length, endB = tokB.length\n while (start < tokA.length && start < tokB.length && tokA[start] === tokB[start]) start++\n if (start == tokA.length && start == tokB.length) return []\n while (endA > start && endB > start && tokA[endA - 1] === tokB[endB - 1]) endA--, endB--\n // If the result is simple _or_ too big to cheaply compute, return\n // the remaining region as the diff\n if (endA == start || endB == start || (endA == endB && endA == start + 1))\n return [range.slice(start, endA, start, endB)]\n\n // This is an implementation of Myers' diff algorithm\n // See https://neil.fraser.name/writing/diff/myers.pdf and\n // https://blog.jcoglan.com/2017/02/12/the-myers-diff-algorithm-part-1/\n\n let lenA = endA - start, lenB = endB - start\n let max = Math.min(MAX_DIFF_SIZE, lenA + lenB), off = max + 1\n let history = []\n let frontier = []\n for (let len = off * 2, i = 0; i < len; i++) frontier[i] = -1\n\n for (let size = 0; size <= max; size++) {\n for (let diag = -size; diag <= size; diag += 2) {\n let next = frontier[diag + 1 + max], prev = frontier[diag - 1 + max]\n let x = next < prev ? prev : next + 1, y = x + diag\n while (x < lenA && y < lenB && tokA[start + x] === tokB[start + y]) x++, y++\n frontier[diag + max] = x\n // Found a match\n if (x >= lenA && y >= lenB) {\n // Trace back through the history to build up a set of changed ranges.\n let diff = [], minSpan = minUnchanged(endA - start, endB - start)\n // Used to add steps to a diff one at a time, back to front, merging\n // ones that are less than minSpan tokens apart\n let fromA = -1, toA = -1, fromB = -1, toB = -1\n let add = (fA, tA, fB, tB) => {\n if (fromA > -1 && fromA < tA + minSpan) {\n fromA = fA; fromB = fB\n } else {\n if (fromA > -1)\n diff.push(range.slice(fromA, toA, fromB, toB))\n fromA = fA; toA = tA\n fromB = fB; toB = tB\n }\n }\n\n for (let i = size - 1; i >= 0; i--) {\n let next = frontier[diag + 1 + max], prev = frontier[diag - 1 + max]\n if (next < prev) { // Deletion\n diag--\n x = prev + start; y = x + diag\n add(x, x, y, y + 1)\n } else { // Insertion\n diag++\n x = next + start; y = x + diag\n add(x, x + 1, y, y)\n }\n frontier = history[i >> 1]\n }\n if (fromA > -1) diff.push(range.slice(fromA, toA, fromB, toB))\n return diff.reverse()\n }\n }\n // Since only either odd or even diagonals are read from each\n // frontier, we only copy them every other iteration.\n if (size % 2 == 0) history.push(frontier.slice())\n }\n // The loop exited, meaning the maximum amount of work was done.\n // Just return a change spanning the entire range.\n return [range.slice(start, endA, start, endB)]\n}\n","// ::- Stores metadata for a part of a change.\nexport class Span {\n constructor(length, data) {\n // :: number\n this.length = length\n // :: any\n this.data = data\n }\n\n cut(length) {\n return length == this.length ? this : new Span(length, this.data)\n }\n\n static slice(spans, from, to) {\n if (from == to) return Span.none\n if (from == 0 && to == Span.len(spans)) return spans\n let result = []\n for (let i = 0, off = 0; off < to; i++) {\n let span = spans[i], end = off + span.length\n let overlap = Math.min(to, end) - Math.max(from, off)\n if (overlap > 0) result.push(span.cut(overlap))\n off = end\n }\n return result\n }\n\n static join(a, b, combine) {\n if (a.length == 0) return b\n if (b.length == 0) return a\n let combined = combine(a[a.length - 1].data, b[0].data)\n if (combined == null) return a.concat(b)\n let result = a.slice(0, a.length - 1)\n result.push(new Span(a[a.length - 1].length + b[0].length, combined))\n for (let i = 1; i < b.length; i++) result.push(b[i])\n return result\n }\n\n static len(spans) {\n let len = 0\n for (let i = 0; i < spans.length; i++) len += spans[i].length\n return len\n }\n}\n\nSpan.none = []\n\n// ::- A replaced range with metadata associated with it.\nexport class Change {\n constructor(fromA, toA, fromB, toB, deleted, inserted) {\n // :: number The start of the range deleted/replaced in the old\n // document.\n this.fromA = fromA\n // :: number The end of the range in the old document.\n this.toA = toA\n // :: number The start of the range inserted in the new document.\n this.fromB = fromB\n // :: number The end of the range in the new document.\n this.toB = toB\n // :: [Span] Data associated with the deleted content. The length\n // of these spans adds up to `this.toA - this.fromA`.\n this.deleted = deleted\n // :: [Span] Data associated with the inserted content. Length\n // adds up to `this.toB - this.toA`.\n this.inserted = inserted\n }\n\n get lenA() { return this.toA - this.fromA }\n get lenB() { return this.toB - this.fromB }\n\n slice(startA, endA, startB, endB) {\n if (startA == 0 && startB == 0 && endA == this.toA - this.fromA &&\n endB == this.toB - this.fromB) return this\n return new Change(this.fromA + startA, this.fromA + endA,\n this.fromB + startB, this.fromB + endB,\n Span.slice(this.deleted, startA, endA),\n Span.slice(this.inserted, startB, endB))\n }\n\n // : ([Change], [Change], (any, any) → any) → [Change]\n // This merges two changesets (the end document of x should be the\n // start document of y) into a single one spanning the start of x to\n // the end of y.\n static merge(x, y, combine) {\n if (x.length == 0) return y\n if (y.length == 0) return x\n\n let result = []\n // Iterate over both sets in parallel, using the middle coordinate\n // system (B in x, A in y) to synchronize.\n for (let iX = 0, iY = 0, curX = x[0], curY = y[0];;) {\n if (!curX && !curY) {\n return result\n } else if (curX && (!curY || curX.toB < curY.fromA)) { // curX entirely in front of curY\n let off = iY ? y[iY - 1].toB - y[iY - 1].toA : 0\n result.push(off == 0 ? curX :\n new Change(curX.fromA, curX.toA, curX.fromB + off, curX.toB + off,\n curX.deleted, curX.inserted))\n curX = iX++ == x.length ? null : x[iX]\n } else if (curY && (!curX || curY.toA < curX.fromB)) { // curY entirely in front of curX\n let off = iX ? x[iX - 1].toB - x[iX - 1].toA : 0\n result.push(off == 0 ? curY :\n new Change(curY.fromA - off, curY.toA - off, curY.fromB, curY.toB,\n curY.deleted, curY.inserted))\n curY = iY++ == y.length ? null : y[iY]\n } else { // Touch, need to merge\n // The rules for merging ranges are that deletions from the\n // old set and insertions from the new are kept. Areas of the\n // middle document covered by a but not by b are insertions\n // from a that need to be added, and areas covered by b but\n // not a are deletions from b that need to be added.\n let pos = Math.min(curX.fromB, curY.fromA)\n let fromA = Math.min(curX.fromA, curY.fromA - (iX ? x[iX - 1].toB - x[iX - 1].toA : 0)), toA = fromA\n let fromB = Math.min(curY.fromB, curX.fromB + (iY ? y[iY - 1].toB - y[iY - 1].toA : 0)), toB = fromB\n let deleted = Span.none, inserted = Span.none\n\n // Used to prevent appending ins/del range for the same Change twice\n let enteredX = false, enteredY = false\n\n // Need to have an inner loop since any number of further\n // ranges might be touching this group\n for (;;) {\n let nextX = !curX ? 2e8 : pos >= curX.fromB ? curX.toB : curX.fromB\n let nextY = !curY ? 2e8 : pos >= curY.fromA ? curY.toA : curY.fromA\n let next = Math.min(nextX, nextY)\n let inX = curX && pos >= curX.fromB, inY = curY && pos >= curY.fromA\n if (!inX && !inY) break\n if (inX && pos == curX.fromB && !enteredX) {\n deleted = Span.join(deleted, curX.deleted, combine)\n toA += curX.lenA\n enteredX = true\n }\n if (inX && !inY) {\n inserted = Span.join(inserted, Span.slice(curX.inserted, pos - curX.fromB, next - curX.fromB), combine)\n toB += next - pos\n }\n if (inY && pos == curY.fromA && !enteredY) {\n inserted = Span.join(inserted, curY.inserted, combine)\n toB += curY.lenB\n enteredY = true\n }\n if (inY && !inX) {\n deleted = Span.join(deleted, Span.slice(curY.deleted, pos - curY.fromA, next - curY.fromA), combine)\n toA += next - pos\n }\n\n if (inX && next == curX.toB) {\n curX = iX++ == x.length ? null : x[iX]\n enteredX = false\n }\n if (inY && next == curY.toA) {\n curY = iY++ == y.length ? null : y[iY]\n enteredY = false\n }\n pos = next\n }\n if (fromA < toA || fromB < toB)\n result.push(new Change(fromA, toA, fromB, toB, deleted, inserted))\n }\n }\n }\n}\n","import {Span, Change} from \"./change\"\n\nlet letter\n// If the runtime support unicode properties in regexps, that's a good\n// source of info on whether something is a letter.\ntry { letter = new RegExp(\"[\\\\p{Alphabetic}_]\", \"u\") } catch(_) {}\n\n// Otherwise, we see if the character changes when upper/lowercased,\n// or if it is part of these common single-case scripts.\nconst nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/\n\nfunction isLetter(code) {\n if (code < 128)\n return code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 79 && code <= 122\n let ch = String.fromCharCode(code)\n if (letter) return letter.test(ch)\n return ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)\n}\n\n// Convert a range of document into a string, so that we can easily\n// access characters at a given position. Treat non-text tokens as\n// spaces so that they aren't considered part of a word.\nfunction getText(frag, start, end) {\n let out = \"\"\n function convert(frag, start, end) {\n for (let i = 0, off = 0; i < frag.childCount; i++) {\n let child = frag.child(i), endOff = off + child.nodeSize\n let from = Math.max(off, start), to = Math.min(endOff, end)\n if (from < to) {\n if (child.isText) {\n out += child.text.slice(Math.max(0, start - off), Math.min(child.text.length, end - off))\n } else if (child.isLeaf) {\n out += \" \"\n } else {\n if (from == off) out += \" \"\n convert(child.content, Math.max(0, from - off - 1), Math.min(child.content.size, end - off))\n if (to == endOff) out += \" \"\n }\n }\n off = endOff\n }\n }\n convert(frag, start, end)\n return out\n}\n\n// The distance changes have to be apart for us to not consider them\n// candidates for merging.\nconst MAX_SIMPLIFY_DISTANCE = 30\n\n// :: ([Change], Node) → [Change]\n// Simplifies a set of changes for presentation. This makes the\n// assumption that having both insertions and deletions within a word\n// is confusing, and, when such changes occur without a word boundary\n// between them, they should be expanded to cover the entire set of\n// words (in the new document) they touch. An exception is made for\n// single-character replacements.\nexport function simplifyChanges(changes, doc) {\n let result = []\n for (let i = 0; i < changes.length; i++) {\n let end = changes[i].toB, start = i\n while (i < changes.length - 1 && changes[i + 1].fromB <= end + MAX_SIMPLIFY_DISTANCE)\n end = changes[++i].toB\n simplifyAdjacentChanges(changes, start, i + 1, doc, result)\n }\n return result\n}\n\nfunction simplifyAdjacentChanges(changes, from, to, doc, target) {\n let start = Math.max(0, changes[from].fromB - MAX_SIMPLIFY_DISTANCE)\n let end = Math.min(doc.content.size, changes[to - 1].toB + MAX_SIMPLIFY_DISTANCE)\n let text = getText(doc.content, start, end)\n\n for (let i = from; i < to; i++) {\n let startI = i, last = changes[i], deleted = last.lenA, inserted = last.lenB\n while (i < to - 1) {\n let next = changes[i + 1], boundary = false\n let prevLetter = last.toB == end ? false : isLetter(text.charCodeAt(last.toB - 1 - start))\n for (let pos = last.toB; !boundary && pos < next.fromB; pos++) {\n let nextLetter = pos == end ? false : isLetter(text.charCodeAt(pos - start))\n if ((!prevLetter || !nextLetter) && pos != changes[startI].fromB) boundary = true\n prevLetter = nextLetter\n }\n if (boundary) break\n deleted += next.lenA; inserted += next.lenB\n last = next\n i++\n }\n\n if (inserted > 0 && deleted > 0 && !(inserted == 1 && deleted == 1)) {\n let from = changes[startI].fromB, to = changes[i].toB\n if (from < end && isLetter(text.charCodeAt(from - start)))\n while (from > start && isLetter(text.charCodeAt(from - 1 - start))) from--\n if (to > start && isLetter(text.charCodeAt(to - 1 - start)))\n while (to < end && isLetter(text.charCodeAt(to - start))) to++\n let joined = fillChange(changes.slice(startI, i + 1), from, to)\n let last = target.length ? target[target.length - 1] : null\n if (last && last.toA == joined.fromA)\n target[target.length - 1] = new Change(last.fromA, joined.toA, last.fromB, joined.toB,\n last.deleted.concat(joined.deleted), last.inserted.concat(joined.inserted))\n else\n target.push(joined)\n } else {\n for (let j = startI; j <= i; j++) target.push(changes[j])\n }\n }\n return changes\n}\n\nfunction combine(a, b) { return a === b ? a : null }\n\nfunction fillChange(changes, fromB, toB) {\n let fromA = changes[0].fromA - (changes[0].fromB - fromB)\n let last = changes[changes.length - 1]\n let toA = last.toA + (toB - last.toB)\n let deleted = Span.none, inserted = Span.none\n let delData = (changes[0].deleted.length ? changes[0].deleted : changes[0].inserted)[0].data\n let insData = (changes[0].inserted.length ? changes[0].inserted : changes[0].deleted)[0].data\n for (let posA = fromA, posB = fromB, i = 0;; i++) {\n let next = i == changes.length ? null : changes[i]\n let endA = next ? next.fromA : toA, endB = next ? next.fromB : toB\n if (endA > posA) deleted = Span.join(deleted, [new Span(endA - posA, delData)], combine)\n if (endB > posB) inserted = Span.join(inserted, [new Span(endB - posB, insData)], combine)\n if (!next) break\n deleted = Span.join(deleted, next.deleted, combine)\n inserted = Span.join(inserted, next.inserted, combine)\n if (deleted.length) delData = deleted[deleted.length - 1].data\n if (inserted.length) insData = inserted[inserted.length - 1].data\n posA = next.toA; posB = next.toB\n }\n return new Change(fromA, toA, fromB, toB, deleted, inserted)\n}\n","import {computeDiff} from \"./diff\"\nimport {Change, Span} from \"./change\"\nexport {Change, Span}\nexport {simplifyChanges} from \"./simplify\"\n\n// ::- A change set tracks the changes to a document from a given\n// point in the past. It condenses a number of step maps down to a\n// flat sequence of replacements, and simplifies replacments that\n// partially undo themselves by comparing their content.\nexport class ChangeSet {\n constructor(config, changes) {\n this.config = config\n // :: [Change] Replaced regions.\n this.changes = changes\n }\n\n // :: (Node, [StepMap], union<[any], any>) → ChangeSet\n // Computes a new changeset by adding the given step maps and\n // metadata (either as an array, per-map, or as a single value to be\n // associated with all maps) to the current set. Will not mutate the\n // old set.\n //\n // Note that due to simplification that happens after each add,\n // incrementally adding steps might create a different final set\n // than adding all those changes at once, since different document\n // tokens might be matched during simplification depending on the\n // boundaries of the current changed ranges.\n addSteps(newDoc, maps, data) {\n // This works by inspecting the position maps for the changes,\n // which indicate what parts of the document were replaced by new\n // content, and the size of that new content. It uses these to\n // build up Change objects.\n //\n // These change objects are put in sets and merged together using\n // Change.merge, giving us the changes created by the new steps.\n // Those changes can then be merged with the existing set of\n // changes.\n //\n // For each change that was touched by the new steps, we recompute\n // a diff to try to minimize the change by dropping matching\n // pieces of the old and new document from the change.\n\n let stepChanges = []\n // Add spans for new steps.\n for (let i = 0; i < maps.length; i++) {\n let d = Array.isArray(data) ? data[i] : data\n let off = 0\n maps[i].forEach((fromA, toA, fromB, toB) => {\n\n stepChanges.push(new Change(fromA + off, toA + off, fromB, toB,\n fromA == toA ? Span.none : [new Span(toA - fromA, d)],\n fromB == toB ? Span.none : [new Span(toB - fromB, d)]))\n\n off = (toB - fromB) - (toA - fromA)\n })\n }\n if (stepChanges.length == 0) return this\n\n let newChanges = mergeAll(stepChanges, this.config.combine)\n let changes = Change.merge(this.changes, newChanges, this.config.combine)\n\n // Minimize changes when possible\n for (let i = 0; i < changes.length; i++) {\n let change = changes[i]\n if (change.fromA == change.toA || change.fromB == change.toB ||\n // Only look at changes that touch newly added changed ranges\n !newChanges.some(r => r.toB > change.fromB && r.fromB < change.toB)) continue\n let diff = computeDiff(this.config.doc.content, newDoc.content, change)\n\n // Fast path: If they are completely different, don't do anything\n if (diff.length == 1 && diff[0].fromB == 0 && diff[0].toB == change.toB - change.fromB)\n continue\n\n if (diff.length == 1) {\n changes[i] = diff[0]\n } else {\n changes.splice(i, 1, ...diff)\n i += diff.length - 1\n }\n }\n\n return new ChangeSet(this.config, changes)\n }\n\n // :: Node\n // The starting document of the change set.\n get startDoc() { return this.config.doc }\n\n // :: (f: (range: Change) → any) → ChangeSet\n // Map the span's data values in the given set through a function\n // and construct a new set with the resulting data.\n map(f) {\n return new ChangeSet(this.config, this.changes.map(change => {\n let data = f(change)\n return data === change.data ? change :\n new Change(change.fromA, change.toA, change.fromB, change.toB, data)\n }))\n }\n\n // :: (ChangeSet, ?[StepMap]) → ?{from: number, to: number}\n // Compare two changesets and return the range in which they are\n // changed, if any. If the document changed between the maps, pass\n // the maps for the steps that changed it as second argument, and\n // make sure the method is called on the old set and passed the new\n // set. The returned positions will be in new document coordinates.\n changedRange(b, maps) {\n if (b == this) return null\n let touched = maps && touchedRange(maps)\n let moved = touched ? (touched.toB - touched.fromB) - (touched.toA - touched.fromA) : 0\n function map(p) {\n return !touched || p <= touched.fromA ? p : p + moved\n }\n\n let from = touched ? touched.fromB : 2e8, to = touched ? touched.toB : -2e8\n function add(start, end = start) {\n from = Math.min(start, from); to = Math.max(end, to)\n }\n\n let rA = this.changes, rB = b.changes\n for (let iA = 0, iB = 0; iA < rA.length && iB < rB.length;) {\n let rangeA = rA[iA], rangeB = rB[iB]\n if (rangeA && rangeB && sameRanges(rangeA, rangeB, map)) { iA++; iB++ }\n else if (rangeB && (!rangeA || map(rangeA.fromB) >= rangeB.fromB)) { add(rangeB.fromB, rangeB.toB); iB++ }\n else { add(map(rangeA.fromB), map(rangeA.toB)); iA++ }\n }\n\n return from <= to ? {from, to} : null\n }\n\n // :: (Node, ?(a: any, b: any) → any) → ChangeSet\n // Create a changeset with the given base object and configuration.\n // The `combine` function is used to compare and combine metadata—it\n // should return null when metadata isn't compatible, and a combined\n // version for a merged range when it is.\n static create(doc, combine = (a, b) => a === b ? a : null) {\n return new ChangeSet({combine, doc}, [], [])\n }\n}\n\n// Exported for testing\nChangeSet.computeDiff = computeDiff\n\n// : ([[Change]], (any, any) → any, number, number) → [Change]\n// Divide-and-conquer approach to merging a series of ranges.\nfunction mergeAll(ranges, combine, start = 0, end = ranges.length) {\n if (end == start + 1) return [ranges[start]]\n let mid = (start + end) >> 1\n return Change.merge(mergeAll(ranges, combine, start, mid),\n mergeAll(ranges, combine, mid, end), combine)\n}\n\nfunction endRange(maps) {\n let from = 2e8, to = -2e8\n for (let i = 0; i < maps.length; i++) {\n let map = maps[i]\n if (from != 2e8) {\n from = map.map(from, -1)\n to = map.map(to, 1)\n }\n map.forEach((_s, _e, start, end) => {\n from = Math.min(from, start)\n to = Math.max(to, end)\n })\n }\n return from == 2e8 ? null : {from, to}\n}\n\nfunction touchedRange(maps) {\n let b = endRange(maps)\n if (!b) return null\n let a = endRange(maps.map(m => m.invert()).reverse())\n return {fromA: a.from, toA: a.to, fromB: b.from, toB: b.to}\n}\n\nfunction sameRanges(a, b, map) {\n return map(a.fromB) == b.fromB && map(a.toB) == b.toB &&\n sameSpans(a.deleted, b.deleted) && sameSpans(a.inserted, b.inserted)\n}\n\nfunction sameSpans(a, b) {\n if (a.length != b.length) return false\n for (let i = 0; i < a.length; i++)\n if (a[i].length != b[i].length || a[i].data !== b[i].data) return false\n return true\n}\n"],"names":["let","const","i","next","prev","prototypeAccessors","off","from","to","last","this"],"mappings":"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"} |
112160
-53.02%18
-10%2274
-19.1%