mergedelta.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /**
  2. * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. 'use strict';
  6. CKEDITOR.define( [
  7. 'document/delta/delta',
  8. 'document/delta/register',
  9. 'document/position',
  10. 'document/element',
  11. 'document/operation/removeoperation',
  12. 'document/operation/moveoperation',
  13. 'ckeditorerror'
  14. ], ( Delta, register, Position, Element, RemoveOperation, MoveOperation, CKEditorError ) => {
  15. /**
  16. * To provide specific OT behavior and better collisions solving, {@link document.Transaction#merge} method
  17. * uses the `MergeDelta` class which inherits from the `Delta` class and may overwrite some methods.
  18. *
  19. * @class document.delta.MergeDelta
  20. */
  21. class MergeDelta extends Delta {}
  22. /**
  23. * Merges two siblings at the given position.
  24. *
  25. * Node before and after the position have to be an element. Otherwise `transaction-merge-no-element-before` or
  26. * `transaction-merge-no-element-after` error will be thrown.
  27. *
  28. * @chainable
  29. * @method merge
  30. * @memberOf document.Transaction
  31. * @param {document.Position} position Position of merge.
  32. */
  33. register( 'merge', function( position ) {
  34. const delta = new MergeDelta();
  35. const nodeBefore = position.nodeBefore;
  36. const nodeAfter = position.nodeAfter;
  37. if ( !( nodeBefore instanceof Element ) ) {
  38. /**
  39. * Node before merge position must be an element.
  40. *
  41. * @error transaction-merge-no-element-before
  42. */
  43. throw new CKEditorError(
  44. 'transaction-merge-no-element-before: Node before merge position must be an element.' );
  45. }
  46. if ( !( nodeAfter instanceof Element ) ) {
  47. /**
  48. * Node after merge position must be an element.
  49. *
  50. * @error transaction-merge-no-element-after
  51. */
  52. throw new CKEditorError(
  53. 'transaction-merge-no-element-after: Node after merge position must be an element.' );
  54. }
  55. const positionAfter = Position.createFromParentAndOffset( nodeAfter, 0 );
  56. const positionBefore = Position.createFromParentAndOffset( nodeBefore, nodeBefore.getChildCount() );
  57. const move = new MoveOperation( positionAfter, nodeAfter.getChildCount(), positionBefore, this.doc.version );
  58. this.doc.applyOperation( move );
  59. delta.addOperation( move );
  60. const remove = new RemoveOperation( position, 1, this.doc.version );
  61. this.doc.applyOperation( remove );
  62. delta.addOperation( remove );
  63. this.addDelta( delta );
  64. return this;
  65. } );
  66. return MergeDelta;
  67. } );