Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 81 additions & 4 deletions lib/type.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,79 @@
var Delta = require('quill-delta');

// Slightly modified from the base rich-text implementation
function transformCursor(cursor, delta, isOwnOp) {
// Rewrap in Quill Delta since we seem to get a raw ops object
delta = new Delta(delta);
return delta.transformPosition(cursor, !isOwnOp);
}

// Copied from https://github.com/Teamwork/ot-rich-text/blob/master/src/Operation.js
function createPresence(presence) {
return isValidPresence(presence) ? presence : {
u: '',
c: 0,
s: []
};
}

// Copied from https://github.com/Teamwork/ot-rich-text/blob/master/src/Operation.js
function transformPresence(presence, operation, isOwnOperation) {
var user = presence.u;
var change = presence.c;
var selections = presence.s;
var newSelections = new Array(selections.length);

for (var i = 0, l = selections.length; i < l; ++i) {
var selection = selections[i];
var newStart = transformCursor(selection[0], operation, isOwnOperation);
var newEnd = selection[0] === selection[1] ? newStart : transformCursor(selection[1], operation, isOwnOperation);
newSelections[i] = [newStart, newEnd];
}

return {
u: user,
c: change,
s: newSelections
};
}

// Copied from https://github.com/Teamwork/ot-rich-text/blob/master/src/Operation.js
function comparePresence(presence1, presence2) {
if (presence1 === presence2) {
return true;
}

if (presence1 == null || presence2 == null || presence1.u !== presence2.u || presence1.c !== presence2.c || presence1.s.length !== presence2.s.length) {
return false;
}

for (var i = 0, l = presence1.s.length; i < l; ++i) {
if (presence1.s[i][0] !== presence2.s[i][0] || presence1.s[i][1] !== presence2.s[i][1]) {
return false;
}
}

return true;
}

// Copied from https://github.com/Teamwork/ot-rich-text/blob/master/src/Operation.js
function isValidPresence(presence) {
if (presence == null || typeof presence.u !== 'string' || typeof presence.c !== 'number' || !isFinite(presence.c) || Math.floor(presence.c) !== presence.c || !Array.isArray(presence.s)) {
return false;
}

var selections = presence.s;

for (var i = 0, l = selections.length; i < l; ++i) {
var selection = selections[i];

if (!Array.isArray(selection) || selection.length !== 2 || selection[0] !== (selection[0] | 0) || selection[1] !== (selection[1] | 0)) {
return false;
}
}

return true;
}

module.exports = {
Delta: Delta,
Expand Down Expand Up @@ -36,9 +110,7 @@ module.exports = {
return delta2.transform(delta1, side === 'left');
},

transformCursor: function(cursor, delta, isOwnOp) {
return delta.transformPosition(cursor, !isOwnOp);
},
transformCursor: transformCursor,

normalize: function(delta) {
return delta; // quill-delta is already canonical
Expand All @@ -50,6 +122,11 @@ module.exports = {

deserialize: function(ops) {
return new Delta(ops);
}
},

createPresence: createPresence,
transformPresence: transformPresence,
comparePresence: comparePresence,
isValidPresence: isValidPresence,
}
};