@ckeditor/ckeditor5-undo 39.0.1 → 40.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/LICENSE.md +1 -1
  3. package/README.md +3 -3
  4. package/lang/translations/ar.po +1 -0
  5. package/lang/translations/ast.po +1 -0
  6. package/lang/translations/az.po +1 -0
  7. package/lang/translations/bg.po +1 -0
  8. package/lang/translations/bn.po +1 -0
  9. package/lang/translations/ca.po +1 -0
  10. package/lang/translations/cs.po +1 -0
  11. package/lang/translations/da.po +1 -0
  12. package/lang/translations/de-ch.po +1 -0
  13. package/lang/translations/de.po +1 -0
  14. package/lang/translations/el.po +1 -0
  15. package/lang/translations/en-au.po +1 -0
  16. package/lang/translations/en-gb.po +1 -0
  17. package/lang/translations/en.po +1 -0
  18. package/lang/translations/eo.po +1 -0
  19. package/lang/translations/es.po +1 -0
  20. package/lang/translations/et.po +1 -0
  21. package/lang/translations/eu.po +1 -0
  22. package/lang/translations/fa.po +1 -0
  23. package/lang/translations/fi.po +1 -0
  24. package/lang/translations/fr.po +1 -0
  25. package/lang/translations/gl.po +1 -0
  26. package/lang/translations/he.po +1 -0
  27. package/lang/translations/hi.po +1 -0
  28. package/lang/translations/hr.po +1 -0
  29. package/lang/translations/hu.po +1 -0
  30. package/lang/translations/id.po +1 -0
  31. package/lang/translations/it.po +1 -0
  32. package/lang/translations/ja.po +1 -0
  33. package/lang/translations/km.po +1 -0
  34. package/lang/translations/kn.po +1 -0
  35. package/lang/translations/ko.po +1 -0
  36. package/lang/translations/ku.po +1 -0
  37. package/lang/translations/lt.po +1 -0
  38. package/lang/translations/lv.po +1 -0
  39. package/lang/translations/ms.po +1 -0
  40. package/lang/translations/nb.po +1 -0
  41. package/lang/translations/ne.po +1 -0
  42. package/lang/translations/nl.po +1 -0
  43. package/lang/translations/no.po +1 -0
  44. package/lang/translations/pl.po +1 -0
  45. package/lang/translations/pt-br.po +1 -0
  46. package/lang/translations/pt.po +1 -0
  47. package/lang/translations/ro.po +1 -0
  48. package/lang/translations/ru.po +1 -0
  49. package/lang/translations/si.po +1 -0
  50. package/lang/translations/sk.po +1 -0
  51. package/lang/translations/sq.po +1 -0
  52. package/lang/translations/sr-latn.po +1 -0
  53. package/lang/translations/sr.po +1 -0
  54. package/lang/translations/sv.po +1 -0
  55. package/lang/translations/th.po +1 -0
  56. package/lang/translations/tk.po +1 -0
  57. package/lang/translations/tr.po +1 -0
  58. package/lang/translations/tt.po +1 -0
  59. package/lang/translations/ug.po +1 -0
  60. package/lang/translations/uk.po +1 -0
  61. package/lang/translations/ur.po +1 -0
  62. package/lang/translations/uz.po +1 -0
  63. package/lang/translations/vi.po +1 -0
  64. package/lang/translations/zh-cn.po +1 -0
  65. package/lang/translations/zh.po +1 -0
  66. package/package.json +4 -8
  67. package/src/augmentation.d.ts +16 -16
  68. package/src/augmentation.js +5 -5
  69. package/src/basecommand.d.ts +72 -72
  70. package/src/basecommand.js +192 -192
  71. package/src/index.d.ts +13 -13
  72. package/src/index.js +11 -11
  73. package/src/redocommand.d.ts +27 -27
  74. package/src/redocommand.js +40 -40
  75. package/src/undo.d.ts +117 -117
  76. package/src/undo.js +121 -121
  77. package/src/undocommand.d.ts +37 -37
  78. package/src/undocommand.js +44 -44
  79. package/src/undoediting.d.ts +37 -37
  80. package/src/undoediting.js +82 -82
  81. package/src/undoui.d.ts +30 -30
  82. package/src/undoui.js +61 -61
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ckeditor/ckeditor5-undo",
3
- "version": "39.0.1",
3
+ "version": "40.0.0",
4
4
  "description": "Undo feature for CKEditor 5.",
5
5
  "keywords": [
6
6
  "ckeditor",
@@ -12,13 +12,9 @@
12
12
  ],
13
13
  "main": "src/index.js",
14
14
  "dependencies": {
15
- "@ckeditor/ckeditor5-core": "39.0.1",
16
- "@ckeditor/ckeditor5-engine": "39.0.1",
17
- "@ckeditor/ckeditor5-ui": "39.0.1"
18
- },
19
- "engines": {
20
- "node": ">=16.0.0",
21
- "npm": ">=5.7.1"
15
+ "@ckeditor/ckeditor5-core": "40.0.0",
16
+ "@ckeditor/ckeditor5-engine": "40.0.0",
17
+ "@ckeditor/ckeditor5-ui": "40.0.0"
22
18
  },
23
19
  "author": "CKSource (http://cksource.com/)",
24
20
  "license": "GPL-2.0-or-later",
@@ -1,16 +1,16 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- import type { Undo, UndoEditing, UndoUI, UndoCommand, RedoCommand } from './index';
6
- declare module '@ckeditor/ckeditor5-core' {
7
- interface CommandsMap {
8
- undo: UndoCommand;
9
- redo: RedoCommand;
10
- }
11
- interface PluginsMap {
12
- [Undo.pluginName]: Undo;
13
- [UndoEditing.pluginName]: UndoEditing;
14
- [UndoUI.pluginName]: UndoUI;
15
- }
16
- }
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ import type { Undo, UndoEditing, UndoUI, UndoCommand, RedoCommand } from './index';
6
+ declare module '@ckeditor/ckeditor5-core' {
7
+ interface CommandsMap {
8
+ undo: UndoCommand;
9
+ redo: RedoCommand;
10
+ }
11
+ interface PluginsMap {
12
+ [Undo.pluginName]: Undo;
13
+ [UndoEditing.pluginName]: UndoEditing;
14
+ [UndoUI.pluginName]: UndoUI;
15
+ }
16
+ }
@@ -1,5 +1,5 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- export {};
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ export {};
@@ -1,72 +1,72 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- /**
6
- * @module undo/basecommand
7
- */
8
- import { Command, type Editor } from '@ckeditor/ckeditor5-core';
9
- import { type Batch, type Operation, type Range } from '@ckeditor/ckeditor5-engine';
10
- /**
11
- * Base class for the undo feature commands: {@link module:undo/undocommand~UndoCommand} and {@link module:undo/redocommand~RedoCommand}.
12
- */
13
- export default abstract class BaseCommand extends Command {
14
- /**
15
- * Stack of items stored by the command. These are pairs of:
16
- *
17
- * * {@link module:engine/model/batch~Batch batch} saved by the command,
18
- * * {@link module:engine/model/selection~Selection selection} state at the moment of saving the batch.
19
- */
20
- protected _stack: Array<{
21
- batch: Batch;
22
- selection: {
23
- ranges: Array<Range>;
24
- isBackward: boolean;
25
- };
26
- }>;
27
- /**
28
- * Stores all batches that were created by this command.
29
- *
30
- * @internal
31
- */
32
- _createdBatches: WeakSet<Batch>;
33
- /**
34
- * @inheritDoc
35
- */
36
- constructor(editor: Editor);
37
- /**
38
- * @inheritDoc
39
- */
40
- refresh(): void;
41
- /**
42
- * Returns all batches created by this command.
43
- */
44
- get createdBatches(): WeakSet<Batch>;
45
- /**
46
- * Stores a batch in the command, together with the selection state of the {@link module:engine/model/document~Document document}
47
- * created by the editor which this command is registered to.
48
- *
49
- * @param batch The batch to add.
50
- */
51
- addBatch(batch: Batch): void;
52
- /**
53
- * Removes all items from the stack.
54
- */
55
- clearStack(): void;
56
- /**
57
- * Restores the {@link module:engine/model/document~Document#selection document selection} state after a batch was undone.
58
- *
59
- * @param ranges Ranges to be restored.
60
- * @param isBackward A flag describing whether the restored range was selected forward or backward.
61
- * @param operations Operations which has been applied since selection has been stored.
62
- */
63
- protected _restoreSelection(ranges: Array<Range>, isBackward: boolean, operations: Array<Operation>): void;
64
- /**
65
- * Undoes a batch by reversing that batch, transforming reversed batch and finally applying it.
66
- * This is a helper method for {@link #execute}.
67
- *
68
- * @param batchToUndo The batch to be undone.
69
- * @param undoingBatch The batch that will contain undoing changes.
70
- */
71
- protected _undo(batchToUndo: Batch, undoingBatch: Batch): void;
72
- }
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module undo/basecommand
7
+ */
8
+ import { Command, type Editor } from '@ckeditor/ckeditor5-core';
9
+ import { type Batch, type Operation, type Range } from '@ckeditor/ckeditor5-engine';
10
+ /**
11
+ * Base class for the undo feature commands: {@link module:undo/undocommand~UndoCommand} and {@link module:undo/redocommand~RedoCommand}.
12
+ */
13
+ export default abstract class BaseCommand extends Command {
14
+ /**
15
+ * Stack of items stored by the command. These are pairs of:
16
+ *
17
+ * * {@link module:engine/model/batch~Batch batch} saved by the command,
18
+ * * {@link module:engine/model/selection~Selection selection} state at the moment of saving the batch.
19
+ */
20
+ protected _stack: Array<{
21
+ batch: Batch;
22
+ selection: {
23
+ ranges: Array<Range>;
24
+ isBackward: boolean;
25
+ };
26
+ }>;
27
+ /**
28
+ * Stores all batches that were created by this command.
29
+ *
30
+ * @internal
31
+ */
32
+ _createdBatches: WeakSet<Batch>;
33
+ /**
34
+ * @inheritDoc
35
+ */
36
+ constructor(editor: Editor);
37
+ /**
38
+ * @inheritDoc
39
+ */
40
+ refresh(): void;
41
+ /**
42
+ * Returns all batches created by this command.
43
+ */
44
+ get createdBatches(): WeakSet<Batch>;
45
+ /**
46
+ * Stores a batch in the command, together with the selection state of the {@link module:engine/model/document~Document document}
47
+ * created by the editor which this command is registered to.
48
+ *
49
+ * @param batch The batch to add.
50
+ */
51
+ addBatch(batch: Batch): void;
52
+ /**
53
+ * Removes all items from the stack.
54
+ */
55
+ clearStack(): void;
56
+ /**
57
+ * Restores the {@link module:engine/model/document~Document#selection document selection} state after a batch was undone.
58
+ *
59
+ * @param ranges Ranges to be restored.
60
+ * @param isBackward A flag describing whether the restored range was selected forward or backward.
61
+ * @param operations Operations which has been applied since selection has been stored.
62
+ */
63
+ protected _restoreSelection(ranges: Array<Range>, isBackward: boolean, operations: Array<Operation>): void;
64
+ /**
65
+ * Undoes a batch by reversing that batch, transforming reversed batch and finally applying it.
66
+ * This is a helper method for {@link #execute}.
67
+ *
68
+ * @param batchToUndo The batch to be undone.
69
+ * @param undoingBatch The batch that will contain undoing changes.
70
+ */
71
+ protected _undo(batchToUndo: Batch, undoingBatch: Batch): void;
72
+ }
@@ -1,192 +1,192 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- /**
6
- * @module undo/basecommand
7
- */
8
- import { Command } from '@ckeditor/ckeditor5-core';
9
- import { transformSets, NoOperation } from '@ckeditor/ckeditor5-engine';
10
- /**
11
- * Base class for the undo feature commands: {@link module:undo/undocommand~UndoCommand} and {@link module:undo/redocommand~RedoCommand}.
12
- */
13
- export default class BaseCommand extends Command {
14
- /**
15
- * @inheritDoc
16
- */
17
- constructor(editor) {
18
- super(editor);
19
- /**
20
- * Stack of items stored by the command. These are pairs of:
21
- *
22
- * * {@link module:engine/model/batch~Batch batch} saved by the command,
23
- * * {@link module:engine/model/selection~Selection selection} state at the moment of saving the batch.
24
- */
25
- this._stack = [];
26
- /**
27
- * Stores all batches that were created by this command.
28
- *
29
- * @internal
30
- */
31
- this._createdBatches = new WeakSet();
32
- // Refresh state, so the command is inactive right after initialization.
33
- this.refresh();
34
- // This command should not depend on selection change.
35
- this._isEnabledBasedOnSelection = false;
36
- // Set the transparent batch for the `editor.data.set()` call if the
37
- // batch type is not set already.
38
- this.listenTo(editor.data, 'set', (evt, data) => {
39
- // Create a shallow copy of the options to not change the original args.
40
- // And make sure that an object is assigned to data[ 1 ].
41
- data[1] = { ...data[1] };
42
- const options = data[1];
43
- // If batch type is not set, default to non-undoable batch.
44
- if (!options.batchType) {
45
- options.batchType = { isUndoable: false };
46
- }
47
- }, { priority: 'high' });
48
- // Clear the stack for the `transparent` batches.
49
- this.listenTo(editor.data, 'set', (evt, data) => {
50
- // We can assume that the object exists and it has a `batchType` property.
51
- // It was ensured with a higher priority listener before.
52
- const options = data[1];
53
- if (!options.batchType.isUndoable) {
54
- this.clearStack();
55
- }
56
- });
57
- }
58
- /**
59
- * @inheritDoc
60
- */
61
- refresh() {
62
- this.isEnabled = this._stack.length > 0;
63
- }
64
- /**
65
- * Returns all batches created by this command.
66
- */
67
- get createdBatches() {
68
- return this._createdBatches;
69
- }
70
- /**
71
- * Stores a batch in the command, together with the selection state of the {@link module:engine/model/document~Document document}
72
- * created by the editor which this command is registered to.
73
- *
74
- * @param batch The batch to add.
75
- */
76
- addBatch(batch) {
77
- const docSelection = this.editor.model.document.selection;
78
- const selection = {
79
- ranges: docSelection.hasOwnRange ? Array.from(docSelection.getRanges()) : [],
80
- isBackward: docSelection.isBackward
81
- };
82
- this._stack.push({ batch, selection });
83
- this.refresh();
84
- }
85
- /**
86
- * Removes all items from the stack.
87
- */
88
- clearStack() {
89
- this._stack = [];
90
- this.refresh();
91
- }
92
- /**
93
- * Restores the {@link module:engine/model/document~Document#selection document selection} state after a batch was undone.
94
- *
95
- * @param ranges Ranges to be restored.
96
- * @param isBackward A flag describing whether the restored range was selected forward or backward.
97
- * @param operations Operations which has been applied since selection has been stored.
98
- */
99
- _restoreSelection(ranges, isBackward, operations) {
100
- const model = this.editor.model;
101
- const document = model.document;
102
- // This will keep the transformed selection ranges.
103
- const selectionRanges = [];
104
- // Transform all ranges from the restored selection.
105
- const transformedRangeGroups = ranges.map(range => range.getTransformedByOperations(operations));
106
- const allRanges = transformedRangeGroups.flat();
107
- for (const rangeGroup of transformedRangeGroups) {
108
- // While transforming there could appear ranges that are contained by other ranges, we shall ignore them.
109
- const transformed = rangeGroup
110
- .filter(range => range.root != document.graveyard)
111
- .filter(range => !isRangeContainedByAnyOtherRange(range, allRanges));
112
- // All the transformed ranges ended up in graveyard.
113
- if (!transformed.length) {
114
- continue;
115
- }
116
- // After the range got transformed, we have an array of ranges. Some of those
117
- // ranges may be "touching" -- they can be next to each other and could be merged.
118
- normalizeRanges(transformed);
119
- // For each `range` from `ranges`, we take only one transformed range.
120
- // This is because we want to prevent situation where single-range selection
121
- // got transformed to multi-range selection.
122
- selectionRanges.push(transformed[0]);
123
- }
124
- // @if CK_DEBUG_ENGINE // console.log( `Restored selection by undo: ${ selectionRanges.join( ', ' ) }` );
125
- // `selectionRanges` may be empty if all ranges ended up in graveyard. If that is the case, do not restore selection.
126
- if (selectionRanges.length) {
127
- model.change(writer => {
128
- writer.setSelection(selectionRanges, { backward: isBackward });
129
- });
130
- }
131
- }
132
- /**
133
- * Undoes a batch by reversing that batch, transforming reversed batch and finally applying it.
134
- * This is a helper method for {@link #execute}.
135
- *
136
- * @param batchToUndo The batch to be undone.
137
- * @param undoingBatch The batch that will contain undoing changes.
138
- */
139
- _undo(batchToUndo, undoingBatch) {
140
- const model = this.editor.model;
141
- const document = model.document;
142
- // All changes done by the command execution will be saved as one batch.
143
- this._createdBatches.add(undoingBatch);
144
- const operationsToUndo = batchToUndo.operations.slice().filter(operation => operation.isDocumentOperation);
145
- operationsToUndo.reverse();
146
- // We will process each operation from `batchToUndo`, in reverse order. If there were operations A, B and C in undone batch,
147
- // we need to revert them in reverse order, so first C' (reversed C), then B', then A'.
148
- for (const operationToUndo of operationsToUndo) {
149
- const nextBaseVersion = operationToUndo.baseVersion + 1;
150
- const historyOperations = Array.from(document.history.getOperations(nextBaseVersion));
151
- const transformedSets = transformSets([operationToUndo.getReversed()], historyOperations, {
152
- useRelations: true,
153
- document: this.editor.model.document,
154
- padWithNoOps: false,
155
- forceWeakRemove: true
156
- });
157
- const reversedOperations = transformedSets.operationsA;
158
- // After reversed operation has been transformed by all history operations, apply it.
159
- for (let operation of reversedOperations) {
160
- // Do not apply any operation on non-editable space.
161
- const affectedSelectable = operation.affectedSelectable;
162
- if (affectedSelectable && !model.canEditAt(affectedSelectable)) {
163
- operation = new NoOperation(operation.baseVersion);
164
- }
165
- // Before applying, add the operation to the `undoingBatch`.
166
- undoingBatch.addOperation(operation);
167
- model.applyOperation(operation);
168
- document.history.setOperationAsUndone(operationToUndo, operation);
169
- }
170
- }
171
- }
172
- }
173
- /**
174
- * Normalizes list of ranges by joining intersecting or "touching" ranges.
175
- *
176
- * @param ranges Ranges to be normalized.
177
- */
178
- function normalizeRanges(ranges) {
179
- ranges.sort((a, b) => a.start.isBefore(b.start) ? -1 : 1);
180
- for (let i = 1; i < ranges.length; i++) {
181
- const previousRange = ranges[i - 1];
182
- const joinedRange = previousRange.getJoined(ranges[i], true);
183
- if (joinedRange) {
184
- // Replace the ranges on the list with the new joined range.
185
- i--;
186
- ranges.splice(i, 2, joinedRange);
187
- }
188
- }
189
- }
190
- function isRangeContainedByAnyOtherRange(range, ranges) {
191
- return ranges.some(otherRange => otherRange !== range && otherRange.containsRange(range, true));
192
- }
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module undo/basecommand
7
+ */
8
+ import { Command } from '@ckeditor/ckeditor5-core';
9
+ import { transformSets, NoOperation } from '@ckeditor/ckeditor5-engine';
10
+ /**
11
+ * Base class for the undo feature commands: {@link module:undo/undocommand~UndoCommand} and {@link module:undo/redocommand~RedoCommand}.
12
+ */
13
+ export default class BaseCommand extends Command {
14
+ /**
15
+ * @inheritDoc
16
+ */
17
+ constructor(editor) {
18
+ super(editor);
19
+ /**
20
+ * Stack of items stored by the command. These are pairs of:
21
+ *
22
+ * * {@link module:engine/model/batch~Batch batch} saved by the command,
23
+ * * {@link module:engine/model/selection~Selection selection} state at the moment of saving the batch.
24
+ */
25
+ this._stack = [];
26
+ /**
27
+ * Stores all batches that were created by this command.
28
+ *
29
+ * @internal
30
+ */
31
+ this._createdBatches = new WeakSet();
32
+ // Refresh state, so the command is inactive right after initialization.
33
+ this.refresh();
34
+ // This command should not depend on selection change.
35
+ this._isEnabledBasedOnSelection = false;
36
+ // Set the transparent batch for the `editor.data.set()` call if the
37
+ // batch type is not set already.
38
+ this.listenTo(editor.data, 'set', (evt, data) => {
39
+ // Create a shallow copy of the options to not change the original args.
40
+ // And make sure that an object is assigned to data[ 1 ].
41
+ data[1] = { ...data[1] };
42
+ const options = data[1];
43
+ // If batch type is not set, default to non-undoable batch.
44
+ if (!options.batchType) {
45
+ options.batchType = { isUndoable: false };
46
+ }
47
+ }, { priority: 'high' });
48
+ // Clear the stack for the `transparent` batches.
49
+ this.listenTo(editor.data, 'set', (evt, data) => {
50
+ // We can assume that the object exists and it has a `batchType` property.
51
+ // It was ensured with a higher priority listener before.
52
+ const options = data[1];
53
+ if (!options.batchType.isUndoable) {
54
+ this.clearStack();
55
+ }
56
+ });
57
+ }
58
+ /**
59
+ * @inheritDoc
60
+ */
61
+ refresh() {
62
+ this.isEnabled = this._stack.length > 0;
63
+ }
64
+ /**
65
+ * Returns all batches created by this command.
66
+ */
67
+ get createdBatches() {
68
+ return this._createdBatches;
69
+ }
70
+ /**
71
+ * Stores a batch in the command, together with the selection state of the {@link module:engine/model/document~Document document}
72
+ * created by the editor which this command is registered to.
73
+ *
74
+ * @param batch The batch to add.
75
+ */
76
+ addBatch(batch) {
77
+ const docSelection = this.editor.model.document.selection;
78
+ const selection = {
79
+ ranges: docSelection.hasOwnRange ? Array.from(docSelection.getRanges()) : [],
80
+ isBackward: docSelection.isBackward
81
+ };
82
+ this._stack.push({ batch, selection });
83
+ this.refresh();
84
+ }
85
+ /**
86
+ * Removes all items from the stack.
87
+ */
88
+ clearStack() {
89
+ this._stack = [];
90
+ this.refresh();
91
+ }
92
+ /**
93
+ * Restores the {@link module:engine/model/document~Document#selection document selection} state after a batch was undone.
94
+ *
95
+ * @param ranges Ranges to be restored.
96
+ * @param isBackward A flag describing whether the restored range was selected forward or backward.
97
+ * @param operations Operations which has been applied since selection has been stored.
98
+ */
99
+ _restoreSelection(ranges, isBackward, operations) {
100
+ const model = this.editor.model;
101
+ const document = model.document;
102
+ // This will keep the transformed selection ranges.
103
+ const selectionRanges = [];
104
+ // Transform all ranges from the restored selection.
105
+ const transformedRangeGroups = ranges.map(range => range.getTransformedByOperations(operations));
106
+ const allRanges = transformedRangeGroups.flat();
107
+ for (const rangeGroup of transformedRangeGroups) {
108
+ // While transforming there could appear ranges that are contained by other ranges, we shall ignore them.
109
+ const transformed = rangeGroup
110
+ .filter(range => range.root != document.graveyard)
111
+ .filter(range => !isRangeContainedByAnyOtherRange(range, allRanges));
112
+ // All the transformed ranges ended up in graveyard.
113
+ if (!transformed.length) {
114
+ continue;
115
+ }
116
+ // After the range got transformed, we have an array of ranges. Some of those
117
+ // ranges may be "touching" -- they can be next to each other and could be merged.
118
+ normalizeRanges(transformed);
119
+ // For each `range` from `ranges`, we take only one transformed range.
120
+ // This is because we want to prevent situation where single-range selection
121
+ // got transformed to multi-range selection.
122
+ selectionRanges.push(transformed[0]);
123
+ }
124
+ // @if CK_DEBUG_ENGINE // console.log( `Restored selection by undo: ${ selectionRanges.join( ', ' ) }` );
125
+ // `selectionRanges` may be empty if all ranges ended up in graveyard. If that is the case, do not restore selection.
126
+ if (selectionRanges.length) {
127
+ model.change(writer => {
128
+ writer.setSelection(selectionRanges, { backward: isBackward });
129
+ });
130
+ }
131
+ }
132
+ /**
133
+ * Undoes a batch by reversing that batch, transforming reversed batch and finally applying it.
134
+ * This is a helper method for {@link #execute}.
135
+ *
136
+ * @param batchToUndo The batch to be undone.
137
+ * @param undoingBatch The batch that will contain undoing changes.
138
+ */
139
+ _undo(batchToUndo, undoingBatch) {
140
+ const model = this.editor.model;
141
+ const document = model.document;
142
+ // All changes done by the command execution will be saved as one batch.
143
+ this._createdBatches.add(undoingBatch);
144
+ const operationsToUndo = batchToUndo.operations.slice().filter(operation => operation.isDocumentOperation);
145
+ operationsToUndo.reverse();
146
+ // We will process each operation from `batchToUndo`, in reverse order. If there were operations A, B and C in undone batch,
147
+ // we need to revert them in reverse order, so first C' (reversed C), then B', then A'.
148
+ for (const operationToUndo of operationsToUndo) {
149
+ const nextBaseVersion = operationToUndo.baseVersion + 1;
150
+ const historyOperations = Array.from(document.history.getOperations(nextBaseVersion));
151
+ const transformedSets = transformSets([operationToUndo.getReversed()], historyOperations, {
152
+ useRelations: true,
153
+ document: this.editor.model.document,
154
+ padWithNoOps: false,
155
+ forceWeakRemove: true
156
+ });
157
+ const reversedOperations = transformedSets.operationsA;
158
+ // After reversed operation has been transformed by all history operations, apply it.
159
+ for (let operation of reversedOperations) {
160
+ // Do not apply any operation on non-editable space.
161
+ const affectedSelectable = operation.affectedSelectable;
162
+ if (affectedSelectable && !model.canEditAt(affectedSelectable)) {
163
+ operation = new NoOperation(operation.baseVersion);
164
+ }
165
+ // Before applying, add the operation to the `undoingBatch`.
166
+ undoingBatch.addOperation(operation);
167
+ model.applyOperation(operation);
168
+ document.history.setOperationAsUndone(operationToUndo, operation);
169
+ }
170
+ }
171
+ }
172
+ }
173
+ /**
174
+ * Normalizes list of ranges by joining intersecting or "touching" ranges.
175
+ *
176
+ * @param ranges Ranges to be normalized.
177
+ */
178
+ function normalizeRanges(ranges) {
179
+ ranges.sort((a, b) => a.start.isBefore(b.start) ? -1 : 1);
180
+ for (let i = 1; i < ranges.length; i++) {
181
+ const previousRange = ranges[i - 1];
182
+ const joinedRange = previousRange.getJoined(ranges[i], true);
183
+ if (joinedRange) {
184
+ // Replace the ranges on the list with the new joined range.
185
+ i--;
186
+ ranges.splice(i, 2, joinedRange);
187
+ }
188
+ }
189
+ }
190
+ function isRangeContainedByAnyOtherRange(range, ranges) {
191
+ return ranges.some(otherRange => otherRange !== range && otherRange.containsRange(range, true));
192
+ }
package/src/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- /**
6
- * @module undo
7
- */
8
- export { default as Undo } from './undo';
9
- export { default as UndoEditing } from './undoediting';
10
- export { default as UndoUI } from './undoui';
11
- export type { default as UndoCommand } from './undocommand';
12
- export type { default as RedoCommand } from './redocommand';
13
- import './augmentation';
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module undo
7
+ */
8
+ export { default as Undo } from './undo';
9
+ export { default as UndoEditing } from './undoediting';
10
+ export { default as UndoUI } from './undoui';
11
+ export type { default as UndoCommand } from './undocommand';
12
+ export type { default as RedoCommand } from './redocommand';
13
+ import './augmentation';
package/src/index.js CHANGED
@@ -1,11 +1,11 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- /**
6
- * @module undo
7
- */
8
- export { default as Undo } from './undo';
9
- export { default as UndoEditing } from './undoediting';
10
- export { default as UndoUI } from './undoui';
11
- import './augmentation';
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module undo
7
+ */
8
+ export { default as Undo } from './undo';
9
+ export { default as UndoEditing } from './undoediting';
10
+ export { default as UndoUI } from './undoui';
11
+ import './augmentation';