mirror of
https://github.com/overleaf/overleaf.git
synced 2024-12-11 11:46:31 -05:00
120 lines
3.4 KiB
JavaScript
120 lines
3.4 KiB
JavaScript
|
// Generated by CoffeeScript 1.4.0
|
||
|
(function() {
|
||
|
var Range, applyToShareJS;
|
||
|
|
||
|
Range = require("ace/range").Range;
|
||
|
|
||
|
applyToShareJS = function(editorDoc, delta, doc) {
|
||
|
var getStartOffsetPosition, pos, text;
|
||
|
getStartOffsetPosition = function(range) {
|
||
|
var i, line, lines, offset, _i, _len;
|
||
|
lines = editorDoc.getLines(0, range.start.row);
|
||
|
offset = 0;
|
||
|
for (i = _i = 0, _len = lines.length; _i < _len; i = ++_i) {
|
||
|
line = lines[i];
|
||
|
offset += i < range.start.row ? line.length : range.start.column;
|
||
|
}
|
||
|
return offset + range.start.row;
|
||
|
};
|
||
|
pos = getStartOffsetPosition(delta.range);
|
||
|
switch (delta.action) {
|
||
|
case 'insertText':
|
||
|
doc.insert(pos, delta.text);
|
||
|
break;
|
||
|
case 'removeText':
|
||
|
doc.del(pos, delta.text.length);
|
||
|
break;
|
||
|
case 'insertLines':
|
||
|
text = delta.lines.join('\n') + '\n';
|
||
|
doc.insert(pos, text);
|
||
|
break;
|
||
|
case 'removeLines':
|
||
|
text = delta.lines.join('\n') + '\n';
|
||
|
doc.del(pos, text.length);
|
||
|
break;
|
||
|
default:
|
||
|
throw new Error("unknown action: " + delta.action);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
window.sharejs.extendDoc('attach_ace', function(editor, keepEditorContents) {
|
||
|
var check, doc, docListener, editorDoc, editorListener, offsetToPos, suppress;
|
||
|
if (!this.provides['text']) {
|
||
|
throw new Error('Only text documents can be attached to ace');
|
||
|
}
|
||
|
doc = this;
|
||
|
editorDoc = editor.getSession().getDocument();
|
||
|
editorDoc.setNewLineMode('unix');
|
||
|
check = function() {
|
||
|
return window.setTimeout(function() {
|
||
|
var editorText, otText;
|
||
|
editorText = editorDoc.getValue();
|
||
|
otText = doc.getText();
|
||
|
if (editorText !== otText) {
|
||
|
console.error("Text does not match!");
|
||
|
console.error("editor: " + editorText);
|
||
|
return console.error("ot: " + otText);
|
||
|
}
|
||
|
}, 0);
|
||
|
};
|
||
|
if (keepEditorContents) {
|
||
|
doc.del(0, doc.getText().length);
|
||
|
doc.insert(0, editorDoc.getValue());
|
||
|
} else {
|
||
|
editorDoc.setValue(doc.getText());
|
||
|
}
|
||
|
check();
|
||
|
suppress = false;
|
||
|
editorListener = function(change) {
|
||
|
if (suppress) {
|
||
|
return;
|
||
|
}
|
||
|
applyToShareJS(editorDoc, change.data, doc);
|
||
|
return check();
|
||
|
};
|
||
|
editorDoc.on('change', editorListener);
|
||
|
docListener = function(op) {
|
||
|
suppress = true;
|
||
|
applyToDoc(editorDoc, op);
|
||
|
suppress = false;
|
||
|
return check();
|
||
|
};
|
||
|
offsetToPos = function(offset) {
|
||
|
var line, lines, row, _i, _len;
|
||
|
lines = editorDoc.getAllLines();
|
||
|
row = 0;
|
||
|
for (row = _i = 0, _len = lines.length; _i < _len; row = ++_i) {
|
||
|
line = lines[row];
|
||
|
if (offset <= line.length) {
|
||
|
break;
|
||
|
}
|
||
|
offset -= lines[row].length + 1;
|
||
|
}
|
||
|
return {
|
||
|
row: row,
|
||
|
column: offset
|
||
|
};
|
||
|
};
|
||
|
doc.on('insert', function(pos, text) {
|
||
|
suppress = true;
|
||
|
editorDoc.insert(offsetToPos(pos), text);
|
||
|
suppress = false;
|
||
|
return check();
|
||
|
});
|
||
|
doc.on('delete', function(pos, text) {
|
||
|
var range;
|
||
|
suppress = true;
|
||
|
range = Range.fromPoints(offsetToPos(pos), offsetToPos(pos + text.length));
|
||
|
editorDoc.remove(range);
|
||
|
suppress = false;
|
||
|
return check();
|
||
|
});
|
||
|
doc.detach_ace = function() {
|
||
|
doc.removeListener('remoteop', docListener);
|
||
|
editorDoc.removeListener('change', editorListener);
|
||
|
return delete doc.detach_ace;
|
||
|
};
|
||
|
});
|
||
|
|
||
|
}).call(this);
|