mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
133 lines
3.4 KiB
JavaScript
133 lines
3.4 KiB
JavaScript
/* eslint-disable
|
|
no-undef,
|
|
*/
|
|
// TODO: This file was created by bulk-decaffeinate.
|
|
// Fix any style issues and re-enable lint.
|
|
/*
|
|
* 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-tp2
|
|
|
|
let type
|
|
if (typeof WEB !== 'undefined' && WEB !== null) {
|
|
type = exports.types['text-tp2']
|
|
} else {
|
|
type = require('./text-tp2')
|
|
}
|
|
|
|
const { _takeDoc: takeDoc, _append: append } = type
|
|
|
|
const appendSkipChars = (op, doc, pos, maxlength) =>
|
|
(() => {
|
|
const result = []
|
|
while (
|
|
(maxlength === undefined || maxlength > 0) &&
|
|
pos.index < doc.data.length
|
|
) {
|
|
const part = takeDoc(doc, pos, maxlength, true)
|
|
if (maxlength !== undefined && typeof part === 'string') {
|
|
maxlength -= part.length
|
|
}
|
|
result.push(append(op, part.length || part))
|
|
}
|
|
return result
|
|
})()
|
|
|
|
type.api = {
|
|
provides: { text: true },
|
|
|
|
// The number of characters in the string
|
|
getLength() {
|
|
return this.snapshot.charLength
|
|
},
|
|
|
|
// Flatten a document into a string
|
|
getText() {
|
|
const strings = Array.from(this.snapshot.data).filter(
|
|
(elem) => typeof elem === 'string'
|
|
)
|
|
return strings.join('')
|
|
},
|
|
|
|
insert(pos, text, callback) {
|
|
if (pos === undefined) {
|
|
pos = 0
|
|
}
|
|
|
|
const op = []
|
|
const docPos = { index: 0, offset: 0 }
|
|
|
|
appendSkipChars(op, this.snapshot, docPos, pos)
|
|
append(op, { i: text })
|
|
appendSkipChars(op, this.snapshot, docPos)
|
|
|
|
this.submitOp(op, callback)
|
|
return op
|
|
},
|
|
|
|
del(pos, length, callback) {
|
|
const op = []
|
|
const docPos = { index: 0, offset: 0 }
|
|
|
|
appendSkipChars(op, this.snapshot, docPos, pos)
|
|
|
|
while (length > 0) {
|
|
const part = takeDoc(this.snapshot, docPos, length, true)
|
|
if (typeof part === 'string') {
|
|
append(op, { d: part.length })
|
|
length -= part.length
|
|
} else {
|
|
append(op, part)
|
|
}
|
|
}
|
|
|
|
appendSkipChars(op, this.snapshot, docPos)
|
|
|
|
this.submitOp(op, callback)
|
|
return op
|
|
},
|
|
|
|
_register() {
|
|
// Interpret recieved ops + generate more detailed events for them
|
|
return this.on('remoteop', function (op, snapshot) {
|
|
let textPos = 0
|
|
const docPos = { index: 0, offset: 0 }
|
|
|
|
for (const component of Array.from(op)) {
|
|
var part, remainder
|
|
if (typeof component === 'number') {
|
|
// Skip
|
|
remainder = component
|
|
while (remainder > 0) {
|
|
part = takeDoc(snapshot, docPos, remainder)
|
|
if (typeof part === 'string') {
|
|
textPos += part.length
|
|
}
|
|
remainder -= part.length || part
|
|
}
|
|
} else if (component.i !== undefined) {
|
|
// Insert
|
|
if (typeof component.i === 'string') {
|
|
this.emit('insert', textPos, component.i)
|
|
textPos += component.i.length
|
|
}
|
|
} else {
|
|
// Delete
|
|
remainder = component.d
|
|
while (remainder > 0) {
|
|
part = takeDoc(snapshot, docPos, remainder)
|
|
if (typeof part === 'string') {
|
|
this.emit('delete', textPos, part)
|
|
}
|
|
remainder -= part.length || part
|
|
}
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|