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) {
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue