fix backwards edge case
This commit is contained in:
parent
4a8ebc31f7
commit
40c3be1732
@ -54,7 +54,21 @@ export const useSearchMarker = (tr, yarray, index, f) => {
|
||||
if (createFreshMarker) {
|
||||
searchMarker.push(fsm)
|
||||
}
|
||||
const diff = fsm.index - index
|
||||
if (diff > 0) {
|
||||
fsm.backward(tr, diff)
|
||||
} else {
|
||||
fsm.forward(tr, -diff)
|
||||
}
|
||||
const result = f(fsm)
|
||||
if (fsm.reachedEnd) {
|
||||
fsm.reachedEnd = false
|
||||
const nextItem = /** @type {Item} */ (fsm.nextItem)
|
||||
if (nextItem.countable && !nextItem.deleted) {
|
||||
fsm.index -= nextItem.length
|
||||
}
|
||||
fsm.rel = 0
|
||||
}
|
||||
if (!createFreshMarker && fsm.nextItem !== prevItem) {
|
||||
// reused old marker and we moved to a different position
|
||||
prevItem.marker = false
|
||||
@ -76,22 +90,25 @@ export const useSearchMarker = (tr, yarray, index, f) => {
|
||||
*
|
||||
* This should be called before doing a deletion!
|
||||
*
|
||||
* @param {Transaction} tr
|
||||
* @param {Array<ListIterator>} searchMarker
|
||||
* @param {number} index
|
||||
* @param {number} len If insertion, len is positive. If deletion, len is negative.
|
||||
* @param {ListIterator} origSearchMarker Do not update this searchmarker because it is the one we used to manipulate.
|
||||
*/
|
||||
export const updateMarkerChanges = (tr, searchMarker, index, len) => {
|
||||
export const updateMarkerChanges = (searchMarker, index, len, origSearchMarker) => {
|
||||
for (let i = searchMarker.length - 1; i >= 0; i--) {
|
||||
const marker = searchMarker[i]
|
||||
if (len > 0 && index === marker.index) {
|
||||
// inserting at a marked position deletes the marked position because we can't do a simple transformation
|
||||
// (we don't know whether to insert directly before or directly after the position)
|
||||
searchMarker.splice(i, 1)
|
||||
continue
|
||||
}
|
||||
if (index < marker.index) { // a simple index <= m.index check would actually suffice
|
||||
marker.index = math.max(index, marker.index + len)
|
||||
if (marker !== origSearchMarker) {
|
||||
if (len > 0 && index === marker.index) {
|
||||
// inserting at a marked position deletes the marked position because we can't do a simple transformation
|
||||
// (we don't know whether to insert directly before or directly after the position)
|
||||
searchMarker.splice(i, 1)
|
||||
if (marker.nextItem) marker.nextItem.marker = false
|
||||
continue
|
||||
}
|
||||
if (index < marker.index) { // a simple index <= m.index check would actually suffice
|
||||
marker.index = math.max(index, marker.index + len)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -202,7 +202,7 @@ export class ListIterator {
|
||||
item = item.left
|
||||
}
|
||||
this.index -= len
|
||||
this.nextItem = item
|
||||
this.nextItem = item && item.right
|
||||
return this
|
||||
}
|
||||
|
||||
@ -278,11 +278,12 @@ export class ListIterator {
|
||||
if (item && !this.reachedEnd && len > 0) {
|
||||
this.nextItem = item
|
||||
this.forward(tr, 0)
|
||||
item = this.nextItem
|
||||
}
|
||||
}
|
||||
this.nextItem = item
|
||||
if (sm) {
|
||||
updateMarkerChanges(tr, sm, this.index, -startLength + len)
|
||||
updateMarkerChanges(sm, this.index, -startLength + len, this)
|
||||
}
|
||||
}
|
||||
|
||||
@ -369,7 +370,7 @@ export class ListIterator {
|
||||
this.nextItem = right
|
||||
}
|
||||
if (sm) {
|
||||
updateMarkerChanges(tr, sm, this.index, content.length)
|
||||
updateMarkerChanges(sm, this.index, content.length, this)
|
||||
}
|
||||
this.index += content.length
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user