@ckeditor/ckeditor5-engine 39.0.1 → 40.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/CHANGELOG.md +2 -2
  2. package/LICENSE.md +1 -1
  3. package/README.md +8 -8
  4. package/package.json +2 -6
  5. package/src/controller/datacontroller.d.ts +334 -334
  6. package/src/controller/datacontroller.js +481 -481
  7. package/src/controller/editingcontroller.d.ts +98 -98
  8. package/src/controller/editingcontroller.js +191 -191
  9. package/src/conversion/conversion.d.ts +478 -478
  10. package/src/conversion/conversion.js +601 -601
  11. package/src/conversion/conversionhelpers.d.ts +26 -26
  12. package/src/conversion/conversionhelpers.js +32 -32
  13. package/src/conversion/downcastdispatcher.d.ts +562 -562
  14. package/src/conversion/downcastdispatcher.js +547 -547
  15. package/src/conversion/downcasthelpers.d.ts +1226 -1226
  16. package/src/conversion/downcasthelpers.js +2183 -2183
  17. package/src/conversion/mapper.d.ts +503 -503
  18. package/src/conversion/mapper.js +536 -536
  19. package/src/conversion/modelconsumable.d.ts +201 -201
  20. package/src/conversion/modelconsumable.js +333 -333
  21. package/src/conversion/upcastdispatcher.d.ts +492 -492
  22. package/src/conversion/upcastdispatcher.js +460 -460
  23. package/src/conversion/upcasthelpers.d.ts +499 -499
  24. package/src/conversion/upcasthelpers.js +950 -950
  25. package/src/conversion/viewconsumable.d.ts +369 -369
  26. package/src/conversion/viewconsumable.js +532 -532
  27. package/src/dataprocessor/basichtmlwriter.d.ts +18 -18
  28. package/src/dataprocessor/basichtmlwriter.js +19 -19
  29. package/src/dataprocessor/dataprocessor.d.ts +61 -61
  30. package/src/dataprocessor/dataprocessor.js +5 -5
  31. package/src/dataprocessor/htmldataprocessor.d.ts +76 -76
  32. package/src/dataprocessor/htmldataprocessor.js +96 -96
  33. package/src/dataprocessor/htmlwriter.d.ts +16 -16
  34. package/src/dataprocessor/htmlwriter.js +5 -5
  35. package/src/dataprocessor/xmldataprocessor.d.ts +90 -90
  36. package/src/dataprocessor/xmldataprocessor.js +108 -108
  37. package/src/dev-utils/model.d.ts +124 -124
  38. package/src/dev-utils/model.js +395 -395
  39. package/src/dev-utils/operationreplayer.d.ts +51 -51
  40. package/src/dev-utils/operationreplayer.js +112 -112
  41. package/src/dev-utils/utils.d.ts +37 -37
  42. package/src/dev-utils/utils.js +73 -73
  43. package/src/dev-utils/view.d.ts +319 -319
  44. package/src/dev-utils/view.js +967 -967
  45. package/src/index.d.ts +114 -114
  46. package/src/index.js +78 -78
  47. package/src/model/batch.d.ts +106 -106
  48. package/src/model/batch.js +96 -96
  49. package/src/model/differ.d.ts +387 -387
  50. package/src/model/differ.js +1149 -1149
  51. package/src/model/document.d.ts +272 -272
  52. package/src/model/document.js +361 -361
  53. package/src/model/documentfragment.d.ts +200 -200
  54. package/src/model/documentfragment.js +306 -306
  55. package/src/model/documentselection.d.ts +420 -420
  56. package/src/model/documentselection.js +993 -993
  57. package/src/model/element.d.ts +165 -165
  58. package/src/model/element.js +281 -281
  59. package/src/model/history.d.ts +114 -114
  60. package/src/model/history.js +207 -207
  61. package/src/model/item.d.ts +14 -14
  62. package/src/model/item.js +5 -5
  63. package/src/model/liveposition.d.ts +77 -77
  64. package/src/model/liveposition.js +93 -93
  65. package/src/model/liverange.d.ts +102 -102
  66. package/src/model/liverange.js +120 -120
  67. package/src/model/markercollection.d.ts +335 -335
  68. package/src/model/markercollection.js +403 -403
  69. package/src/model/model.d.ts +919 -919
  70. package/src/model/model.js +842 -842
  71. package/src/model/node.d.ts +256 -256
  72. package/src/model/node.js +375 -375
  73. package/src/model/nodelist.d.ts +91 -91
  74. package/src/model/nodelist.js +163 -163
  75. package/src/model/operation/attributeoperation.d.ts +103 -103
  76. package/src/model/operation/attributeoperation.js +148 -148
  77. package/src/model/operation/detachoperation.d.ts +60 -60
  78. package/src/model/operation/detachoperation.js +77 -77
  79. package/src/model/operation/insertoperation.d.ts +90 -90
  80. package/src/model/operation/insertoperation.js +135 -135
  81. package/src/model/operation/markeroperation.d.ts +91 -91
  82. package/src/model/operation/markeroperation.js +107 -107
  83. package/src/model/operation/mergeoperation.d.ts +100 -100
  84. package/src/model/operation/mergeoperation.js +167 -167
  85. package/src/model/operation/moveoperation.d.ts +96 -96
  86. package/src/model/operation/moveoperation.js +164 -164
  87. package/src/model/operation/nooperation.d.ts +38 -38
  88. package/src/model/operation/nooperation.js +48 -48
  89. package/src/model/operation/operation.d.ts +96 -96
  90. package/src/model/operation/operation.js +62 -62
  91. package/src/model/operation/operationfactory.d.ts +18 -18
  92. package/src/model/operation/operationfactory.js +44 -44
  93. package/src/model/operation/renameoperation.d.ts +83 -83
  94. package/src/model/operation/renameoperation.js +115 -115
  95. package/src/model/operation/rootattributeoperation.d.ts +98 -98
  96. package/src/model/operation/rootattributeoperation.js +155 -155
  97. package/src/model/operation/rootoperation.d.ts +76 -76
  98. package/src/model/operation/rootoperation.js +90 -90
  99. package/src/model/operation/splitoperation.d.ts +109 -109
  100. package/src/model/operation/splitoperation.js +194 -194
  101. package/src/model/operation/transform.d.ts +100 -100
  102. package/src/model/operation/transform.js +1985 -1985
  103. package/src/model/operation/utils.d.ts +71 -71
  104. package/src/model/operation/utils.js +213 -213
  105. package/src/model/position.d.ts +539 -539
  106. package/src/model/position.js +979 -979
  107. package/src/model/range.d.ts +458 -458
  108. package/src/model/range.js +875 -875
  109. package/src/model/rootelement.d.ts +60 -60
  110. package/src/model/rootelement.js +74 -74
  111. package/src/model/schema.d.ts +1186 -1186
  112. package/src/model/schema.js +1242 -1242
  113. package/src/model/selection.d.ts +482 -482
  114. package/src/model/selection.js +789 -789
  115. package/src/model/text.d.ts +66 -66
  116. package/src/model/text.js +85 -85
  117. package/src/model/textproxy.d.ts +144 -144
  118. package/src/model/textproxy.js +189 -189
  119. package/src/model/treewalker.d.ts +186 -186
  120. package/src/model/treewalker.js +244 -244
  121. package/src/model/typecheckable.d.ts +285 -285
  122. package/src/model/typecheckable.js +16 -16
  123. package/src/model/utils/autoparagraphing.d.ts +37 -37
  124. package/src/model/utils/autoparagraphing.js +63 -63
  125. package/src/model/utils/deletecontent.d.ts +58 -58
  126. package/src/model/utils/deletecontent.js +488 -488
  127. package/src/model/utils/findoptimalinsertionrange.d.ts +32 -32
  128. package/src/model/utils/findoptimalinsertionrange.js +57 -57
  129. package/src/model/utils/getselectedcontent.d.ts +30 -30
  130. package/src/model/utils/getselectedcontent.js +125 -125
  131. package/src/model/utils/insertcontent.d.ts +46 -46
  132. package/src/model/utils/insertcontent.js +705 -705
  133. package/src/model/utils/insertobject.d.ts +44 -44
  134. package/src/model/utils/insertobject.js +139 -139
  135. package/src/model/utils/modifyselection.d.ts +48 -48
  136. package/src/model/utils/modifyselection.js +186 -186
  137. package/src/model/utils/selection-post-fixer.d.ts +74 -74
  138. package/src/model/utils/selection-post-fixer.js +260 -260
  139. package/src/model/writer.d.ts +851 -851
  140. package/src/model/writer.js +1306 -1306
  141. package/src/view/attributeelement.d.ts +108 -108
  142. package/src/view/attributeelement.js +184 -184
  143. package/src/view/containerelement.d.ts +49 -49
  144. package/src/view/containerelement.js +80 -80
  145. package/src/view/datatransfer.d.ts +79 -79
  146. package/src/view/datatransfer.js +98 -98
  147. package/src/view/document.d.ts +184 -184
  148. package/src/view/document.js +120 -120
  149. package/src/view/documentfragment.d.ts +149 -149
  150. package/src/view/documentfragment.js +228 -228
  151. package/src/view/documentselection.d.ts +306 -306
  152. package/src/view/documentselection.js +256 -256
  153. package/src/view/domconverter.d.ts +640 -640
  154. package/src/view/domconverter.js +1450 -1425
  155. package/src/view/downcastwriter.d.ts +996 -996
  156. package/src/view/downcastwriter.js +1696 -1696
  157. package/src/view/editableelement.d.ts +62 -62
  158. package/src/view/editableelement.js +62 -62
  159. package/src/view/element.d.ts +468 -468
  160. package/src/view/element.js +724 -724
  161. package/src/view/elementdefinition.d.ts +87 -87
  162. package/src/view/elementdefinition.js +5 -5
  163. package/src/view/emptyelement.d.ts +41 -41
  164. package/src/view/emptyelement.js +73 -73
  165. package/src/view/filler.d.ts +111 -111
  166. package/src/view/filler.js +150 -150
  167. package/src/view/item.d.ts +14 -14
  168. package/src/view/item.js +5 -5
  169. package/src/view/matcher.d.ts +486 -486
  170. package/src/view/matcher.js +507 -507
  171. package/src/view/node.d.ts +163 -163
  172. package/src/view/node.js +228 -228
  173. package/src/view/observer/arrowkeysobserver.d.ts +45 -45
  174. package/src/view/observer/arrowkeysobserver.js +40 -40
  175. package/src/view/observer/bubblingemittermixin.d.ts +166 -166
  176. package/src/view/observer/bubblingemittermixin.js +172 -172
  177. package/src/view/observer/bubblingeventinfo.d.ts +47 -47
  178. package/src/view/observer/bubblingeventinfo.js +37 -37
  179. package/src/view/observer/clickobserver.d.ts +43 -43
  180. package/src/view/observer/clickobserver.js +29 -29
  181. package/src/view/observer/compositionobserver.d.ts +82 -82
  182. package/src/view/observer/compositionobserver.js +60 -60
  183. package/src/view/observer/domeventdata.d.ts +50 -50
  184. package/src/view/observer/domeventdata.js +47 -47
  185. package/src/view/observer/domeventobserver.d.ts +73 -73
  186. package/src/view/observer/domeventobserver.js +79 -79
  187. package/src/view/observer/fakeselectionobserver.d.ts +47 -47
  188. package/src/view/observer/fakeselectionobserver.js +91 -91
  189. package/src/view/observer/focusobserver.d.ts +82 -82
  190. package/src/view/observer/focusobserver.js +86 -86
  191. package/src/view/observer/inputobserver.d.ts +86 -86
  192. package/src/view/observer/inputobserver.js +164 -164
  193. package/src/view/observer/keyobserver.d.ts +66 -66
  194. package/src/view/observer/keyobserver.js +39 -39
  195. package/src/view/observer/mouseobserver.d.ts +89 -89
  196. package/src/view/observer/mouseobserver.js +29 -29
  197. package/src/view/observer/mutationobserver.d.ts +86 -86
  198. package/src/view/observer/mutationobserver.js +206 -206
  199. package/src/view/observer/observer.d.ts +89 -89
  200. package/src/view/observer/observer.js +84 -84
  201. package/src/view/observer/selectionobserver.d.ts +148 -148
  202. package/src/view/observer/selectionobserver.js +202 -202
  203. package/src/view/observer/tabobserver.d.ts +46 -46
  204. package/src/view/observer/tabobserver.js +42 -42
  205. package/src/view/placeholder.d.ts +96 -96
  206. package/src/view/placeholder.js +267 -267
  207. package/src/view/position.d.ts +189 -189
  208. package/src/view/position.js +324 -324
  209. package/src/view/range.d.ts +279 -279
  210. package/src/view/range.js +430 -430
  211. package/src/view/rawelement.d.ts +73 -73
  212. package/src/view/rawelement.js +105 -105
  213. package/src/view/renderer.d.ts +265 -265
  214. package/src/view/renderer.js +999 -999
  215. package/src/view/rooteditableelement.d.ts +41 -41
  216. package/src/view/rooteditableelement.js +69 -69
  217. package/src/view/selection.d.ts +375 -375
  218. package/src/view/selection.js +559 -559
  219. package/src/view/styles/background.d.ts +33 -33
  220. package/src/view/styles/background.js +74 -74
  221. package/src/view/styles/border.d.ts +43 -43
  222. package/src/view/styles/border.js +316 -316
  223. package/src/view/styles/margin.d.ts +29 -29
  224. package/src/view/styles/margin.js +34 -34
  225. package/src/view/styles/padding.d.ts +29 -29
  226. package/src/view/styles/padding.js +34 -34
  227. package/src/view/styles/utils.d.ts +93 -93
  228. package/src/view/styles/utils.js +219 -219
  229. package/src/view/stylesmap.d.ts +675 -675
  230. package/src/view/stylesmap.js +766 -766
  231. package/src/view/text.d.ts +74 -74
  232. package/src/view/text.js +93 -93
  233. package/src/view/textproxy.d.ts +97 -97
  234. package/src/view/textproxy.js +124 -124
  235. package/src/view/treewalker.d.ts +195 -195
  236. package/src/view/treewalker.js +327 -327
  237. package/src/view/typecheckable.d.ts +448 -448
  238. package/src/view/typecheckable.js +19 -19
  239. package/src/view/uielement.d.ts +96 -96
  240. package/src/view/uielement.js +182 -182
  241. package/src/view/upcastwriter.d.ts +417 -417
  242. package/src/view/upcastwriter.js +359 -359
  243. package/src/view/view.d.ts +487 -487
  244. package/src/view/view.js +546 -546
@@ -1,387 +1,387 @@
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 engine/model/differ
7
- */
8
- import Position from './position';
9
- import Range from './range';
10
- import type { default as MarkerCollection, MarkerData } from './markercollection';
11
- import type Item from './item';
12
- import type RootElement from './rootelement';
13
- import type Operation from './operation/operation';
14
- /**
15
- * Calculates the difference between two model states.
16
- *
17
- * Receives operations that are to be applied on the model document. Marks parts of the model document tree which
18
- * are changed and saves the state of these elements before the change. Then, it compares saved elements with the
19
- * changed elements, after all changes are applied on the model document. Calculates the diff between saved
20
- * elements and new ones and returns a change set.
21
- */
22
- export default class Differ {
23
- /**
24
- * Reference to the model's marker collection.
25
- */
26
- private readonly _markerCollection;
27
- /**
28
- * A map that stores changes that happened in a given element.
29
- *
30
- * The keys of the map are references to the model elements.
31
- * The values of the map are arrays with changes that were done on this element.
32
- */
33
- private readonly _changesInElement;
34
- /**
35
- * A map that stores "element's children snapshots". A snapshot is representing children of a given element before
36
- * the first change was applied on that element. Snapshot items are objects with two properties: `name`,
37
- * containing the element name (or `'$text'` for a text node) and `attributes` which is a map of the node's attributes.
38
- */
39
- private readonly _elementSnapshots;
40
- /**
41
- * A map that stores all changed markers.
42
- *
43
- * The keys of the map are marker names.
44
- * The values of the map are objects with the following properties:
45
- * - `oldMarkerData`,
46
- * - `newMarkerData`.
47
- */
48
- private readonly _changedMarkers;
49
- /**
50
- * A map that stores all roots that have been changed.
51
- *
52
- * The keys are the names of the roots while value represents the changes.
53
- */
54
- private readonly _changedRoots;
55
- /**
56
- * Stores the number of changes that were processed. Used to order the changes chronologically. It is important
57
- * when changes are sorted.
58
- */
59
- private _changeCount;
60
- /**
61
- * For efficiency purposes, `Differ` stores the change set returned by the differ after {@link #getChanges} call.
62
- * Cache is reset each time a new operation is buffered. If the cache has not been reset, {@link #getChanges} will
63
- * return the cached value instead of calculating it again.
64
- *
65
- * This property stores those changes that did not take place in graveyard root.
66
- */
67
- private _cachedChanges;
68
- /**
69
- * For efficiency purposes, `Differ` stores the change set returned by the differ after the {@link #getChanges} call.
70
- * The cache is reset each time a new operation is buffered. If the cache has not been reset, {@link #getChanges} will
71
- * return the cached value instead of calculating it again.
72
- *
73
- * This property stores all changes evaluated by `Differ`, including those that took place in the graveyard.
74
- */
75
- private _cachedChangesWithGraveyard;
76
- /**
77
- * Set of model items that were marked to get refreshed in {@link #_refreshItem}.
78
- */
79
- private _refreshedItems;
80
- /**
81
- * Creates a `Differ` instance.
82
- *
83
- * @param markerCollection Model's marker collection.
84
- */
85
- constructor(markerCollection: MarkerCollection);
86
- /**
87
- * Informs whether there are any changes buffered in `Differ`.
88
- */
89
- get isEmpty(): boolean;
90
- /**
91
- * Buffers the given operation. An operation has to be buffered before it is executed.
92
- *
93
- * @param operationToBuffer An operation to buffer.
94
- */
95
- bufferOperation(operationToBuffer: Operation): void;
96
- /**
97
- * Buffers a marker change.
98
- *
99
- * @param markerName The name of the marker that changed.
100
- * @param oldMarkerData Marker data before the change.
101
- * @param newMarkerData Marker data after the change.
102
- */
103
- bufferMarkerChange(markerName: string, oldMarkerData: MarkerData, newMarkerData: MarkerData): void;
104
- /**
105
- * Returns all markers that should be removed as a result of buffered changes.
106
- *
107
- * @returns Markers to remove. Each array item is an object containing the `name` and `range` properties.
108
- */
109
- getMarkersToRemove(): Array<{
110
- name: string;
111
- range: Range;
112
- }>;
113
- /**
114
- * Returns all markers which should be added as a result of buffered changes.
115
- *
116
- * @returns Markers to add. Each array item is an object containing the `name` and `range` properties.
117
- */
118
- getMarkersToAdd(): Array<{
119
- name: string;
120
- range: Range;
121
- }>;
122
- /**
123
- * Returns all markers which changed.
124
- */
125
- getChangedMarkers(): Array<{
126
- name: string;
127
- data: {
128
- oldRange: Range | null;
129
- newRange: Range | null;
130
- };
131
- }>;
132
- /**
133
- * Checks whether some of the buffered changes affect the editor data.
134
- *
135
- * Types of changes which affect the editor data:
136
- *
137
- * * model structure changes,
138
- * * attribute changes,
139
- * * a root is added or detached,
140
- * * changes of markers which were defined as `affectsData`,
141
- * * changes of markers' `affectsData` property.
142
- */
143
- hasDataChanges(): boolean;
144
- /**
145
- * Calculates the diff between the old model tree state (the state before the first buffered operations since the last {@link #reset}
146
- * call) and the new model tree state (actual one). It should be called after all buffered operations are executed.
147
- *
148
- * The diff set is returned as an array of {@link module:engine/model/differ~DiffItem diff items}, each describing a change done
149
- * on the model. The items are sorted by the position on which the change happened. If a position
150
- * {@link module:engine/model/position~Position#isBefore is before} another one, it will be on an earlier index in the diff set.
151
- *
152
- * **Note**: Elements inside inserted element will not have a separate diff item, only the top most element change will be reported.
153
- *
154
- * Because calculating the diff is a costly operation, the result is cached. If no new operation was buffered since the
155
- * previous {@link #getChanges} call, the next call will return the cached value.
156
- *
157
- * @param options Additional options.
158
- * @param options.includeChangesInGraveyard If set to `true`, also changes that happened
159
- * in the graveyard root will be returned. By default, changes in the graveyard root are not returned.
160
- * @returns Diff between the old and the new model tree state.
161
- */
162
- getChanges(options?: {
163
- includeChangesInGraveyard?: boolean;
164
- }): Array<DiffItem>;
165
- /**
166
- * Returns all roots that have changed (either were attached, or detached, or their attributes changed).
167
- *
168
- * @returns Diff between the old and the new roots state.
169
- */
170
- getChangedRoots(): Array<DiffItemRoot>;
171
- /**
172
- * Returns a set of model items that were marked to get refreshed.
173
- */
174
- getRefreshedItems(): Set<Item>;
175
- /**
176
- * Resets `Differ`. Removes all buffered changes.
177
- */
178
- reset(): void;
179
- /**
180
- * Buffers the root state change after the root was attached or detached
181
- */
182
- private _bufferRootStateChange;
183
- /**
184
- * Buffers a root attribute change.
185
- */
186
- private _bufferRootAttributeChange;
187
- /**
188
- * Marks the given `item` in differ to be "refreshed". It means that the item will be marked as removed and inserted
189
- * in the differ changes set, so it will be effectively re-converted when the differ changes are handled by a dispatcher.
190
- *
191
- * @internal
192
- * @param item Item to refresh.
193
- */
194
- _refreshItem(item: Item): void;
195
- /**
196
- * Buffers all the data related to given root like it was all just added to the editor.
197
- *
198
- * Following changes are buffered:
199
- *
200
- * * root is attached,
201
- * * all root content is inserted,
202
- * * all root attributes are added,
203
- * * all markers inside the root are added.
204
- *
205
- * @internal
206
- */
207
- _bufferRootLoad(root: RootElement): void;
208
- /**
209
- * Saves and handles an insert change.
210
- */
211
- private _markInsert;
212
- /**
213
- * Saves and handles a remove change.
214
- */
215
- private _markRemove;
216
- /**
217
- * Saves and handles an attribute change.
218
- */
219
- private _markAttribute;
220
- /**
221
- * Saves and handles a model change.
222
- */
223
- private _markChange;
224
- /**
225
- * Gets an array of changes that have already been saved for a given element.
226
- */
227
- private _getChangesForElement;
228
- /**
229
- * Saves a children snapshot for a given element.
230
- */
231
- private _makeSnapshot;
232
- /**
233
- * For a given newly saved change, compares it with a change already done on the element and modifies the incoming
234
- * change and/or the old change.
235
- *
236
- * @param inc Incoming (new) change.
237
- * @param changes An array containing all the changes done on that element.
238
- */
239
- private _handleChange;
240
- /**
241
- * Returns an object with a single insert change description.
242
- *
243
- * @param parent The element in which the change happened.
244
- * @param offset The offset at which change happened.
245
- * @param elementSnapshot The snapshot of the removed element a character.
246
- * @returns The diff item.
247
- */
248
- private _getInsertDiff;
249
- /**
250
- * Returns an object with a single remove change description.
251
- *
252
- * @param parent The element in which change happened.
253
- * @param offset The offset at which change happened.
254
- * @param elementSnapshot The snapshot of the removed element a character.
255
- * @returns The diff item.
256
- */
257
- private _getRemoveDiff;
258
- /**
259
- * Returns an array of objects where each one is a single attribute change description.
260
- *
261
- * @param range The range where the change happened.
262
- * @param oldAttributes A map, map iterator or compatible object that contains attributes before the change.
263
- * @param newAttributes A map, map iterator or compatible object that contains attributes after the change.
264
- * @returns An array containing one or more diff items.
265
- */
266
- private _getAttributesDiff;
267
- /**
268
- * Checks whether given element or any of its parents is an element that is buffered as an inserted element.
269
- */
270
- private _isInInsertedElement;
271
- /**
272
- * Removes deeply all buffered changes that are registered in elements from range specified by `parent`, `offset`
273
- * and `howMany`.
274
- */
275
- private _removeAllNestedChanges;
276
- }
277
- /**
278
- * The single diff item.
279
- *
280
- * Could be one of:
281
- *
282
- * * {@link module:engine/model/differ~DiffItemInsert `DiffItemInsert`},
283
- * * {@link module:engine/model/differ~DiffItemRemove `DiffItemRemove`},
284
- * * {@link module:engine/model/differ~DiffItemAttribute `DiffItemAttribute`}.
285
- */
286
- export type DiffItem = DiffItemInsert | DiffItemRemove | DiffItemAttribute;
287
- /**
288
- * A single diff item for inserted nodes.
289
- */
290
- export interface DiffItemInsert {
291
- /**
292
- * The type of diff item.
293
- */
294
- type: 'insert';
295
- /**
296
- * The name of the inserted elements or `'$text'` for a text node.
297
- */
298
- name: string;
299
- /**
300
- * Map of attributes that were set on the item while it was inserted.
301
- */
302
- attributes: Map<string, unknown>;
303
- /**
304
- * The position where the node was inserted.
305
- */
306
- position: Position;
307
- /**
308
- * The length of an inserted text node. For elements, it is always 1 as each inserted element is counted as a one.
309
- */
310
- length: number;
311
- }
312
- /**
313
- * A single diff item for removed nodes.
314
- */
315
- export interface DiffItemRemove {
316
- /**
317
- * The type of diff item.
318
- */
319
- type: 'remove';
320
- /**
321
- * The name of the removed element or `'$text'` for a text node.
322
- */
323
- name: string;
324
- /**
325
- * Map of attributes that were set on the item while it was removed.
326
- */
327
- attributes: Map<string, unknown>;
328
- /**
329
- * The position where the node was removed.
330
- */
331
- position: Position;
332
- /**
333
- * The length of a removed text node. For elements, it is always 1, as each removed element is counted as a one.
334
- */
335
- length: number;
336
- }
337
- /**
338
- * A single diff item for attribute change.
339
- */
340
- export interface DiffItemAttribute {
341
- /**
342
- * The type of diff item.
343
- */
344
- type: 'attribute';
345
- /**
346
- * The name of the changed attribute.
347
- */
348
- attributeKey: string;
349
- /**
350
- * An attribute previous value (before change).
351
- */
352
- attributeOldValue: unknown;
353
- /**
354
- * An attribute new value (after change).
355
- */
356
- attributeNewValue: unknown;
357
- /**
358
- * The range where the change happened.
359
- */
360
- range: Range;
361
- }
362
- /**
363
- * A single diff item for a changed root.
364
- */
365
- export interface DiffItemRoot {
366
- /**
367
- * Name of the changed root.
368
- */
369
- name: string;
370
- /**
371
- * Set accordingly if the root got attached or detached. Otherwise, not set.
372
- */
373
- state?: 'attached' | 'detached';
374
- /**
375
- * Keeps all attribute changes that happened on the root.
376
- *
377
- * The keys are keys of the changed attributes. The values are objects containing the attribute value before the change
378
- * (`oldValue`) and after the change (`newValue`).
379
- *
380
- * Note, that if the root state changed (`state` is set), then `attributes` property will not be set. All attributes should be
381
- * handled together with the root being attached or detached.
382
- */
383
- attributes?: Record<string, {
384
- oldValue: unknown;
385
- newValue: unknown;
386
- }>;
387
- }
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 engine/model/differ
7
+ */
8
+ import Position from './position';
9
+ import Range from './range';
10
+ import type { default as MarkerCollection, MarkerData } from './markercollection';
11
+ import type Item from './item';
12
+ import type RootElement from './rootelement';
13
+ import type Operation from './operation/operation';
14
+ /**
15
+ * Calculates the difference between two model states.
16
+ *
17
+ * Receives operations that are to be applied on the model document. Marks parts of the model document tree which
18
+ * are changed and saves the state of these elements before the change. Then, it compares saved elements with the
19
+ * changed elements, after all changes are applied on the model document. Calculates the diff between saved
20
+ * elements and new ones and returns a change set.
21
+ */
22
+ export default class Differ {
23
+ /**
24
+ * Reference to the model's marker collection.
25
+ */
26
+ private readonly _markerCollection;
27
+ /**
28
+ * A map that stores changes that happened in a given element.
29
+ *
30
+ * The keys of the map are references to the model elements.
31
+ * The values of the map are arrays with changes that were done on this element.
32
+ */
33
+ private readonly _changesInElement;
34
+ /**
35
+ * A map that stores "element's children snapshots". A snapshot is representing children of a given element before
36
+ * the first change was applied on that element. Snapshot items are objects with two properties: `name`,
37
+ * containing the element name (or `'$text'` for a text node) and `attributes` which is a map of the node's attributes.
38
+ */
39
+ private readonly _elementSnapshots;
40
+ /**
41
+ * A map that stores all changed markers.
42
+ *
43
+ * The keys of the map are marker names.
44
+ * The values of the map are objects with the following properties:
45
+ * - `oldMarkerData`,
46
+ * - `newMarkerData`.
47
+ */
48
+ private readonly _changedMarkers;
49
+ /**
50
+ * A map that stores all roots that have been changed.
51
+ *
52
+ * The keys are the names of the roots while value represents the changes.
53
+ */
54
+ private readonly _changedRoots;
55
+ /**
56
+ * Stores the number of changes that were processed. Used to order the changes chronologically. It is important
57
+ * when changes are sorted.
58
+ */
59
+ private _changeCount;
60
+ /**
61
+ * For efficiency purposes, `Differ` stores the change set returned by the differ after {@link #getChanges} call.
62
+ * Cache is reset each time a new operation is buffered. If the cache has not been reset, {@link #getChanges} will
63
+ * return the cached value instead of calculating it again.
64
+ *
65
+ * This property stores those changes that did not take place in graveyard root.
66
+ */
67
+ private _cachedChanges;
68
+ /**
69
+ * For efficiency purposes, `Differ` stores the change set returned by the differ after the {@link #getChanges} call.
70
+ * The cache is reset each time a new operation is buffered. If the cache has not been reset, {@link #getChanges} will
71
+ * return the cached value instead of calculating it again.
72
+ *
73
+ * This property stores all changes evaluated by `Differ`, including those that took place in the graveyard.
74
+ */
75
+ private _cachedChangesWithGraveyard;
76
+ /**
77
+ * Set of model items that were marked to get refreshed in {@link #_refreshItem}.
78
+ */
79
+ private _refreshedItems;
80
+ /**
81
+ * Creates a `Differ` instance.
82
+ *
83
+ * @param markerCollection Model's marker collection.
84
+ */
85
+ constructor(markerCollection: MarkerCollection);
86
+ /**
87
+ * Informs whether there are any changes buffered in `Differ`.
88
+ */
89
+ get isEmpty(): boolean;
90
+ /**
91
+ * Buffers the given operation. An operation has to be buffered before it is executed.
92
+ *
93
+ * @param operationToBuffer An operation to buffer.
94
+ */
95
+ bufferOperation(operationToBuffer: Operation): void;
96
+ /**
97
+ * Buffers a marker change.
98
+ *
99
+ * @param markerName The name of the marker that changed.
100
+ * @param oldMarkerData Marker data before the change.
101
+ * @param newMarkerData Marker data after the change.
102
+ */
103
+ bufferMarkerChange(markerName: string, oldMarkerData: MarkerData, newMarkerData: MarkerData): void;
104
+ /**
105
+ * Returns all markers that should be removed as a result of buffered changes.
106
+ *
107
+ * @returns Markers to remove. Each array item is an object containing the `name` and `range` properties.
108
+ */
109
+ getMarkersToRemove(): Array<{
110
+ name: string;
111
+ range: Range;
112
+ }>;
113
+ /**
114
+ * Returns all markers which should be added as a result of buffered changes.
115
+ *
116
+ * @returns Markers to add. Each array item is an object containing the `name` and `range` properties.
117
+ */
118
+ getMarkersToAdd(): Array<{
119
+ name: string;
120
+ range: Range;
121
+ }>;
122
+ /**
123
+ * Returns all markers which changed.
124
+ */
125
+ getChangedMarkers(): Array<{
126
+ name: string;
127
+ data: {
128
+ oldRange: Range | null;
129
+ newRange: Range | null;
130
+ };
131
+ }>;
132
+ /**
133
+ * Checks whether some of the buffered changes affect the editor data.
134
+ *
135
+ * Types of changes which affect the editor data:
136
+ *
137
+ * * model structure changes,
138
+ * * attribute changes,
139
+ * * a root is added or detached,
140
+ * * changes of markers which were defined as `affectsData`,
141
+ * * changes of markers' `affectsData` property.
142
+ */
143
+ hasDataChanges(): boolean;
144
+ /**
145
+ * Calculates the diff between the old model tree state (the state before the first buffered operations since the last {@link #reset}
146
+ * call) and the new model tree state (actual one). It should be called after all buffered operations are executed.
147
+ *
148
+ * The diff set is returned as an array of {@link module:engine/model/differ~DiffItem diff items}, each describing a change done
149
+ * on the model. The items are sorted by the position on which the change happened. If a position
150
+ * {@link module:engine/model/position~Position#isBefore is before} another one, it will be on an earlier index in the diff set.
151
+ *
152
+ * **Note**: Elements inside inserted element will not have a separate diff item, only the top most element change will be reported.
153
+ *
154
+ * Because calculating the diff is a costly operation, the result is cached. If no new operation was buffered since the
155
+ * previous {@link #getChanges} call, the next call will return the cached value.
156
+ *
157
+ * @param options Additional options.
158
+ * @param options.includeChangesInGraveyard If set to `true`, also changes that happened
159
+ * in the graveyard root will be returned. By default, changes in the graveyard root are not returned.
160
+ * @returns Diff between the old and the new model tree state.
161
+ */
162
+ getChanges(options?: {
163
+ includeChangesInGraveyard?: boolean;
164
+ }): Array<DiffItem>;
165
+ /**
166
+ * Returns all roots that have changed (either were attached, or detached, or their attributes changed).
167
+ *
168
+ * @returns Diff between the old and the new roots state.
169
+ */
170
+ getChangedRoots(): Array<DiffItemRoot>;
171
+ /**
172
+ * Returns a set of model items that were marked to get refreshed.
173
+ */
174
+ getRefreshedItems(): Set<Item>;
175
+ /**
176
+ * Resets `Differ`. Removes all buffered changes.
177
+ */
178
+ reset(): void;
179
+ /**
180
+ * Buffers the root state change after the root was attached or detached
181
+ */
182
+ private _bufferRootStateChange;
183
+ /**
184
+ * Buffers a root attribute change.
185
+ */
186
+ private _bufferRootAttributeChange;
187
+ /**
188
+ * Marks the given `item` in differ to be "refreshed". It means that the item will be marked as removed and inserted
189
+ * in the differ changes set, so it will be effectively re-converted when the differ changes are handled by a dispatcher.
190
+ *
191
+ * @internal
192
+ * @param item Item to refresh.
193
+ */
194
+ _refreshItem(item: Item): void;
195
+ /**
196
+ * Buffers all the data related to given root like it was all just added to the editor.
197
+ *
198
+ * Following changes are buffered:
199
+ *
200
+ * * root is attached,
201
+ * * all root content is inserted,
202
+ * * all root attributes are added,
203
+ * * all markers inside the root are added.
204
+ *
205
+ * @internal
206
+ */
207
+ _bufferRootLoad(root: RootElement): void;
208
+ /**
209
+ * Saves and handles an insert change.
210
+ */
211
+ private _markInsert;
212
+ /**
213
+ * Saves and handles a remove change.
214
+ */
215
+ private _markRemove;
216
+ /**
217
+ * Saves and handles an attribute change.
218
+ */
219
+ private _markAttribute;
220
+ /**
221
+ * Saves and handles a model change.
222
+ */
223
+ private _markChange;
224
+ /**
225
+ * Gets an array of changes that have already been saved for a given element.
226
+ */
227
+ private _getChangesForElement;
228
+ /**
229
+ * Saves a children snapshot for a given element.
230
+ */
231
+ private _makeSnapshot;
232
+ /**
233
+ * For a given newly saved change, compares it with a change already done on the element and modifies the incoming
234
+ * change and/or the old change.
235
+ *
236
+ * @param inc Incoming (new) change.
237
+ * @param changes An array containing all the changes done on that element.
238
+ */
239
+ private _handleChange;
240
+ /**
241
+ * Returns an object with a single insert change description.
242
+ *
243
+ * @param parent The element in which the change happened.
244
+ * @param offset The offset at which change happened.
245
+ * @param elementSnapshot The snapshot of the removed element a character.
246
+ * @returns The diff item.
247
+ */
248
+ private _getInsertDiff;
249
+ /**
250
+ * Returns an object with a single remove change description.
251
+ *
252
+ * @param parent The element in which change happened.
253
+ * @param offset The offset at which change happened.
254
+ * @param elementSnapshot The snapshot of the removed element a character.
255
+ * @returns The diff item.
256
+ */
257
+ private _getRemoveDiff;
258
+ /**
259
+ * Returns an array of objects where each one is a single attribute change description.
260
+ *
261
+ * @param range The range where the change happened.
262
+ * @param oldAttributes A map, map iterator or compatible object that contains attributes before the change.
263
+ * @param newAttributes A map, map iterator or compatible object that contains attributes after the change.
264
+ * @returns An array containing one or more diff items.
265
+ */
266
+ private _getAttributesDiff;
267
+ /**
268
+ * Checks whether given element or any of its parents is an element that is buffered as an inserted element.
269
+ */
270
+ private _isInInsertedElement;
271
+ /**
272
+ * Removes deeply all buffered changes that are registered in elements from range specified by `parent`, `offset`
273
+ * and `howMany`.
274
+ */
275
+ private _removeAllNestedChanges;
276
+ }
277
+ /**
278
+ * The single diff item.
279
+ *
280
+ * Could be one of:
281
+ *
282
+ * * {@link module:engine/model/differ~DiffItemInsert `DiffItemInsert`},
283
+ * * {@link module:engine/model/differ~DiffItemRemove `DiffItemRemove`},
284
+ * * {@link module:engine/model/differ~DiffItemAttribute `DiffItemAttribute`}.
285
+ */
286
+ export type DiffItem = DiffItemInsert | DiffItemRemove | DiffItemAttribute;
287
+ /**
288
+ * A single diff item for inserted nodes.
289
+ */
290
+ export interface DiffItemInsert {
291
+ /**
292
+ * The type of diff item.
293
+ */
294
+ type: 'insert';
295
+ /**
296
+ * The name of the inserted elements or `'$text'` for a text node.
297
+ */
298
+ name: string;
299
+ /**
300
+ * Map of attributes that were set on the item while it was inserted.
301
+ */
302
+ attributes: Map<string, unknown>;
303
+ /**
304
+ * The position where the node was inserted.
305
+ */
306
+ position: Position;
307
+ /**
308
+ * The length of an inserted text node. For elements, it is always 1 as each inserted element is counted as a one.
309
+ */
310
+ length: number;
311
+ }
312
+ /**
313
+ * A single diff item for removed nodes.
314
+ */
315
+ export interface DiffItemRemove {
316
+ /**
317
+ * The type of diff item.
318
+ */
319
+ type: 'remove';
320
+ /**
321
+ * The name of the removed element or `'$text'` for a text node.
322
+ */
323
+ name: string;
324
+ /**
325
+ * Map of attributes that were set on the item while it was removed.
326
+ */
327
+ attributes: Map<string, unknown>;
328
+ /**
329
+ * The position where the node was removed.
330
+ */
331
+ position: Position;
332
+ /**
333
+ * The length of a removed text node. For elements, it is always 1, as each removed element is counted as a one.
334
+ */
335
+ length: number;
336
+ }
337
+ /**
338
+ * A single diff item for attribute change.
339
+ */
340
+ export interface DiffItemAttribute {
341
+ /**
342
+ * The type of diff item.
343
+ */
344
+ type: 'attribute';
345
+ /**
346
+ * The name of the changed attribute.
347
+ */
348
+ attributeKey: string;
349
+ /**
350
+ * An attribute previous value (before change).
351
+ */
352
+ attributeOldValue: unknown;
353
+ /**
354
+ * An attribute new value (after change).
355
+ */
356
+ attributeNewValue: unknown;
357
+ /**
358
+ * The range where the change happened.
359
+ */
360
+ range: Range;
361
+ }
362
+ /**
363
+ * A single diff item for a changed root.
364
+ */
365
+ export interface DiffItemRoot {
366
+ /**
367
+ * Name of the changed root.
368
+ */
369
+ name: string;
370
+ /**
371
+ * Set accordingly if the root got attached or detached. Otherwise, not set.
372
+ */
373
+ state?: 'attached' | 'detached';
374
+ /**
375
+ * Keeps all attribute changes that happened on the root.
376
+ *
377
+ * The keys are keys of the changed attributes. The values are objects containing the attribute value before the change
378
+ * (`oldValue`) and after the change (`newValue`).
379
+ *
380
+ * Note, that if the root state changed (`state` is set), then `attributes` property will not be set. All attributes should be
381
+ * handled together with the root being attached or detached.
382
+ */
383
+ attributes?: Record<string, {
384
+ oldValue: unknown;
385
+ newValue: unknown;
386
+ }>;
387
+ }