overleaf/services/document-updater/app/coffee/DiffCodec.js

48 lines
1.2 KiB
JavaScript

/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* DS102: Remove unnecessary code created because of implicit returns
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
let DiffCodec;
const {
diff_match_patch
} = require("../lib/diff_match_patch");
const dmp = new diff_match_patch();
module.exports = (DiffCodec = {
ADDED: 1,
REMOVED: -1,
UNCHANGED: 0,
diffAsShareJsOp(before, after, callback) {
if (callback == null) { callback = function(error, ops) {}; }
const diffs = dmp.diff_main(before.join("\n"), after.join("\n"));
dmp.diff_cleanupSemantic(diffs);
const ops = [];
let position = 0;
for (let diff of Array.from(diffs)) {
const type = diff[0];
const content = diff[1];
if (type === this.ADDED) {
ops.push({
i: content,
p: position
});
position += content.length;
} else if (type === this.REMOVED) {
ops.push({
d: content,
p: position
});
} else if (type === this.UNCHANGED) {
position += content.length;
} else {
throw "Unknown type";
}
}
return callback(null, ops);
}
});