simplify apply_delta.js
This commit is contained in:
parent
c8d1df203e
commit
46f3d77068
1 changed files with 14 additions and 31 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue