2020-05-06 06:08:21 -04:00
|
|
|
/*
|
|
|
|
* decaffeinate suggestions:
|
|
|
|
* DS101: Remove unnecessary use of Array.from
|
|
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
|
|
* DS205: Consider reworking code to avoid use of IIFEs
|
|
|
|
* DS207: Consider shorter variations of null checks
|
|
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
|
|
*/
|
|
|
|
// Text document API for text
|
2014-02-12 05:40:42 -05:00
|
|
|
|
2020-05-06 06:08:21 -04:00
|
|
|
let type;
|
|
|
|
if (typeof WEB !== 'undefined' && WEB !== null) {
|
|
|
|
type = exports.types['text-composable'];
|
|
|
|
} else {
|
|
|
|
type = require('./text-composable');
|
|
|
|
}
|
2014-02-12 05:40:42 -05:00
|
|
|
|
2020-05-06 06:08:21 -04:00
|
|
|
type.api = {
|
|
|
|
provides: {'text':true},
|
2014-02-12 05:40:42 -05:00
|
|
|
|
2020-05-06 06:08:21 -04:00
|
|
|
// The number of characters in the string
|
|
|
|
'getLength'() { return this.snapshot.length; },
|
2014-02-12 05:40:42 -05:00
|
|
|
|
2020-05-06 06:08:21 -04:00
|
|
|
// Get the text contents of a document
|
|
|
|
'getText'() { return this.snapshot; },
|
2014-02-12 05:40:42 -05:00
|
|
|
|
2020-05-06 06:08:21 -04:00
|
|
|
'insert'(pos, text, callback) {
|
|
|
|
const op = type.normalize([pos, {'i':text}, (this.snapshot.length - pos)]);
|
2014-02-12 05:40:42 -05:00
|
|
|
|
2020-05-06 06:08:21 -04:00
|
|
|
this.submitOp(op, callback);
|
|
|
|
return op;
|
|
|
|
},
|
2014-02-12 05:40:42 -05:00
|
|
|
|
2020-05-06 06:08:21 -04:00
|
|
|
'del'(pos, length, callback) {
|
|
|
|
const op = type.normalize([pos, {'d':this.snapshot.slice(pos, (pos + length))}, (this.snapshot.length - pos - length)]);
|
|
|
|
|
|
|
|
this.submitOp(op, callback);
|
|
|
|
return op;
|
|
|
|
},
|
|
|
|
|
|
|
|
_register() {
|
|
|
|
return this.on('remoteop', function(op) {
|
|
|
|
let pos = 0;
|
|
|
|
return (() => {
|
|
|
|
const result = [];
|
|
|
|
for (let component of Array.from(op)) {
|
|
|
|
if (typeof component === 'number') {
|
|
|
|
result.push(pos += component);
|
|
|
|
} else if (component.i !== undefined) {
|
|
|
|
this.emit('insert', pos, component.i);
|
|
|
|
result.push(pos += component.i.length);
|
|
|
|
} else {
|
|
|
|
// delete
|
|
|
|
result.push(this.emit('delete', pos, component.d));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
})();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
// We don't increment pos, because the position
|
|
|
|
// specified is after the delete has happened.
|
2014-02-12 05:40:42 -05:00
|
|
|
|