@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.
- package/CHANGELOG.md +4 -4
- package/package.json +30 -24
- package/src/controller/datacontroller.js +467 -561
- package/src/controller/editingcontroller.js +168 -204
- package/src/conversion/conversion.js +541 -565
- package/src/conversion/conversionhelpers.js +24 -28
- package/src/conversion/downcastdispatcher.js +457 -686
- package/src/conversion/downcasthelpers.js +1583 -1965
- package/src/conversion/mapper.js +518 -707
- package/src/conversion/modelconsumable.js +240 -283
- package/src/conversion/upcastdispatcher.js +372 -718
- package/src/conversion/upcasthelpers.js +707 -818
- package/src/conversion/viewconsumable.js +524 -581
- package/src/dataprocessor/basichtmlwriter.js +12 -16
- package/src/dataprocessor/dataprocessor.js +5 -0
- package/src/dataprocessor/htmldataprocessor.js +100 -116
- package/src/dataprocessor/htmlwriter.js +1 -18
- package/src/dataprocessor/xmldataprocessor.js +116 -137
- package/src/dev-utils/model.js +260 -352
- package/src/dev-utils/operationreplayer.js +106 -126
- package/src/dev-utils/utils.js +34 -51
- package/src/dev-utils/view.js +632 -753
- package/src/index.js +0 -11
- package/src/model/batch.js +111 -127
- package/src/model/differ.js +988 -1233
- package/src/model/document.js +340 -449
- package/src/model/documentfragment.js +327 -364
- package/src/model/documentselection.js +996 -1189
- package/src/model/element.js +306 -410
- package/src/model/history.js +224 -262
- package/src/model/item.js +5 -0
- package/src/model/liveposition.js +84 -145
- package/src/model/liverange.js +108 -185
- package/src/model/markercollection.js +379 -480
- package/src/model/model.js +883 -1034
- package/src/model/node.js +419 -463
- package/src/model/nodelist.js +176 -201
- package/src/model/operation/attributeoperation.js +153 -182
- package/src/model/operation/detachoperation.js +64 -83
- package/src/model/operation/insertoperation.js +135 -166
- package/src/model/operation/markeroperation.js +114 -140
- package/src/model/operation/mergeoperation.js +163 -191
- package/src/model/operation/moveoperation.js +157 -187
- package/src/model/operation/nooperation.js +28 -38
- package/src/model/operation/operation.js +106 -125
- package/src/model/operation/operationfactory.js +30 -34
- package/src/model/operation/renameoperation.js +109 -135
- package/src/model/operation/rootattributeoperation.js +155 -188
- package/src/model/operation/splitoperation.js +196 -232
- package/src/model/operation/transform.js +1833 -2204
- package/src/model/operation/utils.js +140 -204
- package/src/model/position.js +980 -1053
- package/src/model/range.js +910 -1028
- package/src/model/rootelement.js +77 -97
- package/src/model/schema.js +1189 -1835
- package/src/model/selection.js +745 -862
- package/src/model/text.js +90 -114
- package/src/model/textproxy.js +204 -240
- package/src/model/treewalker.js +316 -397
- package/src/model/typecheckable.js +16 -0
- package/src/model/utils/autoparagraphing.js +32 -44
- package/src/model/utils/deletecontent.js +334 -418
- package/src/model/utils/findoptimalinsertionrange.js +25 -36
- package/src/model/utils/getselectedcontent.js +96 -118
- package/src/model/utils/insertcontent.js +757 -773
- package/src/model/utils/insertobject.js +96 -119
- package/src/model/utils/modifyselection.js +120 -158
- package/src/model/utils/selection-post-fixer.js +153 -201
- package/src/model/writer.js +1305 -1474
- package/src/view/attributeelement.js +189 -225
- package/src/view/containerelement.js +75 -85
- package/src/view/document.js +172 -215
- package/src/view/documentfragment.js +200 -249
- package/src/view/documentselection.js +338 -367
- package/src/view/domconverter.js +1370 -1617
- package/src/view/downcastwriter.js +1747 -2076
- package/src/view/editableelement.js +81 -97
- package/src/view/element.js +739 -890
- package/src/view/elementdefinition.js +5 -0
- package/src/view/emptyelement.js +82 -92
- package/src/view/filler.js +35 -50
- package/src/view/item.js +5 -0
- package/src/view/matcher.js +260 -559
- package/src/view/node.js +274 -360
- package/src/view/observer/arrowkeysobserver.js +19 -28
- package/src/view/observer/bubblingemittermixin.js +120 -263
- package/src/view/observer/bubblingeventinfo.js +47 -55
- package/src/view/observer/clickobserver.js +7 -13
- package/src/view/observer/compositionobserver.js +14 -24
- package/src/view/observer/domeventdata.js +57 -67
- package/src/view/observer/domeventobserver.js +40 -64
- package/src/view/observer/fakeselectionobserver.js +81 -96
- package/src/view/observer/focusobserver.js +45 -61
- package/src/view/observer/inputobserver.js +7 -13
- package/src/view/observer/keyobserver.js +17 -27
- package/src/view/observer/mouseobserver.js +7 -14
- package/src/view/observer/mutationobserver.js +220 -315
- package/src/view/observer/observer.js +81 -102
- package/src/view/observer/selectionobserver.js +199 -246
- package/src/view/observer/tabobserver.js +23 -36
- package/src/view/placeholder.js +128 -173
- package/src/view/position.js +350 -401
- package/src/view/range.js +453 -513
- package/src/view/rawelement.js +85 -112
- package/src/view/renderer.js +874 -1018
- package/src/view/rooteditableelement.js +80 -90
- package/src/view/selection.js +608 -689
- package/src/view/styles/background.js +43 -44
- package/src/view/styles/border.js +220 -276
- package/src/view/styles/margin.js +8 -17
- package/src/view/styles/padding.js +8 -16
- package/src/view/styles/utils.js +127 -160
- package/src/view/stylesmap.js +728 -905
- package/src/view/text.js +102 -126
- package/src/view/textproxy.js +144 -170
- package/src/view/treewalker.js +383 -479
- package/src/view/typecheckable.js +19 -0
- package/src/view/uielement.js +166 -187
- package/src/view/upcastwriter.js +395 -449
- package/src/view/view.js +569 -664
- package/src/dataprocessor/dataprocessor.jsdoc +0 -64
- package/src/model/item.jsdoc +0 -14
- package/src/view/elementdefinition.jsdoc +0 -59
- package/src/view/item.jsdoc +0 -14
package/src/model/nodelist.js
CHANGED
|
@@ -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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
}
|