mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2025-08-04 14:00:11 +02:00

* [history-v1-ot] initial implementation of using doc-level history-v1-ot * [web] fix advancing of the otMigrationStage Use 'nextStage' for the user provided, desired stage when advancing. Co-authored-by: Brian Gough <brian.gough@overleaf.com> * [document-updater] document size check in editor-core * [history-ot] rename history-v1-ot to history-ot and add types * [history-ot] apply review feedback - remove extra !! - merge variable assignment when processing diff-match-match output - add helper function for getting docstore lines view of StringFileData Co-authored-by: Alf Eaton <alf.eaton@overleaf.com> * Revert "[document-updater] add safe rollback point for history-ot (#25283)" This reverts commit d7230dd14a379a27d2c6ab03a006463a18979d06 Signed-off-by: Jakob Ackermann <jakob.ackermann@overleaf.com> --------- Signed-off-by: Jakob Ackermann <jakob.ackermann@overleaf.com> Co-authored-by: Brian Gough <brian.gough@overleaf.com> Co-authored-by: Alf Eaton <alf.eaton@overleaf.com> GitOrigin-RevId: 89c497782adb0427635d50d02263d6f535b12481
60 lines
1.4 KiB
JavaScript
60 lines
1.4 KiB
JavaScript
const DMP = require('diff-match-patch')
|
|
const { TextOperation } = require('overleaf-editor-core')
|
|
const dmp = new DMP()
|
|
|
|
// Do not attempt to produce a diff for more than 100ms
|
|
dmp.Diff_Timeout = 0.1
|
|
|
|
module.exports = {
|
|
ADDED: 1,
|
|
REMOVED: -1,
|
|
UNCHANGED: 0,
|
|
|
|
diffAsShareJsOp(before, after) {
|
|
const diffs = dmp.diff_main(before.join('\n'), after.join('\n'))
|
|
dmp.diff_cleanupSemantic(diffs)
|
|
|
|
const ops = []
|
|
let position = 0
|
|
for (const diff of diffs) {
|
|
const [type, content] = diff
|
|
if (type === this.ADDED) {
|
|
ops.push({
|
|
i: content,
|
|
p: position,
|
|
})
|
|
position += content.length
|
|
} else if (type === this.REMOVED) {
|
|
ops.push({
|
|
d: content,
|
|
p: position,
|
|
})
|
|
} else if (type === this.UNCHANGED) {
|
|
position += content.length
|
|
} else {
|
|
throw new Error('Unknown type')
|
|
}
|
|
}
|
|
return ops
|
|
},
|
|
|
|
diffAsHistoryV1EditOperation(before, after) {
|
|
const diffs = dmp.diff_main(before, after)
|
|
dmp.diff_cleanupSemantic(diffs)
|
|
|
|
const op = new TextOperation()
|
|
for (const diff of diffs) {
|
|
const [type, content] = diff
|
|
if (type === this.ADDED) {
|
|
op.insert(content)
|
|
} else if (type === this.REMOVED) {
|
|
op.remove(content.length)
|
|
} else if (type === this.UNCHANGED) {
|
|
op.retain(content.length)
|
|
} else {
|
|
throw new Error('Unknown type')
|
|
}
|
|
}
|
|
return op
|
|
},
|
|
}
|