@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.
- 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/datatransfer.js +24 -27
- 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
package/src/view/domconverter.js
CHANGED
|
@@ -39,133 +39,58 @@ export default class DomConverter {
|
|
|
39
39
|
/**
|
|
40
40
|
* Creates a DOM converter.
|
|
41
41
|
*
|
|
42
|
-
* @param
|
|
43
|
-
* @param
|
|
44
|
-
* @param
|
|
42
|
+
* @param document The view document instance.
|
|
43
|
+
* @param options An object with configuration options.
|
|
44
|
+
* @param options.blockFillerMode The type of the block filler to use.
|
|
45
45
|
* Default value depends on the options.renderingMode:
|
|
46
46
|
* 'nbsp' when options.renderingMode == 'data',
|
|
47
47
|
* 'br' when options.renderingMode == 'editing'.
|
|
48
|
-
* @param
|
|
48
|
+
* @param options.renderingMode Whether to leave the View-to-DOM conversion result unchanged
|
|
49
49
|
* or improve editing experience by filtering out interactive data.
|
|
50
50
|
*/
|
|
51
|
-
constructor(document,
|
|
52
|
-
/**
|
|
53
|
-
* @readonly
|
|
54
|
-
* @type {module:engine/view/document~Document}
|
|
55
|
-
*/
|
|
56
|
-
this.document = document;
|
|
57
|
-
/**
|
|
58
|
-
* Whether to leave the View-to-DOM conversion result unchanged or improve editing experience by filtering out interactive data.
|
|
59
|
-
*
|
|
60
|
-
* @member {'data'|'editing'} module:engine/view/domconverter~DomConverter#renderingMode
|
|
61
|
-
*/
|
|
62
|
-
this.renderingMode = options.renderingMode || 'editing';
|
|
63
|
-
/**
|
|
64
|
-
* The mode of a block filler used by the DOM converter.
|
|
65
|
-
*
|
|
66
|
-
* @member {'br'|'nbsp'|'markedNbsp'} module:engine/view/domconverter~DomConverter#blockFillerMode
|
|
67
|
-
*/
|
|
68
|
-
this.blockFillerMode = options.blockFillerMode || (this.renderingMode === 'editing' ? 'br' : 'nbsp');
|
|
69
|
-
/**
|
|
70
|
-
* Elements which are considered pre-formatted elements.
|
|
71
|
-
*
|
|
72
|
-
* @readonly
|
|
73
|
-
* @member {Array.<String>} module:engine/view/domconverter~DomConverter#preElements
|
|
74
|
-
*/
|
|
75
|
-
this.preElements = ['pre'];
|
|
76
|
-
/**
|
|
77
|
-
* Elements which are considered block elements (and hence should be filled with a
|
|
78
|
-
* {@link #isBlockFiller block filler}).
|
|
79
|
-
*
|
|
80
|
-
* Whether an element is considered a block element also affects handling of trailing whitespaces.
|
|
81
|
-
*
|
|
82
|
-
* You can extend this array if you introduce support for block elements which are not yet recognized here.
|
|
83
|
-
*
|
|
84
|
-
* @readonly
|
|
85
|
-
* @member {Array.<String>} module:engine/view/domconverter~DomConverter#blockElements
|
|
86
|
-
*/
|
|
87
|
-
this.blockElements = [
|
|
88
|
-
'address', 'article', 'aside', 'blockquote', 'caption', 'center', 'dd', 'details', 'dir', 'div',
|
|
89
|
-
'dl', 'dt', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header',
|
|
90
|
-
'hgroup', 'legend', 'li', 'main', 'menu', 'nav', 'ol', 'p', 'pre', 'section', 'summary', 'table', 'tbody',
|
|
91
|
-
'td', 'tfoot', 'th', 'thead', 'tr', 'ul'
|
|
92
|
-
];
|
|
93
|
-
/**
|
|
94
|
-
* A list of elements that exist inline (in text) but their inner structure cannot be edited because
|
|
95
|
-
* of the way they are rendered by the browser. They are mostly HTML form elements but there are other
|
|
96
|
-
* elements such as `<img>` or `<iframe>` that also have non-editable children or no children whatsoever.
|
|
97
|
-
*
|
|
98
|
-
* Whether an element is considered an inline object has an impact on white space rendering (trimming)
|
|
99
|
-
* around (and inside of it). In short, white spaces in text nodes next to inline objects are not trimmed.
|
|
100
|
-
*
|
|
101
|
-
* You can extend this array if you introduce support for inline object elements which are not yet recognized here.
|
|
102
|
-
*
|
|
103
|
-
* @readonly
|
|
104
|
-
* @member {Array.<String>} module:engine/view/domconverter~DomConverter#inlineObjectElements
|
|
105
|
-
*/
|
|
106
|
-
this.inlineObjectElements = [
|
|
107
|
-
'object', 'iframe', 'input', 'button', 'textarea', 'select', 'option', 'video', 'embed', 'audio', 'img', 'canvas'
|
|
108
|
-
];
|
|
109
|
-
/**
|
|
110
|
-
* A list of elements which may affect the editing experience. To avoid this, those elements are replaced with
|
|
111
|
-
* `<span data-ck-unsafe-element="[element name]"></span>` while rendering in the editing mode.
|
|
112
|
-
*
|
|
113
|
-
* @readonly
|
|
114
|
-
* @member {Array.<String>} module:engine/view/domconverter~DomConverter#unsafeElements
|
|
115
|
-
*/
|
|
116
|
-
this.unsafeElements = ['script', 'style'];
|
|
117
|
-
/**
|
|
118
|
-
* The DOM Document used to create DOM nodes.
|
|
119
|
-
*
|
|
120
|
-
* @type {Document}
|
|
121
|
-
* @private
|
|
122
|
-
*/
|
|
123
|
-
this._domDocument = this.renderingMode === 'editing' ? global.document : global.document.implementation.createHTMLDocument('');
|
|
51
|
+
constructor(document, { blockFillerMode, renderingMode = 'editing' } = {}) {
|
|
124
52
|
/**
|
|
125
53
|
* The DOM-to-view mapping.
|
|
126
|
-
*
|
|
127
|
-
* @private
|
|
128
|
-
* @member {WeakMap} module:engine/view/domconverter~DomConverter#_domToViewMapping
|
|
129
54
|
*/
|
|
130
55
|
this._domToViewMapping = new WeakMap();
|
|
131
56
|
/**
|
|
132
57
|
* The view-to-DOM mapping.
|
|
133
|
-
*
|
|
134
|
-
* @private
|
|
135
|
-
* @member {WeakMap} module:engine/view/domconverter~DomConverter#_viewToDomMapping
|
|
136
58
|
*/
|
|
137
59
|
this._viewToDomMapping = new WeakMap();
|
|
138
60
|
/**
|
|
139
61
|
* Holds the mapping between fake selection containers and corresponding view selections.
|
|
140
|
-
*
|
|
141
|
-
* @private
|
|
142
|
-
* @member {WeakMap} module:engine/view/domconverter~DomConverter#_fakeSelectionMapping
|
|
143
62
|
*/
|
|
144
63
|
this._fakeSelectionMapping = new WeakMap();
|
|
145
64
|
/**
|
|
146
65
|
* Matcher for view elements whose content should be treated as raw data
|
|
147
66
|
* and not processed during the conversion from DOM nodes to view elements.
|
|
148
|
-
*
|
|
149
|
-
* @private
|
|
150
|
-
* @type {module:engine/view/matcher~Matcher}
|
|
151
67
|
*/
|
|
152
68
|
this._rawContentElementMatcher = new Matcher();
|
|
153
69
|
/**
|
|
154
70
|
* A set of encountered raw content DOM nodes. It is used for preventing left trimming of the following text node.
|
|
155
|
-
*
|
|
156
|
-
* @private
|
|
157
|
-
* @type {WeakSet.<Node>}
|
|
158
71
|
*/
|
|
159
72
|
this._encounteredRawContentDomNodes = new WeakSet();
|
|
73
|
+
this.document = document;
|
|
74
|
+
this.renderingMode = renderingMode;
|
|
75
|
+
this.blockFillerMode = blockFillerMode || (renderingMode === 'editing' ? 'br' : 'nbsp');
|
|
76
|
+
this.preElements = ['pre'];
|
|
77
|
+
this.blockElements = [
|
|
78
|
+
'address', 'article', 'aside', 'blockquote', 'caption', 'center', 'dd', 'details', 'dir', 'div',
|
|
79
|
+
'dl', 'dt', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header',
|
|
80
|
+
'hgroup', 'legend', 'li', 'main', 'menu', 'nav', 'ol', 'p', 'pre', 'section', 'summary', 'table', 'tbody',
|
|
81
|
+
'td', 'tfoot', 'th', 'thead', 'tr', 'ul'
|
|
82
|
+
];
|
|
83
|
+
this.inlineObjectElements = [
|
|
84
|
+
'object', 'iframe', 'input', 'button', 'textarea', 'select', 'option', 'video', 'embed', 'audio', 'img', 'canvas'
|
|
85
|
+
];
|
|
86
|
+
this.unsafeElements = ['script', 'style'];
|
|
87
|
+
this._domDocument = this.renderingMode === 'editing' ? global.document : global.document.implementation.createHTMLDocument('');
|
|
160
88
|
}
|
|
161
89
|
/**
|
|
162
90
|
* Binds a given DOM element that represents fake selection to a **position** of a
|
|
163
91
|
* {@link module:engine/view/documentselection~DocumentSelection document selection}.
|
|
164
92
|
* Document selection copy is stored and can be retrieved by the
|
|
165
93
|
* {@link module:engine/view/domconverter~DomConverter#fakeSelectionToView} method.
|
|
166
|
-
*
|
|
167
|
-
* @param {HTMLElement} domElement
|
|
168
|
-
* @param {module:engine/view/documentselection~DocumentSelection} viewDocumentSelection
|
|
169
94
|
*/
|
|
170
95
|
bindFakeSelection(domElement, viewDocumentSelection) {
|
|
171
96
|
this._fakeSelectionMapping.set(domElement, new ViewSelection(viewDocumentSelection));
|
|
@@ -173,9 +98,6 @@ export default class DomConverter {
|
|
|
173
98
|
/**
|
|
174
99
|
* Returns a {@link module:engine/view/selection~Selection view selection} instance corresponding to a given
|
|
175
100
|
* DOM element that represents fake selection. Returns `undefined` if binding to the given DOM element does not exist.
|
|
176
|
-
*
|
|
177
|
-
* @param {HTMLElement} domElement
|
|
178
|
-
* @returns {module:engine/view/selection~Selection|undefined}
|
|
179
101
|
*/
|
|
180
102
|
fakeSelectionToView(domElement) {
|
|
181
103
|
return this._fakeSelectionMapping.get(domElement);
|
|
@@ -185,8 +107,8 @@ export default class DomConverter {
|
|
|
185
107
|
* {@link module:engine/view/domconverter~DomConverter#mapDomToView} and
|
|
186
108
|
* {@link module:engine/view/domconverter~DomConverter#mapViewToDom}.
|
|
187
109
|
*
|
|
188
|
-
* @param
|
|
189
|
-
* @param
|
|
110
|
+
* @param domElement The DOM element to bind.
|
|
111
|
+
* @param viewElement The view element to bind.
|
|
190
112
|
*/
|
|
191
113
|
bindElements(domElement, viewElement) {
|
|
192
114
|
this._domToViewMapping.set(domElement, viewElement);
|
|
@@ -196,7 +118,7 @@ export default class DomConverter {
|
|
|
196
118
|
* Unbinds a given DOM element from the view element it was bound to. Unbinding is deep, meaning that all children of
|
|
197
119
|
* the DOM element will be unbound too.
|
|
198
120
|
*
|
|
199
|
-
* @param
|
|
121
|
+
* @param domElement The DOM element to unbind.
|
|
200
122
|
*/
|
|
201
123
|
unbindDomElement(domElement) {
|
|
202
124
|
const viewElement = this._domToViewMapping.get(domElement);
|
|
@@ -213,8 +135,8 @@ export default class DomConverter {
|
|
|
213
135
|
* {@link module:engine/view/domconverter~DomConverter#mapDomToView} and
|
|
214
136
|
* {@link module:engine/view/domconverter~DomConverter#mapViewToDom}.
|
|
215
137
|
*
|
|
216
|
-
* @param
|
|
217
|
-
* @param
|
|
138
|
+
* @param domFragment The DOM document fragment to bind.
|
|
139
|
+
* @param viewFragment The view document fragment to bind.
|
|
218
140
|
*/
|
|
219
141
|
bindDocumentFragments(domFragment, viewFragment) {
|
|
220
142
|
this._domToViewMapping.set(domFragment, viewFragment);
|
|
@@ -223,10 +145,7 @@ export default class DomConverter {
|
|
|
223
145
|
/**
|
|
224
146
|
* Decides whether a given pair of attribute key and value should be passed further down the pipeline.
|
|
225
147
|
*
|
|
226
|
-
* @param
|
|
227
|
-
* @param {String} attributeValue
|
|
228
|
-
* @param {String} elementName Element name in lower case.
|
|
229
|
-
* @returns {Boolean}
|
|
148
|
+
* @param elementName Element name in lower case.
|
|
230
149
|
*/
|
|
231
150
|
shouldRenderAttribute(attributeKey, attributeValue, elementName) {
|
|
232
151
|
if (this.renderingMode === 'data') {
|
|
@@ -255,8 +174,8 @@ export default class DomConverter {
|
|
|
255
174
|
/**
|
|
256
175
|
* Set `domElement`'s content using provided `html` argument. Apply necessary filtering for the editing pipeline.
|
|
257
176
|
*
|
|
258
|
-
* @param
|
|
259
|
-
* @param
|
|
177
|
+
* @param domElement DOM element that should have `html` set as its content.
|
|
178
|
+
* @param html Textual representation of the HTML that will be set on `domElement`.
|
|
260
179
|
*/
|
|
261
180
|
setContentOf(domElement, html) {
|
|
262
181
|
// For data pipeline we pass the HTML as-is.
|
|
@@ -299,12 +218,11 @@ export default class DomConverter {
|
|
|
299
218
|
* Converts the view to the DOM. For all text nodes, not bound elements and document fragments new items will
|
|
300
219
|
* be created. For bound elements and document fragments the method will return corresponding items.
|
|
301
220
|
*
|
|
302
|
-
* @param
|
|
303
|
-
*
|
|
304
|
-
* @param
|
|
305
|
-
* @param
|
|
306
|
-
* @
|
|
307
|
-
* @returns {Node|DocumentFragment} Converted node or DocumentFragment.
|
|
221
|
+
* @param viewNode View node or document fragment to transform.
|
|
222
|
+
* @param options Conversion options.
|
|
223
|
+
* @param options.bind Determines whether new elements will be bound.
|
|
224
|
+
* @param options.withChildren If `false`, node's and document fragment's children will not be converted.
|
|
225
|
+
* @returns Converted node or DocumentFragment.
|
|
308
226
|
*/
|
|
309
227
|
viewToDom(viewNode, options = {}) {
|
|
310
228
|
if (viewNode.is('$text')) {
|
|
@@ -374,10 +292,10 @@ export default class DomConverter {
|
|
|
374
292
|
*
|
|
375
293
|
* **Note**: To remove the attribute, use {@link #removeDomElementAttribute}.
|
|
376
294
|
*
|
|
377
|
-
* @param
|
|
378
|
-
* @param
|
|
379
|
-
* @param
|
|
380
|
-
* @param
|
|
295
|
+
* @param domElement The DOM element the attribute should be set on.
|
|
296
|
+
* @param key The name of the attribute.
|
|
297
|
+
* @param value The value of the attribute.
|
|
298
|
+
* @param relatedViewElement The view element related to the `domElement` (if there is any).
|
|
381
299
|
* It helps decide whether the attribute set is unsafe. For instance, view elements created via the
|
|
382
300
|
* {@link module:engine/view/downcastwriter~DowncastWriter} methods can allow certain attributes that would normally be filtered out.
|
|
383
301
|
*/
|
|
@@ -404,8 +322,8 @@ export default class DomConverter {
|
|
|
404
322
|
*
|
|
405
323
|
* **Note**: To set the attribute, use {@link #setDomElementAttribute}.
|
|
406
324
|
*
|
|
407
|
-
* @param
|
|
408
|
-
* @param
|
|
325
|
+
* @param domElement The DOM element the attribute should be removed from.
|
|
326
|
+
* @param key The name of the attribute.
|
|
409
327
|
*/
|
|
410
328
|
removeDomElementAttribute(domElement, key) {
|
|
411
329
|
// See #_createReplacementDomElement() to learn what this is.
|
|
@@ -421,9 +339,9 @@ export default class DomConverter {
|
|
|
421
339
|
* {@link module:engine/view/domconverter~DomConverter#viewToDom} method.
|
|
422
340
|
* Additionally, this method adds block {@link module:engine/view/filler filler} to the list of children, if needed.
|
|
423
341
|
*
|
|
424
|
-
* @param
|
|
425
|
-
* @param
|
|
426
|
-
* @returns
|
|
342
|
+
* @param viewElement Parent view element.
|
|
343
|
+
* @param options See {@link module:engine/view/domconverter~DomConverter#viewToDom} options parameter.
|
|
344
|
+
* @returns DOM nodes.
|
|
427
345
|
*/
|
|
428
346
|
*viewChildrenToDom(viewElement, options = {}) {
|
|
429
347
|
const fillerPositionOffset = viewElement.getFillerOffset && viewElement.getFillerOffset();
|
|
@@ -459,8 +377,8 @@ export default class DomConverter {
|
|
|
459
377
|
* Converts view {@link module:engine/view/range~Range} to DOM range.
|
|
460
378
|
* Inline and block {@link module:engine/view/filler fillers} are handled during the conversion.
|
|
461
379
|
*
|
|
462
|
-
* @param
|
|
463
|
-
* @returns
|
|
380
|
+
* @param viewRange View range.
|
|
381
|
+
* @returns DOM range.
|
|
464
382
|
*/
|
|
465
383
|
viewRangeToDom(viewRange) {
|
|
466
384
|
const domStart = this.viewPositionToDom(viewRange.start);
|
|
@@ -476,10 +394,11 @@ export default class DomConverter {
|
|
|
476
394
|
* Inline and block {@link module:engine/view/filler fillers} are handled during the conversion.
|
|
477
395
|
* If the converted position is directly before inline filler it is moved inside the filler.
|
|
478
396
|
*
|
|
479
|
-
* @param
|
|
480
|
-
* @returns
|
|
481
|
-
*
|
|
482
|
-
*
|
|
397
|
+
* @param viewPosition View position.
|
|
398
|
+
* @returns DOM position or `null` if view position could not be converted to DOM.
|
|
399
|
+
* DOM position has two properties:
|
|
400
|
+
* * `parent` - DOM position parent.
|
|
401
|
+
* * `offset` - DOM position offset.
|
|
483
402
|
*/
|
|
484
403
|
viewPositionToDom(viewPosition) {
|
|
485
404
|
const viewParent = viewPosition.parent;
|
|
@@ -533,15 +452,15 @@ export default class DomConverter {
|
|
|
533
452
|
* {@link module:engine/view/filler fillers} `null` will be returned.
|
|
534
453
|
* For all DOM elements rendered by {@link module:engine/view/uielement~UIElement} that UIElement will be returned.
|
|
535
454
|
*
|
|
536
|
-
* @param
|
|
537
|
-
* @param
|
|
538
|
-
* @param
|
|
539
|
-
* @param
|
|
540
|
-
* @param
|
|
541
|
-
* @param
|
|
542
|
-
* {@link module:engine/view/uielement~UIElement view UI elements}.
|
|
543
|
-
* @returns
|
|
544
|
-
* or
|
|
455
|
+
* @param domNode DOM node or document fragment to transform.
|
|
456
|
+
* @param options Conversion options.
|
|
457
|
+
* @param options.bind Determines whether new elements will be bound. False by default.
|
|
458
|
+
* @param options.withChildren If `true`, node's and document fragment's children will be converted too. True by default.
|
|
459
|
+
* @param options.keepOriginalCase If `false`, node's tag name will be converted to lower case. False by default.
|
|
460
|
+
* @param options.skipComments If `false`, comment nodes will be converted to `$comment`
|
|
461
|
+
* {@link module:engine/view/uielement~UIElement view UI elements}. False by default.
|
|
462
|
+
* @returns Converted node or document fragment or `null` if DOM node is a {@link module:engine/view/filler filler}
|
|
463
|
+
* or the given node is an empty text node.
|
|
545
464
|
*/
|
|
546
465
|
domToView(domNode, options = {}) {
|
|
547
466
|
if (this.isBlockFiller(domNode)) {
|
|
@@ -612,9 +531,9 @@ export default class DomConverter {
|
|
|
612
531
|
* the {@link module:engine/view/domconverter~DomConverter#domToView} method.
|
|
613
532
|
* Additionally this method omits block {@link module:engine/view/filler filler}, if it exists in the DOM parent.
|
|
614
533
|
*
|
|
615
|
-
* @param
|
|
616
|
-
* @param
|
|
617
|
-
* @returns
|
|
534
|
+
* @param domElement Parent DOM element.
|
|
535
|
+
* @param options See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.
|
|
536
|
+
* @returns View nodes.
|
|
618
537
|
*/
|
|
619
538
|
*domChildrenToView(domElement, options) {
|
|
620
539
|
for (let i = 0; i < domElement.childNodes.length; i++) {
|
|
@@ -629,8 +548,8 @@ export default class DomConverter {
|
|
|
629
548
|
* Converts DOM selection to view {@link module:engine/view/selection~Selection}.
|
|
630
549
|
* Ranges which cannot be converted will be omitted.
|
|
631
550
|
*
|
|
632
|
-
* @param
|
|
633
|
-
* @returns
|
|
551
|
+
* @param domSelection DOM selection.
|
|
552
|
+
* @returns View selection.
|
|
634
553
|
*/
|
|
635
554
|
domSelectionToView(domSelection) {
|
|
636
555
|
// DOM selection might be placed in fake selection container.
|
|
@@ -662,8 +581,8 @@ export default class DomConverter {
|
|
|
662
581
|
* Converts DOM Range to view {@link module:engine/view/range~Range}.
|
|
663
582
|
* If the start or end position can not be converted `null` is returned.
|
|
664
583
|
*
|
|
665
|
-
* @param
|
|
666
|
-
* @returns
|
|
584
|
+
* @param domRange DOM range.
|
|
585
|
+
* @returns View range.
|
|
667
586
|
*/
|
|
668
587
|
domRangeToView(domRange) {
|
|
669
588
|
const viewStart = this.domPositionToView(domRange.startContainer, domRange.startOffset);
|
|
@@ -684,9 +603,9 @@ export default class DomConverter {
|
|
|
684
603
|
*
|
|
685
604
|
* If structures are too different and it is not possible to find corresponding position then `null` will be returned.
|
|
686
605
|
*
|
|
687
|
-
* @param
|
|
688
|
-
* @param
|
|
689
|
-
* @returns
|
|
606
|
+
* @param domParent DOM position parent.
|
|
607
|
+
* @param domOffset DOM position offset. You can skip it when converting the inline filler node.
|
|
608
|
+
* @returns View position.
|
|
690
609
|
*/
|
|
691
610
|
domPositionToView(domParent, domOffset = 0) {
|
|
692
611
|
if (this.isBlockFiller(domParent)) {
|
|
@@ -745,9 +664,8 @@ export default class DomConverter {
|
|
|
745
664
|
* For all DOM elements rendered by a {@link module:engine/view/uielement~UIElement} or
|
|
746
665
|
* a {@link module:engine/view/rawelement~RawElement}, the parent `UIElement` or `RawElement` will be returned.
|
|
747
666
|
*
|
|
748
|
-
* @param
|
|
749
|
-
* @returns
|
|
750
|
-
* Corresponding view element, document fragment or `undefined` if no element was bound.
|
|
667
|
+
* @param domElementOrDocumentFragment DOM element or document fragment.
|
|
668
|
+
* @returns Corresponding view element, document fragment or `undefined` if no element was bound.
|
|
751
669
|
*/
|
|
752
670
|
mapDomToView(domElementOrDocumentFragment) {
|
|
753
671
|
const hostElement = this.getHostViewElement(domElementOrDocumentFragment);
|
|
@@ -770,9 +688,8 @@ export default class DomConverter {
|
|
|
770
688
|
*
|
|
771
689
|
* Note that for the block or inline {@link module:engine/view/filler filler} this method returns `null`.
|
|
772
690
|
*
|
|
773
|
-
* @param
|
|
774
|
-
* @returns
|
|
775
|
-
* corresponding node.
|
|
691
|
+
* @param domText DOM text node.
|
|
692
|
+
* @returns Corresponding view text node or `null`, if it was not possible to find a corresponding node.
|
|
776
693
|
*/
|
|
777
694
|
findCorrespondingViewText(domText) {
|
|
778
695
|
if (isInlineFiller(domText)) {
|
|
@@ -824,9 +741,8 @@ export default class DomConverter {
|
|
|
824
741
|
* To find a corresponding text for {@link module:engine/view/text~Text view Text instance}
|
|
825
742
|
* use {@link #findCorrespondingDomText}.
|
|
826
743
|
*
|
|
827
|
-
* @param
|
|
828
|
-
*
|
|
829
|
-
* @returns {Node|DocumentFragment|undefined} Corresponding DOM node or document fragment.
|
|
744
|
+
* @param documentFragmentOrElement View element or document fragment.
|
|
745
|
+
* @returns Corresponding DOM node or document fragment.
|
|
830
746
|
*/
|
|
831
747
|
mapViewToDom(documentFragmentOrElement) {
|
|
832
748
|
return this._viewToDomMapping.get(documentFragmentOrElement);
|
|
@@ -843,8 +759,8 @@ export default class DomConverter {
|
|
|
843
759
|
*
|
|
844
760
|
* Otherwise `null` is returned.
|
|
845
761
|
*
|
|
846
|
-
* @param
|
|
847
|
-
* @returns
|
|
762
|
+
* @param viewText View text node.
|
|
763
|
+
* @returns Corresponding DOM text node or `null`, if it was not possible to find a corresponding node.
|
|
848
764
|
*/
|
|
849
765
|
findCorrespondingDomText(viewText) {
|
|
850
766
|
const previousSibling = viewText.previousSibling;
|
|
@@ -860,8 +776,6 @@ export default class DomConverter {
|
|
|
860
776
|
}
|
|
861
777
|
/**
|
|
862
778
|
* Focuses DOM editable that is corresponding to provided {@link module:engine/view/editableelement~EditableElement}.
|
|
863
|
-
*
|
|
864
|
-
* @param {module:engine/view/editableelement~EditableElement} viewEditable
|
|
865
779
|
*/
|
|
866
780
|
focus(viewEditable) {
|
|
867
781
|
const domEditable = this.mapViewToDom(viewEditable);
|
|
@@ -893,8 +807,7 @@ export default class DomConverter {
|
|
|
893
807
|
/**
|
|
894
808
|
* Returns `true` when `node.nodeType` equals `Node.ELEMENT_NODE`.
|
|
895
809
|
*
|
|
896
|
-
* @param
|
|
897
|
-
* @returns {Boolean}
|
|
810
|
+
* @param node Node to check.
|
|
898
811
|
*/
|
|
899
812
|
isElement(node) {
|
|
900
813
|
return node && node.nodeType == Node.ELEMENT_NODE;
|
|
@@ -902,8 +815,7 @@ export default class DomConverter {
|
|
|
902
815
|
/**
|
|
903
816
|
* Returns `true` when `node.nodeType` equals `Node.DOCUMENT_FRAGMENT_NODE`.
|
|
904
817
|
*
|
|
905
|
-
* @param
|
|
906
|
-
* @returns {Boolean}
|
|
818
|
+
* @param node Node to check.
|
|
907
819
|
*/
|
|
908
820
|
isDocumentFragment(node) {
|
|
909
821
|
return node && node.nodeType == Node.DOCUMENT_FRAGMENT_NODE;
|
|
@@ -911,17 +823,19 @@ export default class DomConverter {
|
|
|
911
823
|
/**
|
|
912
824
|
* Checks if the node is an instance of the block filler for this DOM converter.
|
|
913
825
|
*
|
|
914
|
-
*
|
|
826
|
+
* ```ts
|
|
827
|
+
* const converter = new DomConverter( viewDocument, { blockFillerMode: 'br' } );
|
|
915
828
|
*
|
|
916
|
-
*
|
|
917
|
-
*
|
|
829
|
+
* converter.isBlockFiller( BR_FILLER( document ) ); // true
|
|
830
|
+
* converter.isBlockFiller( NBSP_FILLER( document ) ); // false
|
|
831
|
+
* ```
|
|
918
832
|
*
|
|
919
833
|
* **Note:**: For the `'nbsp'` mode the method also checks context of a node so it cannot be a detached node.
|
|
920
834
|
*
|
|
921
835
|
* **Note:** A special case in the `'nbsp'` mode exists where the `<br>` in `<p><br></p>` is treated as a block filler.
|
|
922
836
|
*
|
|
923
|
-
* @param
|
|
924
|
-
* @returns
|
|
837
|
+
* @param domNode DOM node to check.
|
|
838
|
+
* @returns True if a node is considered a block filler for given mode.
|
|
925
839
|
*/
|
|
926
840
|
isBlockFiller(domNode) {
|
|
927
841
|
if (this.blockFillerMode == 'br') {
|
|
@@ -939,8 +853,7 @@ export default class DomConverter {
|
|
|
939
853
|
/**
|
|
940
854
|
* Returns `true` if given selection is a backward selection, that is, if it's `focus` is before `anchor`.
|
|
941
855
|
*
|
|
942
|
-
* @param
|
|
943
|
-
* @returns {Boolean}
|
|
856
|
+
* @param DOM Selection instance to check.
|
|
944
857
|
*/
|
|
945
858
|
isDomSelectionBackward(selection) {
|
|
946
859
|
if (selection.isCollapsed) {
|
|
@@ -965,9 +878,6 @@ export default class DomConverter {
|
|
|
965
878
|
/**
|
|
966
879
|
* Returns a parent {@link module:engine/view/uielement~UIElement} or {@link module:engine/view/rawelement~RawElement}
|
|
967
880
|
* that hosts the provided DOM node. Returns `null` if there is no such parent.
|
|
968
|
-
*
|
|
969
|
-
* @param {Node} domNode
|
|
970
|
-
* @returns {module:engine/view/uielement~UIElement|module:engine/view/rawelement~RawElement|null}
|
|
971
881
|
*/
|
|
972
882
|
getHostViewElement(domNode) {
|
|
973
883
|
const ancestors = getAncestors(domNode);
|
|
@@ -991,8 +901,8 @@ export default class DomConverter {
|
|
|
991
901
|
* * inside a DOM element which represents {@link module:engine/view/uielement~UIElement a view UI element},
|
|
992
902
|
* * inside a DOM element which represents {@link module:engine/view/rawelement~RawElement a view raw element}.
|
|
993
903
|
*
|
|
994
|
-
* @param
|
|
995
|
-
* @returns
|
|
904
|
+
* @param domSelection The DOM selection object to be checked.
|
|
905
|
+
* @returns `true` if the given selection is at a correct place, `false` otherwise.
|
|
996
906
|
*/
|
|
997
907
|
isDomSelectionCorrect(domSelection) {
|
|
998
908
|
return this._isDomSelectionPositionCorrect(domSelection.anchorNode, domSelection.anchorOffset) &&
|
|
@@ -1008,7 +918,7 @@ export default class DomConverter {
|
|
|
1008
918
|
* The raw data can be later accessed by a
|
|
1009
919
|
* {@link module:engine/view/element~Element#getCustomProperty custom property of a view element} called `"$rawContent"`.
|
|
1010
920
|
*
|
|
1011
|
-
* @param
|
|
921
|
+
* @param pattern Pattern matching a view element whose content should
|
|
1012
922
|
* be treated as raw data.
|
|
1013
923
|
*/
|
|
1014
924
|
registerRawContentMatcher(pattern) {
|
|
@@ -1016,9 +926,6 @@ export default class DomConverter {
|
|
|
1016
926
|
}
|
|
1017
927
|
/**
|
|
1018
928
|
* Returns the block {@link module:engine/view/filler filler} node based on the current {@link #blockFillerMode} setting.
|
|
1019
|
-
*
|
|
1020
|
-
* @private
|
|
1021
|
-
* @returns {Node} filler
|
|
1022
929
|
*/
|
|
1023
930
|
_getBlockFiller() {
|
|
1024
931
|
switch (this.blockFillerMode) {
|
|
@@ -1033,10 +940,9 @@ export default class DomConverter {
|
|
|
1033
940
|
/**
|
|
1034
941
|
* Checks if the given DOM position is a correct place for selection boundary. See {@link #isDomSelectionCorrect}.
|
|
1035
942
|
*
|
|
1036
|
-
* @
|
|
1037
|
-
* @param
|
|
1038
|
-
* @
|
|
1039
|
-
* @returns {Boolean} `true` if given position is at a correct place for selection boundary, `false` otherwise.
|
|
943
|
+
* @param domParent Position parent.
|
|
944
|
+
* @param offset Position offset.
|
|
945
|
+
* @returns `true` if given position is at a correct place for selection boundary, `false` otherwise.
|
|
1040
946
|
*/
|
|
1041
947
|
_isDomSelectionPositionCorrect(domParent, offset) {
|
|
1042
948
|
// If selection is before or in the middle of inline filler string, it is incorrect.
|
|
@@ -1071,9 +977,8 @@ export default class DomConverter {
|
|
|
1071
977
|
*
|
|
1072
978
|
* Content of {@link #preElements} is not processed.
|
|
1073
979
|
*
|
|
1074
|
-
* @
|
|
1075
|
-
* @
|
|
1076
|
-
* @returns {String} Processed text data.
|
|
980
|
+
* @param node View text node to process.
|
|
981
|
+
* @returns Processed text data.
|
|
1077
982
|
*/
|
|
1078
983
|
_processDataFromViewText(node) {
|
|
1079
984
|
let data = node.data;
|
|
@@ -1113,9 +1018,8 @@ export default class DomConverter {
|
|
|
1113
1018
|
/**
|
|
1114
1019
|
* Checks whether given node ends with a space character after changing appropriate space characters to ` `s.
|
|
1115
1020
|
*
|
|
1116
|
-
* @
|
|
1117
|
-
* @
|
|
1118
|
-
* @returns {Boolean} `true` if given `node` ends with space, `false` otherwise.
|
|
1021
|
+
* @param node Node to check.
|
|
1022
|
+
* @returns `true` if given `node` ends with space, `false` otherwise.
|
|
1119
1023
|
*/
|
|
1120
1024
|
_nodeEndsWithSpace(node) {
|
|
1121
1025
|
if (node.getAncestors().some(parent => this.preElements.includes(parent.name))) {
|
|
@@ -1136,9 +1040,8 @@ export default class DomConverter {
|
|
|
1136
1040
|
* starts with a space or if it is the last text node in its container
|
|
1137
1041
|
* * nbsps are converted to spaces.
|
|
1138
1042
|
*
|
|
1139
|
-
* @param
|
|
1140
|
-
* @returns
|
|
1141
|
-
* @private
|
|
1043
|
+
* @param node DOM text node to process.
|
|
1044
|
+
* @returns Processed data.
|
|
1142
1045
|
*/
|
|
1143
1046
|
_processDataFromDomText(node) {
|
|
1144
1047
|
let data = node.data;
|
|
@@ -1195,9 +1098,7 @@ export default class DomConverter {
|
|
|
1195
1098
|
* Helper function which checks if a DOM text node, preceded by the given `prevNode` should
|
|
1196
1099
|
* be trimmed from the left side.
|
|
1197
1100
|
*
|
|
1198
|
-
* @
|
|
1199
|
-
* @param {Node} node
|
|
1200
|
-
* @param {Node} prevNode Either DOM text or `<br>` or one of `#inlineObjectElements`.
|
|
1101
|
+
* @param prevNode Either DOM text or `<br>` or one of `#inlineObjectElements`.
|
|
1201
1102
|
*/
|
|
1202
1103
|
_checkShouldLeftTrimDomText(node, prevNode) {
|
|
1203
1104
|
if (!prevNode) {
|
|
@@ -1216,9 +1117,7 @@ export default class DomConverter {
|
|
|
1216
1117
|
* Helper function which checks if a DOM text node, succeeded by the given `nextNode` should
|
|
1217
1118
|
* be trimmed from the right side.
|
|
1218
1119
|
*
|
|
1219
|
-
* @
|
|
1220
|
-
* @param {Node} node
|
|
1221
|
-
* @param {Node} nextNode Either DOM text or `<br>` or one of `#inlineObjectElements`.
|
|
1120
|
+
* @param nextNode Either DOM text or `<br>` or one of `#inlineObjectElements`.
|
|
1222
1121
|
*/
|
|
1223
1122
|
_checkShouldRightTrimDomText(node, nextNode) {
|
|
1224
1123
|
if (nextNode) {
|
|
@@ -1230,10 +1129,8 @@ export default class DomConverter {
|
|
|
1230
1129
|
* Helper function. For given {@link module:engine/view/text~Text view text node}, it finds previous or next sibling
|
|
1231
1130
|
* that is contained in the same container element. If there is no such sibling, `null` is returned.
|
|
1232
1131
|
*
|
|
1233
|
-
* @
|
|
1234
|
-
* @
|
|
1235
|
-
* @param {Boolean} getNext
|
|
1236
|
-
* @returns {module:engine/view/text~Text|module:engine/view/element~Element|null} Touching text node, an inline object
|
|
1132
|
+
* @param node Reference node.
|
|
1133
|
+
* @returns Touching text node, an inline object
|
|
1237
1134
|
* or `null` if there is no next or previous touching text node.
|
|
1238
1135
|
*/
|
|
1239
1136
|
_getTouchingInlineViewNode(node, getNext) {
|
|
@@ -1270,7 +1167,9 @@ export default class DomConverter {
|
|
|
1270
1167
|
*
|
|
1271
1168
|
* For instance, in the following DOM structure:
|
|
1272
1169
|
*
|
|
1273
|
-
*
|
|
1170
|
+
* ```html
|
|
1171
|
+
* <p>foo<b>bar</b><br>bom</p>
|
|
1172
|
+
* ```
|
|
1274
1173
|
*
|
|
1275
1174
|
* * `foo` doesn't have its previous touching inline node (`null` is returned),
|
|
1276
1175
|
* * `foo`'s next touching inline node is `bar`
|
|
@@ -1278,11 +1177,6 @@ export default class DomConverter {
|
|
|
1278
1177
|
*
|
|
1279
1178
|
* This method returns text nodes and `<br>` elements because these types of nodes affect how
|
|
1280
1179
|
* spaces in the given text node need to be converted.
|
|
1281
|
-
*
|
|
1282
|
-
* @private
|
|
1283
|
-
* @param {Text} node
|
|
1284
|
-
* @param {Boolean} getNext
|
|
1285
|
-
* @returns {Text|Element|null}
|
|
1286
1180
|
*/
|
|
1287
1181
|
_getTouchingInlineDomNode(node, getNext) {
|
|
1288
1182
|
if (!node.parentNode) {
|
|
@@ -1312,20 +1206,12 @@ export default class DomConverter {
|
|
|
1312
1206
|
}
|
|
1313
1207
|
/**
|
|
1314
1208
|
* Returns `true` if a DOM node belongs to {@link #blockElements}. `false` otherwise.
|
|
1315
|
-
*
|
|
1316
|
-
* @private
|
|
1317
|
-
* @param {Node} node
|
|
1318
|
-
* @returns {Boolean}
|
|
1319
1209
|
*/
|
|
1320
1210
|
_isBlockElement(node) {
|
|
1321
1211
|
return this.isElement(node) && this.blockElements.includes(node.tagName.toLowerCase());
|
|
1322
1212
|
}
|
|
1323
1213
|
/**
|
|
1324
1214
|
* Returns `true` if a DOM node belongs to {@link #inlineObjectElements}. `false` otherwise.
|
|
1325
|
-
*
|
|
1326
|
-
* @private
|
|
1327
|
-
* @param {Node} node
|
|
1328
|
-
* @returns {Boolean}
|
|
1329
1215
|
*/
|
|
1330
1216
|
_isInlineObjectElement(node) {
|
|
1331
1217
|
return this.isElement(node) && this.inlineObjectElements.includes(node.tagName.toLowerCase());
|
|
@@ -1333,10 +1219,8 @@ export default class DomConverter {
|
|
|
1333
1219
|
/**
|
|
1334
1220
|
* Creates view element basing on the node type.
|
|
1335
1221
|
*
|
|
1336
|
-
* @
|
|
1337
|
-
* @param
|
|
1338
|
-
* @param {Object} options Conversion options. See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.
|
|
1339
|
-
* @returns {Element}
|
|
1222
|
+
* @param node DOM node to check.
|
|
1223
|
+
* @param options Conversion options. See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.
|
|
1340
1224
|
*/
|
|
1341
1225
|
_createViewElement(node, options) {
|
|
1342
1226
|
if (isComment(node)) {
|
|
@@ -1348,10 +1232,8 @@ export default class DomConverter {
|
|
|
1348
1232
|
/**
|
|
1349
1233
|
* Checks if view element's content should be treated as a raw data.
|
|
1350
1234
|
*
|
|
1351
|
-
* @
|
|
1352
|
-
* @param
|
|
1353
|
-
* @param {Object} options Conversion options. See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.
|
|
1354
|
-
* @returns {Boolean}
|
|
1235
|
+
* @param viewElement View element to check.
|
|
1236
|
+
* @param options Conversion options. See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.
|
|
1355
1237
|
*/
|
|
1356
1238
|
_isViewElementWithRawContent(viewElement, options) {
|
|
1357
1239
|
return options.withChildren !== false && !!this._rawContentElementMatcher.match(viewElement);
|
|
@@ -1359,9 +1241,7 @@ export default class DomConverter {
|
|
|
1359
1241
|
/**
|
|
1360
1242
|
* Checks whether a given element name should be renamed in a current rendering mode.
|
|
1361
1243
|
*
|
|
1362
|
-
* @
|
|
1363
|
-
* @param {String} elementName The name of view element.
|
|
1364
|
-
* @returns {Boolean}
|
|
1244
|
+
* @param elementName The name of view element.
|
|
1365
1245
|
*/
|
|
1366
1246
|
_shouldRenameElement(elementName) {
|
|
1367
1247
|
const name = elementName.toLowerCase();
|
|
@@ -1371,10 +1251,8 @@ export default class DomConverter {
|
|
|
1371
1251
|
* Return a <span> element with a special attribute holding the name of the original element.
|
|
1372
1252
|
* Optionally, copy all the attributes of the original element if that element is provided.
|
|
1373
1253
|
*
|
|
1374
|
-
* @
|
|
1375
|
-
* @param
|
|
1376
|
-
* @param {Element} [originalDomElement] The original DOM element to copy attributes and content from.
|
|
1377
|
-
* @returns {Element}
|
|
1254
|
+
* @param elementName The name of view element.
|
|
1255
|
+
* @param originalDomElement The original DOM element to copy attributes and content from.
|
|
1378
1256
|
*/
|
|
1379
1257
|
_createReplacementDomElement(elementName, originalDomElement) {
|
|
1380
1258
|
const newDomElement = this._domDocument.createElement('span');
|
|
@@ -1391,21 +1269,22 @@ export default class DomConverter {
|
|
|
1391
1269
|
return newDomElement;
|
|
1392
1270
|
}
|
|
1393
1271
|
}
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1272
|
+
/**
|
|
1273
|
+
* Helper function.
|
|
1274
|
+
* Used to check if given native `Element` or `Text` node has parent with tag name from `types` array.
|
|
1275
|
+
*
|
|
1276
|
+
* @returns`true` if such parent exists or `false` if it does not.
|
|
1277
|
+
*/
|
|
1400
1278
|
function _hasDomParentOfType(node, types) {
|
|
1401
1279
|
const parents = getAncestors(node);
|
|
1402
1280
|
return parents.some(parent => parent.tagName && types.includes(parent.tagName.toLowerCase()));
|
|
1403
1281
|
}
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1282
|
+
/**
|
|
1283
|
+
* A helper that executes given callback for each DOM node's ancestor, starting from the given node
|
|
1284
|
+
* and ending in document#documentElement.
|
|
1285
|
+
*
|
|
1286
|
+
* @param callback A callback to be executed for each ancestor.
|
|
1287
|
+
*/
|
|
1409
1288
|
function forEachDomElementAncestor(element, callback) {
|
|
1410
1289
|
let node = element;
|
|
1411
1290
|
while (node) {
|
|
@@ -1413,30 +1292,32 @@ function forEachDomElementAncestor(element, callback) {
|
|
|
1413
1292
|
node = node.parentElement;
|
|
1414
1293
|
}
|
|
1415
1294
|
}
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1295
|
+
/**
|
|
1296
|
+
* Checks if given node is a nbsp block filler.
|
|
1297
|
+
*
|
|
1298
|
+
* A is a block filler only if it is a single child of a block element.
|
|
1299
|
+
*
|
|
1300
|
+
* @param domNode DOM node.
|
|
1301
|
+
*/
|
|
1423
1302
|
function isNbspBlockFiller(domNode, blockElements) {
|
|
1424
1303
|
const isNBSP = domNode.isEqualNode(NBSP_FILLER_REF);
|
|
1425
1304
|
return isNBSP && hasBlockParent(domNode, blockElements) && domNode.parentNode.childNodes.length === 1;
|
|
1426
1305
|
}
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1306
|
+
/**
|
|
1307
|
+
* Checks if domNode has block parent.
|
|
1308
|
+
*
|
|
1309
|
+
* @param domNode DOM node.
|
|
1310
|
+
*/
|
|
1432
1311
|
function hasBlockParent(domNode, blockElements) {
|
|
1433
1312
|
const parent = domNode.parentNode;
|
|
1434
1313
|
return !!parent && !!parent.tagName && blockElements.includes(parent.tagName.toLowerCase());
|
|
1435
1314
|
}
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1315
|
+
/**
|
|
1316
|
+
* Log to console the information about element that was replaced.
|
|
1317
|
+
* Check UNSAFE_ELEMENTS for all recognized unsafe elements.
|
|
1318
|
+
*
|
|
1319
|
+
* @param elementName The name of the view element.
|
|
1320
|
+
*/
|
|
1440
1321
|
function _logUnsafeElement(elementName) {
|
|
1441
1322
|
if (elementName === 'script') {
|
|
1442
1323
|
logWarning('domconverter-unsafe-script-element-detected');
|
|
@@ -1459,31 +1340,33 @@ function _logUnsafeElement(elementName) {
|
|
|
1459
1340
|
*/
|
|
1460
1341
|
/**
|
|
1461
1342
|
* The {@link module:engine/view/domconverter~DomConverter} detected an interactive attribute in the
|
|
1462
|
-
* {@glink framework/
|
|
1343
|
+
* {@glink framework/architecture/editing-engine#editing-pipeline editing pipeline}. For the best
|
|
1463
1344
|
* editing experience, the attribute was renamed to `data-ck-unsafe-attribute-[original attribute name]`.
|
|
1464
1345
|
*
|
|
1465
1346
|
* If you are the author of the plugin that generated this attribute and you want it to be preserved
|
|
1466
1347
|
* in the editing pipeline, you can configure this when creating the element
|
|
1467
1348
|
* using {@link module:engine/view/downcastwriter~DowncastWriter} during the
|
|
1468
|
-
* {@glink framework/
|
|
1349
|
+
* {@glink framework/architecture/editing-engine#conversion model–view conversion}. Methods such as
|
|
1469
1350
|
* {@link module:engine/view/downcastwriter~DowncastWriter#createContainerElement},
|
|
1470
1351
|
* {@link module:engine/view/downcastwriter~DowncastWriter#createAttributeElement}, or
|
|
1471
1352
|
* {@link module:engine/view/downcastwriter~DowncastWriter#createEmptyElement}
|
|
1472
1353
|
* accept an option that will disable filtering of specific attributes:
|
|
1473
1354
|
*
|
|
1474
|
-
*
|
|
1475
|
-
*
|
|
1476
|
-
*
|
|
1477
|
-
*
|
|
1478
|
-
*
|
|
1479
|
-
*
|
|
1480
|
-
*
|
|
1481
|
-
*
|
|
1482
|
-
*
|
|
1483
|
-
*
|
|
1355
|
+
* ```ts
|
|
1356
|
+
* const paragraph = writer.createContainerElement( 'p',
|
|
1357
|
+
* {
|
|
1358
|
+
* class: 'clickable-paragraph',
|
|
1359
|
+
* onclick: 'alert( "Paragraph clicked!" )'
|
|
1360
|
+
* },
|
|
1361
|
+
* {
|
|
1362
|
+
* // Make sure the "onclick" attribute will pass through.
|
|
1363
|
+
* renderUnsafeAttributes: [ 'onclick' ]
|
|
1364
|
+
* }
|
|
1365
|
+
* );
|
|
1366
|
+
* ```
|
|
1484
1367
|
*
|
|
1485
1368
|
* @error domconverter-unsafe-attribute-detected
|
|
1486
|
-
* @param
|
|
1487
|
-
* @param
|
|
1488
|
-
* @param
|
|
1369
|
+
* @param domElement The DOM element the attribute was set on.
|
|
1370
|
+
* @param key The original name of the attribute
|
|
1371
|
+
* @param value The value of the original attribute
|
|
1489
1372
|
*/
|