removedelta.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /**
  2. * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. /**
  6. * @module engine/model/delta/removedelta
  7. */
  8. import MoveDelta from './movedelta';
  9. import { register } from '../batch';
  10. import DeltaFactory from './deltafactory';
  11. import RemoveOperation from '../operation/removeoperation';
  12. import Position from '../position';
  13. import Range from '../range';
  14. /**
  15. * @classdesc
  16. * To provide specific OT behavior and better collisions solving, {@link module:engine/model/batch~Batch#remove} method
  17. * uses the `RemoveDelta` class which inherits from the `Delta` class and may overwrite some methods.
  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 addRemoveDelta( batch, position, howMany, isPermanent ) {
  28. const delta = new RemoveDelta();
  29. batch.addDelta( delta );
  30. const graveyard = batch.document.graveyard;
  31. const gyPosition = new Position( graveyard, [ 0 ] );
  32. const operation = new RemoveOperation( position, howMany, gyPosition, batch.document.version );
  33. operation.isPermanent = isPermanent;
  34. delta.addOperation( operation );
  35. batch.document.applyOperation( operation );
  36. }
  37. /**
  38. * Removes given {@link module:engine/model/item~Item model item} or given range.
  39. *
  40. * @chainable
  41. * @method module:engine/model/batch~Batch#remove
  42. * @param {module:engine/model/item~Item|module:engine/model/range~Range} itemOrRange Model item or range to remove.
  43. * @param {Boolean} isPermanent If set to `true`, creates
  44. * {@link module:engine/model/operation/removeoperation~RemoveOperation#isPermanent a permanent RemoveOperation}.
  45. */
  46. register( 'remove', function( itemOrRange, isPermanent = false ) {
  47. if ( itemOrRange instanceof Range ) {
  48. // The array is reversed, so the ranges to remove are in correct order and do not have to be updated.
  49. const ranges = itemOrRange.getMinimalFlatRanges().reverse();
  50. for ( const flat of ranges ) {
  51. addRemoveDelta( this, flat.start, flat.end.offset - flat.start.offset, isPermanent );
  52. }
  53. } else {
  54. addRemoveDelta( this, Position.createBefore( itemOrRange ), 1, isPermanent );
  55. }
  56. return this;
  57. } );
  58. DeltaFactory.register( RemoveDelta );