@ckeditor/ckeditor5-engine 36.0.1 → 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.
- package/README.md +1 -1
- package/package.json +24 -23
- package/src/controller/datacontroller.d.ts +331 -0
- package/src/controller/datacontroller.js +62 -109
- package/src/controller/editingcontroller.d.ts +98 -0
- package/src/controller/editingcontroller.js +22 -46
- package/src/conversion/conversion.d.ts +476 -0
- package/src/conversion/conversion.js +328 -347
- package/src/conversion/conversionhelpers.d.ts +26 -0
- package/src/conversion/conversionhelpers.js +1 -5
- package/src/conversion/downcastdispatcher.d.ts +547 -0
- package/src/conversion/downcastdispatcher.js +74 -152
- package/src/conversion/downcasthelpers.d.ts +1226 -0
- package/src/conversion/downcasthelpers.js +843 -762
- package/src/conversion/mapper.d.ts +499 -0
- package/src/conversion/mapper.js +84 -99
- package/src/conversion/modelconsumable.d.ts +201 -0
- package/src/conversion/modelconsumable.js +96 -99
- package/src/conversion/upcastdispatcher.d.ts +492 -0
- package/src/conversion/upcastdispatcher.js +73 -100
- package/src/conversion/upcasthelpers.d.ts +499 -0
- package/src/conversion/upcasthelpers.js +406 -373
- package/src/conversion/viewconsumable.d.ts +177 -0
- package/src/conversion/viewconsumable.js +157 -162
- package/src/dataprocessor/basichtmlwriter.d.ts +18 -0
- package/src/dataprocessor/basichtmlwriter.js +0 -9
- package/src/dataprocessor/dataprocessor.d.ts +61 -0
- package/src/dataprocessor/htmldataprocessor.d.ts +76 -0
- package/src/dataprocessor/htmldataprocessor.js +6 -28
- package/src/dataprocessor/htmlwriter.d.ts +16 -0
- package/src/dataprocessor/xmldataprocessor.d.ts +90 -0
- package/src/dataprocessor/xmldataprocessor.js +8 -40
- package/src/dev-utils/model.d.ts +124 -0
- package/src/dev-utils/model.js +41 -38
- package/src/dev-utils/operationreplayer.d.ts +51 -0
- package/src/dev-utils/operationreplayer.js +6 -14
- package/src/dev-utils/utils.d.ts +37 -0
- package/src/dev-utils/utils.js +5 -18
- package/src/dev-utils/view.d.ts +319 -0
- package/src/dev-utils/view.js +205 -226
- package/src/index.d.ts +105 -0
- package/src/index.js +1 -0
- package/src/model/batch.d.ts +106 -0
- package/src/model/differ.d.ts +329 -0
- package/src/model/document.d.ts +245 -0
- package/src/model/document.js +1 -1
- package/src/model/documentfragment.d.ts +196 -0
- package/src/model/documentfragment.js +2 -2
- package/src/model/documentselection.d.ts +420 -0
- package/src/model/element.d.ts +165 -0
- package/src/model/history.d.ts +114 -0
- package/src/model/item.d.ts +14 -0
- package/src/model/liveposition.d.ts +77 -0
- package/src/model/liverange.d.ts +102 -0
- package/src/model/markercollection.d.ts +335 -0
- package/src/model/model.d.ts +812 -0
- package/src/model/model.js +59 -30
- package/src/model/node.d.ts +256 -0
- package/src/model/nodelist.d.ts +91 -0
- package/src/model/operation/attributeoperation.d.ts +98 -0
- package/src/model/operation/detachoperation.d.ts +55 -0
- package/src/model/operation/insertoperation.d.ts +85 -0
- package/src/model/operation/markeroperation.d.ts +86 -0
- package/src/model/operation/mergeoperation.d.ts +95 -0
- package/src/model/operation/moveoperation.d.ts +91 -0
- package/src/model/operation/nooperation.d.ts +33 -0
- package/src/model/operation/operation.d.ts +89 -0
- package/src/model/operation/operationfactory.d.ts +18 -0
- package/src/model/operation/renameoperation.d.ts +78 -0
- package/src/model/operation/rootattributeoperation.d.ts +97 -0
- package/src/model/operation/rootattributeoperation.js +1 -1
- package/src/model/operation/splitoperation.d.ts +104 -0
- package/src/model/operation/transform.d.ts +100 -0
- package/src/model/operation/utils.d.ts +71 -0
- package/src/model/position.d.ts +539 -0
- package/src/model/position.js +1 -1
- package/src/model/range.d.ts +458 -0
- package/src/model/range.js +1 -1
- package/src/model/rootelement.d.ts +40 -0
- package/src/model/schema.d.ts +1176 -0
- package/src/model/schema.js +15 -15
- package/src/model/selection.d.ts +472 -0
- package/src/model/text.d.ts +66 -0
- package/src/model/text.js +0 -2
- package/src/model/textproxy.d.ts +144 -0
- package/src/model/treewalker.d.ts +186 -0
- package/src/model/treewalker.js +19 -10
- package/src/model/typecheckable.d.ts +255 -0
- package/src/model/utils/autoparagraphing.d.ts +37 -0
- package/src/model/utils/deletecontent.d.ts +58 -0
- package/src/model/utils/findoptimalinsertionrange.d.ts +32 -0
- package/src/model/utils/getselectedcontent.d.ts +30 -0
- package/src/model/utils/insertcontent.d.ts +46 -0
- package/src/model/utils/insertcontent.js +2 -12
- package/src/model/utils/insertobject.d.ts +44 -0
- package/src/model/utils/insertobject.js +3 -14
- package/src/model/utils/modifyselection.d.ts +48 -0
- package/src/model/utils/selection-post-fixer.d.ts +65 -0
- package/src/model/writer.d.ts +726 -0
- package/src/model/writer.js +6 -4
- package/src/view/attributeelement.d.ts +108 -0
- package/src/view/attributeelement.js +25 -69
- package/src/view/containerelement.d.ts +49 -0
- package/src/view/containerelement.js +10 -43
- package/src/view/datatransfer.d.ts +75 -0
- package/src/view/document.d.ts +184 -0
- package/src/view/document.js +15 -84
- package/src/view/documentfragment.d.ts +150 -0
- package/src/view/documentfragment.js +40 -81
- package/src/view/documentselection.d.ts +219 -0
- package/src/view/documentselection.js +75 -121
- package/src/view/domconverter.d.ts +620 -0
- package/src/view/domconverter.js +159 -276
- package/src/view/downcastwriter.d.ts +804 -0
- package/src/view/downcastwriter.js +336 -380
- package/src/view/editableelement.d.ts +52 -0
- package/src/view/editableelement.js +9 -49
- package/src/view/element.d.ts +466 -0
- package/src/view/element.js +150 -222
- package/src/view/elementdefinition.d.ts +87 -0
- package/src/view/emptyelement.d.ts +41 -0
- package/src/view/emptyelement.js +11 -44
- package/src/view/filler.d.ts +111 -0
- package/src/view/filler.js +24 -21
- package/src/view/item.d.ts +14 -0
- package/src/view/matcher.d.ts +486 -0
- package/src/view/matcher.js +247 -218
- package/src/view/node.d.ts +160 -0
- package/src/view/node.js +26 -100
- package/src/view/observer/arrowkeysobserver.d.ts +41 -0
- package/src/view/observer/arrowkeysobserver.js +0 -13
- package/src/view/observer/bubblingemittermixin.d.ts +166 -0
- package/src/view/observer/bubblingemittermixin.js +36 -25
- package/src/view/observer/bubblingeventinfo.d.ts +47 -0
- package/src/view/observer/bubblingeventinfo.js +3 -29
- package/src/view/observer/clickobserver.d.ts +43 -0
- package/src/view/observer/clickobserver.js +9 -19
- package/src/view/observer/compositionobserver.d.ts +82 -0
- package/src/view/observer/compositionobserver.js +13 -42
- package/src/view/observer/domeventdata.d.ts +50 -0
- package/src/view/observer/domeventdata.js +5 -30
- package/src/view/observer/domeventobserver.d.ts +69 -0
- package/src/view/observer/domeventobserver.js +19 -21
- package/src/view/observer/fakeselectionobserver.d.ts +46 -0
- package/src/view/observer/fakeselectionobserver.js +2 -15
- package/src/view/observer/focusobserver.d.ts +82 -0
- package/src/view/observer/focusobserver.js +14 -40
- package/src/view/observer/inputobserver.d.ts +86 -0
- package/src/view/observer/inputobserver.js +18 -64
- package/src/view/observer/keyobserver.d.ts +67 -0
- package/src/view/observer/keyobserver.js +8 -42
- package/src/view/observer/mouseobserver.d.ts +89 -0
- package/src/view/observer/mouseobserver.js +8 -28
- package/src/view/observer/mutationobserver.d.ts +82 -0
- package/src/view/observer/mutationobserver.js +7 -37
- package/src/view/observer/observer.d.ts +84 -0
- package/src/view/observer/observer.js +12 -25
- package/src/view/observer/selectionobserver.d.ts +143 -0
- package/src/view/observer/selectionobserver.js +9 -99
- package/src/view/observer/tabobserver.d.ts +42 -0
- package/src/view/observer/tabobserver.js +0 -14
- package/src/view/placeholder.d.ts +85 -0
- package/src/view/placeholder.js +26 -43
- package/src/view/position.d.ts +189 -0
- package/src/view/position.js +36 -83
- package/src/view/range.d.ts +279 -0
- package/src/view/range.js +79 -122
- package/src/view/rawelement.d.ts +73 -0
- package/src/view/rawelement.js +34 -48
- package/src/view/renderer.d.ts +265 -0
- package/src/view/renderer.js +105 -193
- package/src/view/rooteditableelement.d.ts +41 -0
- package/src/view/rooteditableelement.js +12 -40
- package/src/view/selection.d.ts +375 -0
- package/src/view/selection.js +79 -153
- package/src/view/styles/background.d.ts +33 -0
- package/src/view/styles/background.js +14 -12
- package/src/view/styles/border.d.ts +43 -0
- package/src/view/styles/border.js +58 -48
- package/src/view/styles/margin.d.ts +29 -0
- package/src/view/styles/margin.js +13 -11
- package/src/view/styles/padding.d.ts +29 -0
- package/src/view/styles/padding.js +13 -11
- package/src/view/styles/utils.d.ts +93 -0
- package/src/view/styles/utils.js +22 -48
- package/src/view/stylesmap.d.ts +675 -0
- package/src/view/stylesmap.js +249 -244
- package/src/view/text.d.ts +74 -0
- package/src/view/text.js +16 -46
- package/src/view/textproxy.d.ts +97 -0
- package/src/view/textproxy.js +10 -59
- package/src/view/treewalker.d.ts +195 -0
- package/src/view/treewalker.js +43 -106
- package/src/view/typecheckable.d.ts +401 -0
- package/src/view/uielement.d.ts +96 -0
- package/src/view/uielement.js +28 -62
- package/src/view/upcastwriter.d.ts +328 -0
- package/src/view/upcastwriter.js +124 -134
- package/src/view/view.d.ts +327 -0
- 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 {};
|
package/src/view/uielement.js
CHANGED
|
@@ -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
|
-
* @
|
|
40
|
-
* @param
|
|
41
|
-
* @param
|
|
42
|
-
* @param
|
|
43
|
-
* @param
|
|
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(
|
|
47
|
-
super(
|
|
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
|
-
* @
|
|
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
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
70
|
+
* ```ts
|
|
71
|
+
* const myUIElement = downcastWriter.createUIElement( 'span' );
|
|
72
|
+
* myUIElement.render = function( domDocument, domConverter ) {
|
|
73
|
+
* const domElement = this.toDomElement( domDocument );
|
|
82
74
|
*
|
|
83
|
-
*
|
|
75
|
+
* domConverter.setContentOf( domElement, '<b>this is ui element</b>' );
|
|
84
76
|
*
|
|
85
|
-
*
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
166
|
-
|
|
167
|
-
|
|
129
|
+
/**
|
|
130
|
+
* Returns `null` because block filler is not needed for UIElements.
|
|
131
|
+
*/
|
|
168
132
|
function getFillerOffset() {
|
|
169
133
|
return null;
|
|
170
134
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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();
|