simplify apply_delta.js

This commit is contained in:
nightwing 2014-01-19 04:27:07 +04:00
commit 46f3d77068

View file

@ -31,19 +31,6 @@
define(function(require, exports, module) { define(function(require, exports, module) {
"use strict"; "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){ function throwDeltaError(delta, errorText){
console.log("Invalid Delta:", delta); console.log("Invalid Delta:", delta);
throw "Invalid Delta: " + errorText; throw "Invalid Delta: " + errorText;
@ -91,44 +78,40 @@ exports.applyDelta = function(docLines, delta, doNotValidate) {
if (!doNotValidate) if (!doNotValidate)
validateDelta(docLines, delta); validateDelta(docLines, delta);
var row = delta.start.row;
var startColumn = delta.start.column;
var line = docLines[row];
// Apply delta. // Apply delta.
if (delta.start.row == delta.end.row) { if (row == delta.end.row) {
// Apply single-line delta. // Apply single-line delta.
// Note: The multi-line code below correctly handle single-line // Note: The multi-line code below correctly handle single-line
// deltas too, but we need to short-circuit for speed. // 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 endColumn = delta.end.column;
var line = docLines[row];
switch (delta.action) { switch (delta.action) {
case "insert": case "insert":
docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);
break; break;
case "remove": case "remove":
docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);
break; break;
} }
} else { } else {
// Apply multi-line delta. // Apply multi-line delta.
switch (delta.action) { switch (delta.action) {
case "insert": case "insert":
splitLine(docLines, delta.start); var line = docLines[row];
docLines.splice.apply(docLines, [delta.start.row + 1, 0].concat(delta.lines)); var args = [row, 1].concat(delta.lines);
joinLineWithNext(docLines, delta.start.row); docLines.splice.apply(docLines, args);
joinLineWithNext(docLines, delta.end.row); docLines[row] = line.substring(0, startColumn) + docLines[row];
docLines[row + delta.lines.length - 1] += line.substring(startColumn);
break; break;
case "remove": case "remove":
splitLine(docLines, delta.end); var endRow
splitLine(docLines, delta.start);
docLines.splice( docLines.splice(
delta.start.row + 1, // Where to start deleting row, // Where to start deleting
delta.end.row - delta.start.row + 1 // Num lines to delete. 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; break;
} }
} }