8
0

removedelta.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /**
  2. * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. 'use strict';
  6. import MoveDelta from './movedelta.js';
  7. import { register } from '../batch.js';
  8. import RemoveOperation from '../operation/removeoperation.js';
  9. import Position from '../position.js';
  10. import Range from '../range.js';
  11. /**
  12. * @classdesc
  13. * To provide specific OT behavior and better collisions solving, {@link core.treeModel.Batch#remove} method
  14. * uses the `RemoveDelta` class which inherits from the `Delta` class and may overwrite some methods.
  15. *
  16. * @memberOf core.treeModel.delta
  17. */
  18. export default class RemoveDelta extends MoveDelta {}
  19. function addRemoveOperation( batch, delta, position, howMany ) {
  20. const operation = new RemoveOperation( position, howMany, batch.doc.version );
  21. delta.addOperation( operation );
  22. batch.doc.applyOperation( operation );
  23. }
  24. /**
  25. * Removes given node or range of nodes.
  26. *
  27. * @chainable
  28. * @method core.treeModel.Batch#remove
  29. * @param {core.treeModel.Node|core.treeModel.Range} nodeOrRange Node or range of nodes to remove.
  30. */
  31. register( 'remove', function( nodeOrRange ) {
  32. const delta = new RemoveDelta();
  33. this.addDelta( delta );
  34. if ( nodeOrRange instanceof Range ) {
  35. // The array is reversed, so the ranges are correct and do not have to be updated.
  36. let ranges = nodeOrRange.getMinimalFlatRanges().reverse();
  37. for ( let flat of ranges ) {
  38. addRemoveOperation( this, delta, flat.start, flat.end.offset - flat.start.offset );
  39. }
  40. } else {
  41. addRemoveOperation( this, delta, Position.createBefore( nodeOrRange ), 1 );
  42. }
  43. return this;
  44. } );