@ckeditor/ckeditor5-engine 30.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/LICENSE.md +17 -0
  2. package/README.md +30 -0
  3. package/package.json +70 -0
  4. package/src/controller/datacontroller.js +563 -0
  5. package/src/controller/editingcontroller.js +149 -0
  6. package/src/conversion/conversion.js +644 -0
  7. package/src/conversion/conversionhelpers.js +40 -0
  8. package/src/conversion/downcastdispatcher.js +914 -0
  9. package/src/conversion/downcasthelpers.js +1706 -0
  10. package/src/conversion/mapper.js +696 -0
  11. package/src/conversion/modelconsumable.js +329 -0
  12. package/src/conversion/upcastdispatcher.js +807 -0
  13. package/src/conversion/upcasthelpers.js +997 -0
  14. package/src/conversion/viewconsumable.js +623 -0
  15. package/src/dataprocessor/basichtmlwriter.js +32 -0
  16. package/src/dataprocessor/dataprocessor.jsdoc +64 -0
  17. package/src/dataprocessor/htmldataprocessor.js +159 -0
  18. package/src/dataprocessor/htmlwriter.js +22 -0
  19. package/src/dataprocessor/xmldataprocessor.js +161 -0
  20. package/src/dev-utils/model.js +482 -0
  21. package/src/dev-utils/operationreplayer.js +140 -0
  22. package/src/dev-utils/utils.js +103 -0
  23. package/src/dev-utils/view.js +1091 -0
  24. package/src/index.js +52 -0
  25. package/src/model/batch.js +82 -0
  26. package/src/model/differ.js +1282 -0
  27. package/src/model/document.js +483 -0
  28. package/src/model/documentfragment.js +390 -0
  29. package/src/model/documentselection.js +1261 -0
  30. package/src/model/element.js +438 -0
  31. package/src/model/history.js +138 -0
  32. package/src/model/item.jsdoc +14 -0
  33. package/src/model/liveposition.js +182 -0
  34. package/src/model/liverange.js +221 -0
  35. package/src/model/markercollection.js +553 -0
  36. package/src/model/model.js +934 -0
  37. package/src/model/node.js +507 -0
  38. package/src/model/nodelist.js +217 -0
  39. package/src/model/operation/attributeoperation.js +202 -0
  40. package/src/model/operation/detachoperation.js +103 -0
  41. package/src/model/operation/insertoperation.js +188 -0
  42. package/src/model/operation/markeroperation.js +154 -0
  43. package/src/model/operation/mergeoperation.js +216 -0
  44. package/src/model/operation/moveoperation.js +209 -0
  45. package/src/model/operation/nooperation.js +58 -0
  46. package/src/model/operation/operation.js +139 -0
  47. package/src/model/operation/operationfactory.js +49 -0
  48. package/src/model/operation/renameoperation.js +155 -0
  49. package/src/model/operation/rootattributeoperation.js +211 -0
  50. package/src/model/operation/splitoperation.js +254 -0
  51. package/src/model/operation/transform.js +2389 -0
  52. package/src/model/operation/utils.js +292 -0
  53. package/src/model/position.js +1164 -0
  54. package/src/model/range.js +1049 -0
  55. package/src/model/rootelement.js +111 -0
  56. package/src/model/schema.js +1851 -0
  57. package/src/model/selection.js +902 -0
  58. package/src/model/text.js +138 -0
  59. package/src/model/textproxy.js +279 -0
  60. package/src/model/treewalker.js +414 -0
  61. package/src/model/utils/autoparagraphing.js +77 -0
  62. package/src/model/utils/deletecontent.js +528 -0
  63. package/src/model/utils/getselectedcontent.js +150 -0
  64. package/src/model/utils/insertcontent.js +824 -0
  65. package/src/model/utils/modifyselection.js +229 -0
  66. package/src/model/utils/selection-post-fixer.js +297 -0
  67. package/src/model/writer.js +1574 -0
  68. package/src/view/attributeelement.js +274 -0
  69. package/src/view/containerelement.js +123 -0
  70. package/src/view/document.js +221 -0
  71. package/src/view/documentfragment.js +273 -0
  72. package/src/view/documentselection.js +387 -0
  73. package/src/view/domconverter.js +1437 -0
  74. package/src/view/downcastwriter.js +2121 -0
  75. package/src/view/editableelement.js +118 -0
  76. package/src/view/element.js +945 -0
  77. package/src/view/elementdefinition.jsdoc +59 -0
  78. package/src/view/emptyelement.js +119 -0
  79. package/src/view/filler.js +161 -0
  80. package/src/view/item.jsdoc +14 -0
  81. package/src/view/matcher.js +776 -0
  82. package/src/view/node.js +391 -0
  83. package/src/view/observer/arrowkeysobserver.js +58 -0
  84. package/src/view/observer/bubblingemittermixin.js +307 -0
  85. package/src/view/observer/bubblingeventinfo.js +71 -0
  86. package/src/view/observer/clickobserver.js +46 -0
  87. package/src/view/observer/compositionobserver.js +79 -0
  88. package/src/view/observer/domeventdata.js +82 -0
  89. package/src/view/observer/domeventobserver.js +99 -0
  90. package/src/view/observer/fakeselectionobserver.js +118 -0
  91. package/src/view/observer/focusobserver.js +106 -0
  92. package/src/view/observer/inputobserver.js +44 -0
  93. package/src/view/observer/keyobserver.js +83 -0
  94. package/src/view/observer/mouseobserver.js +56 -0
  95. package/src/view/observer/mutationobserver.js +345 -0
  96. package/src/view/observer/observer.js +118 -0
  97. package/src/view/observer/selectionobserver.js +242 -0
  98. package/src/view/placeholder.js +285 -0
  99. package/src/view/position.js +426 -0
  100. package/src/view/range.js +533 -0
  101. package/src/view/rawelement.js +148 -0
  102. package/src/view/renderer.js +1037 -0
  103. package/src/view/rooteditableelement.js +107 -0
  104. package/src/view/selection.js +718 -0
  105. package/src/view/styles/background.js +73 -0
  106. package/src/view/styles/border.js +362 -0
  107. package/src/view/styles/margin.js +41 -0
  108. package/src/view/styles/padding.js +40 -0
  109. package/src/view/styles/utils.js +277 -0
  110. package/src/view/stylesmap.js +938 -0
  111. package/src/view/text.js +147 -0
  112. package/src/view/textproxy.js +199 -0
  113. package/src/view/treewalker.js +496 -0
  114. package/src/view/uielement.js +238 -0
  115. package/src/view/upcastwriter.js +484 -0
  116. package/src/view/view.js +721 -0
  117. package/theme/placeholder.css +27 -0
@@ -0,0 +1,118 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+
6
+ /**
7
+ * @module engine/view/observer/fakeselectionobserver
8
+ */
9
+
10
+ import Observer from './observer';
11
+ import ViewSelection from '../selection';
12
+ import { keyCodes } from '@ckeditor/ckeditor5-utils/src/keyboard';
13
+ import { debounce } from 'lodash-es';
14
+
15
+ /**
16
+ * Fake selection observer class. If view selection is fake it is placed in dummy DOM container. This observer listens
17
+ * on {@link module:engine/view/document~Document#event:keydown keydown} events and handles moving fake view selection to the correct place
18
+ * if arrow keys are pressed.
19
+ * Fires {@link module:engine/view/document~Document#event:selectionChange selectionChange event} simulating natural behaviour of
20
+ * {@link module:engine/view/observer/selectionobserver~SelectionObserver SelectionObserver}.
21
+ *
22
+ * @extends module:engine/view/observer/observer~Observer
23
+ */
24
+ export default class FakeSelectionObserver extends Observer {
25
+ /**
26
+ * Creates new FakeSelectionObserver instance.
27
+ *
28
+ * @param {module:engine/view/view~View} view
29
+ */
30
+ constructor( view ) {
31
+ super( view );
32
+
33
+ /**
34
+ * Fires debounced event `selectionChangeDone`. It uses `lodash#debounce` method to delay function call.
35
+ *
36
+ * @private
37
+ * @param {Object} data Selection change data.
38
+ * @method #_fireSelectionChangeDoneDebounced
39
+ */
40
+ this._fireSelectionChangeDoneDebounced = debounce( data => this.document.fire( 'selectionChangeDone', data ), 200 );
41
+ }
42
+
43
+ /**
44
+ * @inheritDoc
45
+ */
46
+ observe() {
47
+ const document = this.document;
48
+
49
+ document.on( 'arrowKey', ( eventInfo, data ) => {
50
+ const selection = document.selection;
51
+
52
+ if ( selection.isFake && this.isEnabled ) {
53
+ // Prevents default key down handling - no selection change will occur.
54
+ data.preventDefault();
55
+ }
56
+ }, { context: '$capture' } );
57
+
58
+ document.on( 'arrowKey', ( eventInfo, data ) => {
59
+ const selection = document.selection;
60
+
61
+ if ( selection.isFake && this.isEnabled ) {
62
+ this._handleSelectionMove( data.keyCode );
63
+ }
64
+ }, { priority: 'lowest' } );
65
+ }
66
+
67
+ /**
68
+ * @inheritDoc
69
+ */
70
+ destroy() {
71
+ super.destroy();
72
+
73
+ this._fireSelectionChangeDoneDebounced.cancel();
74
+ }
75
+
76
+ /**
77
+ * Handles collapsing view selection according to given key code. If left or up key is provided - new selection will be
78
+ * collapsed to left. If right or down key is pressed - new selection will be collapsed to right.
79
+ *
80
+ * This method fires {@link module:engine/view/document~Document#event:selectionChange} and
81
+ * {@link module:engine/view/document~Document#event:selectionChangeDone} events imitating behaviour of
82
+ * {@link module:engine/view/observer/selectionobserver~SelectionObserver}.
83
+ *
84
+ * @private
85
+ * @param {Number} keyCode
86
+ * @fires module:engine/view/document~Document#event:selectionChange
87
+ * @fires module:engine/view/document~Document#event:selectionChangeDone
88
+ */
89
+ _handleSelectionMove( keyCode ) {
90
+ const selection = this.document.selection;
91
+ const newSelection = new ViewSelection( selection.getRanges(), { backward: selection.isBackward, fake: false } );
92
+
93
+ // Left or up arrow pressed - move selection to start.
94
+ if ( keyCode == keyCodes.arrowleft || keyCode == keyCodes.arrowup ) {
95
+ newSelection.setTo( newSelection.getFirstPosition() );
96
+ }
97
+
98
+ // Right or down arrow pressed - move selection to end.
99
+ if ( keyCode == keyCodes.arrowright || keyCode == keyCodes.arrowdown ) {
100
+ newSelection.setTo( newSelection.getLastPosition() );
101
+ }
102
+
103
+ const data = {
104
+ oldSelection: selection,
105
+ newSelection,
106
+ domSelection: null
107
+ };
108
+
109
+ // Fire dummy selection change event.
110
+ this.document.fire( 'selectionChange', data );
111
+
112
+ // Call` #_fireSelectionChangeDoneDebounced` every time when `selectionChange` event is fired.
113
+ // This function is debounced what means that `selectionChangeDone` event will be fired only when
114
+ // defined int the function time will elapse since the last time the function was called.
115
+ // So `selectionChangeDone` will be fired when selection will stop changing.
116
+ this._fireSelectionChangeDoneDebounced( data );
117
+ }
118
+ }
@@ -0,0 +1,106 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+
6
+ /**
7
+ * @module engine/view/observer/focusobserver
8
+ */
9
+
10
+ /* globals setTimeout, clearTimeout */
11
+
12
+ import DomEventObserver from './domeventobserver';
13
+
14
+ /**
15
+ * {@link module:engine/view/document~Document#event:focus Focus}
16
+ * and {@link module:engine/view/document~Document#event:blur blur} events observer.
17
+ * Focus observer handle also {@link module:engine/view/rooteditableelement~RootEditableElement#isFocused isFocused} property of the
18
+ * {@link module:engine/view/rooteditableelement~RootEditableElement root elements}.
19
+ *
20
+ * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.
21
+ *
22
+ * @extends module:engine/view/observer/domeventobserver~DomEventObserver
23
+ */
24
+ export default class FocusObserver extends DomEventObserver {
25
+ constructor( view ) {
26
+ super( view );
27
+
28
+ this.domEventType = [ 'focus', 'blur' ];
29
+ this.useCapture = true;
30
+ const document = this.document;
31
+
32
+ document.on( 'focus', () => {
33
+ document.isFocused = true;
34
+
35
+ // Unfortunately native `selectionchange` event is fired asynchronously.
36
+ // We need to wait until `SelectionObserver` handle the event and then render. Otherwise rendering will
37
+ // overwrite new DOM selection with selection from the view.
38
+ // See https://github.com/ckeditor/ckeditor5-engine/issues/795 for more details.
39
+ // Long timeout is needed to solve #676 and https://github.com/ckeditor/ckeditor5-engine/issues/1157 issues.
40
+ //
41
+ // Using `view.change()` instead of `view.forceRender()` to prevent double rendering
42
+ // in a situation where `selectionchange` already caused selection change.
43
+ this._renderTimeoutId = setTimeout( () => view.change( () => {} ), 50 );
44
+ } );
45
+
46
+ document.on( 'blur', ( evt, data ) => {
47
+ const selectedEditable = document.selection.editableElement;
48
+
49
+ if ( selectedEditable === null || selectedEditable === data.target ) {
50
+ document.isFocused = false;
51
+
52
+ // Re-render the document to update view elements
53
+ // (changing document.isFocused already marked view as changed since last rendering).
54
+ view.change( () => {} );
55
+ }
56
+ } );
57
+
58
+ /**
59
+ * Identifier of the timeout currently used by focus listener to delay rendering execution.
60
+ *
61
+ * @private
62
+ * @member {Number} #_renderTimeoutId
63
+ */
64
+ }
65
+
66
+ onDomEvent( domEvent ) {
67
+ this.fire( domEvent.type, domEvent );
68
+ }
69
+
70
+ /**
71
+ * @inheritDoc
72
+ */
73
+ destroy() {
74
+ if ( this._renderTimeoutId ) {
75
+ clearTimeout( this._renderTimeoutId );
76
+ }
77
+
78
+ super.destroy();
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Fired when one of the editables gets focus.
84
+ *
85
+ * Introduced by {@link module:engine/view/observer/focusobserver~FocusObserver}.
86
+ *
87
+ * Note that because {@link module:engine/view/observer/focusobserver~FocusObserver} is attached by the
88
+ * {@link module:engine/view/view~View} this event is available by default.
89
+ *
90
+ * @see module:engine/view/observer/focusobserver~FocusObserver
91
+ * @event module:engine/view/document~Document#event:focus
92
+ * @param {module:engine/view/observer/domeventdata~DomEventData} data Event data.
93
+ */
94
+
95
+ /**
96
+ * Fired when one of the editables loses focus.
97
+ *
98
+ * Introduced by {@link module:engine/view/observer/focusobserver~FocusObserver}.
99
+ *
100
+ * Note that because {@link module:engine/view/observer/focusobserver~FocusObserver} is attached by the
101
+ * {@link module:engine/view/view~View} this event is available by default.
102
+ *
103
+ * @see module:engine/view/observer/focusobserver~FocusObserver
104
+ * @event module:engine/view/document~Document#event:blur
105
+ * @param {module:engine/view/observer/domeventdata~DomEventData} data Event data.
106
+ */
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
3
+ * For licensing, see LICENSE.md.
4
+ */
5
+
6
+ /**
7
+ * @module engine/view/observer/inputobserver
8
+ */
9
+
10
+ import DomEventObserver from './domeventobserver';
11
+
12
+ /**
13
+ * Observer for events connected with data input.
14
+ *
15
+ * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.
16
+ *
17
+ * @extends module:engine/view/observer/domeventobserver~DomEventObserver
18
+ */
19
+ export default class InputObserver extends DomEventObserver {
20
+ constructor( view ) {
21
+ super( view );
22
+
23
+ this.domEventType = [ 'beforeinput' ];
24
+ }
25
+
26
+ onDomEvent( domEvent ) {
27
+ this.fire( domEvent.type, domEvent );
28
+ }
29
+ }
30
+
31
+ /**
32
+ * Fired before browser inputs (or deletes) some data.
33
+ *
34
+ * This event is available only on browsers which support DOM `beforeinput` event.
35
+ *
36
+ * Introduced by {@link module:engine/view/observer/inputobserver~InputObserver}.
37
+ *
38
+ * Note that because {@link module:engine/view/observer/inputobserver~InputObserver} is attached by the
39
+ * {@link module:engine/view/view~View} this event is available by default.
40
+ *
41
+ * @see module:engine/view/observer/inputobserver~InputObserver
42
+ * @event module:engine/view/document~Document#event:beforeinput
43
+ * @param {module:engine/view/observer/domeventdata~DomEventData} data Event data.
44
+ */
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+
6
+ /**
7
+ * @module engine/view/observer/keyobserver
8
+ */
9
+
10
+ import DomEventObserver from './domeventobserver';
11
+ import { getCode } from '@ckeditor/ckeditor5-utils/src/keyboard';
12
+
13
+ /**
14
+ * Observer for events connected with pressing keyboard keys.
15
+ *
16
+ * Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.
17
+ *
18
+ * @extends module:engine/view/observer/domeventobserver~DomEventObserver
19
+ */
20
+ export default class KeyObserver extends DomEventObserver {
21
+ constructor( view ) {
22
+ super( view );
23
+
24
+ this.domEventType = [ 'keydown', 'keyup' ];
25
+ }
26
+
27
+ onDomEvent( domEvt ) {
28
+ this.fire( domEvt.type, domEvt, {
29
+ keyCode: domEvt.keyCode,
30
+
31
+ altKey: domEvt.altKey,
32
+ ctrlKey: domEvt.ctrlKey,
33
+ shiftKey: domEvt.shiftKey,
34
+ metaKey: domEvt.metaKey,
35
+
36
+ get keystroke() {
37
+ return getCode( this );
38
+ }
39
+ } );
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Fired when a key has been pressed.
45
+ *
46
+ * Introduced by {@link module:engine/view/observer/keyobserver~KeyObserver}.
47
+ *
48
+ * Note that because {@link module:engine/view/observer/keyobserver~KeyObserver} is attached by the
49
+ * {@link module:engine/view/view~View} this event is available by default.
50
+ *
51
+ * @see module:engine/view/observer/keyobserver~KeyObserver
52
+ * @event module:engine/view/document~Document#event:keydown
53
+ * @param {module:engine/view/observer/keyobserver~KeyEventData} keyEventData
54
+ */
55
+
56
+ /**
57
+ * Fired when a key has been released.
58
+ *
59
+ * Introduced by {@link module:engine/view/observer/keyobserver~KeyObserver}.
60
+ *
61
+ * Note that because {@link module:engine/view/observer/keyobserver~KeyObserver} is attached by the
62
+ * {@link module:engine/view/view~View} this event is available by default.
63
+ *
64
+ * @see module:engine/view/observer/keyobserver~KeyObserver
65
+ * @event module:engine/view/document~Document#event:keyup
66
+ * @param {module:engine/view/observer/keyobserver~KeyEventData} keyEventData
67
+ */
68
+
69
+ /**
70
+ * The value of both events - {@link module:engine/view/document~Document#event:keydown} and
71
+ * {@link module:engine/view/document~Document#event:keyup}.
72
+ *
73
+ * @class module:engine/view/observer/keyobserver~KeyEventData
74
+ * @extends module:engine/view/observer/domeventdata~DomEventData
75
+ * @implements module:utils/keyboard~KeystrokeInfo
76
+ */
77
+
78
+ /**
79
+ * Code of the whole keystroke. See {@link module:utils/keyboard~getCode}.
80
+ *
81
+ * @readonly
82
+ * @member {Number} module:engine/view/observer/keyobserver~KeyEventData#keystroke
83
+ */
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2021, CKSource - Frederico Knabben. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+
6
+ /**
7
+ * @module engine/view/observer/mouseobserver
8
+ */
9
+
10
+ import DomEventObserver from './domeventobserver';
11
+
12
+ /**
13
+ * Mouse events observer.
14
+ *
15
+ * Note that this observer is not available by default. To make it available it needs to be added to
16
+ * {@link module:engine/view/view~View} by {@link module:engine/view/view~View#addObserver} method.
17
+ *
18
+ * @extends module:engine/view/observer/domeventobserver~DomEventObserver
19
+ */
20
+ export default class MouseObserver extends DomEventObserver {
21
+ constructor( view ) {
22
+ super( view );
23
+
24
+ this.domEventType = [ 'mousedown', 'mouseup', 'mouseover', 'mouseout' ];
25
+ }
26
+
27
+ onDomEvent( domEvent ) {
28
+ this.fire( domEvent.type, domEvent );
29
+ }
30
+ }
31
+
32
+ /**
33
+ * Fired when the mouse button is pressed down on one of the editing roots of the editor.
34
+ *
35
+ * Introduced by {@link module:engine/view/observer/mouseobserver~MouseObserver}.
36
+ *
37
+ * Note that this event is not available by default. To make it available, {@link module:engine/view/observer/mouseobserver~MouseObserver}
38
+ * needs to be added to {@link module:engine/view/view~View} by the {@link module:engine/view/view~View#addObserver} method.
39
+ *
40
+ * @see module:engine/view/observer/mouseobserver~MouseObserver
41
+ * @event module:engine/view/document~Document#event:mousedown
42
+ * @param {module:engine/view/observer/domeventdata~DomEventData} data The event data.
43
+ */
44
+
45
+ /**
46
+ * Fired when the mouse button is released over one of the editing roots of the editor.
47
+ *
48
+ * Introduced by {@link module:engine/view/observer/mouseobserver~MouseObserver}.
49
+ *
50
+ * Note that this event is not available by default. To make it available, {@link module:engine/view/observer/mouseobserver~MouseObserver}
51
+ * needs to be added to {@link module:engine/view/view~View} by the {@link module:engine/view/view~View#addObserver} method.
52
+ *
53
+ * @see module:engine/view/observer/mouseobserver~MouseObserver
54
+ * @event module:engine/view/document~Document#event:mouseup
55
+ * @param {module:engine/view/observer/domeventdata~DomEventData} data The event data.
56
+ */