diff --git a/lib/ace/apply_delta.js b/lib/ace/apply_delta.js index 3996920c..ed019ccb 100644 --- a/lib/ace/apply_delta.js +++ b/lib/ace/apply_delta.js @@ -31,19 +31,6 @@ define(function(require, exports, module) { "use strict"; -var Range = require("./range").Range; - -function splitLine (docLines, position) { - var text = docLines[position.row]; - docLines[position.row] = text.slice(0, position.column); - docLines.splice(position.row + 1, 0, text.slice(position.column)); -} - -function joinLineWithNext(docLines, row) { - docLines[row] += docLines[row + 1]; - docLines.splice(row + 1, 1); -} - function throwDeltaError(delta, errorText){ console.log("Invalid Delta:", delta); throw "Invalid Delta: " + errorText; @@ -91,44 +78,40 @@ exports.applyDelta = function(docLines, delta, doNotValidate) { if (!doNotValidate) validateDelta(docLines, delta); + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row]; // Apply delta. - if (delta.start.row == delta.end.row) { + if (row == delta.end.row) { // Apply single-line delta. // Note: The multi-line code below correctly handle single-line // deltas too, but we need to short-circuit for speed. - var row = delta.start.row; - var startColumn = delta.start.column; - var endColumn = delta.end.column; - var line = docLines[row]; + var endColumn = delta.end.column; switch (delta.action) { - case "insert": docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); break; - case "remove": docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); break; } } else { - // Apply multi-line delta. switch (delta.action) { case "insert": - splitLine(docLines, delta.start); - docLines.splice.apply(docLines, [delta.start.row + 1, 0].concat(delta.lines)); - joinLineWithNext(docLines, delta.start.row); - joinLineWithNext(docLines, delta.end.row); + var line = docLines[row]; + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); break; - case "remove": - splitLine(docLines, delta.end); - splitLine(docLines, delta.start); + var endRow docLines.splice( - delta.start.row + 1, // Where to start deleting - delta.end.row - delta.start.row + 1 // Num lines to delete. + row, // Where to start deleting + delta.end.row - delta.start.row + 1, // Num lines to delete. + line.substring(0, startColumn) + docLines[delta.end.row].substring(delta.end.column) ); - joinLineWithNext(docLines, delta.start.row); break; } }