@ckeditor/ckeditor5-engine 0.0.0-internal-20241017.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/CHANGELOG.md +4 -0
- package/LICENSE.md +21 -0
- package/README.md +36 -0
- package/dist/controller/datacontroller.d.ts +339 -0
- package/dist/controller/editingcontroller.d.ts +102 -0
- package/dist/conversion/conversion.d.ts +482 -0
- package/dist/conversion/conversionhelpers.d.ts +30 -0
- package/dist/conversion/downcastdispatcher.d.ts +566 -0
- package/dist/conversion/downcasthelpers.d.ts +1194 -0
- package/dist/conversion/mapper.d.ts +507 -0
- package/dist/conversion/modelconsumable.d.ts +205 -0
- package/dist/conversion/upcastdispatcher.d.ts +496 -0
- package/dist/conversion/upcasthelpers.d.ts +503 -0
- package/dist/conversion/viewconsumable.d.ts +373 -0
- package/dist/dataprocessor/basichtmlwriter.d.ts +22 -0
- package/dist/dataprocessor/dataprocessor.d.ts +65 -0
- package/dist/dataprocessor/htmldataprocessor.d.ts +80 -0
- package/dist/dataprocessor/htmlwriter.d.ts +20 -0
- package/dist/dataprocessor/xmldataprocessor.d.ts +94 -0
- package/dist/dev-utils/model.d.ts +130 -0
- package/dist/dev-utils/operationreplayer.d.ts +55 -0
- package/dist/dev-utils/utils.d.ts +41 -0
- package/dist/dev-utils/view.d.ts +324 -0
- package/dist/index-content.css +4 -0
- package/dist/index-editor.css +24 -0
- package/dist/index.css +49 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +122 -0
- package/dist/index.js +37775 -0
- package/dist/index.js.map +1 -0
- package/dist/model/batch.d.ts +110 -0
- package/dist/model/differ.d.ts +511 -0
- package/dist/model/document.d.ts +278 -0
- package/dist/model/documentfragment.d.ts +204 -0
- package/dist/model/documentselection.d.ts +424 -0
- package/dist/model/element.d.ts +169 -0
- package/dist/model/history.d.ts +118 -0
- package/dist/model/item.d.ts +18 -0
- package/dist/model/liveposition.d.ts +81 -0
- package/dist/model/liverange.d.ts +106 -0
- package/dist/model/markercollection.d.ts +339 -0
- package/dist/model/model.d.ts +923 -0
- package/dist/model/node.d.ts +259 -0
- package/dist/model/nodelist.d.ts +95 -0
- package/dist/model/operation/attributeoperation.d.ts +107 -0
- package/dist/model/operation/detachoperation.d.ts +64 -0
- package/dist/model/operation/insertoperation.d.ts +94 -0
- package/dist/model/operation/markeroperation.d.ts +95 -0
- package/dist/model/operation/mergeoperation.d.ts +104 -0
- package/dist/model/operation/moveoperation.d.ts +100 -0
- package/dist/model/operation/nooperation.d.ts +42 -0
- package/dist/model/operation/operation.d.ts +100 -0
- package/dist/model/operation/operationfactory.d.ts +22 -0
- package/dist/model/operation/renameoperation.d.ts +87 -0
- package/dist/model/operation/rootattributeoperation.d.ts +102 -0
- package/dist/model/operation/rootoperation.d.ts +80 -0
- package/dist/model/operation/splitoperation.d.ts +113 -0
- package/dist/model/operation/transform.d.ts +104 -0
- package/dist/model/operation/utils.d.ts +75 -0
- package/dist/model/position.d.ts +542 -0
- package/dist/model/range.d.ts +462 -0
- package/dist/model/rootelement.d.ts +64 -0
- package/dist/model/schema.d.ts +1334 -0
- package/dist/model/selection.d.ts +486 -0
- package/dist/model/text.d.ts +70 -0
- package/dist/model/textproxy.d.ts +148 -0
- package/dist/model/treewalker.d.ts +190 -0
- package/dist/model/typecheckable.d.ts +289 -0
- package/dist/model/utils/autoparagraphing.d.ts +41 -0
- package/dist/model/utils/deletecontent.d.ts +62 -0
- package/dist/model/utils/getselectedcontent.d.ts +34 -0
- package/dist/model/utils/insertcontent.d.ts +50 -0
- package/dist/model/utils/insertobject.d.ts +51 -0
- package/dist/model/utils/modifyselection.d.ts +52 -0
- package/dist/model/utils/selection-post-fixer.d.ts +78 -0
- package/dist/model/writer.d.ts +855 -0
- package/dist/view/attributeelement.d.ts +112 -0
- package/dist/view/containerelement.d.ts +53 -0
- package/dist/view/datatransfer.d.ts +83 -0
- package/dist/view/document.d.ts +188 -0
- package/dist/view/documentfragment.d.ts +157 -0
- package/dist/view/documentselection.d.ts +310 -0
- package/dist/view/domconverter.d.ts +665 -0
- package/dist/view/downcastwriter.d.ts +1000 -0
- package/dist/view/editableelement.d.ts +66 -0
- package/dist/view/element.d.ts +472 -0
- package/dist/view/elementdefinition.d.ts +91 -0
- package/dist/view/emptyelement.d.ts +45 -0
- package/dist/view/filler.d.ts +115 -0
- package/dist/view/item.d.ts +18 -0
- package/dist/view/matcher.d.ts +490 -0
- package/dist/view/node.d.ts +166 -0
- package/dist/view/observer/arrowkeysobserver.d.ts +49 -0
- package/dist/view/observer/bubblingemittermixin.d.ts +170 -0
- package/dist/view/observer/bubblingeventinfo.d.ts +51 -0
- package/dist/view/observer/clickobserver.d.ts +47 -0
- package/dist/view/observer/compositionobserver.d.ts +86 -0
- package/dist/view/observer/domeventdata.d.ts +54 -0
- package/dist/view/observer/domeventobserver.d.ts +82 -0
- package/dist/view/observer/fakeselectionobserver.d.ts +51 -0
- package/dist/view/observer/focusobserver.d.ts +98 -0
- package/dist/view/observer/inputobserver.d.ts +90 -0
- package/dist/view/observer/keyobserver.d.ts +70 -0
- package/dist/view/observer/mouseobserver.d.ts +93 -0
- package/dist/view/observer/mutationobserver.d.ts +119 -0
- package/dist/view/observer/observer.d.ts +93 -0
- package/dist/view/observer/selectionobserver.d.ts +151 -0
- package/dist/view/observer/tabobserver.d.ts +50 -0
- package/dist/view/placeholder.d.ts +100 -0
- package/dist/view/position.d.ts +192 -0
- package/dist/view/range.d.ts +283 -0
- package/dist/view/rawelement.d.ts +77 -0
- package/dist/view/renderer.d.ts +281 -0
- package/dist/view/rooteditableelement.d.ts +45 -0
- package/dist/view/selection.d.ts +379 -0
- package/dist/view/styles/background.d.ts +37 -0
- package/dist/view/styles/border.d.ts +47 -0
- package/dist/view/styles/margin.d.ts +33 -0
- package/dist/view/styles/padding.d.ts +33 -0
- package/dist/view/styles/utils.d.ts +97 -0
- package/dist/view/stylesmap.d.ts +677 -0
- package/dist/view/text.d.ts +78 -0
- package/dist/view/textproxy.d.ts +101 -0
- package/dist/view/treewalker.d.ts +199 -0
- package/dist/view/typecheckable.d.ts +452 -0
- package/dist/view/uielement.d.ts +100 -0
- package/dist/view/upcastwriter.d.ts +421 -0
- package/dist/view/view.d.ts +488 -0
- package/package.json +49 -0
- package/src/controller/datacontroller.d.ts +335 -0
- package/src/controller/datacontroller.js +481 -0
- package/src/controller/editingcontroller.d.ts +98 -0
- package/src/controller/editingcontroller.js +191 -0
- package/src/conversion/conversion.d.ts +478 -0
- package/src/conversion/conversion.js +601 -0
- package/src/conversion/conversionhelpers.d.ts +26 -0
- package/src/conversion/conversionhelpers.js +32 -0
- package/src/conversion/downcastdispatcher.d.ts +562 -0
- package/src/conversion/downcastdispatcher.js +548 -0
- package/src/conversion/downcasthelpers.d.ts +1190 -0
- package/src/conversion/downcasthelpers.js +2161 -0
- package/src/conversion/mapper.d.ts +503 -0
- package/src/conversion/mapper.js +536 -0
- package/src/conversion/modelconsumable.d.ts +201 -0
- package/src/conversion/modelconsumable.js +333 -0
- package/src/conversion/upcastdispatcher.d.ts +492 -0
- package/src/conversion/upcastdispatcher.js +460 -0
- package/src/conversion/upcasthelpers.d.ts +499 -0
- package/src/conversion/upcasthelpers.js +943 -0
- package/src/conversion/viewconsumable.d.ts +369 -0
- package/src/conversion/viewconsumable.js +535 -0
- package/src/dataprocessor/basichtmlwriter.d.ts +18 -0
- package/src/dataprocessor/basichtmlwriter.js +20 -0
- package/src/dataprocessor/dataprocessor.d.ts +61 -0
- package/src/dataprocessor/dataprocessor.js +5 -0
- package/src/dataprocessor/htmldataprocessor.d.ts +76 -0
- package/src/dataprocessor/htmldataprocessor.js +96 -0
- package/src/dataprocessor/htmlwriter.d.ts +16 -0
- package/src/dataprocessor/htmlwriter.js +5 -0
- package/src/dataprocessor/xmldataprocessor.d.ts +90 -0
- package/src/dataprocessor/xmldataprocessor.js +108 -0
- package/src/dev-utils/model.d.ts +126 -0
- package/src/dev-utils/model.js +397 -0
- package/src/dev-utils/operationreplayer.d.ts +51 -0
- package/src/dev-utils/operationreplayer.js +112 -0
- package/src/dev-utils/utils.d.ts +37 -0
- package/src/dev-utils/utils.js +80 -0
- package/src/dev-utils/view.d.ts +320 -0
- package/src/dev-utils/view.js +970 -0
- package/src/index.d.ts +118 -0
- package/src/index.js +83 -0
- package/src/model/batch.d.ts +106 -0
- package/src/model/batch.js +96 -0
- package/src/model/differ.d.ts +507 -0
- package/src/model/differ.js +1285 -0
- package/src/model/document.d.ts +274 -0
- package/src/model/document.js +360 -0
- package/src/model/documentfragment.d.ts +200 -0
- package/src/model/documentfragment.js +306 -0
- package/src/model/documentselection.d.ts +420 -0
- package/src/model/documentselection.js +993 -0
- package/src/model/element.d.ts +165 -0
- package/src/model/element.js +281 -0
- package/src/model/history.d.ts +114 -0
- package/src/model/history.js +207 -0
- package/src/model/item.d.ts +14 -0
- package/src/model/item.js +5 -0
- package/src/model/liveposition.d.ts +77 -0
- package/src/model/liveposition.js +93 -0
- package/src/model/liverange.d.ts +102 -0
- package/src/model/liverange.js +120 -0
- package/src/model/markercollection.d.ts +335 -0
- package/src/model/markercollection.js +403 -0
- package/src/model/model.d.ts +919 -0
- package/src/model/model.js +838 -0
- package/src/model/node.d.ts +255 -0
- package/src/model/node.js +373 -0
- package/src/model/nodelist.d.ts +91 -0
- package/src/model/nodelist.js +170 -0
- package/src/model/operation/attributeoperation.d.ts +103 -0
- package/src/model/operation/attributeoperation.js +148 -0
- package/src/model/operation/detachoperation.d.ts +60 -0
- package/src/model/operation/detachoperation.js +77 -0
- package/src/model/operation/insertoperation.d.ts +90 -0
- package/src/model/operation/insertoperation.js +135 -0
- package/src/model/operation/markeroperation.d.ts +91 -0
- package/src/model/operation/markeroperation.js +107 -0
- package/src/model/operation/mergeoperation.d.ts +100 -0
- package/src/model/operation/mergeoperation.js +167 -0
- package/src/model/operation/moveoperation.d.ts +96 -0
- package/src/model/operation/moveoperation.js +164 -0
- package/src/model/operation/nooperation.d.ts +38 -0
- package/src/model/operation/nooperation.js +48 -0
- package/src/model/operation/operation.d.ts +96 -0
- package/src/model/operation/operation.js +59 -0
- package/src/model/operation/operationfactory.d.ts +18 -0
- package/src/model/operation/operationfactory.js +44 -0
- package/src/model/operation/renameoperation.d.ts +83 -0
- package/src/model/operation/renameoperation.js +115 -0
- package/src/model/operation/rootattributeoperation.d.ts +98 -0
- package/src/model/operation/rootattributeoperation.js +155 -0
- package/src/model/operation/rootoperation.d.ts +76 -0
- package/src/model/operation/rootoperation.js +90 -0
- package/src/model/operation/splitoperation.d.ts +109 -0
- package/src/model/operation/splitoperation.js +194 -0
- package/src/model/operation/transform.d.ts +100 -0
- package/src/model/operation/transform.js +2119 -0
- package/src/model/operation/utils.d.ts +71 -0
- package/src/model/operation/utils.js +217 -0
- package/src/model/position.d.ts +538 -0
- package/src/model/position.js +977 -0
- package/src/model/range.d.ts +458 -0
- package/src/model/range.js +872 -0
- package/src/model/rootelement.d.ts +60 -0
- package/src/model/rootelement.js +74 -0
- package/src/model/schema.d.ts +1330 -0
- package/src/model/schema.js +1524 -0
- package/src/model/selection.d.ts +482 -0
- package/src/model/selection.js +789 -0
- package/src/model/text.d.ts +66 -0
- package/src/model/text.js +85 -0
- package/src/model/textproxy.d.ts +144 -0
- package/src/model/textproxy.js +189 -0
- package/src/model/treewalker.d.ts +186 -0
- package/src/model/treewalker.js +244 -0
- package/src/model/typecheckable.d.ts +285 -0
- package/src/model/typecheckable.js +16 -0
- package/src/model/utils/autoparagraphing.d.ts +37 -0
- package/src/model/utils/autoparagraphing.js +63 -0
- package/src/model/utils/deletecontent.d.ts +58 -0
- package/src/model/utils/deletecontent.js +488 -0
- package/src/model/utils/getselectedcontent.d.ts +30 -0
- package/src/model/utils/getselectedcontent.js +125 -0
- package/src/model/utils/insertcontent.d.ts +46 -0
- package/src/model/utils/insertcontent.js +661 -0
- package/src/model/utils/insertobject.d.ts +47 -0
- package/src/model/utils/insertobject.js +135 -0
- package/src/model/utils/modifyselection.d.ts +48 -0
- package/src/model/utils/modifyselection.js +186 -0
- package/src/model/utils/selection-post-fixer.d.ts +74 -0
- package/src/model/utils/selection-post-fixer.js +260 -0
- package/src/model/writer.d.ts +851 -0
- package/src/model/writer.js +1306 -0
- package/src/view/attributeelement.d.ts +108 -0
- package/src/view/attributeelement.js +185 -0
- package/src/view/containerelement.d.ts +49 -0
- package/src/view/containerelement.js +80 -0
- package/src/view/datatransfer.d.ts +79 -0
- package/src/view/datatransfer.js +98 -0
- package/src/view/document.d.ts +184 -0
- package/src/view/document.js +122 -0
- package/src/view/documentfragment.d.ts +153 -0
- package/src/view/documentfragment.js +234 -0
- package/src/view/documentselection.d.ts +306 -0
- package/src/view/documentselection.js +256 -0
- package/src/view/domconverter.d.ts +661 -0
- package/src/view/domconverter.js +1523 -0
- package/src/view/downcastwriter.d.ts +996 -0
- package/src/view/downcastwriter.js +1696 -0
- package/src/view/editableelement.d.ts +62 -0
- package/src/view/editableelement.js +62 -0
- package/src/view/element.d.ts +468 -0
- package/src/view/element.js +724 -0
- package/src/view/elementdefinition.d.ts +87 -0
- package/src/view/elementdefinition.js +5 -0
- package/src/view/emptyelement.d.ts +41 -0
- package/src/view/emptyelement.js +73 -0
- package/src/view/filler.d.ts +111 -0
- package/src/view/filler.js +150 -0
- package/src/view/item.d.ts +14 -0
- package/src/view/item.js +5 -0
- package/src/view/matcher.d.ts +486 -0
- package/src/view/matcher.js +507 -0
- package/src/view/node.d.ts +162 -0
- package/src/view/node.js +226 -0
- package/src/view/observer/arrowkeysobserver.d.ts +45 -0
- package/src/view/observer/arrowkeysobserver.js +40 -0
- package/src/view/observer/bubblingemittermixin.d.ts +166 -0
- package/src/view/observer/bubblingemittermixin.js +172 -0
- package/src/view/observer/bubblingeventinfo.d.ts +47 -0
- package/src/view/observer/bubblingeventinfo.js +37 -0
- package/src/view/observer/clickobserver.d.ts +43 -0
- package/src/view/observer/clickobserver.js +29 -0
- package/src/view/observer/compositionobserver.d.ts +82 -0
- package/src/view/observer/compositionobserver.js +62 -0
- package/src/view/observer/domeventdata.d.ts +50 -0
- package/src/view/observer/domeventdata.js +47 -0
- package/src/view/observer/domeventobserver.d.ts +78 -0
- package/src/view/observer/domeventobserver.js +84 -0
- package/src/view/observer/fakeselectionobserver.d.ts +47 -0
- package/src/view/observer/fakeselectionobserver.js +91 -0
- package/src/view/observer/focusobserver.d.ts +94 -0
- package/src/view/observer/focusobserver.js +116 -0
- package/src/view/observer/inputobserver.d.ts +86 -0
- package/src/view/observer/inputobserver.js +166 -0
- package/src/view/observer/keyobserver.d.ts +66 -0
- package/src/view/observer/keyobserver.js +39 -0
- package/src/view/observer/mouseobserver.d.ts +89 -0
- package/src/view/observer/mouseobserver.js +29 -0
- package/src/view/observer/mutationobserver.d.ts +115 -0
- package/src/view/observer/mutationobserver.js +203 -0
- package/src/view/observer/observer.d.ts +89 -0
- package/src/view/observer/observer.js +84 -0
- package/src/view/observer/selectionobserver.d.ts +147 -0
- package/src/view/observer/selectionobserver.js +220 -0
- package/src/view/observer/tabobserver.d.ts +46 -0
- package/src/view/observer/tabobserver.js +42 -0
- package/src/view/placeholder.d.ts +96 -0
- package/src/view/placeholder.js +267 -0
- package/src/view/position.d.ts +188 -0
- package/src/view/position.js +322 -0
- package/src/view/range.d.ts +279 -0
- package/src/view/range.js +430 -0
- package/src/view/rawelement.d.ts +73 -0
- package/src/view/rawelement.js +105 -0
- package/src/view/renderer.d.ts +277 -0
- package/src/view/renderer.js +1056 -0
- package/src/view/rooteditableelement.d.ts +41 -0
- package/src/view/rooteditableelement.js +69 -0
- package/src/view/selection.d.ts +375 -0
- package/src/view/selection.js +559 -0
- package/src/view/styles/background.d.ts +33 -0
- package/src/view/styles/background.js +74 -0
- package/src/view/styles/border.d.ts +43 -0
- package/src/view/styles/border.js +316 -0
- package/src/view/styles/margin.d.ts +29 -0
- package/src/view/styles/margin.js +34 -0
- package/src/view/styles/padding.d.ts +29 -0
- package/src/view/styles/padding.js +34 -0
- package/src/view/styles/utils.d.ts +93 -0
- package/src/view/styles/utils.js +219 -0
- package/src/view/stylesmap.d.ts +673 -0
- package/src/view/stylesmap.js +762 -0
- package/src/view/text.d.ts +74 -0
- package/src/view/text.js +93 -0
- package/src/view/textproxy.d.ts +97 -0
- package/src/view/textproxy.js +124 -0
- package/src/view/treewalker.d.ts +195 -0
- package/src/view/treewalker.js +327 -0
- package/src/view/typecheckable.d.ts +448 -0
- package/src/view/typecheckable.js +19 -0
- package/src/view/uielement.d.ts +96 -0
- package/src/view/uielement.js +183 -0
- package/src/view/upcastwriter.d.ts +417 -0
- package/src/view/upcastwriter.js +359 -0
- package/src/view/view.d.ts +484 -0
- package/src/view/view.js +560 -0
- package/theme/placeholder.css +36 -0
- package/theme/renderer.css +9 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @module engine/model/treewalker
|
|
7
|
+
*/
|
|
8
|
+
import Element from './element.js';
|
|
9
|
+
import { default as Position, getTextNodeAtPosition, getNodeAfterPosition, getNodeBeforePosition } from './position.js';
|
|
10
|
+
import Text from './text.js';
|
|
11
|
+
import TextProxy from './textproxy.js';
|
|
12
|
+
import { CKEditorError } from '@ckeditor/ckeditor5-utils';
|
|
13
|
+
/**
|
|
14
|
+
* Position iterator class. It allows to iterate forward and backward over the document.
|
|
15
|
+
*/
|
|
16
|
+
export default class TreeWalker {
|
|
17
|
+
/**
|
|
18
|
+
* Creates a range iterator. All parameters are optional, but you have to specify either `boundaries` or `startPosition`.
|
|
19
|
+
*
|
|
20
|
+
* @param options Object with configuration.
|
|
21
|
+
*/
|
|
22
|
+
constructor(options) {
|
|
23
|
+
if (!options || (!options.boundaries && !options.startPosition)) {
|
|
24
|
+
/**
|
|
25
|
+
* Neither boundaries nor starting position of a `TreeWalker` have been defined.
|
|
26
|
+
*
|
|
27
|
+
* @error model-tree-walker-no-start-position
|
|
28
|
+
*/
|
|
29
|
+
throw new CKEditorError('model-tree-walker-no-start-position', null);
|
|
30
|
+
}
|
|
31
|
+
const direction = options.direction || 'forward';
|
|
32
|
+
if (direction != 'forward' && direction != 'backward') {
|
|
33
|
+
/**
|
|
34
|
+
* Only `backward` and `forward` direction allowed.
|
|
35
|
+
*
|
|
36
|
+
* @error model-tree-walker-unknown-direction
|
|
37
|
+
*/
|
|
38
|
+
throw new CKEditorError('model-tree-walker-unknown-direction', options, { direction });
|
|
39
|
+
}
|
|
40
|
+
this.direction = direction;
|
|
41
|
+
this.boundaries = options.boundaries || null;
|
|
42
|
+
if (options.startPosition) {
|
|
43
|
+
this._position = options.startPosition.clone();
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
this._position = Position._createAt(this.boundaries[this.direction == 'backward' ? 'end' : 'start']);
|
|
47
|
+
}
|
|
48
|
+
// Reset position stickiness in case it was set to other value, as the stickiness is kept after cloning.
|
|
49
|
+
this.position.stickiness = 'toNone';
|
|
50
|
+
this.singleCharacters = !!options.singleCharacters;
|
|
51
|
+
this.shallow = !!options.shallow;
|
|
52
|
+
this.ignoreElementEnd = !!options.ignoreElementEnd;
|
|
53
|
+
this._boundaryStartParent = this.boundaries ? this.boundaries.start.parent : null;
|
|
54
|
+
this._boundaryEndParent = this.boundaries ? this.boundaries.end.parent : null;
|
|
55
|
+
this._visitedParent = this.position.parent;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Iterable interface.
|
|
59
|
+
*
|
|
60
|
+
* @returns {Iterable.<module:engine/model/treewalker~TreeWalkerValue>}
|
|
61
|
+
*/
|
|
62
|
+
[Symbol.iterator]() {
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Iterator position. This is always static position, even if the initial position was a
|
|
67
|
+
* {@link module:engine/model/liveposition~LivePosition live position}. If start position is not defined then position depends
|
|
68
|
+
* on {@link #direction}. If direction is `'forward'` position starts form the beginning, when direction
|
|
69
|
+
* is `'backward'` position starts from the end.
|
|
70
|
+
*/
|
|
71
|
+
get position() {
|
|
72
|
+
return this._position;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Moves {@link #position} in the {@link #direction} skipping values as long as the callback function returns `true`.
|
|
76
|
+
*
|
|
77
|
+
* For example:
|
|
78
|
+
*
|
|
79
|
+
* ```ts
|
|
80
|
+
* walker.skip( value => value.type == 'text' ); // <paragraph>[]foo</paragraph> -> <paragraph>foo[]</paragraph>
|
|
81
|
+
* walker.skip( () => true ); // Move the position to the end: <paragraph>[]foo</paragraph> -> <paragraph>foo</paragraph>[]
|
|
82
|
+
* walker.skip( () => false ); // Do not move the position.
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* @param skip Callback function. Gets {@link module:engine/model/treewalker~TreeWalkerValue} and should
|
|
86
|
+
* return `true` if the value should be skipped or `false` if not.
|
|
87
|
+
*/
|
|
88
|
+
skip(skip) {
|
|
89
|
+
let done, value, prevPosition, prevVisitedParent;
|
|
90
|
+
do {
|
|
91
|
+
prevPosition = this.position;
|
|
92
|
+
prevVisitedParent = this._visitedParent;
|
|
93
|
+
({ done, value } = this.next());
|
|
94
|
+
} while (!done && skip(value));
|
|
95
|
+
if (!done) {
|
|
96
|
+
this._position = prevPosition;
|
|
97
|
+
this._visitedParent = prevVisitedParent;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Gets the next tree walker's value.
|
|
102
|
+
*/
|
|
103
|
+
next() {
|
|
104
|
+
if (this.direction == 'forward') {
|
|
105
|
+
return this._next();
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
return this._previous();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Makes a step forward in model. Moves the {@link #position} to the next position and returns the encountered value.
|
|
113
|
+
*/
|
|
114
|
+
_next() {
|
|
115
|
+
const previousPosition = this.position;
|
|
116
|
+
const position = this.position.clone();
|
|
117
|
+
const parent = this._visitedParent;
|
|
118
|
+
// We are at the end of the root.
|
|
119
|
+
if (parent.parent === null && position.offset === parent.maxOffset) {
|
|
120
|
+
return { done: true, value: undefined };
|
|
121
|
+
}
|
|
122
|
+
// We reached the walker boundary.
|
|
123
|
+
if (parent === this._boundaryEndParent && position.offset == this.boundaries.end.offset) {
|
|
124
|
+
return { done: true, value: undefined };
|
|
125
|
+
}
|
|
126
|
+
// Get node just after the current position.
|
|
127
|
+
// Use a highly optimized version instead of checking the text node first and then getting the node after. See #6582.
|
|
128
|
+
const textNodeAtPosition = getTextNodeAtPosition(position, parent);
|
|
129
|
+
const node = textNodeAtPosition || getNodeAfterPosition(position, parent, textNodeAtPosition);
|
|
130
|
+
if (node instanceof Element) {
|
|
131
|
+
if (!this.shallow) {
|
|
132
|
+
// Manual operations on path internals for optimization purposes. Here and in the rest of the method.
|
|
133
|
+
position.path.push(0);
|
|
134
|
+
this._visitedParent = node;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// We are past the walker boundaries.
|
|
138
|
+
if (this.boundaries && this.boundaries.end.isBefore(position)) {
|
|
139
|
+
return { done: true, value: undefined };
|
|
140
|
+
}
|
|
141
|
+
position.offset++;
|
|
142
|
+
}
|
|
143
|
+
this._position = position;
|
|
144
|
+
return formatReturnValue('elementStart', node, previousPosition, position, 1);
|
|
145
|
+
}
|
|
146
|
+
if (node instanceof Text) {
|
|
147
|
+
let charactersCount;
|
|
148
|
+
if (this.singleCharacters) {
|
|
149
|
+
charactersCount = 1;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
let offset = node.endOffset;
|
|
153
|
+
if (this._boundaryEndParent == parent && this.boundaries.end.offset < offset) {
|
|
154
|
+
offset = this.boundaries.end.offset;
|
|
155
|
+
}
|
|
156
|
+
charactersCount = offset - position.offset;
|
|
157
|
+
}
|
|
158
|
+
const offsetInTextNode = position.offset - node.startOffset;
|
|
159
|
+
const item = new TextProxy(node, offsetInTextNode, charactersCount);
|
|
160
|
+
position.offset += charactersCount;
|
|
161
|
+
this._position = position;
|
|
162
|
+
return formatReturnValue('text', item, previousPosition, position, charactersCount);
|
|
163
|
+
}
|
|
164
|
+
// `node` is not set, we reached the end of current `parent`.
|
|
165
|
+
position.path.pop();
|
|
166
|
+
position.offset++;
|
|
167
|
+
this._position = position;
|
|
168
|
+
this._visitedParent = parent.parent;
|
|
169
|
+
if (this.ignoreElementEnd) {
|
|
170
|
+
return this._next();
|
|
171
|
+
}
|
|
172
|
+
return formatReturnValue('elementEnd', parent, previousPosition, position);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Makes a step backward in model. Moves the {@link #position} to the previous position and returns the encountered value.
|
|
176
|
+
*/
|
|
177
|
+
_previous() {
|
|
178
|
+
const previousPosition = this.position;
|
|
179
|
+
const position = this.position.clone();
|
|
180
|
+
const parent = this._visitedParent;
|
|
181
|
+
// We are at the beginning of the root.
|
|
182
|
+
if (parent.parent === null && position.offset === 0) {
|
|
183
|
+
return { done: true, value: undefined };
|
|
184
|
+
}
|
|
185
|
+
// We reached the walker boundary.
|
|
186
|
+
if (parent == this._boundaryStartParent && position.offset == this.boundaries.start.offset) {
|
|
187
|
+
return { done: true, value: undefined };
|
|
188
|
+
}
|
|
189
|
+
// Get node just before the current position.
|
|
190
|
+
// Use a highly optimized version instead of checking the text node first and then getting the node before. See #6582.
|
|
191
|
+
const positionParent = position.parent;
|
|
192
|
+
const textNodeAtPosition = getTextNodeAtPosition(position, positionParent);
|
|
193
|
+
const node = textNodeAtPosition || getNodeBeforePosition(position, positionParent, textNodeAtPosition);
|
|
194
|
+
if (node instanceof Element) {
|
|
195
|
+
position.offset--;
|
|
196
|
+
if (this.shallow) {
|
|
197
|
+
this._position = position;
|
|
198
|
+
return formatReturnValue('elementStart', node, previousPosition, position, 1);
|
|
199
|
+
}
|
|
200
|
+
position.path.push(node.maxOffset);
|
|
201
|
+
this._position = position;
|
|
202
|
+
this._visitedParent = node;
|
|
203
|
+
if (this.ignoreElementEnd) {
|
|
204
|
+
return this._previous();
|
|
205
|
+
}
|
|
206
|
+
return formatReturnValue('elementEnd', node, previousPosition, position);
|
|
207
|
+
}
|
|
208
|
+
if (node instanceof Text) {
|
|
209
|
+
let charactersCount;
|
|
210
|
+
if (this.singleCharacters) {
|
|
211
|
+
charactersCount = 1;
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
let offset = node.startOffset;
|
|
215
|
+
if (this._boundaryStartParent == parent && this.boundaries.start.offset > offset) {
|
|
216
|
+
offset = this.boundaries.start.offset;
|
|
217
|
+
}
|
|
218
|
+
charactersCount = position.offset - offset;
|
|
219
|
+
}
|
|
220
|
+
const offsetInTextNode = position.offset - node.startOffset;
|
|
221
|
+
const item = new TextProxy(node, offsetInTextNode - charactersCount, charactersCount);
|
|
222
|
+
position.offset -= charactersCount;
|
|
223
|
+
this._position = position;
|
|
224
|
+
return formatReturnValue('text', item, previousPosition, position, charactersCount);
|
|
225
|
+
}
|
|
226
|
+
// `node` is not set, we reached the beginning of current `parent`.
|
|
227
|
+
position.path.pop();
|
|
228
|
+
this._position = position;
|
|
229
|
+
this._visitedParent = parent.parent;
|
|
230
|
+
return formatReturnValue('elementStart', parent, previousPosition, position, 1);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function formatReturnValue(type, item, previousPosition, nextPosition, length) {
|
|
234
|
+
return {
|
|
235
|
+
done: false,
|
|
236
|
+
value: {
|
|
237
|
+
type,
|
|
238
|
+
item,
|
|
239
|
+
previousPosition,
|
|
240
|
+
nextPosition,
|
|
241
|
+
length
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @module engine/model/typecheckable
|
|
7
|
+
*/
|
|
8
|
+
import type { Marker } from './markercollection.js';
|
|
9
|
+
import type DocumentFragment from './documentfragment.js';
|
|
10
|
+
import type DocumentSelection from './documentselection.js';
|
|
11
|
+
import type Element from './element.js';
|
|
12
|
+
import type LivePosition from './liveposition.js';
|
|
13
|
+
import type LiveRange from './liverange.js';
|
|
14
|
+
import type Node from './node.js';
|
|
15
|
+
import type Position from './position.js';
|
|
16
|
+
import type Range from './range.js';
|
|
17
|
+
import type RootElement from './rootelement.js';
|
|
18
|
+
import type Selection from './selection.js';
|
|
19
|
+
import type Text from './text.js';
|
|
20
|
+
import type TextProxy from './textproxy.js';
|
|
21
|
+
export default abstract class TypeCheckable {
|
|
22
|
+
/**
|
|
23
|
+
* Checks whether the object is of type {@link module:engine/model/node~Node} or its subclass.
|
|
24
|
+
*
|
|
25
|
+
* This method is useful when processing model objects that are of unknown type. For example, a function
|
|
26
|
+
* may return a {@link module:engine/model/documentfragment~DocumentFragment} or a {@link module:engine/model/node~Node}
|
|
27
|
+
* that can be either a text node or an element. This method can be used to check what kind of object is returned.
|
|
28
|
+
*
|
|
29
|
+
* ```ts
|
|
30
|
+
* someObject.is( 'element' ); // -> true if this is an element
|
|
31
|
+
* someObject.is( 'node' ); // -> true if this is a node (a text node or an element)
|
|
32
|
+
* someObject.is( 'documentFragment' ); // -> true if this is a document fragment
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* Since this method is also available on a range of view objects, you can prefix the type of the object with
|
|
36
|
+
* `model:` or `view:` to check, for example, if this is the model's or view's element:
|
|
37
|
+
*
|
|
38
|
+
* ```ts
|
|
39
|
+
* modelElement.is( 'model:element' ); // -> true
|
|
40
|
+
* modelElement.is( 'view:element' ); // -> false
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* By using this method it is also possible to check a name of an element:
|
|
44
|
+
*
|
|
45
|
+
* ```ts
|
|
46
|
+
* imageElement.is( 'element', 'imageBlock' ); // -> true
|
|
47
|
+
* imageElement.is( 'element', 'imageBlock' ); // -> same as above
|
|
48
|
+
* imageElement.is( 'model:element', 'imageBlock' ); // -> same as above, but more precise
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* @label NODE
|
|
52
|
+
*/
|
|
53
|
+
is(type: 'node' | 'model:node'): this is Node | Element | Text | RootElement;
|
|
54
|
+
/**
|
|
55
|
+
* Checks whether the object is of type {@link module:engine/model/element~Element} or its subclass.
|
|
56
|
+
*
|
|
57
|
+
* ```ts
|
|
58
|
+
* element.is( 'element' ); // -> true
|
|
59
|
+
* element.is( 'node' ); // -> true
|
|
60
|
+
* element.is( 'model:element' ); // -> true
|
|
61
|
+
* element.is( 'model:node' ); // -> true
|
|
62
|
+
*
|
|
63
|
+
* element.is( 'view:element' ); // -> false
|
|
64
|
+
* element.is( 'documentSelection' ); // -> false
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* Assuming that the object being checked is an element, you can also check its
|
|
68
|
+
* {@link module:engine/model/element~Element#name name}:
|
|
69
|
+
*
|
|
70
|
+
* ```ts
|
|
71
|
+
* element.is( 'element', 'imageBlock' ); // -> true if this is an <imageBlock> element
|
|
72
|
+
* text.is( 'element', 'imageBlock' ); -> false
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* @label ELEMENT
|
|
76
|
+
*/
|
|
77
|
+
is(type: 'element' | 'model:element'): this is Element | RootElement;
|
|
78
|
+
/**
|
|
79
|
+
* Checks whether the object is of type {@link module:engine/model/rootelement~RootElement}.
|
|
80
|
+
*
|
|
81
|
+
* ```ts
|
|
82
|
+
* rootElement.is( 'rootElement' ); // -> true
|
|
83
|
+
* rootElement.is( 'element' ); // -> true
|
|
84
|
+
* rootElement.is( 'node' ); // -> true
|
|
85
|
+
* rootElement.is( 'model:rootElement' ); // -> true
|
|
86
|
+
* rootElement.is( 'model:element' ); // -> true
|
|
87
|
+
* rootElement.is( 'model:node' ); // -> true
|
|
88
|
+
*
|
|
89
|
+
* rootElement.is( 'view:element' ); // -> false
|
|
90
|
+
* rootElement.is( 'documentFragment' ); // -> false
|
|
91
|
+
* ```
|
|
92
|
+
*
|
|
93
|
+
* Assuming that the object being checked is an element, you can also check its
|
|
94
|
+
* {@link module:engine/model/element~Element#name name}:
|
|
95
|
+
*
|
|
96
|
+
* ```ts
|
|
97
|
+
* rootElement.is( 'rootElement', '$root' ); // -> same as above
|
|
98
|
+
* ```
|
|
99
|
+
*
|
|
100
|
+
* @label ROOT_ELEMENT
|
|
101
|
+
*/
|
|
102
|
+
is(type: 'rootElement' | 'model:rootElement'): this is RootElement;
|
|
103
|
+
/**
|
|
104
|
+
* Checks whether the object is of type {@link module:engine/model/text~Text}.
|
|
105
|
+
*
|
|
106
|
+
* ```ts
|
|
107
|
+
* text.is( '$text' ); // -> true
|
|
108
|
+
* text.is( 'node' ); // -> true
|
|
109
|
+
* text.is( 'model:$text' ); // -> true
|
|
110
|
+
* text.is( 'model:node' ); // -> true
|
|
111
|
+
*
|
|
112
|
+
* text.is( 'view:$text' ); // -> false
|
|
113
|
+
* text.is( 'documentSelection' ); // -> false
|
|
114
|
+
* ```
|
|
115
|
+
*
|
|
116
|
+
* **Note:** Until version 20.0.0 this method wasn't accepting `'$text'` type. The legacy `'text'` type is still
|
|
117
|
+
* accepted for backward compatibility.
|
|
118
|
+
*
|
|
119
|
+
* @label TEXT
|
|
120
|
+
*/
|
|
121
|
+
is(type: '$text' | 'model:$text'): this is Text;
|
|
122
|
+
/**
|
|
123
|
+
* Checks whether the object is of type {@link module:engine/model/position~Position} or its subclass.
|
|
124
|
+
*
|
|
125
|
+
* ```ts
|
|
126
|
+
* position.is( 'position' ); // -> true
|
|
127
|
+
* position.is( 'model:position' ); // -> true
|
|
128
|
+
*
|
|
129
|
+
* position.is( 'view:position' ); // -> false
|
|
130
|
+
* position.is( 'documentSelection' ); // -> false
|
|
131
|
+
* ```
|
|
132
|
+
*
|
|
133
|
+
* @label POSITION
|
|
134
|
+
*/
|
|
135
|
+
is(type: 'position' | 'model:position'): this is Position | LivePosition;
|
|
136
|
+
/**
|
|
137
|
+
* Checks whether the object is of type {@link module:engine/model/liveposition~LivePosition}.
|
|
138
|
+
*
|
|
139
|
+
* ```ts
|
|
140
|
+
* livePosition.is( 'position' ); // -> true
|
|
141
|
+
* livePosition.is( 'model:position' ); // -> true
|
|
142
|
+
* livePosition.is( 'liveposition' ); // -> true
|
|
143
|
+
* livePosition.is( 'model:livePosition' ); // -> true
|
|
144
|
+
*
|
|
145
|
+
* livePosition.is( 'view:position' ); // -> false
|
|
146
|
+
* livePosition.is( 'documentSelection' ); // -> false
|
|
147
|
+
* ```
|
|
148
|
+
*
|
|
149
|
+
* @label LIVE_POSITION
|
|
150
|
+
*/
|
|
151
|
+
is(type: 'livePosition' | 'model:livePosition'): this is LivePosition;
|
|
152
|
+
/**
|
|
153
|
+
* Checks whether the object is of type {@link module:engine/model/range~Range} or its subclass.
|
|
154
|
+
*
|
|
155
|
+
* ```ts
|
|
156
|
+
* range.is( 'range' ); // -> true
|
|
157
|
+
* range.is( 'model:range' ); // -> true
|
|
158
|
+
*
|
|
159
|
+
* range.is( 'view:range' ); // -> false
|
|
160
|
+
* range.is( 'documentSelection' ); // -> false
|
|
161
|
+
* ```
|
|
162
|
+
*
|
|
163
|
+
* @label RANGE
|
|
164
|
+
*/
|
|
165
|
+
is(type: 'range' | 'model:range'): this is Range | LiveRange;
|
|
166
|
+
/**
|
|
167
|
+
* Checks whether the object is of type {@link module:engine/model/liverange~LiveRange}.
|
|
168
|
+
*
|
|
169
|
+
* ```ts
|
|
170
|
+
* liveRange.is( 'range' ); // -> true
|
|
171
|
+
* liveRange.is( 'model:range' ); // -> true
|
|
172
|
+
* liveRange.is( 'liveRange' ); // -> true
|
|
173
|
+
* liveRange.is( 'model:liveRange' ); // -> true
|
|
174
|
+
*
|
|
175
|
+
* liveRange.is( 'view:range' ); // -> false
|
|
176
|
+
* liveRange.is( 'documentSelection' ); // -> false
|
|
177
|
+
* ```
|
|
178
|
+
*
|
|
179
|
+
* @label LIVE_RANGE
|
|
180
|
+
*/
|
|
181
|
+
is(type: 'liveRange' | 'model:liveRange'): this is LiveRange;
|
|
182
|
+
/**
|
|
183
|
+
* Checks whether the object is of type {@link module:engine/model/documentfragment~DocumentFragment}.
|
|
184
|
+
*
|
|
185
|
+
* ```ts
|
|
186
|
+
* docFrag.is( 'documentFragment' ); // -> true
|
|
187
|
+
* docFrag.is( 'model:documentFragment' ); // -> true
|
|
188
|
+
*
|
|
189
|
+
* docFrag.is( 'view:documentFragment' ); // -> false
|
|
190
|
+
* docFrag.is( 'element' ); // -> false
|
|
191
|
+
* docFrag.is( 'node' ); // -> false
|
|
192
|
+
* ```
|
|
193
|
+
*
|
|
194
|
+
* @label DOCUMENT_FRAGMENT
|
|
195
|
+
*/
|
|
196
|
+
is(type: 'documentFragment' | 'model:documentFragment'): this is DocumentFragment;
|
|
197
|
+
/**
|
|
198
|
+
* Checks whether the object is of type {@link module:engine/model/selection~Selection}
|
|
199
|
+
* or {@link module:engine/model/documentselection~DocumentSelection}.
|
|
200
|
+
*
|
|
201
|
+
* ```ts
|
|
202
|
+
* selection.is( 'selection' ); // -> true
|
|
203
|
+
* selection.is( 'model:selection' ); // -> true
|
|
204
|
+
*
|
|
205
|
+
* selection.is( 'view:selection' ); // -> false
|
|
206
|
+
* selection.is( 'range' ); // -> false
|
|
207
|
+
* ```
|
|
208
|
+
*
|
|
209
|
+
* @label SELECTION
|
|
210
|
+
*/
|
|
211
|
+
is(type: 'selection' | 'model:selection'): this is Selection | DocumentSelection;
|
|
212
|
+
/**
|
|
213
|
+
* Checks whether the object is of type {@link module:engine/model/documentselection~DocumentSelection}.
|
|
214
|
+
*
|
|
215
|
+
* ```ts
|
|
216
|
+
* selection.is( 'selection' ); // -> true
|
|
217
|
+
* selection.is( 'documentSelection' ); // -> true
|
|
218
|
+
* selection.is( 'model:selection' ); // -> true
|
|
219
|
+
* selection.is( 'model:documentSelection' ); // -> true
|
|
220
|
+
*
|
|
221
|
+
* selection.is( 'view:selection' ); // -> false
|
|
222
|
+
* selection.is( 'element' ); // -> false
|
|
223
|
+
* selection.is( 'node' ); // -> false
|
|
224
|
+
* ```
|
|
225
|
+
*
|
|
226
|
+
* @label DOCUMENT_SELECTION
|
|
227
|
+
*/
|
|
228
|
+
is(type: 'documentSelection' | 'model:documentSelection'): this is DocumentSelection;
|
|
229
|
+
/**
|
|
230
|
+
* Checks whether the object is of type {@link module:engine/model/markercollection~Marker}.
|
|
231
|
+
*
|
|
232
|
+
* ```ts
|
|
233
|
+
* marker.is( 'marker' ); // -> true
|
|
234
|
+
* marker.is( 'model:marker' ); // -> true
|
|
235
|
+
*
|
|
236
|
+
* marker.is( 'view:element' ); // -> false
|
|
237
|
+
* marker.is( 'documentSelection' ); // -> false
|
|
238
|
+
* ```
|
|
239
|
+
*
|
|
240
|
+
* @label MARKER
|
|
241
|
+
*/
|
|
242
|
+
is(type: 'marker' | 'model:marker'): this is Marker;
|
|
243
|
+
/**
|
|
244
|
+
* Checks whether the object is of type {@link module:engine/model/textproxy~TextProxy}.
|
|
245
|
+
*
|
|
246
|
+
* ```ts
|
|
247
|
+
* textProxy.is( '$textProxy' ); // -> true
|
|
248
|
+
* textProxy.is( 'model:$textProxy' ); // -> true
|
|
249
|
+
*
|
|
250
|
+
* textProxy.is( 'view:$textProxy' ); // -> false
|
|
251
|
+
* textProxy.is( 'range' ); // -> false
|
|
252
|
+
* ```
|
|
253
|
+
*
|
|
254
|
+
* **Note:** Until version 20.0.0 this method wasn't accepting `'$textProxy'` type. The legacy `'textProxt'` type is still
|
|
255
|
+
* accepted for backward compatibility.
|
|
256
|
+
*
|
|
257
|
+
* @label TEXT_PROXY
|
|
258
|
+
*/
|
|
259
|
+
is(type: '$textProxy' | 'model:$textProxy'): this is TextProxy;
|
|
260
|
+
/**
|
|
261
|
+
* Checks whether the object is of type {@link module:engine/model/element~Element} or its subclass and has the specified `name`.
|
|
262
|
+
*
|
|
263
|
+
* ```ts
|
|
264
|
+
* element.is( 'element', 'imageBlock' ); // -> true if this is an <imageBlock> element
|
|
265
|
+
* text.is( 'element', 'imageBlock' ); -> false
|
|
266
|
+
* ```
|
|
267
|
+
*
|
|
268
|
+
* @label ELEMENT_NAME
|
|
269
|
+
*/
|
|
270
|
+
is<N extends string>(type: 'element' | 'model:element', name: N): this is (Element | RootElement) & {
|
|
271
|
+
name: N;
|
|
272
|
+
};
|
|
273
|
+
/**
|
|
274
|
+
* Checks whether the object is of type {@link module:engine/model/rootelement~RootElement} and has the specified `name`.
|
|
275
|
+
*
|
|
276
|
+
* ```ts
|
|
277
|
+
* rootElement.is( 'rootElement', '$root' );
|
|
278
|
+
* ```
|
|
279
|
+
*
|
|
280
|
+
* @label ROOT_ELEMENT_NAME
|
|
281
|
+
*/
|
|
282
|
+
is<N extends string>(type: 'rootElement' | 'model:rootElement', name: N): this is RootElement & {
|
|
283
|
+
name: N;
|
|
284
|
+
};
|
|
285
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
|
+
*/
|
|
5
|
+
export default class TypeCheckable {
|
|
6
|
+
/* istanbul ignore next -- @preserve */
|
|
7
|
+
is() {
|
|
8
|
+
// There are a lot of overloads above.
|
|
9
|
+
// Overriding method in derived classes remove them and only `is( type: string ): boolean` is visible which we don't want.
|
|
10
|
+
// One option would be to copy them all to all classes, but that's ugly.
|
|
11
|
+
// It's best when TypeScript compiler doesn't see those overloads, except the one in the top base class.
|
|
12
|
+
// To overload a method, but not let the compiler see it, do after class definition:
|
|
13
|
+
// `MyClass.prototype.is = function( type: string ) {...}`
|
|
14
|
+
throw new Error('is() method is abstract');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
|
+
*/
|
|
5
|
+
import type Node from '../node.js';
|
|
6
|
+
import type Position from '../position.js';
|
|
7
|
+
import type Schema from '../schema.js';
|
|
8
|
+
import type Writer from '../writer.js';
|
|
9
|
+
/**
|
|
10
|
+
* @module engine/model/utils/autoparagraphing
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Fixes all empty roots.
|
|
14
|
+
*
|
|
15
|
+
* @internal
|
|
16
|
+
* @param writer The model writer.
|
|
17
|
+
* @returns `true` if any change has been applied, `false` otherwise.
|
|
18
|
+
*/
|
|
19
|
+
export declare function autoParagraphEmptyRoots(writer: Writer): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Checks if the given node wrapped with a paragraph would be accepted by the schema in the given position.
|
|
22
|
+
*
|
|
23
|
+
* @internal
|
|
24
|
+
* @param position The position at which to check.
|
|
25
|
+
* @param nodeOrType The child node or child type to check.
|
|
26
|
+
* @param schema A schema instance used for element validation.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isParagraphable(position: Position, nodeOrType: Node | string, schema: Schema): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Inserts a new paragraph at the given position and returns a position inside that paragraph.
|
|
31
|
+
*
|
|
32
|
+
* @internal
|
|
33
|
+
* @param position The position where a paragraph should be inserted.
|
|
34
|
+
* @param writer The model writer.
|
|
35
|
+
* @returns Position inside the created paragraph.
|
|
36
|
+
*/
|
|
37
|
+
export declare function wrapInParagraph(position: Position, writer: Writer): Position;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @module engine/model/utils/autoparagraphing
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Fixes all empty roots.
|
|
10
|
+
*
|
|
11
|
+
* @internal
|
|
12
|
+
* @param writer The model writer.
|
|
13
|
+
* @returns `true` if any change has been applied, `false` otherwise.
|
|
14
|
+
*/
|
|
15
|
+
export function autoParagraphEmptyRoots(writer) {
|
|
16
|
+
const { schema, document } = writer.model;
|
|
17
|
+
for (const root of document.getRoots()) {
|
|
18
|
+
if (root.isEmpty && !schema.checkChild(root, '$text')) {
|
|
19
|
+
// If paragraph element is allowed in the root, create paragraph element.
|
|
20
|
+
if (schema.checkChild(root, 'paragraph')) {
|
|
21
|
+
writer.insertElement('paragraph', root);
|
|
22
|
+
// Other roots will get fixed in the next post-fixer round. Those will be triggered
|
|
23
|
+
// in the same batch no matter if this method was triggered by the post-fixing or not
|
|
24
|
+
// (the above insertElement call will trigger the post-fixers).
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Checks if the given node wrapped with a paragraph would be accepted by the schema in the given position.
|
|
33
|
+
*
|
|
34
|
+
* @internal
|
|
35
|
+
* @param position The position at which to check.
|
|
36
|
+
* @param nodeOrType The child node or child type to check.
|
|
37
|
+
* @param schema A schema instance used for element validation.
|
|
38
|
+
*/
|
|
39
|
+
export function isParagraphable(position, nodeOrType, schema) {
|
|
40
|
+
const context = schema.createContext(position);
|
|
41
|
+
// When paragraph is allowed in this context...
|
|
42
|
+
if (!schema.checkChild(context, 'paragraph')) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
// And a node would be allowed in this paragraph...
|
|
46
|
+
if (!schema.checkChild(context.push('paragraph'), nodeOrType)) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Inserts a new paragraph at the given position and returns a position inside that paragraph.
|
|
53
|
+
*
|
|
54
|
+
* @internal
|
|
55
|
+
* @param position The position where a paragraph should be inserted.
|
|
56
|
+
* @param writer The model writer.
|
|
57
|
+
* @returns Position inside the created paragraph.
|
|
58
|
+
*/
|
|
59
|
+
export function wrapInParagraph(position, writer) {
|
|
60
|
+
const paragraph = writer.createElement('paragraph');
|
|
61
|
+
writer.insert(paragraph, position);
|
|
62
|
+
return writer.createPositionAt(paragraph, 0);
|
|
63
|
+
}
|