@ckeditor/ckeditor5-engine 35.0.1 → 35.2.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 (124) hide show
  1. package/CHANGELOG.md +4 -4
  2. package/package.json +30 -24
  3. package/src/controller/datacontroller.js +467 -561
  4. package/src/controller/editingcontroller.js +168 -204
  5. package/src/conversion/conversion.js +541 -565
  6. package/src/conversion/conversionhelpers.js +24 -28
  7. package/src/conversion/downcastdispatcher.js +457 -686
  8. package/src/conversion/downcasthelpers.js +1583 -1965
  9. package/src/conversion/mapper.js +518 -707
  10. package/src/conversion/modelconsumable.js +240 -283
  11. package/src/conversion/upcastdispatcher.js +372 -718
  12. package/src/conversion/upcasthelpers.js +707 -818
  13. package/src/conversion/viewconsumable.js +524 -581
  14. package/src/dataprocessor/basichtmlwriter.js +12 -16
  15. package/src/dataprocessor/dataprocessor.js +5 -0
  16. package/src/dataprocessor/htmldataprocessor.js +100 -116
  17. package/src/dataprocessor/htmlwriter.js +1 -18
  18. package/src/dataprocessor/xmldataprocessor.js +116 -137
  19. package/src/dev-utils/model.js +260 -352
  20. package/src/dev-utils/operationreplayer.js +106 -126
  21. package/src/dev-utils/utils.js +34 -51
  22. package/src/dev-utils/view.js +632 -753
  23. package/src/index.js +0 -11
  24. package/src/model/batch.js +111 -127
  25. package/src/model/differ.js +988 -1233
  26. package/src/model/document.js +340 -449
  27. package/src/model/documentfragment.js +327 -364
  28. package/src/model/documentselection.js +996 -1189
  29. package/src/model/element.js +306 -410
  30. package/src/model/history.js +224 -262
  31. package/src/model/item.js +5 -0
  32. package/src/model/liveposition.js +84 -145
  33. package/src/model/liverange.js +108 -185
  34. package/src/model/markercollection.js +379 -480
  35. package/src/model/model.js +883 -1034
  36. package/src/model/node.js +419 -463
  37. package/src/model/nodelist.js +176 -201
  38. package/src/model/operation/attributeoperation.js +153 -182
  39. package/src/model/operation/detachoperation.js +64 -83
  40. package/src/model/operation/insertoperation.js +135 -166
  41. package/src/model/operation/markeroperation.js +114 -140
  42. package/src/model/operation/mergeoperation.js +163 -191
  43. package/src/model/operation/moveoperation.js +157 -187
  44. package/src/model/operation/nooperation.js +28 -38
  45. package/src/model/operation/operation.js +106 -125
  46. package/src/model/operation/operationfactory.js +30 -34
  47. package/src/model/operation/renameoperation.js +109 -135
  48. package/src/model/operation/rootattributeoperation.js +155 -188
  49. package/src/model/operation/splitoperation.js +196 -232
  50. package/src/model/operation/transform.js +1833 -2204
  51. package/src/model/operation/utils.js +140 -204
  52. package/src/model/position.js +980 -1053
  53. package/src/model/range.js +910 -1028
  54. package/src/model/rootelement.js +77 -97
  55. package/src/model/schema.js +1189 -1835
  56. package/src/model/selection.js +745 -862
  57. package/src/model/text.js +90 -114
  58. package/src/model/textproxy.js +204 -240
  59. package/src/model/treewalker.js +316 -397
  60. package/src/model/typecheckable.js +16 -0
  61. package/src/model/utils/autoparagraphing.js +32 -44
  62. package/src/model/utils/deletecontent.js +334 -418
  63. package/src/model/utils/findoptimalinsertionrange.js +25 -36
  64. package/src/model/utils/getselectedcontent.js +96 -118
  65. package/src/model/utils/insertcontent.js +757 -773
  66. package/src/model/utils/insertobject.js +96 -119
  67. package/src/model/utils/modifyselection.js +120 -158
  68. package/src/model/utils/selection-post-fixer.js +153 -201
  69. package/src/model/writer.js +1305 -1474
  70. package/src/view/attributeelement.js +189 -225
  71. package/src/view/containerelement.js +75 -85
  72. package/src/view/document.js +172 -215
  73. package/src/view/documentfragment.js +200 -249
  74. package/src/view/documentselection.js +338 -367
  75. package/src/view/domconverter.js +1370 -1617
  76. package/src/view/downcastwriter.js +1747 -2076
  77. package/src/view/editableelement.js +81 -97
  78. package/src/view/element.js +739 -890
  79. package/src/view/elementdefinition.js +5 -0
  80. package/src/view/emptyelement.js +82 -92
  81. package/src/view/filler.js +35 -50
  82. package/src/view/item.js +5 -0
  83. package/src/view/matcher.js +260 -559
  84. package/src/view/node.js +274 -360
  85. package/src/view/observer/arrowkeysobserver.js +19 -28
  86. package/src/view/observer/bubblingemittermixin.js +120 -263
  87. package/src/view/observer/bubblingeventinfo.js +47 -55
  88. package/src/view/observer/clickobserver.js +7 -13
  89. package/src/view/observer/compositionobserver.js +14 -24
  90. package/src/view/observer/domeventdata.js +57 -67
  91. package/src/view/observer/domeventobserver.js +40 -64
  92. package/src/view/observer/fakeselectionobserver.js +81 -96
  93. package/src/view/observer/focusobserver.js +45 -61
  94. package/src/view/observer/inputobserver.js +7 -13
  95. package/src/view/observer/keyobserver.js +17 -27
  96. package/src/view/observer/mouseobserver.js +7 -14
  97. package/src/view/observer/mutationobserver.js +220 -315
  98. package/src/view/observer/observer.js +81 -102
  99. package/src/view/observer/selectionobserver.js +199 -246
  100. package/src/view/observer/tabobserver.js +23 -36
  101. package/src/view/placeholder.js +128 -173
  102. package/src/view/position.js +350 -401
  103. package/src/view/range.js +453 -513
  104. package/src/view/rawelement.js +85 -112
  105. package/src/view/renderer.js +874 -1018
  106. package/src/view/rooteditableelement.js +80 -90
  107. package/src/view/selection.js +608 -689
  108. package/src/view/styles/background.js +43 -44
  109. package/src/view/styles/border.js +220 -276
  110. package/src/view/styles/margin.js +8 -17
  111. package/src/view/styles/padding.js +8 -16
  112. package/src/view/styles/utils.js +127 -160
  113. package/src/view/stylesmap.js +728 -905
  114. package/src/view/text.js +102 -126
  115. package/src/view/textproxy.js +144 -170
  116. package/src/view/treewalker.js +383 -479
  117. package/src/view/typecheckable.js +19 -0
  118. package/src/view/uielement.js +166 -187
  119. package/src/view/upcastwriter.js +395 -449
  120. package/src/view/view.js +569 -664
  121. package/src/dataprocessor/dataprocessor.jsdoc +0 -64
  122. package/src/model/item.jsdoc +0 -14
  123. package/src/view/elementdefinition.jsdoc +0 -59
  124. package/src/view/item.jsdoc +0 -14
@@ -2,216 +2,191 @@
2
2
  * @license Copyright (c) 2003-2022, CKSource Holding sp. z o.o. All rights reserved.
3
3
  * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
4
  */
5
-
6
5
  /**
7
6
  * @module engine/model/nodelist
8
7
  */
9
-
10
8
  import Node from './node';
11
9
  import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';
12
-
10
+ import spliceArray from '@ckeditor/ckeditor5-utils/src/splicearray';
13
11
  /**
14
12
  * Provides an interface to operate on a list of {@link module:engine/model/node~Node nodes}. `NodeList` is used internally
15
13
  * in classes like {@link module:engine/model/element~Element Element}
16
14
  * or {@link module:engine/model/documentfragment~DocumentFragment DocumentFragment}.
17
15
  */
18
16
  export default class NodeList {
19
- /**
20
- * Creates an empty node list.
21
- *
22
- * @protected
23
- * @param {Iterable.<module:engine/model/node~Node>} nodes Nodes contained in this node list.
24
- */
25
- constructor( nodes ) {
26
- /**
27
- * Nodes contained in this node list.
28
- *
29
- * @private
30
- * @member {Array.<module:engine/model/node~Node>}
31
- */
32
- this._nodes = [];
33
-
34
- if ( nodes ) {
35
- this._insertNodes( 0, nodes );
36
- }
37
- }
38
-
39
- /**
40
- * Iterable interface.
41
- *
42
- * Iterates over all nodes contained inside this node list.
43
- *
44
- * @returns {Iterable.<module:engine/model/node~Node>}
45
- */
46
- [ Symbol.iterator ]() {
47
- return this._nodes[ Symbol.iterator ]();
48
- }
49
-
50
- /**
51
- * Number of nodes contained inside this node list.
52
- *
53
- * @readonly
54
- * @type {Number}
55
- */
56
- get length() {
57
- return this._nodes.length;
58
- }
59
-
60
- /**
61
- * Sum of {@link module:engine/model/node~Node#offsetSize offset sizes} of all nodes contained inside this node list.
62
- *
63
- * @readonly
64
- * @type {Number}
65
- */
66
- get maxOffset() {
67
- return this._nodes.reduce( ( sum, node ) => sum + node.offsetSize, 0 );
68
- }
69
-
70
- /**
71
- * Gets the node at the given index. Returns `null` if incorrect index was passed.
72
- *
73
- * @param {Number} index Index of node.
74
- * @returns {module:engine/model/node~Node|null} Node at given index.
75
- */
76
- getNode( index ) {
77
- return this._nodes[ index ] || null;
78
- }
79
-
80
- /**
81
- * Returns an index of the given node. Returns `null` if given node is not inside this node list.
82
- *
83
- * @param {module:engine/model/node~Node} node Child node to look for.
84
- * @returns {Number|null} Child node's index.
85
- */
86
- getNodeIndex( node ) {
87
- const index = this._nodes.indexOf( node );
88
-
89
- return index == -1 ? null : index;
90
- }
91
-
92
- /**
93
- * Returns the starting offset of given node. Starting offset is equal to the sum of
94
- * {@link module:engine/model/node~Node#offsetSize offset sizes} of all nodes that are before this node in this node list.
95
- *
96
- * @param {module:engine/model/node~Node} node Node to look for.
97
- * @returns {Number|null} Node's starting offset.
98
- */
99
- getNodeStartOffset( node ) {
100
- const index = this.getNodeIndex( node );
101
-
102
- return index === null ? null : this._nodes.slice( 0, index ).reduce( ( sum, node ) => sum + node.offsetSize, 0 );
103
- }
104
-
105
- /**
106
- * Converts index to offset in node list.
107
- *
108
- * Returns starting offset of a node that is at given index. Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError}
109
- * `model-nodelist-index-out-of-bounds` if given index is less than `0` or more than {@link #length}.
110
- *
111
- * @param {Number} index Node's index.
112
- * @returns {Number} Node's starting offset.
113
- */
114
- indexToOffset( index ) {
115
- if ( index == this._nodes.length ) {
116
- return this.maxOffset;
117
- }
118
-
119
- const node = this._nodes[ index ];
120
-
121
- if ( !node ) {
122
- /**
123
- * Given index cannot be found in the node list.
124
- *
125
- * @error model-nodelist-index-out-of-bounds
126
- */
127
- throw new CKEditorError( 'model-nodelist-index-out-of-bounds', this );
128
- }
129
-
130
- return this.getNodeStartOffset( node );
131
- }
132
-
133
- /**
134
- * Converts offset in node list to index.
135
- *
136
- * Returns index of a node that occupies given offset. Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError}
137
- * `model-nodelist-offset-out-of-bounds` if given offset is less than `0` or more than {@link #maxOffset}.
138
- *
139
- * @param {Number} offset Offset to look for.
140
- * @returns {Number} Index of a node that occupies given offset.
141
- */
142
- offsetToIndex( offset ) {
143
- let totalOffset = 0;
144
-
145
- for ( const node of this._nodes ) {
146
- if ( offset >= totalOffset && offset < totalOffset + node.offsetSize ) {
147
- return this.getNodeIndex( node );
148
- }
149
-
150
- totalOffset += node.offsetSize;
151
- }
152
-
153
- if ( totalOffset != offset ) {
154
- /**
155
- * Given offset cannot be found in the node list.
156
- *
157
- * @error model-nodelist-offset-out-of-bounds
158
- * @param {Number} offset
159
- * @param {module:engine/model/nodelist~NodeList} nodeList Stringified node list.
160
- */
161
- throw new CKEditorError( 'model-nodelist-offset-out-of-bounds',
162
- this,
163
- {
164
- offset,
165
- nodeList: this
166
- }
167
- );
168
- }
169
-
170
- return this.length;
171
- }
172
-
173
- /**
174
- * Inserts given nodes at given index.
175
- *
176
- * @protected
177
- * @param {Number} index Index at which nodes should be inserted.
178
- * @param {Iterable.<module:engine/model/node~Node>} nodes Nodes to be inserted.
179
- */
180
- _insertNodes( index, nodes ) {
181
- // Validation.
182
- for ( const node of nodes ) {
183
- if ( !( node instanceof Node ) ) {
184
- /**
185
- * Trying to insert an object which is not a Node instance.
186
- *
187
- * @error model-nodelist-insertnodes-not-node
188
- */
189
- throw new CKEditorError( 'model-nodelist-insertnodes-not-node', this );
190
- }
191
- }
192
-
193
- this._nodes.splice( index, 0, ...nodes );
194
- }
195
-
196
- /**
197
- * Removes one or more nodes starting at the given index.
198
- *
199
- * @protected
200
- * @param {Number} indexStart Index of the first node to remove.
201
- * @param {Number} [howMany=1] Number of nodes to remove.
202
- * @returns {Array.<module:engine/model/node~Node>} Array containing removed nodes.
203
- */
204
- _removeNodes( indexStart, howMany = 1 ) {
205
- return this._nodes.splice( indexStart, howMany );
206
- }
207
-
208
- /**
209
- * Converts `NodeList` instance to an array containing nodes that were inserted in the node list. Nodes
210
- * are also converted to their plain object representation.
211
- *
212
- * @returns {Array.<module:engine/model/node~Node>} `NodeList` instance converted to `Array`.
213
- */
214
- toJSON() {
215
- return this._nodes.map( node => node.toJSON() );
216
- }
17
+ /**
18
+ * Creates an empty node list.
19
+ *
20
+ * @protected
21
+ * @param {Iterable.<module:engine/model/node~Node>} [nodes] Nodes contained in this node list.
22
+ */
23
+ constructor(nodes) {
24
+ /**
25
+ * Nodes contained in this node list.
26
+ *
27
+ * @private
28
+ * @member {Array.<module:engine/model/node~Node>}
29
+ */
30
+ this._nodes = [];
31
+ if (nodes) {
32
+ this._insertNodes(0, nodes);
33
+ }
34
+ }
35
+ /**
36
+ * Iterable interface.
37
+ *
38
+ * Iterates over all nodes contained inside this node list.
39
+ *
40
+ * @returns {Iterator.<module:engine/model/node~Node>}
41
+ */
42
+ [Symbol.iterator]() {
43
+ return this._nodes[Symbol.iterator]();
44
+ }
45
+ /**
46
+ * Number of nodes contained inside this node list.
47
+ *
48
+ * @readonly
49
+ * @type {Number}
50
+ */
51
+ get length() {
52
+ return this._nodes.length;
53
+ }
54
+ /**
55
+ * Sum of {@link module:engine/model/node~Node#offsetSize offset sizes} of all nodes contained inside this node list.
56
+ *
57
+ * @readonly
58
+ * @type {Number}
59
+ */
60
+ get maxOffset() {
61
+ return this._nodes.reduce((sum, node) => sum + node.offsetSize, 0);
62
+ }
63
+ /**
64
+ * Gets the node at the given index. Returns `null` if incorrect index was passed.
65
+ *
66
+ * @param {Number} index Index of node.
67
+ * @returns {module:engine/model/node~Node|null} Node at given index.
68
+ */
69
+ getNode(index) {
70
+ return this._nodes[index] || null;
71
+ }
72
+ /**
73
+ * Returns an index of the given node. Returns `null` if given node is not inside this node list.
74
+ *
75
+ * @param {module:engine/model/node~Node} node Child node to look for.
76
+ * @returns {Number|null} Child node's index.
77
+ */
78
+ getNodeIndex(node) {
79
+ const index = this._nodes.indexOf(node);
80
+ return index == -1 ? null : index;
81
+ }
82
+ /**
83
+ * Returns the starting offset of given node. Starting offset is equal to the sum of
84
+ * {@link module:engine/model/node~Node#offsetSize offset sizes} of all nodes that are before this node in this node list.
85
+ *
86
+ * @param {module:engine/model/node~Node} node Node to look for.
87
+ * @returns {Number|null} Node's starting offset.
88
+ */
89
+ getNodeStartOffset(node) {
90
+ const index = this.getNodeIndex(node);
91
+ return index === null ? null : this._nodes.slice(0, index).reduce((sum, node) => sum + node.offsetSize, 0);
92
+ }
93
+ /**
94
+ * Converts index to offset in node list.
95
+ *
96
+ * Returns starting offset of a node that is at given index. Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError}
97
+ * `model-nodelist-index-out-of-bounds` if given index is less than `0` or more than {@link #length}.
98
+ *
99
+ * @param {Number} index Node's index.
100
+ * @returns {Number} Node's starting offset.
101
+ */
102
+ indexToOffset(index) {
103
+ if (index == this._nodes.length) {
104
+ return this.maxOffset;
105
+ }
106
+ const node = this._nodes[index];
107
+ if (!node) {
108
+ /**
109
+ * Given index cannot be found in the node list.
110
+ *
111
+ * @error model-nodelist-index-out-of-bounds
112
+ */
113
+ throw new CKEditorError('model-nodelist-index-out-of-bounds', this);
114
+ }
115
+ return this.getNodeStartOffset(node);
116
+ }
117
+ /**
118
+ * Converts offset in node list to index.
119
+ *
120
+ * Returns index of a node that occupies given offset. Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError}
121
+ * `model-nodelist-offset-out-of-bounds` if given offset is less than `0` or more than {@link #maxOffset}.
122
+ *
123
+ * @param {Number} offset Offset to look for.
124
+ * @returns {Number} Index of a node that occupies given offset.
125
+ */
126
+ offsetToIndex(offset) {
127
+ let totalOffset = 0;
128
+ for (const node of this._nodes) {
129
+ if (offset >= totalOffset && offset < totalOffset + node.offsetSize) {
130
+ return this.getNodeIndex(node);
131
+ }
132
+ totalOffset += node.offsetSize;
133
+ }
134
+ if (totalOffset != offset) {
135
+ /**
136
+ * Given offset cannot be found in the node list.
137
+ *
138
+ * @error model-nodelist-offset-out-of-bounds
139
+ * @param {Number} offset
140
+ * @param {module:engine/model/nodelist~NodeList} nodeList Stringified node list.
141
+ */
142
+ throw new CKEditorError('model-nodelist-offset-out-of-bounds', this, {
143
+ offset,
144
+ nodeList: this
145
+ });
146
+ }
147
+ return this.length;
148
+ }
149
+ /**
150
+ * Inserts given nodes at given index.
151
+ *
152
+ * @internal
153
+ * @protected
154
+ * @param {Number} index Index at which nodes should be inserted.
155
+ * @param {Iterable.<module:engine/model/node~Node>} nodes Nodes to be inserted.
156
+ */
157
+ _insertNodes(index, nodes) {
158
+ // Validation.
159
+ for (const node of nodes) {
160
+ if (!(node instanceof Node)) {
161
+ /**
162
+ * Trying to insert an object which is not a Node instance.
163
+ *
164
+ * @error model-nodelist-insertnodes-not-node
165
+ */
166
+ throw new CKEditorError('model-nodelist-insertnodes-not-node', this);
167
+ }
168
+ }
169
+ this._nodes = spliceArray(this._nodes, Array.from(nodes), index, 0);
170
+ }
171
+ /**
172
+ * Removes one or more nodes starting at the given index.
173
+ *
174
+ * @internal
175
+ * @protected
176
+ * @param {Number} indexStart Index of the first node to remove.
177
+ * @param {Number} [howMany=1] Number of nodes to remove.
178
+ * @returns {Array.<module:engine/model/node~Node>} Array containing removed nodes.
179
+ */
180
+ _removeNodes(indexStart, howMany = 1) {
181
+ return this._nodes.splice(indexStart, howMany);
182
+ }
183
+ /**
184
+ * Converts `NodeList` instance to an array containing nodes that were inserted in the node list. Nodes
185
+ * are also converted to their plain object representation.
186
+ *
187
+ * @returns {Array.<module:engine/model/node~Node>} `NodeList` instance converted to `Array`.
188
+ */
189
+ toJSON() {
190
+ return this._nodes.map(node => node.toJSON());
191
+ }
217
192
  }