diff --git a/www/vdom/main.js b/www/vdom/main.js index f8f13ce09..9be13486f 100644 --- a/www/vdom/main.js +++ b/www/vdom/main.js @@ -6,9 +6,12 @@ define([ '/common/convert.js', '/common/toolbar.js', '/common/cursor.js', + '/common/Operation.js', '/bower_components/jquery/dist/jquery.min.js', '/customize/pad.js' -], function (Config, Messages, Crypto, realtimeInput, Convert, Toolbar, Cursor) { +], function (Config, Messages, Crypto, realtimeInput, Convert, Toolbar, Cursor, Operation) { + window.Operation = Operation; + var $ = window.jQuery; var ifrw = $('#pad-iframe')[0].contentWindow; window.Ckeditor = ifrw.CKEDITOR; @@ -104,29 +107,53 @@ define([ onInit: onInit, transformFunction : function (text, toTransform, transformBy) { - /* FIXME - operational transform on json shouldn't be in all editors - just those transmitting/expecting JSON - */ - false && console.log({ - text: text, - toTransform: toTransform, - transformBy: transformBy - }); - // returning **null** breaks out of the loop // which transforms conflicting operations // in theory this should prevent us from producing bad JSON return null; - } + }, + + // OT /* - FIXME NOT A REAL FUNCTION WONT WORK - transformFunction: function (state0str, toTransform, transformBy) { - var state1A = JSON.parse(Operation.apply(state0str, transformBy)); - var state1B = JSON.parse(Operation.apply(state0str, toTransform)); - var state0 = JSON.parse(state0str); + transformFunction: function (text, toTransform, transformBy) { + if (toTransform.offset > transformBy.offset) { + if (toTransform.offset > transformBy.offset + transformBy.toRemove) { + // simple rebase + toTransform.offset -= transformBy.toRemove; + toTransform.offset += transformBy.toInsert.length; + + // TODO check that this is using the correct parameters + // TODO get the actual library + // TODO functionize this because it's repeated + + var temp = Operation.apply(text, toTransform) + try { + JSON.parse(temp); + } catch (err) { + console.error(err.stack); + return null; + } + return toTransform; + } + // goto the end, anything you deleted that they also deleted should be skipped. + var newOffset = transformBy.offset + transformBy.toInsert.length; + toTransform.toRemove = 0; //-= (newOffset - toTransform.offset); + if (toTransform.toRemove < 0) { toTransform.toRemove = 0; } + toTransform.offset = newOffset; + if (toTransform.toInsert.length === 0 && toTransform.toRemove === 0) { + return null; + } + return toTransform; + } + if (toTransform.offset + toTransform.toRemove < transformBy.offset) { + return toTransform; + } + toTransform.toRemove = transformBy.offset - toTransform.offset; + if (toTransform.toInsert.length === 0 && toTransform.toRemove === 0) { + return null; } - */ + return toTransform; + } */ }); $textarea.val(JSON.stringify(Convert.dom.to.hjson(inner)));