8
0

removedelta.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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 DeltaFactory from './deltafactory.js';
  9. import RemoveOperation from '../operation/removeoperation.js';
  10. import Position from '../position.js';
  11. import Range from '../range.js';
  12. /**
  13. * @classdesc
  14. * To provide specific OT behavior and better collisions solving, {@link engine.model.Batch#remove} method
  15. * uses the `RemoveDelta` class which inherits from the `Delta` class and may overwrite some methods.
  16. *
  17. * @memberOf engine.model.delta
  18. */
  19. export default class RemoveDelta extends MoveDelta {
  20. /**
  21. * @inheritDoc
  22. */
  23. static get className() {
  24. return 'engine.model.delta.RemoveDelta';
  25. }
  26. }
  27. function addRemoveOperation( batch, delta, position, howMany ) {
  28. const operation = new RemoveOperation( position, howMany, batch.document.version );
  29. delta.addOperation( operation );
  30. batch.document.applyOperation( operation );
  31. }
  32. /**
  33. * Removes given node or range of nodes.
  34. *
  35. * @chainable
  36. * @method engine.model.Batch#remove
  37. * @param {engine.model.Node|engine.model.Range} nodeOrRange Node or range of nodes to remove.
  38. */
  39. register( 'remove', function( nodeOrRange ) {
  40. const delta = new RemoveDelta();
  41. this.addDelta( delta );
  42. if ( nodeOrRange instanceof Range ) {
  43. // The array is reversed, so the ranges are correct and do not have to be updated.
  44. let ranges = nodeOrRange.getMinimalFlatRanges().reverse();
  45. for ( let flat of ranges ) {
  46. addRemoveOperation( this, delta, flat.start, flat.end.offset - flat.start.offset );
  47. }
  48. } else {
  49. addRemoveOperation( this, delta, Position.createBefore( nodeOrRange ), 1 );
  50. }
  51. return this;
  52. } );
  53. DeltaFactory.register( RemoveDelta );