diff --git a/www/common/cursor.js b/www/common/cursor.js index e72585bb8..b19c02850 100644 --- a/www/common/cursor.js +++ b/www/common/cursor.js @@ -124,6 +124,7 @@ define([ cursor.pushDelta = function (oldVal, newVal) { if (oldVal === newVal) { return; } + var commonStart = 0; while (oldVal.charAt(commonStart) === newVal.charAt(commonStart)) { commonStart++; @@ -156,6 +157,31 @@ define([ }; }; + cursor.transformRange = function (cursorRange, ops) { + var transformCursor = function (cursor, op) { + if (!op) { return cursor; } + + var pos = op.offset; + var remove = op.toRemove; + var insert = op.toInsert.length; + if (typeof cursor === 'undefined') { return; } + if (typeof remove === 'number' && pos < cursor) { + cursor -= Math.min(remove, cursor - pos); + } + if (typeof insert === 'number' && pos < cursor) { + cursor += insert; + } + return cursor; + }; + var c = cursorRange.offset; + if (Array.isArray(ops)) { + for (var i = ops.length - 1; i >= 0; i--) { + c = transformCursor(c, ops[i]); + } + cursorRange.offset = c; + } + }; + cursor.brFix = function () { cursor.update(); var start = Range.start; diff --git a/www/common/sframe-app-framework.js b/www/common/sframe-app-framework.js index b26c60583..a19979c5b 100644 --- a/www/common/sframe-app-framework.js +++ b/www/common/sframe-app-framework.js @@ -259,6 +259,9 @@ define([ if (content === UNINITIALIZED) { return; } throw new Error("Content must be an object or array, type is " + typeof(content)); } + + oldContent = content; + if (Array.isArray(content)) { // Pad content.push({ metadata: cpNfInner.metadataMgr.getMetadataLazy() }); diff --git a/www/pad/inner.js b/www/pad/inner.js index 4cbbf9fb6..84da3c211 100644 --- a/www/pad/inner.js +++ b/www/pad/inner.js @@ -318,20 +318,23 @@ define([ if (!frame) { return; } - if (typeof info.diff.oldValue === 'string' && typeof info.diff.newValue === 'string') { - var pushes = cursor.pushDelta(info.diff.oldValue, info.diff.newValue); + if (frame && typeof info.diff.oldValue === 'string' && typeof info.diff.newValue === 'string') { + //var pushes = cursor.pushDelta(info.diff.oldValue, info.diff.newValue); + var ops = ChainPad.Diff.diff(info.diff.oldValue, info.diff.newValue); if (frame & 1) { // push cursor start if necessary - if (pushes.commonStart < cursor.Range.start.offset) { + cursor.transformRange(cursor.Range.start, ops); + /*if (pushes.commonStart < cursor.Range.start.offset) { cursor.Range.start.offset += pushes.delta; - } + }*/ } if (frame & 2) { // push cursor end if necessary - if (pushes.commonStart < cursor.Range.end.offset) { + cursor.transformRange(cursor.Range.end, ops); + /*if (pushes.commonStart < cursor.Range.end.offset) { cursor.Range.end.offset += pushes.delta; - } + }*/ } } },