mirror of
https://github.com/overleaf/overleaf.git
synced 2024-10-31 21:21:03 -04:00
38 lines
1.3 KiB
CoffeeScript
38 lines
1.3 KiB
CoffeeScript
# This is a really simple OT type. Its not compiled with the web client, but it could be.
|
|
#
|
|
# Its mostly included for demonstration purposes and its used in a lot of unit tests.
|
|
#
|
|
# This defines a really simple text OT type which only allows inserts. (No deletes).
|
|
#
|
|
# Ops look like:
|
|
# {position:#, text:"asdf"}
|
|
#
|
|
# Document snapshots look like:
|
|
# {str:string}
|
|
|
|
module.exports =
|
|
# The name of the OT type. The type is stored in types[type.name]. The name can be
|
|
# used in place of the actual type in all the API methods.
|
|
name: 'simple'
|
|
|
|
# Create a new document snapshot
|
|
create: -> {str:""}
|
|
|
|
# Apply the given op to the document snapshot. Returns the new snapshot.
|
|
#
|
|
# The original snapshot should not be modified.
|
|
apply: (snapshot, op) ->
|
|
throw new Error 'Invalid position' unless 0 <= op.position <= snapshot.str.length
|
|
|
|
str = snapshot.str
|
|
str = str.slice(0, op.position) + op.text + str.slice(op.position)
|
|
{str}
|
|
|
|
# transform op1 by op2. Return transformed version of op1.
|
|
# sym describes the symmetry of the op. Its 'left' or 'right' depending on whether the
|
|
# op being transformed comes from the client or the server.
|
|
transform: (op1, op2, sym) ->
|
|
pos = op1.position
|
|
pos += op2.text.length if op2.position < pos or (op2.position == pos and sym is 'left')
|
|
|
|
return {position:pos, text:op1.text}
|