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) {
"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;
}
}