Skip to content

Commit e52e069

Browse files
committed
fix diff issue
1 parent 199c3df commit e52e069

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

src/delta/delta.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,10 +1174,12 @@ export const slice = (d, start = 0, end = d.childCnt, currNode = d.children.star
11741174
}
11751175
while (currNode != null && currNode.length <= remainingLen) {
11761176
list.pushEnd(cpy.children, currNode.clone())
1177+
remainingLen -= currNode.length
11771178
currNode = currNode.next
11781179
}
11791180
if (currNode != null && remainingLen > 0) {
11801181
list.pushEnd(cpy.children, currNode.clone(0, remainingLen))
1182+
remainingLen -= math.min(currNode.length, remainingLen)
11811183
}
11821184
cpy.childCnt = slicedLen - remainingLen
11831185
// @ts-ignore
@@ -1621,7 +1623,7 @@ export class DeltaBuilder extends Delta {
16211623
remainingLen -= delLen
16221624
}
16231625
}
1624-
} else if ($modifyAttrOp.check(op)) {
1626+
} else if ($modifyOp.check(op)) {
16251627
if (opsI == null) {
16261628
list.pushEnd(this.children, op.clone())
16271629
this.childCnt += 1
@@ -2230,11 +2232,12 @@ export const diff = (d1, d2) => {
22302232
const cd = cdiff[i]
22312233
cd.remove = isContent.slice(cd.index, cd.index + cd.remove.length)
22322234
cd.insert = shouldContent.slice(cd.index + adj, cd.index + adj + cd.insert.length)
2233-
adj += cd.remove.length - cd.insert.length
2235+
adj += cd.insert.length - cd.remove.length
22342236
}
22352237
for (let i = 0, lastIndex = 0; i < cdiff.length; i++) {
22362238
const cd = cdiff[i]
22372239
d.retain(cd.index - lastIndex)
2240+
lastIndex = cd.index
22382241
let cdii = 0
22392242
let cdri = 0
22402243
// try to match as much content as possible, preferring to skip over non-deltas

src/delta/delta.test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -781,3 +781,13 @@ export const testDeltaTypings = () => {
781781
/**
782782
* @typedef {IsDeltaOpAny<delta.DeleteOp<{text:true}>>} DeltaOpTestAnyDeleteOp2
783783
*/
784+
785+
export const testDeltaDiffIssue1 = () => {
786+
const stateA = delta.create().insert([delta.create('paragraph').setAttr('ychange', null).insert('ABCDEFGHIJKLMNOPQRSTUVWXYZ')])
787+
const stateB = delta.create().insert([delta.create('paragraph').setAttr('ychange', null).insert('ABCDE123FGHIJKLMNOPQRSTUVWXYZ2sawfa')])
788+
const expectedDiff = delta.create().modify(delta.create().retain(5).insert('123').retain(21).insert('2sawfa'))
789+
const diffResult = delta.diff(stateA, stateB)
790+
const synced = delta.clone(stateA).apply(diffResult)
791+
t.assert(synced.equals(stateB))
792+
t.assert(expectedDiff.equals(diffResult))
793+
}

0 commit comments

Comments
 (0)