@ckeditor/ckeditor5-engine 36.0.1 → 37.0.0-alpha.1
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 +25 -24
- package/src/controller/datacontroller.d.ts +331 -0
- package/src/controller/datacontroller.js +72 -116
- 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 +503 -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 +369 -0
- package/src/conversion/viewconsumable.js +139 -173
- 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 +108 -0
- package/src/index.js +4 -0
- package/src/model/batch.d.ts +106 -0
- package/src/model/differ.d.ts +329 -0
- package/src/model/document.d.ts +246 -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 +885 -0
- package/src/model/model.js +59 -81
- 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/mergeoperation.js +1 -1
- 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/splitoperation.js +1 -1
- package/src/model/operation/transform.d.ts +100 -0
- package/src/model/operation/utils.d.ts +71 -0
- package/src/model/operation/utils.js +1 -1
- 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 +19 -19
- 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 +285 -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 +823 -0
- package/src/model/writer.js +6 -61
- 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 +149 -0
- package/src/view/documentfragment.js +39 -81
- package/src/view/documentselection.d.ts +306 -0
- package/src/view/documentselection.js +42 -143
- package/src/view/domconverter.d.ts +650 -0
- package/src/view/domconverter.js +157 -283
- package/src/view/downcastwriter.d.ts +996 -0
- package/src/view/downcastwriter.js +259 -426
- package/src/view/editableelement.d.ts +52 -0
- package/src/view/editableelement.js +9 -49
- package/src/view/element.d.ts +468 -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 +163 -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 +43 -0
- package/src/view/observer/fakeselectionobserver.js +0 -16
- 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 +66 -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 +144 -0
- package/src/view/observer/selectionobserver.js +17 -107
- 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 +448 -0
- package/src/view/uielement.d.ts +96 -0
- package/src/view/uielement.js +29 -63
- package/src/view/upcastwriter.d.ts +417 -0
- package/src/view/upcastwriter.js +86 -157
- package/src/view/view.d.ts +417 -0
- package/src/view/view.js +47 -175
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)) {
|
|
@@ -818,16 +735,6 @@ export default class DomConverter {
|
|
|
818
735
|
}
|
|
819
736
|
return null;
|
|
820
737
|
}
|
|
821
|
-
/**
|
|
822
|
-
* Returns corresponding DOM item for provided {@link module:engine/view/element~Element Element} or
|
|
823
|
-
* {@link module:engine/view/documentfragment~DocumentFragment DocumentFragment}.
|
|
824
|
-
* To find a corresponding text for {@link module:engine/view/text~Text view Text instance}
|
|
825
|
-
* use {@link #findCorrespondingDomText}.
|
|
826
|
-
*
|
|
827
|
-
* @param {module:engine/view/element~Element|module:engine/view/documentfragment~DocumentFragment} viewNode
|
|
828
|
-
* View element or document fragment.
|
|
829
|
-
* @returns {Node|DocumentFragment|undefined} Corresponding DOM node or document fragment.
|
|
830
|
-
*/
|
|
831
738
|
mapViewToDom(documentFragmentOrElement) {
|
|
832
739
|
return this._viewToDomMapping.get(documentFragmentOrElement);
|
|
833
740
|
}
|
|
@@ -843,8 +750,8 @@ export default class DomConverter {
|
|
|
843
750
|
*
|
|
844
751
|
* Otherwise `null` is returned.
|
|
845
752
|
*
|
|
846
|
-
* @param
|
|
847
|
-
* @returns
|
|
753
|
+
* @param viewText View text node.
|
|
754
|
+
* @returns Corresponding DOM text node or `null`, if it was not possible to find a corresponding node.
|
|
848
755
|
*/
|
|
849
756
|
findCorrespondingDomText(viewText) {
|
|
850
757
|
const previousSibling = viewText.previousSibling;
|
|
@@ -860,8 +767,6 @@ export default class DomConverter {
|
|
|
860
767
|
}
|
|
861
768
|
/**
|
|
862
769
|
* Focuses DOM editable that is corresponding to provided {@link module:engine/view/editableelement~EditableElement}.
|
|
863
|
-
*
|
|
864
|
-
* @param {module:engine/view/editableelement~EditableElement} viewEditable
|
|
865
770
|
*/
|
|
866
771
|
focus(viewEditable) {
|
|
867
772
|
const domEditable = this.mapViewToDom(viewEditable);
|
|
@@ -893,8 +798,7 @@ export default class DomConverter {
|
|
|
893
798
|
/**
|
|
894
799
|
* Returns `true` when `node.nodeType` equals `Node.ELEMENT_NODE`.
|
|
895
800
|
*
|
|
896
|
-
* @param
|
|
897
|
-
* @returns {Boolean}
|
|
801
|
+
* @param node Node to check.
|
|
898
802
|
*/
|
|
899
803
|
isElement(node) {
|
|
900
804
|
return node && node.nodeType == Node.ELEMENT_NODE;
|
|
@@ -902,8 +806,7 @@ export default class DomConverter {
|
|
|
902
806
|
/**
|
|
903
807
|
* Returns `true` when `node.nodeType` equals `Node.DOCUMENT_FRAGMENT_NODE`.
|
|
904
808
|
*
|
|
905
|
-
* @param
|
|
906
|
-
* @returns {Boolean}
|
|
809
|
+
* @param node Node to check.
|
|
907
810
|
*/
|
|
908
811
|
isDocumentFragment(node) {
|
|
909
812
|
return node && node.nodeType == Node.DOCUMENT_FRAGMENT_NODE;
|
|
@@ -911,17 +814,19 @@ export default class DomConverter {
|
|
|
911
814
|
/**
|
|
912
815
|
* Checks if the node is an instance of the block filler for this DOM converter.
|
|
913
816
|
*
|
|
914
|
-
*
|
|
817
|
+
* ```ts
|
|
818
|
+
* const converter = new DomConverter( viewDocument, { blockFillerMode: 'br' } );
|
|
915
819
|
*
|
|
916
|
-
*
|
|
917
|
-
*
|
|
820
|
+
* converter.isBlockFiller( BR_FILLER( document ) ); // true
|
|
821
|
+
* converter.isBlockFiller( NBSP_FILLER( document ) ); // false
|
|
822
|
+
* ```
|
|
918
823
|
*
|
|
919
824
|
* **Note:**: For the `'nbsp'` mode the method also checks context of a node so it cannot be a detached node.
|
|
920
825
|
*
|
|
921
826
|
* **Note:** A special case in the `'nbsp'` mode exists where the `<br>` in `<p><br></p>` is treated as a block filler.
|
|
922
827
|
*
|
|
923
|
-
* @param
|
|
924
|
-
* @returns
|
|
828
|
+
* @param domNode DOM node to check.
|
|
829
|
+
* @returns True if a node is considered a block filler for given mode.
|
|
925
830
|
*/
|
|
926
831
|
isBlockFiller(domNode) {
|
|
927
832
|
if (this.blockFillerMode == 'br') {
|
|
@@ -939,8 +844,7 @@ export default class DomConverter {
|
|
|
939
844
|
/**
|
|
940
845
|
* Returns `true` if given selection is a backward selection, that is, if it's `focus` is before `anchor`.
|
|
941
846
|
*
|
|
942
|
-
* @param
|
|
943
|
-
* @returns {Boolean}
|
|
847
|
+
* @param DOM Selection instance to check.
|
|
944
848
|
*/
|
|
945
849
|
isDomSelectionBackward(selection) {
|
|
946
850
|
if (selection.isCollapsed) {
|
|
@@ -965,9 +869,6 @@ export default class DomConverter {
|
|
|
965
869
|
/**
|
|
966
870
|
* Returns a parent {@link module:engine/view/uielement~UIElement} or {@link module:engine/view/rawelement~RawElement}
|
|
967
871
|
* 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
872
|
*/
|
|
972
873
|
getHostViewElement(domNode) {
|
|
973
874
|
const ancestors = getAncestors(domNode);
|
|
@@ -991,8 +892,8 @@ export default class DomConverter {
|
|
|
991
892
|
* * inside a DOM element which represents {@link module:engine/view/uielement~UIElement a view UI element},
|
|
992
893
|
* * inside a DOM element which represents {@link module:engine/view/rawelement~RawElement a view raw element}.
|
|
993
894
|
*
|
|
994
|
-
* @param
|
|
995
|
-
* @returns
|
|
895
|
+
* @param domSelection The DOM selection object to be checked.
|
|
896
|
+
* @returns `true` if the given selection is at a correct place, `false` otherwise.
|
|
996
897
|
*/
|
|
997
898
|
isDomSelectionCorrect(domSelection) {
|
|
998
899
|
return this._isDomSelectionPositionCorrect(domSelection.anchorNode, domSelection.anchorOffset) &&
|
|
@@ -1008,7 +909,7 @@ export default class DomConverter {
|
|
|
1008
909
|
* The raw data can be later accessed by a
|
|
1009
910
|
* {@link module:engine/view/element~Element#getCustomProperty custom property of a view element} called `"$rawContent"`.
|
|
1010
911
|
*
|
|
1011
|
-
* @param
|
|
912
|
+
* @param pattern Pattern matching a view element whose content should
|
|
1012
913
|
* be treated as raw data.
|
|
1013
914
|
*/
|
|
1014
915
|
registerRawContentMatcher(pattern) {
|
|
@@ -1016,9 +917,6 @@ export default class DomConverter {
|
|
|
1016
917
|
}
|
|
1017
918
|
/**
|
|
1018
919
|
* 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
920
|
*/
|
|
1023
921
|
_getBlockFiller() {
|
|
1024
922
|
switch (this.blockFillerMode) {
|
|
@@ -1033,10 +931,9 @@ export default class DomConverter {
|
|
|
1033
931
|
/**
|
|
1034
932
|
* Checks if the given DOM position is a correct place for selection boundary. See {@link #isDomSelectionCorrect}.
|
|
1035
933
|
*
|
|
1036
|
-
* @
|
|
1037
|
-
* @param
|
|
1038
|
-
* @
|
|
1039
|
-
* @returns {Boolean} `true` if given position is at a correct place for selection boundary, `false` otherwise.
|
|
934
|
+
* @param domParent Position parent.
|
|
935
|
+
* @param offset Position offset.
|
|
936
|
+
* @returns `true` if given position is at a correct place for selection boundary, `false` otherwise.
|
|
1040
937
|
*/
|
|
1041
938
|
_isDomSelectionPositionCorrect(domParent, offset) {
|
|
1042
939
|
// If selection is before or in the middle of inline filler string, it is incorrect.
|
|
@@ -1071,9 +968,8 @@ export default class DomConverter {
|
|
|
1071
968
|
*
|
|
1072
969
|
* Content of {@link #preElements} is not processed.
|
|
1073
970
|
*
|
|
1074
|
-
* @
|
|
1075
|
-
* @
|
|
1076
|
-
* @returns {String} Processed text data.
|
|
971
|
+
* @param node View text node to process.
|
|
972
|
+
* @returns Processed text data.
|
|
1077
973
|
*/
|
|
1078
974
|
_processDataFromViewText(node) {
|
|
1079
975
|
let data = node.data;
|
|
@@ -1113,9 +1009,8 @@ export default class DomConverter {
|
|
|
1113
1009
|
/**
|
|
1114
1010
|
* Checks whether given node ends with a space character after changing appropriate space characters to ` `s.
|
|
1115
1011
|
*
|
|
1116
|
-
* @
|
|
1117
|
-
* @
|
|
1118
|
-
* @returns {Boolean} `true` if given `node` ends with space, `false` otherwise.
|
|
1012
|
+
* @param node Node to check.
|
|
1013
|
+
* @returns `true` if given `node` ends with space, `false` otherwise.
|
|
1119
1014
|
*/
|
|
1120
1015
|
_nodeEndsWithSpace(node) {
|
|
1121
1016
|
if (node.getAncestors().some(parent => this.preElements.includes(parent.name))) {
|
|
@@ -1136,9 +1031,8 @@ export default class DomConverter {
|
|
|
1136
1031
|
* starts with a space or if it is the last text node in its container
|
|
1137
1032
|
* * nbsps are converted to spaces.
|
|
1138
1033
|
*
|
|
1139
|
-
* @param
|
|
1140
|
-
* @returns
|
|
1141
|
-
* @private
|
|
1034
|
+
* @param node DOM text node to process.
|
|
1035
|
+
* @returns Processed data.
|
|
1142
1036
|
*/
|
|
1143
1037
|
_processDataFromDomText(node) {
|
|
1144
1038
|
let data = node.data;
|
|
@@ -1195,9 +1089,7 @@ export default class DomConverter {
|
|
|
1195
1089
|
* Helper function which checks if a DOM text node, preceded by the given `prevNode` should
|
|
1196
1090
|
* be trimmed from the left side.
|
|
1197
1091
|
*
|
|
1198
|
-
* @
|
|
1199
|
-
* @param {Node} node
|
|
1200
|
-
* @param {Node} prevNode Either DOM text or `<br>` or one of `#inlineObjectElements`.
|
|
1092
|
+
* @param prevNode Either DOM text or `<br>` or one of `#inlineObjectElements`.
|
|
1201
1093
|
*/
|
|
1202
1094
|
_checkShouldLeftTrimDomText(node, prevNode) {
|
|
1203
1095
|
if (!prevNode) {
|
|
@@ -1216,9 +1108,7 @@ export default class DomConverter {
|
|
|
1216
1108
|
* Helper function which checks if a DOM text node, succeeded by the given `nextNode` should
|
|
1217
1109
|
* be trimmed from the right side.
|
|
1218
1110
|
*
|
|
1219
|
-
* @
|
|
1220
|
-
* @param {Node} node
|
|
1221
|
-
* @param {Node} nextNode Either DOM text or `<br>` or one of `#inlineObjectElements`.
|
|
1111
|
+
* @param nextNode Either DOM text or `<br>` or one of `#inlineObjectElements`.
|
|
1222
1112
|
*/
|
|
1223
1113
|
_checkShouldRightTrimDomText(node, nextNode) {
|
|
1224
1114
|
if (nextNode) {
|
|
@@ -1230,10 +1120,8 @@ export default class DomConverter {
|
|
|
1230
1120
|
* Helper function. For given {@link module:engine/view/text~Text view text node}, it finds previous or next sibling
|
|
1231
1121
|
* that is contained in the same container element. If there is no such sibling, `null` is returned.
|
|
1232
1122
|
*
|
|
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
|
|
1123
|
+
* @param node Reference node.
|
|
1124
|
+
* @returns Touching text node, an inline object
|
|
1237
1125
|
* or `null` if there is no next or previous touching text node.
|
|
1238
1126
|
*/
|
|
1239
1127
|
_getTouchingInlineViewNode(node, getNext) {
|
|
@@ -1270,7 +1158,9 @@ export default class DomConverter {
|
|
|
1270
1158
|
*
|
|
1271
1159
|
* For instance, in the following DOM structure:
|
|
1272
1160
|
*
|
|
1273
|
-
*
|
|
1161
|
+
* ```html
|
|
1162
|
+
* <p>foo<b>bar</b><br>bom</p>
|
|
1163
|
+
* ```
|
|
1274
1164
|
*
|
|
1275
1165
|
* * `foo` doesn't have its previous touching inline node (`null` is returned),
|
|
1276
1166
|
* * `foo`'s next touching inline node is `bar`
|
|
@@ -1278,11 +1168,6 @@ export default class DomConverter {
|
|
|
1278
1168
|
*
|
|
1279
1169
|
* This method returns text nodes and `<br>` elements because these types of nodes affect how
|
|
1280
1170
|
* 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
1171
|
*/
|
|
1287
1172
|
_getTouchingInlineDomNode(node, getNext) {
|
|
1288
1173
|
if (!node.parentNode) {
|
|
@@ -1312,20 +1197,12 @@ export default class DomConverter {
|
|
|
1312
1197
|
}
|
|
1313
1198
|
/**
|
|
1314
1199
|
* Returns `true` if a DOM node belongs to {@link #blockElements}. `false` otherwise.
|
|
1315
|
-
*
|
|
1316
|
-
* @private
|
|
1317
|
-
* @param {Node} node
|
|
1318
|
-
* @returns {Boolean}
|
|
1319
1200
|
*/
|
|
1320
1201
|
_isBlockElement(node) {
|
|
1321
1202
|
return this.isElement(node) && this.blockElements.includes(node.tagName.toLowerCase());
|
|
1322
1203
|
}
|
|
1323
1204
|
/**
|
|
1324
1205
|
* Returns `true` if a DOM node belongs to {@link #inlineObjectElements}. `false` otherwise.
|
|
1325
|
-
*
|
|
1326
|
-
* @private
|
|
1327
|
-
* @param {Node} node
|
|
1328
|
-
* @returns {Boolean}
|
|
1329
1206
|
*/
|
|
1330
1207
|
_isInlineObjectElement(node) {
|
|
1331
1208
|
return this.isElement(node) && this.inlineObjectElements.includes(node.tagName.toLowerCase());
|
|
@@ -1333,10 +1210,8 @@ export default class DomConverter {
|
|
|
1333
1210
|
/**
|
|
1334
1211
|
* Creates view element basing on the node type.
|
|
1335
1212
|
*
|
|
1336
|
-
* @
|
|
1337
|
-
* @param
|
|
1338
|
-
* @param {Object} options Conversion options. See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.
|
|
1339
|
-
* @returns {Element}
|
|
1213
|
+
* @param node DOM node to check.
|
|
1214
|
+
* @param options Conversion options. See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.
|
|
1340
1215
|
*/
|
|
1341
1216
|
_createViewElement(node, options) {
|
|
1342
1217
|
if (isComment(node)) {
|
|
@@ -1348,10 +1223,8 @@ export default class DomConverter {
|
|
|
1348
1223
|
/**
|
|
1349
1224
|
* Checks if view element's content should be treated as a raw data.
|
|
1350
1225
|
*
|
|
1351
|
-
* @
|
|
1352
|
-
* @param
|
|
1353
|
-
* @param {Object} options Conversion options. See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.
|
|
1354
|
-
* @returns {Boolean}
|
|
1226
|
+
* @param viewElement View element to check.
|
|
1227
|
+
* @param options Conversion options. See {@link module:engine/view/domconverter~DomConverter#domToView} options parameter.
|
|
1355
1228
|
*/
|
|
1356
1229
|
_isViewElementWithRawContent(viewElement, options) {
|
|
1357
1230
|
return options.withChildren !== false && !!this._rawContentElementMatcher.match(viewElement);
|
|
@@ -1359,9 +1232,7 @@ export default class DomConverter {
|
|
|
1359
1232
|
/**
|
|
1360
1233
|
* Checks whether a given element name should be renamed in a current rendering mode.
|
|
1361
1234
|
*
|
|
1362
|
-
* @
|
|
1363
|
-
* @param {String} elementName The name of view element.
|
|
1364
|
-
* @returns {Boolean}
|
|
1235
|
+
* @param elementName The name of view element.
|
|
1365
1236
|
*/
|
|
1366
1237
|
_shouldRenameElement(elementName) {
|
|
1367
1238
|
const name = elementName.toLowerCase();
|
|
@@ -1371,10 +1242,8 @@ export default class DomConverter {
|
|
|
1371
1242
|
* Return a <span> element with a special attribute holding the name of the original element.
|
|
1372
1243
|
* Optionally, copy all the attributes of the original element if that element is provided.
|
|
1373
1244
|
*
|
|
1374
|
-
* @
|
|
1375
|
-
* @param
|
|
1376
|
-
* @param {Element} [originalDomElement] The original DOM element to copy attributes and content from.
|
|
1377
|
-
* @returns {Element}
|
|
1245
|
+
* @param elementName The name of view element.
|
|
1246
|
+
* @param originalDomElement The original DOM element to copy attributes and content from.
|
|
1378
1247
|
*/
|
|
1379
1248
|
_createReplacementDomElement(elementName, originalDomElement) {
|
|
1380
1249
|
const newDomElement = this._domDocument.createElement('span');
|
|
@@ -1391,21 +1260,22 @@ export default class DomConverter {
|
|
|
1391
1260
|
return newDomElement;
|
|
1392
1261
|
}
|
|
1393
1262
|
}
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1263
|
+
/**
|
|
1264
|
+
* Helper function.
|
|
1265
|
+
* Used to check if given native `Element` or `Text` node has parent with tag name from `types` array.
|
|
1266
|
+
*
|
|
1267
|
+
* @returns`true` if such parent exists or `false` if it does not.
|
|
1268
|
+
*/
|
|
1400
1269
|
function _hasDomParentOfType(node, types) {
|
|
1401
1270
|
const parents = getAncestors(node);
|
|
1402
1271
|
return parents.some(parent => parent.tagName && types.includes(parent.tagName.toLowerCase()));
|
|
1403
1272
|
}
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1273
|
+
/**
|
|
1274
|
+
* A helper that executes given callback for each DOM node's ancestor, starting from the given node
|
|
1275
|
+
* and ending in document#documentElement.
|
|
1276
|
+
*
|
|
1277
|
+
* @param callback A callback to be executed for each ancestor.
|
|
1278
|
+
*/
|
|
1409
1279
|
function forEachDomElementAncestor(element, callback) {
|
|
1410
1280
|
let node = element;
|
|
1411
1281
|
while (node) {
|
|
@@ -1413,30 +1283,32 @@ function forEachDomElementAncestor(element, callback) {
|
|
|
1413
1283
|
node = node.parentElement;
|
|
1414
1284
|
}
|
|
1415
1285
|
}
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1286
|
+
/**
|
|
1287
|
+
* Checks if given node is a nbsp block filler.
|
|
1288
|
+
*
|
|
1289
|
+
* A is a block filler only if it is a single child of a block element.
|
|
1290
|
+
*
|
|
1291
|
+
* @param domNode DOM node.
|
|
1292
|
+
*/
|
|
1423
1293
|
function isNbspBlockFiller(domNode, blockElements) {
|
|
1424
1294
|
const isNBSP = domNode.isEqualNode(NBSP_FILLER_REF);
|
|
1425
1295
|
return isNBSP && hasBlockParent(domNode, blockElements) && domNode.parentNode.childNodes.length === 1;
|
|
1426
1296
|
}
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1297
|
+
/**
|
|
1298
|
+
* Checks if domNode has block parent.
|
|
1299
|
+
*
|
|
1300
|
+
* @param domNode DOM node.
|
|
1301
|
+
*/
|
|
1432
1302
|
function hasBlockParent(domNode, blockElements) {
|
|
1433
1303
|
const parent = domNode.parentNode;
|
|
1434
1304
|
return !!parent && !!parent.tagName && blockElements.includes(parent.tagName.toLowerCase());
|
|
1435
1305
|
}
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1306
|
+
/**
|
|
1307
|
+
* Log to console the information about element that was replaced.
|
|
1308
|
+
* Check UNSAFE_ELEMENTS for all recognized unsafe elements.
|
|
1309
|
+
*
|
|
1310
|
+
* @param elementName The name of the view element.
|
|
1311
|
+
*/
|
|
1440
1312
|
function _logUnsafeElement(elementName) {
|
|
1441
1313
|
if (elementName === 'script') {
|
|
1442
1314
|
logWarning('domconverter-unsafe-script-element-detected');
|
|
@@ -1459,31 +1331,33 @@ function _logUnsafeElement(elementName) {
|
|
|
1459
1331
|
*/
|
|
1460
1332
|
/**
|
|
1461
1333
|
* The {@link module:engine/view/domconverter~DomConverter} detected an interactive attribute in the
|
|
1462
|
-
* {@glink framework/
|
|
1334
|
+
* {@glink framework/architecture/editing-engine#editing-pipeline editing pipeline}. For the best
|
|
1463
1335
|
* editing experience, the attribute was renamed to `data-ck-unsafe-attribute-[original attribute name]`.
|
|
1464
1336
|
*
|
|
1465
1337
|
* If you are the author of the plugin that generated this attribute and you want it to be preserved
|
|
1466
1338
|
* in the editing pipeline, you can configure this when creating the element
|
|
1467
1339
|
* using {@link module:engine/view/downcastwriter~DowncastWriter} during the
|
|
1468
|
-
* {@glink framework/
|
|
1340
|
+
* {@glink framework/architecture/editing-engine#conversion model–view conversion}. Methods such as
|
|
1469
1341
|
* {@link module:engine/view/downcastwriter~DowncastWriter#createContainerElement},
|
|
1470
1342
|
* {@link module:engine/view/downcastwriter~DowncastWriter#createAttributeElement}, or
|
|
1471
1343
|
* {@link module:engine/view/downcastwriter~DowncastWriter#createEmptyElement}
|
|
1472
1344
|
* accept an option that will disable filtering of specific attributes:
|
|
1473
1345
|
*
|
|
1474
|
-
*
|
|
1475
|
-
*
|
|
1476
|
-
*
|
|
1477
|
-
*
|
|
1478
|
-
*
|
|
1479
|
-
*
|
|
1480
|
-
*
|
|
1481
|
-
*
|
|
1482
|
-
*
|
|
1483
|
-
*
|
|
1346
|
+
* ```ts
|
|
1347
|
+
* const paragraph = writer.createContainerElement( 'p',
|
|
1348
|
+
* {
|
|
1349
|
+
* class: 'clickable-paragraph',
|
|
1350
|
+
* onclick: 'alert( "Paragraph clicked!" )'
|
|
1351
|
+
* },
|
|
1352
|
+
* {
|
|
1353
|
+
* // Make sure the "onclick" attribute will pass through.
|
|
1354
|
+
* renderUnsafeAttributes: [ 'onclick' ]
|
|
1355
|
+
* }
|
|
1356
|
+
* );
|
|
1357
|
+
* ```
|
|
1484
1358
|
*
|
|
1485
1359
|
* @error domconverter-unsafe-attribute-detected
|
|
1486
|
-
* @param
|
|
1487
|
-
* @param
|
|
1488
|
-
* @param
|
|
1360
|
+
* @param domElement The DOM element the attribute was set on.
|
|
1361
|
+
* @param key The original name of the attribute
|
|
1362
|
+
* @param value The value of the original attribute
|
|
1489
1363
|
*/
|