text-tp2-api.coffee 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. # Text document API for text-tp2
  2. if WEB?
  3. type = exports.types['text-tp2']
  4. else
  5. type = require './text-tp2'
  6. {_takeDoc:takeDoc, _append:append} = type
  7. appendSkipChars = (op, doc, pos, maxlength) ->
  8. while (maxlength == undefined || maxlength > 0) and pos.index < doc.data.length
  9. part = takeDoc doc, pos, maxlength, true
  10. maxlength -= part.length if maxlength != undefined and typeof part is 'string'
  11. append op, (part.length || part)
  12. type['api'] =
  13. 'provides': {'text':true}
  14. # The number of characters in the string
  15. 'getLength': -> @snapshot.charLength
  16. # Flatten a document into a string
  17. 'getText': ->
  18. strings = (elem for elem in @snapshot.data when typeof elem is 'string')
  19. strings.join ''
  20. 'insert': (pos, text, callback) ->
  21. pos = 0 if pos == undefined
  22. op = []
  23. docPos = {index:0, offset:0}
  24. appendSkipChars op, @snapshot, docPos, pos
  25. append op, {'i':text}
  26. appendSkipChars op, @snapshot, docPos
  27. @submitOp op, callback
  28. op
  29. 'del': (pos, length, callback) ->
  30. op = []
  31. docPos = {index:0, offset:0}
  32. appendSkipChars op, @snapshot, docPos, pos
  33. while length > 0
  34. part = takeDoc @snapshot, docPos, length, true
  35. if typeof part is 'string'
  36. append op, {'d':part.length}
  37. length -= part.length
  38. else
  39. append op, part
  40. appendSkipChars op, @snapshot, docPos
  41. @submitOp op, callback
  42. op
  43. '_register': ->
  44. # Interpret recieved ops + generate more detailed events for them
  45. @on 'remoteop', (op, snapshot) ->
  46. textPos = 0
  47. docPos = {index:0, offset:0}
  48. for component in op
  49. if typeof component is 'number'
  50. # Skip
  51. remainder = component
  52. while remainder > 0
  53. part = takeDoc snapshot, docPos, remainder
  54. if typeof part is 'string'
  55. textPos += part.length
  56. remainder -= part.length || part
  57. else if component.i != undefined
  58. # Insert
  59. if typeof component.i is 'string'
  60. @emit 'insert', textPos, component.i
  61. textPos += component.i.length
  62. else
  63. # Delete
  64. remainder = component.d
  65. while remainder > 0
  66. part = takeDoc snapshot, docPos, remainder
  67. if typeof part is 'string'
  68. @emit 'delete', textPos, part
  69. remainder -= part.length || part
  70. return