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