@ckeditor/ckeditor5-engine 36.0.0 → 37.0.0-alpha.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 (201) hide show
  1. package/README.md +1 -1
  2. package/package.json +24 -23
  3. package/src/controller/datacontroller.d.ts +331 -0
  4. package/src/controller/datacontroller.js +62 -109
  5. package/src/controller/editingcontroller.d.ts +98 -0
  6. package/src/controller/editingcontroller.js +22 -46
  7. package/src/conversion/conversion.d.ts +476 -0
  8. package/src/conversion/conversion.js +328 -347
  9. package/src/conversion/conversionhelpers.d.ts +26 -0
  10. package/src/conversion/conversionhelpers.js +1 -5
  11. package/src/conversion/downcastdispatcher.d.ts +547 -0
  12. package/src/conversion/downcastdispatcher.js +74 -152
  13. package/src/conversion/downcasthelpers.d.ts +1226 -0
  14. package/src/conversion/downcasthelpers.js +843 -762
  15. package/src/conversion/mapper.d.ts +499 -0
  16. package/src/conversion/mapper.js +84 -99
  17. package/src/conversion/modelconsumable.d.ts +201 -0
  18. package/src/conversion/modelconsumable.js +96 -99
  19. package/src/conversion/upcastdispatcher.d.ts +492 -0
  20. package/src/conversion/upcastdispatcher.js +73 -100
  21. package/src/conversion/upcasthelpers.d.ts +499 -0
  22. package/src/conversion/upcasthelpers.js +406 -373
  23. package/src/conversion/viewconsumable.d.ts +177 -0
  24. package/src/conversion/viewconsumable.js +157 -162
  25. package/src/dataprocessor/basichtmlwriter.d.ts +18 -0
  26. package/src/dataprocessor/basichtmlwriter.js +0 -9
  27. package/src/dataprocessor/dataprocessor.d.ts +61 -0
  28. package/src/dataprocessor/htmldataprocessor.d.ts +76 -0
  29. package/src/dataprocessor/htmldataprocessor.js +6 -28
  30. package/src/dataprocessor/htmlwriter.d.ts +16 -0
  31. package/src/dataprocessor/xmldataprocessor.d.ts +90 -0
  32. package/src/dataprocessor/xmldataprocessor.js +8 -40
  33. package/src/dev-utils/model.d.ts +124 -0
  34. package/src/dev-utils/model.js +41 -38
  35. package/src/dev-utils/operationreplayer.d.ts +51 -0
  36. package/src/dev-utils/operationreplayer.js +6 -14
  37. package/src/dev-utils/utils.d.ts +37 -0
  38. package/src/dev-utils/utils.js +5 -18
  39. package/src/dev-utils/view.d.ts +319 -0
  40. package/src/dev-utils/view.js +205 -226
  41. package/src/index.d.ts +105 -0
  42. package/src/index.js +1 -0
  43. package/src/model/batch.d.ts +106 -0
  44. package/src/model/differ.d.ts +329 -0
  45. package/src/model/document.d.ts +245 -0
  46. package/src/model/document.js +1 -1
  47. package/src/model/documentfragment.d.ts +196 -0
  48. package/src/model/documentfragment.js +2 -2
  49. package/src/model/documentselection.d.ts +420 -0
  50. package/src/model/element.d.ts +165 -0
  51. package/src/model/history.d.ts +114 -0
  52. package/src/model/item.d.ts +14 -0
  53. package/src/model/liveposition.d.ts +77 -0
  54. package/src/model/liverange.d.ts +102 -0
  55. package/src/model/markercollection.d.ts +335 -0
  56. package/src/model/model.d.ts +812 -0
  57. package/src/model/model.js +59 -30
  58. package/src/model/node.d.ts +256 -0
  59. package/src/model/nodelist.d.ts +91 -0
  60. package/src/model/operation/attributeoperation.d.ts +98 -0
  61. package/src/model/operation/detachoperation.d.ts +55 -0
  62. package/src/model/operation/insertoperation.d.ts +85 -0
  63. package/src/model/operation/markeroperation.d.ts +86 -0
  64. package/src/model/operation/mergeoperation.d.ts +95 -0
  65. package/src/model/operation/moveoperation.d.ts +91 -0
  66. package/src/model/operation/nooperation.d.ts +33 -0
  67. package/src/model/operation/operation.d.ts +89 -0
  68. package/src/model/operation/operationfactory.d.ts +18 -0
  69. package/src/model/operation/renameoperation.d.ts +78 -0
  70. package/src/model/operation/rootattributeoperation.d.ts +97 -0
  71. package/src/model/operation/rootattributeoperation.js +1 -1
  72. package/src/model/operation/splitoperation.d.ts +104 -0
  73. package/src/model/operation/transform.d.ts +100 -0
  74. package/src/model/operation/utils.d.ts +71 -0
  75. package/src/model/position.d.ts +539 -0
  76. package/src/model/position.js +1 -1
  77. package/src/model/range.d.ts +458 -0
  78. package/src/model/range.js +1 -1
  79. package/src/model/rootelement.d.ts +40 -0
  80. package/src/model/schema.d.ts +1176 -0
  81. package/src/model/schema.js +15 -15
  82. package/src/model/selection.d.ts +472 -0
  83. package/src/model/text.d.ts +66 -0
  84. package/src/model/text.js +0 -2
  85. package/src/model/textproxy.d.ts +144 -0
  86. package/src/model/treewalker.d.ts +186 -0
  87. package/src/model/treewalker.js +19 -10
  88. package/src/model/typecheckable.d.ts +255 -0
  89. package/src/model/utils/autoparagraphing.d.ts +37 -0
  90. package/src/model/utils/deletecontent.d.ts +58 -0
  91. package/src/model/utils/findoptimalinsertionrange.d.ts +32 -0
  92. package/src/model/utils/getselectedcontent.d.ts +30 -0
  93. package/src/model/utils/insertcontent.d.ts +46 -0
  94. package/src/model/utils/insertcontent.js +2 -12
  95. package/src/model/utils/insertobject.d.ts +44 -0
  96. package/src/model/utils/insertobject.js +3 -14
  97. package/src/model/utils/modifyselection.d.ts +48 -0
  98. package/src/model/utils/selection-post-fixer.d.ts +65 -0
  99. package/src/model/writer.d.ts +726 -0
  100. package/src/model/writer.js +6 -4
  101. package/src/view/attributeelement.d.ts +108 -0
  102. package/src/view/attributeelement.js +25 -69
  103. package/src/view/containerelement.d.ts +49 -0
  104. package/src/view/containerelement.js +10 -43
  105. package/src/view/datatransfer.d.ts +75 -0
  106. package/src/view/datatransfer.js +24 -27
  107. package/src/view/document.d.ts +184 -0
  108. package/src/view/document.js +15 -84
  109. package/src/view/documentfragment.d.ts +150 -0
  110. package/src/view/documentfragment.js +40 -81
  111. package/src/view/documentselection.d.ts +219 -0
  112. package/src/view/documentselection.js +75 -121
  113. package/src/view/domconverter.d.ts +620 -0
  114. package/src/view/domconverter.js +159 -276
  115. package/src/view/downcastwriter.d.ts +804 -0
  116. package/src/view/downcastwriter.js +336 -380
  117. package/src/view/editableelement.d.ts +52 -0
  118. package/src/view/editableelement.js +9 -49
  119. package/src/view/element.d.ts +466 -0
  120. package/src/view/element.js +150 -222
  121. package/src/view/elementdefinition.d.ts +87 -0
  122. package/src/view/emptyelement.d.ts +41 -0
  123. package/src/view/emptyelement.js +11 -44
  124. package/src/view/filler.d.ts +111 -0
  125. package/src/view/filler.js +24 -21
  126. package/src/view/item.d.ts +14 -0
  127. package/src/view/matcher.d.ts +486 -0
  128. package/src/view/matcher.js +247 -218
  129. package/src/view/node.d.ts +160 -0
  130. package/src/view/node.js +26 -100
  131. package/src/view/observer/arrowkeysobserver.d.ts +41 -0
  132. package/src/view/observer/arrowkeysobserver.js +0 -13
  133. package/src/view/observer/bubblingemittermixin.d.ts +166 -0
  134. package/src/view/observer/bubblingemittermixin.js +36 -25
  135. package/src/view/observer/bubblingeventinfo.d.ts +47 -0
  136. package/src/view/observer/bubblingeventinfo.js +3 -29
  137. package/src/view/observer/clickobserver.d.ts +43 -0
  138. package/src/view/observer/clickobserver.js +9 -19
  139. package/src/view/observer/compositionobserver.d.ts +82 -0
  140. package/src/view/observer/compositionobserver.js +13 -42
  141. package/src/view/observer/domeventdata.d.ts +50 -0
  142. package/src/view/observer/domeventdata.js +5 -30
  143. package/src/view/observer/domeventobserver.d.ts +69 -0
  144. package/src/view/observer/domeventobserver.js +19 -21
  145. package/src/view/observer/fakeselectionobserver.d.ts +46 -0
  146. package/src/view/observer/fakeselectionobserver.js +2 -15
  147. package/src/view/observer/focusobserver.d.ts +82 -0
  148. package/src/view/observer/focusobserver.js +14 -40
  149. package/src/view/observer/inputobserver.d.ts +86 -0
  150. package/src/view/observer/inputobserver.js +18 -64
  151. package/src/view/observer/keyobserver.d.ts +67 -0
  152. package/src/view/observer/keyobserver.js +8 -42
  153. package/src/view/observer/mouseobserver.d.ts +89 -0
  154. package/src/view/observer/mouseobserver.js +8 -28
  155. package/src/view/observer/mutationobserver.d.ts +82 -0
  156. package/src/view/observer/mutationobserver.js +7 -37
  157. package/src/view/observer/observer.d.ts +84 -0
  158. package/src/view/observer/observer.js +12 -25
  159. package/src/view/observer/selectionobserver.d.ts +143 -0
  160. package/src/view/observer/selectionobserver.js +9 -99
  161. package/src/view/observer/tabobserver.d.ts +42 -0
  162. package/src/view/observer/tabobserver.js +0 -14
  163. package/src/view/placeholder.d.ts +85 -0
  164. package/src/view/placeholder.js +26 -43
  165. package/src/view/position.d.ts +189 -0
  166. package/src/view/position.js +36 -83
  167. package/src/view/range.d.ts +279 -0
  168. package/src/view/range.js +79 -122
  169. package/src/view/rawelement.d.ts +73 -0
  170. package/src/view/rawelement.js +34 -48
  171. package/src/view/renderer.d.ts +265 -0
  172. package/src/view/renderer.js +105 -193
  173. package/src/view/rooteditableelement.d.ts +41 -0
  174. package/src/view/rooteditableelement.js +12 -40
  175. package/src/view/selection.d.ts +375 -0
  176. package/src/view/selection.js +79 -153
  177. package/src/view/styles/background.d.ts +33 -0
  178. package/src/view/styles/background.js +14 -12
  179. package/src/view/styles/border.d.ts +43 -0
  180. package/src/view/styles/border.js +58 -48
  181. package/src/view/styles/margin.d.ts +29 -0
  182. package/src/view/styles/margin.js +13 -11
  183. package/src/view/styles/padding.d.ts +29 -0
  184. package/src/view/styles/padding.js +13 -11
  185. package/src/view/styles/utils.d.ts +93 -0
  186. package/src/view/styles/utils.js +22 -48
  187. package/src/view/stylesmap.d.ts +675 -0
  188. package/src/view/stylesmap.js +249 -244
  189. package/src/view/text.d.ts +74 -0
  190. package/src/view/text.js +16 -46
  191. package/src/view/textproxy.d.ts +97 -0
  192. package/src/view/textproxy.js +10 -59
  193. package/src/view/treewalker.d.ts +195 -0
  194. package/src/view/treewalker.js +43 -106
  195. package/src/view/typecheckable.d.ts +401 -0
  196. package/src/view/uielement.d.ts +96 -0
  197. package/src/view/uielement.js +28 -62
  198. package/src/view/upcastwriter.d.ts +328 -0
  199. package/src/view/upcastwriter.js +124 -134
  200. package/src/view/view.d.ts +327 -0
  201. package/src/view/view.js +79 -150
@@ -0,0 +1,401 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ import type AttributeElement from './attributeelement';
6
+ import type ContainerElement from './containerelement';
7
+ import type DocumentFragment from './documentfragment';
8
+ import type DocumentSelection from './documentselection';
9
+ import type EditableElement from './editableelement';
10
+ import type Element from './element';
11
+ import type EmptyElement from './emptyelement';
12
+ import type Node from './node';
13
+ import type Position from './position';
14
+ import type Range from './range';
15
+ import type RawElement from './rawelement';
16
+ import type RootEditableElement from './rooteditableelement';
17
+ import type Selection from './selection';
18
+ import type Text from './text';
19
+ import type TextProxy from './textproxy';
20
+ import type UIElement from './uielement';
21
+ /**
22
+ * @module engine/view/typecheckable
23
+ */
24
+ export default abstract class TypeCheckable {
25
+ /**
26
+ * Checks whether this object is of type {@link module:engine/view/node~Node} or its subclass.
27
+ *
28
+ * This method is useful when processing view objects that are of unknown type. For example, a function
29
+ * may return a {@link module:engine/view/documentfragment~DocumentFragment} or a {@link module:engine/view/node~Node}
30
+ * that can be either a text node or an element. This method can be used to check what kind of object is returned.
31
+ *
32
+ * ```ts
33
+ * someObject.is( 'element' ); // -> true if this is an element
34
+ * someObject.is( 'node' ); // -> true if this is a node (a text node or an element)
35
+ * someObject.is( 'documentFragment' ); // -> true if this is a document fragment
36
+ * ```
37
+ *
38
+ * Since this method is also available on a range of model objects, you can prefix the type of the object with
39
+ * `model:` or `view:` to check, for example, if this is the model's or view's element:
40
+ *
41
+ * ```ts
42
+ * viewElement.is( 'view:element' ); // -> true
43
+ * viewElement.is( 'model:element' ); // -> false
44
+ * ```
45
+ *
46
+ * By using this method it is also possible to check a name of an element:
47
+ *
48
+ * ```ts
49
+ * imgElement.is( 'element', 'img' ); // -> true
50
+ * imgElement.is( 'view:element', 'img' ); // -> same as above, but more precise
51
+ * ```
52
+ */
53
+ is(type: 'node' | 'view:node'): this is (Node | Text | Element | AttributeElement | ContainerElement | EditableElement | EmptyElement | RawElement | RootEditableElement | UIElement);
54
+ /**
55
+ * Checks whether this object is of type {@link module:engine/view/element~Element} or its subclass.
56
+ *
57
+ * ```ts
58
+ * element.is( 'element' ); // -> true
59
+ * element.is( 'node' ); // -> true
60
+ * element.is( 'view:element' ); // -> true
61
+ * element.is( 'view:node' ); // -> true
62
+ *
63
+ * element.is( 'model:element' ); // -> false
64
+ * element.is( 'documentSelection' ); // -> false
65
+ * ```
66
+ *
67
+ * Assuming that the object being checked is an element, you can also check its
68
+ * {@link module:engine/view/element~Element#name name}:
69
+ *
70
+ * ```ts
71
+ * element.is( 'element', 'img' ); // -> true if this is an <img> element
72
+ * text.is( 'element', 'img' ); -> false
73
+ * ```
74
+ */
75
+ is(type: 'element' | 'view:element'): this is (Element | AttributeElement | ContainerElement | EditableElement | EmptyElement | RawElement | RootEditableElement | UIElement);
76
+ /**
77
+ * Checks whether this object is of type {@link module:engine/view/attributeelement~AttributeElement}.
78
+ *
79
+ * ```ts
80
+ * attributeElement.is( 'attributeElement' ); // -> true
81
+ * attributeElement.is( 'element' ); // -> true
82
+ * attributeElement.is( 'node' ); // -> true
83
+ * attributeElement.is( 'view:attributeElement' ); // -> true
84
+ * attributeElement.is( 'view:element' ); // -> true
85
+ * attributeElement.is( 'view:node' ); // -> true
86
+ *
87
+ * attributeElement.is( 'model:element' ); // -> false
88
+ * attributeElement.is( 'documentFragment' ); // -> false
89
+ * ```
90
+ *
91
+ * Assuming that the object being checked is an attribute element, you can also check its
92
+ * {@link module:engine/view/attributeelement~AttributeElement#name name}:
93
+ *
94
+ * ```ts
95
+ * attributeElement.is( 'element', 'b' ); // -> true if this is a bold element
96
+ * attributeElement.is( 'attributeElement', 'b' ); // -> same as above
97
+ * text.is( 'element', 'b' ); -> false
98
+ * ```
99
+ */
100
+ is(type: 'attributeElement' | 'view:attributeElement'): this is AttributeElement;
101
+ /**
102
+ * Checks whether this object is of type {@link module:engine/view/containerelement~ContainerElement} or its subclass.
103
+ *
104
+ * ```ts
105
+ * containerElement.is( 'containerElement' ); // -> true
106
+ * containerElement.is( 'element' ); // -> true
107
+ * containerElement.is( 'node' ); // -> true
108
+ * containerElement.is( 'view:containerElement' ); // -> true
109
+ * containerElement.is( 'view:element' ); // -> true
110
+ * containerElement.is( 'view:node' ); // -> true
111
+ *
112
+ * containerElement.is( 'model:element' ); // -> false
113
+ * containerElement.is( 'documentFragment' ); // -> false
114
+ * ```
115
+ *
116
+ * Assuming that the object being checked is a container element, you can also check its
117
+ * {@link module:engine/view/containerelement~ContainerElement#name name}:
118
+ *
119
+ * ```ts
120
+ * containerElement.is( 'element', 'div' ); // -> true if this is a div container element
121
+ * containerElement.is( 'contaienrElement', 'div' ); // -> same as above
122
+ * text.is( 'element', 'div' ); -> false
123
+ * ```
124
+ */
125
+ is(type: 'containerElement' | 'view:containerElement'): this is ContainerElement | EditableElement | RootEditableElement;
126
+ /**
127
+ * Checks whether this object is of type {@link module:engine/view/editableelement~EditableElement} or its subclass.
128
+ *
129
+ * ```ts
130
+ * editableElement.is( 'editableElement' ); // -> true
131
+ * editableElement.is( 'element' ); // -> true
132
+ * editableElement.is( 'node' ); // -> true
133
+ * editableElement.is( 'view:editableElement' ); // -> true
134
+ * editableElement.is( 'view:element' ); // -> true
135
+ * editableElement.is( 'view:node' ); // -> true
136
+ *
137
+ * editableElement.is( 'model:element' ); // -> false
138
+ * editableElement.is( 'documentFragment' ); // -> false
139
+ * ```
140
+ *
141
+ * Assuming that the object being checked is an editbale element, you can also check its
142
+ * {@link module:engine/view/editableelement~EditableElement#name name}:
143
+ *
144
+ * ```ts
145
+ * editableElement.is( 'element', 'div' ); // -> true if this is a div element
146
+ * editableElement.is( 'editableElement', 'div' ); // -> same as above
147
+ * text.is( 'element', 'div' ); -> false
148
+ * ```
149
+ */
150
+ is(type: 'editableElement' | 'view:editableElement'): this is EditableElement | RootEditableElement;
151
+ /**
152
+ * Checks whether this object is of type {@link module:engine/view/emptyelement~EmptyElement}.
153
+ *
154
+ * ```ts
155
+ * emptyElement.is( 'emptyElement' ); // -> true
156
+ * emptyElement.is( 'element' ); // -> true
157
+ * emptyElement.is( 'node' ); // -> true
158
+ * emptyElement.is( 'view:emptyElement' ); // -> true
159
+ * emptyElement.is( 'view:element' ); // -> true
160
+ * emptyElement.is( 'view:node' ); // -> true
161
+ *
162
+ * emptyElement.is( 'model:element' ); // -> false
163
+ * emptyElement.is( 'documentFragment' ); // -> false
164
+ * ```
165
+ *
166
+ * Assuming that the object being checked is an empty element, you can also check its
167
+ * {@link module:engine/view/emptyelement~EmptyElement#name name}:
168
+ *
169
+ * ```ts
170
+ * emptyElement.is( 'element', 'img' ); // -> true if this is a img element
171
+ * emptyElement.is( 'emptyElement', 'img' ); // -> same as above
172
+ * text.is( 'element', 'img' ); -> false
173
+ * ```
174
+ */
175
+ is(type: 'emptyElement' | 'view:emptyElement'): this is EmptyElement;
176
+ /**
177
+ * Checks whether this object is of type {@link module:engine/view/rawelement~RawElement}.
178
+ *
179
+ * ```ts
180
+ * rawElement.is( 'rawElement' ); // -> true
181
+ * rawElement.is( 'element' ); // -> true
182
+ * rawElement.is( 'node' ); // -> true
183
+ * rawElement.is( 'view:rawElement' ); // -> true
184
+ * rawElement.is( 'view:element' ); // -> true
185
+ * rawElement.is( 'view:node' ); // -> true
186
+ *
187
+ * rawElement.is( 'model:element' ); // -> false
188
+ * rawElement.is( 'documentFragment' ); // -> false
189
+ * ```
190
+ *
191
+ * Assuming that the object being checked is a raw element, you can also check its
192
+ * {@link module:engine/view/rawelement~RawElement#name name}:
193
+ *
194
+ * ```ts
195
+ * rawElement.is( 'img' ); // -> true if this is an img element
196
+ * rawElement.is( 'rawElement', 'img' ); // -> same as above
197
+ * text.is( 'img' ); -> false
198
+ * ```
199
+ */
200
+ is(type: 'rawElement' | 'view:rawElement'): this is RawElement;
201
+ /**
202
+ * Checks whether this object is of type {@link module:engine/view/rooteditableelement~RootEditableElement}.
203
+ *
204
+ * ```ts
205
+ * rootEditableElement.is( 'rootElement' ); // -> true
206
+ * rootEditableElement.is( 'editableElement' ); // -> true
207
+ * rootEditableElement.is( 'element' ); // -> true
208
+ * rootEditableElement.is( 'node' ); // -> true
209
+ * rootEditableElement.is( 'view:editableElement' ); // -> true
210
+ * rootEditableElement.is( 'view:element' ); // -> true
211
+ * rootEditableElement.is( 'view:node' ); // -> true
212
+ *
213
+ * rootEditableElement.is( 'model:element' ); // -> false
214
+ * rootEditableElement.is( 'documentFragment' ); // -> false
215
+ * ```
216
+ *
217
+ * Assuming that the object being checked is a root editable element, you can also check its
218
+ * {@link module:engine/view/rooteditableelement~RootEditableElement#name name}:
219
+ *
220
+ * ```ts
221
+ * rootEditableElement.is( 'element', 'div' ); // -> true if this is a div root editable element
222
+ * rootEditableElement.is( 'rootElement', 'div' ); // -> same as above
223
+ * text.is( 'element', 'div' ); -> false
224
+ * ```
225
+ */
226
+ is(type: 'rootElement' | 'view:rootElement'): this is RootEditableElement;
227
+ /**
228
+ * Checks whether this object is of type {@link module:engine/view/uielement~UIElement}.
229
+ *
230
+ * ```ts
231
+ * uiElement.is( 'uiElement' ); // -> true
232
+ * uiElement.is( 'element' ); // -> true
233
+ * uiElement.is( 'node' ); // -> true
234
+ * uiElement.is( 'view:uiElement' ); // -> true
235
+ * uiElement.is( 'view:element' ); // -> true
236
+ * uiElement.is( 'view:node' ); // -> true
237
+ *
238
+ * uiElement.is( 'model:element' ); // -> false
239
+ * uiElement.is( 'documentFragment' ); // -> false
240
+ * ```
241
+ *
242
+ * Assuming that the object being checked is an ui element, you can also check its
243
+ * {@link module:engine/view/uielement~UIElement#name name}:
244
+ *
245
+ * ```ts
246
+ * uiElement.is( 'element', 'span' ); // -> true if this is a span ui element
247
+ * uiElement.is( 'uiElement', 'span' ); // -> same as above
248
+ * text.is( 'element', 'span' ); -> false
249
+ * ```
250
+ */
251
+ is(type: 'uiElement' | 'view:uiElement'): this is UIElement;
252
+ /**
253
+ * Checks whether this object is of type {@link module:engine/view/text~Text}.
254
+ *
255
+ * ```ts
256
+ * text.is( '$text' ); // -> true
257
+ * text.is( 'node' ); // -> true
258
+ * text.is( 'view:$text' ); // -> true
259
+ * text.is( 'view:node' ); // -> true
260
+ *
261
+ * text.is( 'model:$text' ); // -> false
262
+ * text.is( 'element' ); // -> false
263
+ * text.is( 'range' ); // -> false
264
+ * ```
265
+ */
266
+ is(type: '$text' | 'view:$text'): this is Text;
267
+ /**
268
+ * hecks whether this object is of type {@link module:engine/view/documentfragment~DocumentFragment}.
269
+ *
270
+ * ```ts
271
+ * docFrag.is( 'documentFragment' ); // -> true
272
+ * docFrag.is( 'view:documentFragment' ); // -> true
273
+ *
274
+ * docFrag.is( 'model:documentFragment' ); // -> false
275
+ * docFrag.is( 'element' ); // -> false
276
+ * docFrag.is( 'node' ); // -> false
277
+ * ```
278
+ */
279
+ is(type: 'documentFragment' | 'view:documentFragment'): this is DocumentFragment;
280
+ /**
281
+ * Checks whether this object is of type {@link module:engine/view/textproxy~TextProxy}.
282
+ *
283
+ * ```ts
284
+ * textProxy.is( '$textProxy' ); // -> true
285
+ * textProxy.is( 'view:$textProxy' ); // -> true
286
+ *
287
+ * textProxy.is( 'model:$textProxy' ); // -> false
288
+ * textProxy.is( 'element' ); // -> false
289
+ * textProxy.is( 'range' ); // -> false
290
+ * ```
291
+ *
292
+ * **Note:** Until version 20.0.0 this method wasn't accepting `'$textProxy'` type. The legacy `'textProxy'` type is still
293
+ * accepted for backward compatibility.
294
+ */
295
+ is(type: '$textProxy' | 'view:$textProxy'): this is TextProxy;
296
+ /**
297
+ * Checks whether this object is of type {@link module:engine/view/position~Position}.
298
+ *
299
+ * ```ts
300
+ * position.is( 'position' ); // -> true
301
+ * position.is( 'view:position' ); // -> true
302
+ *
303
+ * position.is( 'model:position' ); // -> false
304
+ * position.is( 'element' ); // -> false
305
+ * position.is( 'range' ); // -> false
306
+ * ```
307
+ */
308
+ is(type: 'position' | 'view:position'): this is Position;
309
+ /**
310
+ * Checks whether this object is of type {@link module:engine/view/range~Range}.
311
+ *
312
+ * ```ts
313
+ * range.is( 'range' ); // -> true
314
+ * range.is( 'view:range' ); // -> true
315
+ *
316
+ * range.is( 'model:range' ); // -> false
317
+ * range.is( 'element' ); // -> false
318
+ * range.is( 'selection' ); // -> false
319
+ * ```
320
+ */
321
+ is(type: 'range' | 'view:range'): this is Range;
322
+ /**
323
+ * Checks whether this object is of type {@link module:engine/view/selection~Selection} or
324
+ * {@link module:engine/view/documentselection~DocumentSelection}.
325
+ *
326
+ * ```ts
327
+ * selection.is( 'selection' ); // -> true
328
+ * selection.is( 'view:selection' ); // -> true
329
+ *
330
+ * selection.is( 'model:selection' ); // -> false
331
+ * selection.is( 'element' ); // -> false
332
+ * selection.is( 'range' ); // -> false
333
+ * ```
334
+ */
335
+ is(type: 'selection' | 'view:selection'): this is Selection | DocumentSelection;
336
+ /**
337
+ * Checks whether this object is of type {@link module:engine/view/documentselection~DocumentSelection}.
338
+ *
339
+ * ```ts
340
+ * `docSelection.is( 'selection' ); // -> true
341
+ * docSelection.is( 'documentSelection' ); // -> true
342
+ * docSelection.is( 'view:selection' ); // -> true
343
+ * docSelection.is( 'view:documentSelection' ); // -> true
344
+ *
345
+ * docSelection.is( 'model:documentSelection' ); // -> false
346
+ * docSelection.is( 'element' ); // -> false
347
+ * docSelection.is( 'node' ); // -> false
348
+ * ```
349
+ */
350
+ is(type: 'documentSelection' | 'view:documentSelection'): this is DocumentSelection;
351
+ /**
352
+ * Checks whether the object is of type {@link module:engine/view/element~Element} or its subclass and has the specified `name`.
353
+ */
354
+ is<N extends string>(type: 'element' | 'view:element', name: N): this is (Element | AttributeElement | ContainerElement | EditableElement | EmptyElement | RawElement | RootEditableElement | UIElement) & {
355
+ name: N;
356
+ };
357
+ /**
358
+ * Checks whether the object is of type {@link module:engine/view/attributeelement~AttributeElement} and has the specified `name`.
359
+ */
360
+ is<N extends string>(type: 'attributeElement' | 'view:attributeElement', name: N): this is AttributeElement & {
361
+ name: N;
362
+ };
363
+ /**
364
+ * Checks whether the object is of type {@link module:engine/view/containerElement~ContainerElement}
365
+ * or its subclass and has the specified `name`.
366
+ */
367
+ is<N extends string>(type: 'containerElement' | 'view:containerElement', name: N): this is (ContainerElement | EditableElement | RootEditableElement) & {
368
+ name: N;
369
+ };
370
+ /**
371
+ * Checks whether the object is of type {@link module:engine/view/editableElement~EditableElement}
372
+ * or its subclass and has the specified `name`.
373
+ */
374
+ is<N extends string>(type: 'editableElement' | 'view:editableElement', name: N): this is (EditableElement | RootEditableElement) & {
375
+ name: N;
376
+ };
377
+ /**
378
+ * Checks whether the object is of type {@link module:engine/view/emptyelement~EmptyElement} has the specified `name`.
379
+ */
380
+ is<N extends string>(type: 'emptyElement' | 'view:emptyElement', name: N): this is EmptyElement & {
381
+ name: N;
382
+ };
383
+ /**
384
+ * Checks whether the object is of type {@link module:engine/view/rawelement~RawElement} and has the specified `name`.
385
+ */
386
+ is<N extends string>(type: 'rawElement' | 'view:rawElement', name: N): this is RawElement & {
387
+ name: N;
388
+ };
389
+ /**
390
+ * Checks whether the object is of type {@link module:engine/view/rooteditableelement~RootEditableElement} and has the specified `name`.
391
+ */
392
+ is<N extends string>(type: 'rootElement' | 'view:rootElement', name: N): this is RootEditableElement & {
393
+ name: N;
394
+ };
395
+ /**
396
+ * Checks whether the object is of type {@link module:engine/view/uielement~UIElement} and has the specified `name`.
397
+ */
398
+ is<N extends string>(type: 'uiElement' | 'view:uiElement', name: N): this is UIElement & {
399
+ name: N;
400
+ };
401
+ }
@@ -0,0 +1,96 @@
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/view/uielement
7
+ */
8
+ import Element, { type ElementAttributes } from './element';
9
+ import Node from './node';
10
+ import type View from './view';
11
+ import type Document from './document';
12
+ import type DomConverter from './domconverter';
13
+ import type Item from './item';
14
+ type DomDocument = globalThis.Document;
15
+ type DomElement = globalThis.HTMLElement;
16
+ /**
17
+ * UI element class. It should be used to represent editing UI which needs to be injected into the editing view
18
+ * If possible, you should keep your UI outside the editing view. However, if that is not possible,
19
+ * UI elements can be used.
20
+ *
21
+ * How a UI element is rendered is in your control (you pass a callback to
22
+ * {@link module:engine/view/downcastwriter~DowncastWriter#createUIElement `downcastWriter#createUIElement()`}).
23
+ * The editor will ignore your UI element – the selection cannot be placed in it, it is skipped (invisible) when
24
+ * the user modifies the selection by using arrow keys and the editor does not listen to any mutations which
25
+ * happen inside your UI elements.
26
+ *
27
+ * The limitation is that you cannot convert a model element to a UI element. UI elements need to be
28
+ * created for {@link module:engine/model/markercollection~Marker markers} or as additinal elements
29
+ * inside normal {@link module:engine/view/containerelement~ContainerElement container elements}.
30
+ *
31
+ * To create a new UI element use the
32
+ * {@link module:engine/view/downcastwriter~DowncastWriter#createUIElement `downcastWriter#createUIElement()`} method.
33
+ */
34
+ export default class UIElement extends Element {
35
+ /**
36
+ * Creates new instance of UIElement.
37
+ *
38
+ * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-uielement-cannot-add` when third parameter is passed,
39
+ * to inform that usage of UIElement is incorrect (adding child nodes to UIElement is forbidden).
40
+ *
41
+ * @see module:engine/view/downcastwriter~DowncastWriter#createUIElement
42
+ * @internal
43
+ * @param document The document instance to which this element belongs.
44
+ * @param name Node name.
45
+ * @param attrs Collection of attributes.
46
+ * @param children A list of nodes to be inserted into created element.
47
+ */
48
+ constructor(document: Document, name: string, attrs?: ElementAttributes, children?: Node | Iterable<Node>);
49
+ /**
50
+ * Overrides {@link module:engine/view/element~Element#_insertChild} method.
51
+ * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-uielement-cannot-add` to prevent adding any child nodes
52
+ * to UIElement.
53
+ *
54
+ * @internal
55
+ */
56
+ _insertChild(index: number, items: Item | Iterable<Item>): number;
57
+ /**
58
+ * Renders this {@link module:engine/view/uielement~UIElement} to DOM. This method is called by
59
+ * {@link module:engine/view/domconverter~DomConverter}.
60
+ * Do not use inheritance to create custom rendering method, replace `render()` method instead:
61
+ *
62
+ * ```ts
63
+ * const myUIElement = downcastWriter.createUIElement( 'span' );
64
+ * myUIElement.render = function( domDocument, domConverter ) {
65
+ * const domElement = this.toDomElement( domDocument );
66
+ *
67
+ * domConverter.setContentOf( domElement, '<b>this is ui element</b>' );
68
+ *
69
+ * return domElement;
70
+ * };
71
+ * ```
72
+ *
73
+ * If changes in your UI element should trigger some editor UI update you should call
74
+ * the {@link module:core/editor/editorui~EditorUI#update `editor.ui.update()`} method
75
+ * after rendering your UI element.
76
+ *
77
+ * @param domConverter Instance of the DomConverter used to optimize the output.
78
+ */
79
+ render(domDocument: DomDocument, domConverter: DomConverter): DomElement;
80
+ /**
81
+ * Creates DOM element based on this view UIElement.
82
+ * Note that each time this method is called new DOM element is created.
83
+ */
84
+ toDomElement(domDocument: DomDocument): DomElement;
85
+ }
86
+ /**
87
+ * This function injects UI element handling to the given {@link module:engine/view/document~Document document}.
88
+ *
89
+ * A callback is added to {@link module:engine/view/document~Document#event:keydown document keydown event}.
90
+ * The callback handles the situation when right arrow key is pressed and selection is collapsed before a UI element.
91
+ * Without this handler, it would be impossible to "jump over" UI element using right arrow key.
92
+ *
93
+ * @param view View controller to which the quirks handling will be injected.
94
+ */
95
+ export declare function injectUiElementHandling(view: View): void;
96
+ export {};
@@ -25,8 +25,6 @@ import { CKEditorError, keyCodes } from '@ckeditor/ckeditor5-utils';
25
25
  *
26
26
  * To create a new UI element use the
27
27
  * {@link module:engine/view/downcastwriter~DowncastWriter#createUIElement `downcastWriter#createUIElement()`} method.
28
- *
29
- * @extends module:engine/view/element~Element
30
28
  */
31
29
  export default class UIElement extends Element {
32
30
  /**
@@ -36,21 +34,14 @@ export default class UIElement extends Element {
36
34
  * to inform that usage of UIElement is incorrect (adding child nodes to UIElement is forbidden).
37
35
  *
38
36
  * @see module:engine/view/downcastwriter~DowncastWriter#createUIElement
39
- * @protected
40
- * @param {module:engine/view/document~Document} document The document instance to which this element belongs.
41
- * @param {String} name Node name.
42
- * @param {Object|Iterable} [attributes] Collection of attributes.
43
- * @param {module:engine/view/node~Node|Iterable.<module:engine/view/node~Node>} [children]
44
- * A list of nodes to be inserted into created element.
37
+ * @internal
38
+ * @param document The document instance to which this element belongs.
39
+ * @param name Node name.
40
+ * @param attrs Collection of attributes.
41
+ * @param children A list of nodes to be inserted into created element.
45
42
  */
46
- constructor(...args) {
47
- super(...args);
48
- /**
49
- * Returns `null` because filler is not needed for UIElements.
50
- *
51
- * @method #getFillerOffset
52
- * @returns {null} Always returns null.
53
- */
43
+ constructor(document, name, attrs, children) {
44
+ super(document, name, attrs, children);
54
45
  this.getFillerOffset = getFillerOffset;
55
46
  }
56
47
  /**
@@ -58,7 +49,7 @@ export default class UIElement extends Element {
58
49
  * Throws {@link module:utils/ckeditorerror~CKEditorError CKEditorError} `view-uielement-cannot-add` to prevent adding any child nodes
59
50
  * to UIElement.
60
51
  *
61
- * @protected
52
+ * @internal
62
53
  */
63
54
  _insertChild(index, items) {
64
55
  if (items && (items instanceof Node || Array.from(items).length > 0)) {
@@ -76,22 +67,22 @@ export default class UIElement extends Element {
76
67
  * {@link module:engine/view/domconverter~DomConverter}.
77
68
  * Do not use inheritance to create custom rendering method, replace `render()` method instead:
78
69
  *
79
- * const myUIElement = downcastWriter.createUIElement( 'span' );
80
- * myUIElement.render = function( domDocument, domConverter ) {
81
- * const domElement = this.toDomElement( domDocument );
70
+ * ```ts
71
+ * const myUIElement = downcastWriter.createUIElement( 'span' );
72
+ * myUIElement.render = function( domDocument, domConverter ) {
73
+ * const domElement = this.toDomElement( domDocument );
82
74
  *
83
- * domConverter.setContentOf( domElement, '<b>this is ui element</b>' );
75
+ * domConverter.setContentOf( domElement, '<b>this is ui element</b>' );
84
76
  *
85
- * return domElement;
86
- * };
77
+ * return domElement;
78
+ * };
79
+ * ```
87
80
  *
88
81
  * If changes in your UI element should trigger some editor UI update you should call
89
82
  * the {@link module:core/editor/editorui~EditorUI#update `editor.ui.update()`} method
90
83
  * after rendering your UI element.
91
84
  *
92
- * @param {Document} domDocument
93
- * @param {module:engine/view/domconverter~DomConverter} domConverter Instance of the DomConverter used to optimize the output.
94
- * @returns {HTMLElement}
85
+ * @param domConverter Instance of the DomConverter used to optimize the output.
95
86
  */
96
87
  render(domDocument, domConverter) {
97
88
  // Provide basic, default output.
@@ -100,9 +91,6 @@ export default class UIElement extends Element {
100
91
  /**
101
92
  * Creates DOM element based on this view UIElement.
102
93
  * Note that each time this method is called new DOM element is created.
103
- *
104
- * @param {Document} domDocument
105
- * @returns {HTMLElement}
106
94
  */
107
95
  toDomElement(domDocument) {
108
96
  const domElement = domDocument.createElement(this.name);
@@ -112,32 +100,8 @@ export default class UIElement extends Element {
112
100
  return domElement;
113
101
  }
114
102
  }
115
- /**
116
- * Checks whether this object is of the given.
117
- *
118
- * uiElement.is( 'uiElement' ); // -> true
119
- * uiElement.is( 'element' ); // -> true
120
- * uiElement.is( 'node' ); // -> true
121
- * uiElement.is( 'view:uiElement' ); // -> true
122
- * uiElement.is( 'view:element' ); // -> true
123
- * uiElement.is( 'view:node' ); // -> true
124
- *
125
- * uiElement.is( 'model:element' ); // -> false
126
- * uiElement.is( 'documentFragment' ); // -> false
127
- *
128
- * Assuming that the object being checked is an ui element, you can also check its
129
- * {@link module:engine/view/uielement~UIElement#name name}:
130
- *
131
- * uiElement.is( 'element', 'span' ); // -> true if this is a span ui element
132
- * uiElement.is( 'uiElement', 'span' ); // -> same as above
133
- * text.is( 'element', 'span' ); -> false
134
- *
135
- * {@link module:engine/view/node~Node#is Check the entire list of view objects} which implement the `is()` method.
136
- *
137
- * @param {String} type Type to check.
138
- * @param {String} [name] Element name.
139
- * @returns {Boolean}
140
- */
103
+ // The magic of type inference using `is` method is centralized in `TypeCheckable` class.
104
+ // Proper overload would interfere with that.
141
105
  UIElement.prototype.is = function (type, name) {
142
106
  if (!name) {
143
107
  return type === 'uiElement' || type === 'view:uiElement' ||
@@ -157,20 +121,22 @@ UIElement.prototype.is = function (type, name) {
157
121
  * The callback handles the situation when right arrow key is pressed and selection is collapsed before a UI element.
158
122
  * Without this handler, it would be impossible to "jump over" UI element using right arrow key.
159
123
  *
160
- * @param {module:engine/view/view~View} view View controller to which the quirks handling will be injected.
124
+ * @param view View controller to which the quirks handling will be injected.
161
125
  */
162
126
  export function injectUiElementHandling(view) {
163
127
  view.document.on('arrowKey', (evt, data) => jumpOverUiElement(evt, data, view.domConverter), { priority: 'low' });
164
128
  }
165
- // Returns `null` because block filler is not needed for UIElements.
166
- //
167
- // @returns {null}
129
+ /**
130
+ * Returns `null` because block filler is not needed for UIElements.
131
+ */
168
132
  function getFillerOffset() {
169
133
  return null;
170
134
  }
171
- // Selection cannot be placed in a `UIElement`. Whenever it is placed there, it is moved before it. This
172
- // causes a situation when it is impossible to jump over `UIElement` using right arrow key, because the selection
173
- // ends up in ui element (in DOM) and is moved back to the left. This handler fixes this situation.
135
+ /**
136
+ * Selection cannot be placed in a `UIElement`. Whenever it is placed there, it is moved before it. This
137
+ * causes a situation when it is impossible to jump over `UIElement` using right arrow key, because the selection
138
+ * ends up in ui element (in DOM) and is moved back to the left. This handler fixes this situation.
139
+ */
174
140
  function jumpOverUiElement(evt, data, domConverter) {
175
141
  if (data.keyCode == keyCodes.arrowright) {
176
142
  const domSelection = data.domTarget.ownerDocument.defaultView.getSelection();