@ckeditor/ckeditor5-engine 40.0.0 → 40.1.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/LICENSE.md +3 -3
- package/package.json +2 -2
- package/src/controller/datacontroller.d.ts +334 -334
- package/src/controller/datacontroller.js +481 -481
- package/src/controller/editingcontroller.d.ts +98 -98
- package/src/controller/editingcontroller.js +191 -191
- package/src/conversion/conversion.d.ts +478 -478
- package/src/conversion/conversion.js +601 -601
- package/src/conversion/conversionhelpers.d.ts +26 -26
- package/src/conversion/conversionhelpers.js +32 -32
- package/src/conversion/downcastdispatcher.d.ts +562 -562
- package/src/conversion/downcastdispatcher.js +547 -547
- package/src/conversion/downcasthelpers.d.ts +1226 -1226
- package/src/conversion/downcasthelpers.js +2178 -2183
- package/src/conversion/mapper.d.ts +503 -503
- package/src/conversion/mapper.js +536 -536
- package/src/conversion/modelconsumable.d.ts +201 -201
- package/src/conversion/modelconsumable.js +333 -333
- package/src/conversion/upcastdispatcher.d.ts +492 -492
- package/src/conversion/upcastdispatcher.js +460 -460
- package/src/conversion/upcasthelpers.d.ts +499 -499
- package/src/conversion/upcasthelpers.js +950 -950
- package/src/conversion/viewconsumable.d.ts +369 -369
- package/src/conversion/viewconsumable.js +536 -532
- package/src/dataprocessor/basichtmlwriter.d.ts +18 -18
- package/src/dataprocessor/basichtmlwriter.js +20 -19
- package/src/dataprocessor/dataprocessor.d.ts +61 -61
- package/src/dataprocessor/dataprocessor.js +5 -5
- package/src/dataprocessor/htmldataprocessor.d.ts +76 -76
- package/src/dataprocessor/htmldataprocessor.js +96 -96
- package/src/dataprocessor/htmlwriter.d.ts +16 -16
- package/src/dataprocessor/htmlwriter.js +5 -5
- package/src/dataprocessor/xmldataprocessor.d.ts +90 -90
- package/src/dataprocessor/xmldataprocessor.js +108 -108
- package/src/dev-utils/model.d.ts +124 -124
- package/src/dev-utils/model.js +395 -395
- package/src/dev-utils/operationreplayer.d.ts +51 -51
- package/src/dev-utils/operationreplayer.js +112 -112
- package/src/dev-utils/utils.d.ts +37 -37
- package/src/dev-utils/utils.js +73 -73
- package/src/dev-utils/view.d.ts +319 -319
- package/src/dev-utils/view.js +967 -967
- package/src/index.d.ts +114 -114
- package/src/index.js +78 -78
- package/src/model/batch.d.ts +106 -106
- package/src/model/batch.js +96 -96
- package/src/model/differ.d.ts +387 -387
- package/src/model/differ.js +1149 -1149
- package/src/model/document.d.ts +272 -272
- package/src/model/document.js +360 -361
- package/src/model/documentfragment.d.ts +200 -200
- package/src/model/documentfragment.js +306 -306
- package/src/model/documentselection.d.ts +420 -420
- package/src/model/documentselection.js +993 -993
- package/src/model/element.d.ts +165 -165
- package/src/model/element.js +281 -281
- package/src/model/history.d.ts +114 -114
- package/src/model/history.js +207 -207
- package/src/model/item.d.ts +14 -14
- package/src/model/item.js +5 -5
- package/src/model/liveposition.d.ts +77 -77
- package/src/model/liveposition.js +93 -93
- package/src/model/liverange.d.ts +102 -102
- package/src/model/liverange.js +120 -120
- package/src/model/markercollection.d.ts +335 -335
- package/src/model/markercollection.js +403 -403
- package/src/model/model.d.ts +919 -919
- package/src/model/model.js +842 -842
- package/src/model/node.d.ts +256 -256
- package/src/model/node.js +375 -375
- package/src/model/nodelist.d.ts +91 -91
- package/src/model/nodelist.js +163 -163
- package/src/model/operation/attributeoperation.d.ts +103 -103
- package/src/model/operation/attributeoperation.js +148 -148
- package/src/model/operation/detachoperation.d.ts +60 -60
- package/src/model/operation/detachoperation.js +77 -77
- package/src/model/operation/insertoperation.d.ts +90 -90
- package/src/model/operation/insertoperation.js +135 -135
- package/src/model/operation/markeroperation.d.ts +91 -91
- package/src/model/operation/markeroperation.js +107 -107
- package/src/model/operation/mergeoperation.d.ts +100 -100
- package/src/model/operation/mergeoperation.js +167 -167
- package/src/model/operation/moveoperation.d.ts +96 -96
- package/src/model/operation/moveoperation.js +164 -164
- package/src/model/operation/nooperation.d.ts +38 -38
- package/src/model/operation/nooperation.js +48 -48
- package/src/model/operation/operation.d.ts +96 -96
- package/src/model/operation/operation.js +59 -62
- package/src/model/operation/operationfactory.d.ts +18 -18
- package/src/model/operation/operationfactory.js +44 -44
- package/src/model/operation/renameoperation.d.ts +83 -83
- package/src/model/operation/renameoperation.js +115 -115
- package/src/model/operation/rootattributeoperation.d.ts +98 -98
- package/src/model/operation/rootattributeoperation.js +155 -155
- package/src/model/operation/rootoperation.d.ts +76 -76
- package/src/model/operation/rootoperation.js +90 -90
- package/src/model/operation/splitoperation.d.ts +109 -109
- package/src/model/operation/splitoperation.js +194 -194
- package/src/model/operation/transform.d.ts +100 -100
- package/src/model/operation/transform.js +1985 -1985
- package/src/model/operation/utils.d.ts +71 -71
- package/src/model/operation/utils.js +217 -213
- package/src/model/position.d.ts +539 -539
- package/src/model/position.js +979 -979
- package/src/model/range.d.ts +458 -458
- package/src/model/range.js +875 -875
- package/src/model/rootelement.d.ts +60 -60
- package/src/model/rootelement.js +74 -74
- package/src/model/schema.d.ts +1186 -1186
- package/src/model/schema.js +1242 -1242
- package/src/model/selection.d.ts +482 -482
- package/src/model/selection.js +789 -789
- package/src/model/text.d.ts +66 -66
- package/src/model/text.js +85 -85
- package/src/model/textproxy.d.ts +144 -144
- package/src/model/textproxy.js +189 -189
- package/src/model/treewalker.d.ts +186 -186
- package/src/model/treewalker.js +244 -244
- package/src/model/typecheckable.d.ts +285 -285
- package/src/model/typecheckable.js +16 -16
- package/src/model/utils/autoparagraphing.d.ts +37 -37
- package/src/model/utils/autoparagraphing.js +63 -63
- package/src/model/utils/deletecontent.d.ts +58 -58
- package/src/model/utils/deletecontent.js +488 -488
- package/src/model/utils/findoptimalinsertionrange.d.ts +32 -32
- package/src/model/utils/findoptimalinsertionrange.js +57 -57
- package/src/model/utils/getselectedcontent.d.ts +30 -30
- package/src/model/utils/getselectedcontent.js +125 -125
- package/src/model/utils/insertcontent.d.ts +46 -46
- package/src/model/utils/insertcontent.js +705 -705
- package/src/model/utils/insertobject.d.ts +44 -44
- package/src/model/utils/insertobject.js +139 -139
- package/src/model/utils/modifyselection.d.ts +48 -48
- package/src/model/utils/modifyselection.js +186 -186
- package/src/model/utils/selection-post-fixer.d.ts +74 -74
- package/src/model/utils/selection-post-fixer.js +260 -260
- package/src/model/writer.d.ts +851 -851
- package/src/model/writer.js +1306 -1306
- package/src/view/attributeelement.d.ts +108 -108
- package/src/view/attributeelement.js +184 -184
- package/src/view/containerelement.d.ts +49 -49
- package/src/view/containerelement.js +80 -80
- package/src/view/datatransfer.d.ts +79 -79
- package/src/view/datatransfer.js +98 -98
- package/src/view/document.d.ts +184 -184
- package/src/view/document.js +122 -120
- package/src/view/documentfragment.d.ts +153 -149
- package/src/view/documentfragment.js +234 -228
- package/src/view/documentselection.d.ts +306 -306
- package/src/view/documentselection.js +256 -256
- package/src/view/domconverter.d.ts +652 -640
- package/src/view/domconverter.js +1473 -1450
- package/src/view/downcastwriter.d.ts +996 -996
- package/src/view/downcastwriter.js +1696 -1696
- package/src/view/editableelement.d.ts +62 -62
- package/src/view/editableelement.js +62 -62
- package/src/view/element.d.ts +468 -468
- package/src/view/element.js +724 -724
- package/src/view/elementdefinition.d.ts +87 -87
- package/src/view/elementdefinition.js +5 -5
- package/src/view/emptyelement.d.ts +41 -41
- package/src/view/emptyelement.js +73 -73
- package/src/view/filler.d.ts +111 -111
- package/src/view/filler.js +150 -150
- package/src/view/item.d.ts +14 -14
- package/src/view/item.js +5 -5
- package/src/view/matcher.d.ts +486 -486
- package/src/view/matcher.js +507 -507
- package/src/view/node.d.ts +163 -163
- package/src/view/node.js +228 -228
- package/src/view/observer/arrowkeysobserver.d.ts +45 -45
- package/src/view/observer/arrowkeysobserver.js +40 -40
- package/src/view/observer/bubblingemittermixin.d.ts +166 -166
- package/src/view/observer/bubblingemittermixin.js +172 -172
- package/src/view/observer/bubblingeventinfo.d.ts +47 -47
- package/src/view/observer/bubblingeventinfo.js +37 -37
- package/src/view/observer/clickobserver.d.ts +43 -43
- package/src/view/observer/clickobserver.js +29 -29
- package/src/view/observer/compositionobserver.d.ts +82 -82
- package/src/view/observer/compositionobserver.js +60 -60
- package/src/view/observer/domeventdata.d.ts +50 -50
- package/src/view/observer/domeventdata.js +47 -47
- package/src/view/observer/domeventobserver.d.ts +73 -73
- package/src/view/observer/domeventobserver.js +79 -79
- package/src/view/observer/fakeselectionobserver.d.ts +47 -47
- package/src/view/observer/fakeselectionobserver.js +91 -91
- package/src/view/observer/focusobserver.d.ts +82 -82
- package/src/view/observer/focusobserver.js +86 -86
- package/src/view/observer/inputobserver.d.ts +86 -86
- package/src/view/observer/inputobserver.js +164 -164
- package/src/view/observer/keyobserver.d.ts +66 -66
- package/src/view/observer/keyobserver.js +39 -39
- package/src/view/observer/mouseobserver.d.ts +89 -89
- package/src/view/observer/mouseobserver.js +29 -29
- package/src/view/observer/mutationobserver.d.ts +86 -86
- package/src/view/observer/mutationobserver.js +206 -206
- package/src/view/observer/observer.d.ts +89 -89
- package/src/view/observer/observer.js +84 -84
- package/src/view/observer/selectionobserver.d.ts +148 -148
- package/src/view/observer/selectionobserver.js +202 -202
- package/src/view/observer/tabobserver.d.ts +46 -46
- package/src/view/observer/tabobserver.js +42 -42
- package/src/view/placeholder.d.ts +96 -96
- package/src/view/placeholder.js +267 -267
- package/src/view/position.d.ts +189 -189
- package/src/view/position.js +324 -324
- package/src/view/range.d.ts +279 -279
- package/src/view/range.js +430 -430
- package/src/view/rawelement.d.ts +73 -73
- package/src/view/rawelement.js +105 -105
- package/src/view/renderer.d.ts +265 -265
- package/src/view/renderer.js +1000 -999
- package/src/view/rooteditableelement.d.ts +41 -41
- package/src/view/rooteditableelement.js +69 -69
- package/src/view/selection.d.ts +375 -375
- package/src/view/selection.js +559 -559
- package/src/view/styles/background.d.ts +33 -33
- package/src/view/styles/background.js +74 -74
- package/src/view/styles/border.d.ts +43 -43
- package/src/view/styles/border.js +316 -316
- package/src/view/styles/margin.d.ts +29 -29
- package/src/view/styles/margin.js +34 -34
- package/src/view/styles/padding.d.ts +29 -29
- package/src/view/styles/padding.js +34 -34
- package/src/view/styles/utils.d.ts +93 -93
- package/src/view/styles/utils.js +219 -219
- package/src/view/stylesmap.d.ts +675 -675
- package/src/view/stylesmap.js +765 -766
- package/src/view/text.d.ts +74 -74
- package/src/view/text.js +93 -93
- package/src/view/textproxy.d.ts +97 -97
- package/src/view/textproxy.js +124 -124
- package/src/view/treewalker.d.ts +195 -195
- package/src/view/treewalker.js +327 -327
- package/src/view/typecheckable.d.ts +448 -448
- package/src/view/typecheckable.js +19 -19
- package/src/view/uielement.d.ts +96 -96
- package/src/view/uielement.js +183 -182
- package/src/view/upcastwriter.d.ts +417 -417
- package/src/view/upcastwriter.js +359 -359
- package/src/view/view.d.ts +487 -487
- package/src/view/view.js +546 -546
|
@@ -1,164 +1,164 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
-
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* @module engine/view/observer/inputobserver
|
|
7
|
-
*/
|
|
8
|
-
import DomEventObserver from './domeventobserver';
|
|
9
|
-
import DataTransfer from '../datatransfer';
|
|
10
|
-
import { env } from '@ckeditor/ckeditor5-utils';
|
|
11
|
-
/**
|
|
12
|
-
* Observer for events connected with data input.
|
|
13
|
-
*
|
|
14
|
-
* **Note**: This observer is attached by {@link module:engine/view/view~View} and available by default in all
|
|
15
|
-
* editor instances.
|
|
16
|
-
*/
|
|
17
|
-
export default class InputObserver extends DomEventObserver {
|
|
18
|
-
constructor() {
|
|
19
|
-
super(...arguments);
|
|
20
|
-
/**
|
|
21
|
-
* @inheritDoc
|
|
22
|
-
*/
|
|
23
|
-
this.domEventType = 'beforeinput';
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* @inheritDoc
|
|
27
|
-
*/
|
|
28
|
-
onDomEvent(domEvent) {
|
|
29
|
-
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
30
|
-
// @if CK_DEBUG_TYPING // console.group( `%c[InputObserver]%c ${ domEvent.type }: ${ domEvent.inputType }`,
|
|
31
|
-
// @if CK_DEBUG_TYPING // 'color: green', 'color: default'
|
|
32
|
-
// @if CK_DEBUG_TYPING // );
|
|
33
|
-
// @if CK_DEBUG_TYPING // }
|
|
34
|
-
const domTargetRanges = domEvent.getTargetRanges();
|
|
35
|
-
const view = this.view;
|
|
36
|
-
const viewDocument = view.document;
|
|
37
|
-
let dataTransfer = null;
|
|
38
|
-
let data = null;
|
|
39
|
-
let targetRanges = [];
|
|
40
|
-
if (domEvent.dataTransfer) {
|
|
41
|
-
dataTransfer = new DataTransfer(domEvent.dataTransfer);
|
|
42
|
-
}
|
|
43
|
-
if (domEvent.data !== null) {
|
|
44
|
-
data = domEvent.data;
|
|
45
|
-
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
46
|
-
// @if CK_DEBUG_TYPING // console.info( `%c[InputObserver]%c event data: %c${ JSON.stringify( data ) }`,
|
|
47
|
-
// @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', 'font-weight:bold', 'color: blue;'
|
|
48
|
-
// @if CK_DEBUG_TYPING // );
|
|
49
|
-
// @if CK_DEBUG_TYPING // }
|
|
50
|
-
}
|
|
51
|
-
else if (dataTransfer) {
|
|
52
|
-
data = dataTransfer.getData('text/plain');
|
|
53
|
-
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
54
|
-
// @if CK_DEBUG_TYPING // console.info( `%c[InputObserver]%c event data transfer: %c${ JSON.stringify( data ) }`,
|
|
55
|
-
// @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', 'font-weight:bold', 'color: blue;'
|
|
56
|
-
// @if CK_DEBUG_TYPING // );
|
|
57
|
-
// @if CK_DEBUG_TYPING // }
|
|
58
|
-
}
|
|
59
|
-
// If the editor selection is fake (an object is selected), the DOM range does not make sense because it is anchored
|
|
60
|
-
// in the fake selection container.
|
|
61
|
-
if (viewDocument.selection.isFake) {
|
|
62
|
-
// Future-proof: in case of multi-range fake selections being possible.
|
|
63
|
-
targetRanges = Array.from(viewDocument.selection.getRanges());
|
|
64
|
-
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
65
|
-
// @if CK_DEBUG_TYPING // console.info( '%c[InputObserver]%c using fake selection:',
|
|
66
|
-
// @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', 'font-weight:bold', targetRanges,
|
|
67
|
-
// @if CK_DEBUG_TYPING // viewDocument.selection.isFake ? 'fake view selection' : 'fake DOM parent'
|
|
68
|
-
// @if CK_DEBUG_TYPING // );
|
|
69
|
-
// @if CK_DEBUG_TYPING // }
|
|
70
|
-
}
|
|
71
|
-
else if (domTargetRanges.length) {
|
|
72
|
-
targetRanges = domTargetRanges.map(domRange => {
|
|
73
|
-
// Sometimes browser provides range that starts before editable node.
|
|
74
|
-
// We try to fall back to collapsed range at the valid end position.
|
|
75
|
-
// See https://github.com/ckeditor/ckeditor5/issues/14411.
|
|
76
|
-
// See https://github.com/ckeditor/ckeditor5/issues/14050.
|
|
77
|
-
const viewStart = view.domConverter.domPositionToView(domRange.startContainer, domRange.startOffset);
|
|
78
|
-
const viewEnd = view.domConverter.domPositionToView(domRange.endContainer, domRange.endOffset);
|
|
79
|
-
if (viewStart) {
|
|
80
|
-
return view.createRange(viewStart, viewEnd);
|
|
81
|
-
}
|
|
82
|
-
else if (viewEnd) {
|
|
83
|
-
return view.createRange(viewEnd);
|
|
84
|
-
}
|
|
85
|
-
}).filter((range) => !!range);
|
|
86
|
-
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
87
|
-
// @if CK_DEBUG_TYPING // console.info( '%c[InputObserver]%c using target ranges:',
|
|
88
|
-
// @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', 'font-weight:bold', targetRanges
|
|
89
|
-
// @if CK_DEBUG_TYPING // );
|
|
90
|
-
// @if CK_DEBUG_TYPING // }
|
|
91
|
-
}
|
|
92
|
-
// For Android devices we use a fallback to the current DOM selection, Android modifies it according
|
|
93
|
-
// to the expected target ranges of input event.
|
|
94
|
-
else if (env.isAndroid) {
|
|
95
|
-
const domSelection = domEvent.target.ownerDocument.defaultView.getSelection();
|
|
96
|
-
targetRanges = Array.from(view.domConverter.domSelectionToView(domSelection).getRanges());
|
|
97
|
-
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
98
|
-
// @if CK_DEBUG_TYPING // console.info( '%c[InputObserver]%c using selection ranges:',
|
|
99
|
-
// @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', 'font-weight:bold', targetRanges
|
|
100
|
-
// @if CK_DEBUG_TYPING // );
|
|
101
|
-
// @if CK_DEBUG_TYPING // }
|
|
102
|
-
}
|
|
103
|
-
// Android sometimes fires insertCompositionText with a new-line character at the end of the data
|
|
104
|
-
// instead of firing insertParagraph beforeInput event.
|
|
105
|
-
// Fire the correct type of beforeInput event and ignore the replaced fragment of text because
|
|
106
|
-
// it wants to replace "test" with "test\n".
|
|
107
|
-
// https://github.com/ckeditor/ckeditor5/issues/12368.
|
|
108
|
-
if (env.isAndroid && domEvent.inputType == 'insertCompositionText' && data && data.endsWith('\n')) {
|
|
109
|
-
this.fire(domEvent.type, domEvent, {
|
|
110
|
-
inputType: 'insertParagraph',
|
|
111
|
-
targetRanges: [view.createRange(targetRanges[0].end)]
|
|
112
|
-
});
|
|
113
|
-
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
114
|
-
// @if CK_DEBUG_TYPING // console.groupEnd();
|
|
115
|
-
// @if CK_DEBUG_TYPING // }
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
// Normalize the insertText data that includes new-line characters.
|
|
119
|
-
// https://github.com/ckeditor/ckeditor5/issues/2045.
|
|
120
|
-
if (domEvent.inputType == 'insertText' && data && data.includes('\n')) {
|
|
121
|
-
// There might be a single new-line or double for new paragraph, but we translate
|
|
122
|
-
// it to paragraphs as it is our default action for enter handling.
|
|
123
|
-
const parts = data.split(/\n{1,2}/g);
|
|
124
|
-
let partTargetRanges = targetRanges;
|
|
125
|
-
for (let i = 0; i < parts.length; i++) {
|
|
126
|
-
const dataPart = parts[i];
|
|
127
|
-
if (dataPart != '') {
|
|
128
|
-
this.fire(domEvent.type, domEvent, {
|
|
129
|
-
data: dataPart,
|
|
130
|
-
dataTransfer,
|
|
131
|
-
targetRanges: partTargetRanges,
|
|
132
|
-
inputType: domEvent.inputType,
|
|
133
|
-
isComposing: domEvent.isComposing
|
|
134
|
-
});
|
|
135
|
-
// Use the result view selection so following events will be added one after another.
|
|
136
|
-
partTargetRanges = [viewDocument.selection.getFirstRange()];
|
|
137
|
-
}
|
|
138
|
-
if (i + 1 < parts.length) {
|
|
139
|
-
this.fire(domEvent.type, domEvent, {
|
|
140
|
-
inputType: 'insertParagraph',
|
|
141
|
-
targetRanges: partTargetRanges
|
|
142
|
-
});
|
|
143
|
-
// Use the result view selection so following events will be added one after another.
|
|
144
|
-
partTargetRanges = [viewDocument.selection.getFirstRange()];
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
148
|
-
// @if CK_DEBUG_TYPING // console.groupEnd();
|
|
149
|
-
// @if CK_DEBUG_TYPING // }
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
// Fire the normalized beforeInput event.
|
|
153
|
-
this.fire(domEvent.type, domEvent, {
|
|
154
|
-
data,
|
|
155
|
-
dataTransfer,
|
|
156
|
-
targetRanges,
|
|
157
|
-
inputType: domEvent.inputType,
|
|
158
|
-
isComposing: domEvent.isComposing
|
|
159
|
-
});
|
|
160
|
-
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
161
|
-
// @if CK_DEBUG_TYPING // console.groupEnd();
|
|
162
|
-
// @if CK_DEBUG_TYPING // }
|
|
163
|
-
}
|
|
164
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @module engine/view/observer/inputobserver
|
|
7
|
+
*/
|
|
8
|
+
import DomEventObserver from './domeventobserver';
|
|
9
|
+
import DataTransfer from '../datatransfer';
|
|
10
|
+
import { env } from '@ckeditor/ckeditor5-utils';
|
|
11
|
+
/**
|
|
12
|
+
* Observer for events connected with data input.
|
|
13
|
+
*
|
|
14
|
+
* **Note**: This observer is attached by {@link module:engine/view/view~View} and available by default in all
|
|
15
|
+
* editor instances.
|
|
16
|
+
*/
|
|
17
|
+
export default class InputObserver extends DomEventObserver {
|
|
18
|
+
constructor() {
|
|
19
|
+
super(...arguments);
|
|
20
|
+
/**
|
|
21
|
+
* @inheritDoc
|
|
22
|
+
*/
|
|
23
|
+
this.domEventType = 'beforeinput';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* @inheritDoc
|
|
27
|
+
*/
|
|
28
|
+
onDomEvent(domEvent) {
|
|
29
|
+
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
30
|
+
// @if CK_DEBUG_TYPING // console.group( `%c[InputObserver]%c ${ domEvent.type }: ${ domEvent.inputType }`,
|
|
31
|
+
// @if CK_DEBUG_TYPING // 'color: green', 'color: default'
|
|
32
|
+
// @if CK_DEBUG_TYPING // );
|
|
33
|
+
// @if CK_DEBUG_TYPING // }
|
|
34
|
+
const domTargetRanges = domEvent.getTargetRanges();
|
|
35
|
+
const view = this.view;
|
|
36
|
+
const viewDocument = view.document;
|
|
37
|
+
let dataTransfer = null;
|
|
38
|
+
let data = null;
|
|
39
|
+
let targetRanges = [];
|
|
40
|
+
if (domEvent.dataTransfer) {
|
|
41
|
+
dataTransfer = new DataTransfer(domEvent.dataTransfer);
|
|
42
|
+
}
|
|
43
|
+
if (domEvent.data !== null) {
|
|
44
|
+
data = domEvent.data;
|
|
45
|
+
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
46
|
+
// @if CK_DEBUG_TYPING // console.info( `%c[InputObserver]%c event data: %c${ JSON.stringify( data ) }`,
|
|
47
|
+
// @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', 'font-weight:bold', 'color: blue;'
|
|
48
|
+
// @if CK_DEBUG_TYPING // );
|
|
49
|
+
// @if CK_DEBUG_TYPING // }
|
|
50
|
+
}
|
|
51
|
+
else if (dataTransfer) {
|
|
52
|
+
data = dataTransfer.getData('text/plain');
|
|
53
|
+
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
54
|
+
// @if CK_DEBUG_TYPING // console.info( `%c[InputObserver]%c event data transfer: %c${ JSON.stringify( data ) }`,
|
|
55
|
+
// @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', 'font-weight:bold', 'color: blue;'
|
|
56
|
+
// @if CK_DEBUG_TYPING // );
|
|
57
|
+
// @if CK_DEBUG_TYPING // }
|
|
58
|
+
}
|
|
59
|
+
// If the editor selection is fake (an object is selected), the DOM range does not make sense because it is anchored
|
|
60
|
+
// in the fake selection container.
|
|
61
|
+
if (viewDocument.selection.isFake) {
|
|
62
|
+
// Future-proof: in case of multi-range fake selections being possible.
|
|
63
|
+
targetRanges = Array.from(viewDocument.selection.getRanges());
|
|
64
|
+
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
65
|
+
// @if CK_DEBUG_TYPING // console.info( '%c[InputObserver]%c using fake selection:',
|
|
66
|
+
// @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', 'font-weight:bold', targetRanges,
|
|
67
|
+
// @if CK_DEBUG_TYPING // viewDocument.selection.isFake ? 'fake view selection' : 'fake DOM parent'
|
|
68
|
+
// @if CK_DEBUG_TYPING // );
|
|
69
|
+
// @if CK_DEBUG_TYPING // }
|
|
70
|
+
}
|
|
71
|
+
else if (domTargetRanges.length) {
|
|
72
|
+
targetRanges = domTargetRanges.map(domRange => {
|
|
73
|
+
// Sometimes browser provides range that starts before editable node.
|
|
74
|
+
// We try to fall back to collapsed range at the valid end position.
|
|
75
|
+
// See https://github.com/ckeditor/ckeditor5/issues/14411.
|
|
76
|
+
// See https://github.com/ckeditor/ckeditor5/issues/14050.
|
|
77
|
+
const viewStart = view.domConverter.domPositionToView(domRange.startContainer, domRange.startOffset);
|
|
78
|
+
const viewEnd = view.domConverter.domPositionToView(domRange.endContainer, domRange.endOffset);
|
|
79
|
+
if (viewStart) {
|
|
80
|
+
return view.createRange(viewStart, viewEnd);
|
|
81
|
+
}
|
|
82
|
+
else if (viewEnd) {
|
|
83
|
+
return view.createRange(viewEnd);
|
|
84
|
+
}
|
|
85
|
+
}).filter((range) => !!range);
|
|
86
|
+
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
87
|
+
// @if CK_DEBUG_TYPING // console.info( '%c[InputObserver]%c using target ranges:',
|
|
88
|
+
// @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', 'font-weight:bold', targetRanges
|
|
89
|
+
// @if CK_DEBUG_TYPING // );
|
|
90
|
+
// @if CK_DEBUG_TYPING // }
|
|
91
|
+
}
|
|
92
|
+
// For Android devices we use a fallback to the current DOM selection, Android modifies it according
|
|
93
|
+
// to the expected target ranges of input event.
|
|
94
|
+
else if (env.isAndroid) {
|
|
95
|
+
const domSelection = domEvent.target.ownerDocument.defaultView.getSelection();
|
|
96
|
+
targetRanges = Array.from(view.domConverter.domSelectionToView(domSelection).getRanges());
|
|
97
|
+
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
98
|
+
// @if CK_DEBUG_TYPING // console.info( '%c[InputObserver]%c using selection ranges:',
|
|
99
|
+
// @if CK_DEBUG_TYPING // 'color: green;font-weight: bold', 'font-weight:bold', targetRanges
|
|
100
|
+
// @if CK_DEBUG_TYPING // );
|
|
101
|
+
// @if CK_DEBUG_TYPING // }
|
|
102
|
+
}
|
|
103
|
+
// Android sometimes fires insertCompositionText with a new-line character at the end of the data
|
|
104
|
+
// instead of firing insertParagraph beforeInput event.
|
|
105
|
+
// Fire the correct type of beforeInput event and ignore the replaced fragment of text because
|
|
106
|
+
// it wants to replace "test" with "test\n".
|
|
107
|
+
// https://github.com/ckeditor/ckeditor5/issues/12368.
|
|
108
|
+
if (env.isAndroid && domEvent.inputType == 'insertCompositionText' && data && data.endsWith('\n')) {
|
|
109
|
+
this.fire(domEvent.type, domEvent, {
|
|
110
|
+
inputType: 'insertParagraph',
|
|
111
|
+
targetRanges: [view.createRange(targetRanges[0].end)]
|
|
112
|
+
});
|
|
113
|
+
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
114
|
+
// @if CK_DEBUG_TYPING // console.groupEnd();
|
|
115
|
+
// @if CK_DEBUG_TYPING // }
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// Normalize the insertText data that includes new-line characters.
|
|
119
|
+
// https://github.com/ckeditor/ckeditor5/issues/2045.
|
|
120
|
+
if (domEvent.inputType == 'insertText' && data && data.includes('\n')) {
|
|
121
|
+
// There might be a single new-line or double for new paragraph, but we translate
|
|
122
|
+
// it to paragraphs as it is our default action for enter handling.
|
|
123
|
+
const parts = data.split(/\n{1,2}/g);
|
|
124
|
+
let partTargetRanges = targetRanges;
|
|
125
|
+
for (let i = 0; i < parts.length; i++) {
|
|
126
|
+
const dataPart = parts[i];
|
|
127
|
+
if (dataPart != '') {
|
|
128
|
+
this.fire(domEvent.type, domEvent, {
|
|
129
|
+
data: dataPart,
|
|
130
|
+
dataTransfer,
|
|
131
|
+
targetRanges: partTargetRanges,
|
|
132
|
+
inputType: domEvent.inputType,
|
|
133
|
+
isComposing: domEvent.isComposing
|
|
134
|
+
});
|
|
135
|
+
// Use the result view selection so following events will be added one after another.
|
|
136
|
+
partTargetRanges = [viewDocument.selection.getFirstRange()];
|
|
137
|
+
}
|
|
138
|
+
if (i + 1 < parts.length) {
|
|
139
|
+
this.fire(domEvent.type, domEvent, {
|
|
140
|
+
inputType: 'insertParagraph',
|
|
141
|
+
targetRanges: partTargetRanges
|
|
142
|
+
});
|
|
143
|
+
// Use the result view selection so following events will be added one after another.
|
|
144
|
+
partTargetRanges = [viewDocument.selection.getFirstRange()];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
148
|
+
// @if CK_DEBUG_TYPING // console.groupEnd();
|
|
149
|
+
// @if CK_DEBUG_TYPING // }
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Fire the normalized beforeInput event.
|
|
153
|
+
this.fire(domEvent.type, domEvent, {
|
|
154
|
+
data,
|
|
155
|
+
dataTransfer,
|
|
156
|
+
targetRanges,
|
|
157
|
+
inputType: domEvent.inputType,
|
|
158
|
+
isComposing: domEvent.isComposing
|
|
159
|
+
});
|
|
160
|
+
// @if CK_DEBUG_TYPING // if ( ( window as any ).logCKETyping ) {
|
|
161
|
+
// @if CK_DEBUG_TYPING // console.groupEnd();
|
|
162
|
+
// @if CK_DEBUG_TYPING // }
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
-
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* @module engine/view/observer/keyobserver
|
|
7
|
-
*/
|
|
8
|
-
import DomEventObserver from './domeventobserver';
|
|
9
|
-
import type DomEventData from './domeventdata';
|
|
10
|
-
import { type KeystrokeInfo } from '@ckeditor/ckeditor5-utils';
|
|
11
|
-
/**
|
|
12
|
-
* Observer for events connected with pressing keyboard keys.
|
|
13
|
-
*
|
|
14
|
-
* Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.
|
|
15
|
-
*/
|
|
16
|
-
export default class KeyObserver extends DomEventObserver<'keydown' | 'keyup', KeystrokeInfo & {
|
|
17
|
-
keystroke: number;
|
|
18
|
-
}> {
|
|
19
|
-
/**
|
|
20
|
-
* @inheritDoc
|
|
21
|
-
*/
|
|
22
|
-
readonly domEventType: readonly ["keydown", "keyup"];
|
|
23
|
-
/**
|
|
24
|
-
* @inheritDoc
|
|
25
|
-
*/
|
|
26
|
-
onDomEvent(domEvt: KeyboardEvent): void;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Fired when a key has been pressed.
|
|
30
|
-
*
|
|
31
|
-
* Introduced by {@link module:engine/view/observer/keyobserver~KeyObserver}.
|
|
32
|
-
*
|
|
33
|
-
* Note that because {@link module:engine/view/observer/keyobserver~KeyObserver} is attached by the
|
|
34
|
-
* {@link module:engine/view/view~View} this event is available by default.
|
|
35
|
-
*
|
|
36
|
-
* @see module:engine/view/observer/keyobserver~KeyObserver
|
|
37
|
-
* @eventName module:engine/view/document~Document#keydown
|
|
38
|
-
*/
|
|
39
|
-
export type ViewDocumentKeyDownEvent = {
|
|
40
|
-
name: 'keydown';
|
|
41
|
-
args: [data: KeyEventData];
|
|
42
|
-
};
|
|
43
|
-
/**
|
|
44
|
-
* Fired when a key has been released.
|
|
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
|
-
* @eventName module:engine/view/document~Document#keyup
|
|
53
|
-
*/
|
|
54
|
-
export type ViewDocumentKeyUpEvent = {
|
|
55
|
-
name: 'keyup';
|
|
56
|
-
args: [data: KeyEventData];
|
|
57
|
-
};
|
|
58
|
-
/**
|
|
59
|
-
* The value of both events - {@link ~ViewDocumentKeyDownEvent} and {@link ~ViewDocumentKeyUpEvent}.
|
|
60
|
-
*/
|
|
61
|
-
export interface KeyEventData extends DomEventData<KeyboardEvent>, KeystrokeInfo {
|
|
62
|
-
/**
|
|
63
|
-
* Code of the whole keystroke. See {@link module:utils/keyboard~getCode}.
|
|
64
|
-
*/
|
|
65
|
-
keystroke: number;
|
|
66
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @module engine/view/observer/keyobserver
|
|
7
|
+
*/
|
|
8
|
+
import DomEventObserver from './domeventobserver';
|
|
9
|
+
import type DomEventData from './domeventdata';
|
|
10
|
+
import { type KeystrokeInfo } from '@ckeditor/ckeditor5-utils';
|
|
11
|
+
/**
|
|
12
|
+
* Observer for events connected with pressing keyboard keys.
|
|
13
|
+
*
|
|
14
|
+
* Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.
|
|
15
|
+
*/
|
|
16
|
+
export default class KeyObserver extends DomEventObserver<'keydown' | 'keyup', KeystrokeInfo & {
|
|
17
|
+
keystroke: number;
|
|
18
|
+
}> {
|
|
19
|
+
/**
|
|
20
|
+
* @inheritDoc
|
|
21
|
+
*/
|
|
22
|
+
readonly domEventType: readonly ["keydown", "keyup"];
|
|
23
|
+
/**
|
|
24
|
+
* @inheritDoc
|
|
25
|
+
*/
|
|
26
|
+
onDomEvent(domEvt: KeyboardEvent): void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Fired when a key has been pressed.
|
|
30
|
+
*
|
|
31
|
+
* Introduced by {@link module:engine/view/observer/keyobserver~KeyObserver}.
|
|
32
|
+
*
|
|
33
|
+
* Note that because {@link module:engine/view/observer/keyobserver~KeyObserver} is attached by the
|
|
34
|
+
* {@link module:engine/view/view~View} this event is available by default.
|
|
35
|
+
*
|
|
36
|
+
* @see module:engine/view/observer/keyobserver~KeyObserver
|
|
37
|
+
* @eventName module:engine/view/document~Document#keydown
|
|
38
|
+
*/
|
|
39
|
+
export type ViewDocumentKeyDownEvent = {
|
|
40
|
+
name: 'keydown';
|
|
41
|
+
args: [data: KeyEventData];
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Fired when a key has been released.
|
|
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
|
+
* @eventName module:engine/view/document~Document#keyup
|
|
53
|
+
*/
|
|
54
|
+
export type ViewDocumentKeyUpEvent = {
|
|
55
|
+
name: 'keyup';
|
|
56
|
+
args: [data: KeyEventData];
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* The value of both events - {@link ~ViewDocumentKeyDownEvent} and {@link ~ViewDocumentKeyUpEvent}.
|
|
60
|
+
*/
|
|
61
|
+
export interface KeyEventData extends DomEventData<KeyboardEvent>, KeystrokeInfo {
|
|
62
|
+
/**
|
|
63
|
+
* Code of the whole keystroke. See {@link module:utils/keyboard~getCode}.
|
|
64
|
+
*/
|
|
65
|
+
keystroke: number;
|
|
66
|
+
}
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
-
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* @module engine/view/observer/keyobserver
|
|
7
|
-
*/
|
|
8
|
-
import DomEventObserver from './domeventobserver';
|
|
9
|
-
import { getCode } from '@ckeditor/ckeditor5-utils';
|
|
10
|
-
/**
|
|
11
|
-
* Observer for events connected with pressing keyboard keys.
|
|
12
|
-
*
|
|
13
|
-
* Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.
|
|
14
|
-
*/
|
|
15
|
-
export default class KeyObserver extends DomEventObserver {
|
|
16
|
-
constructor() {
|
|
17
|
-
super(...arguments);
|
|
18
|
-
/**
|
|
19
|
-
* @inheritDoc
|
|
20
|
-
*/
|
|
21
|
-
this.domEventType = ['keydown', 'keyup'];
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* @inheritDoc
|
|
25
|
-
*/
|
|
26
|
-
onDomEvent(domEvt) {
|
|
27
|
-
const data = {
|
|
28
|
-
keyCode: domEvt.keyCode,
|
|
29
|
-
altKey: domEvt.altKey,
|
|
30
|
-
ctrlKey: domEvt.ctrlKey,
|
|
31
|
-
shiftKey: domEvt.shiftKey,
|
|
32
|
-
metaKey: domEvt.metaKey,
|
|
33
|
-
get keystroke() {
|
|
34
|
-
return getCode(this);
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
this.fire(domEvt.type, domEvt, data);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @module engine/view/observer/keyobserver
|
|
7
|
+
*/
|
|
8
|
+
import DomEventObserver from './domeventobserver';
|
|
9
|
+
import { getCode } from '@ckeditor/ckeditor5-utils';
|
|
10
|
+
/**
|
|
11
|
+
* Observer for events connected with pressing keyboard keys.
|
|
12
|
+
*
|
|
13
|
+
* Note that this observer is attached by the {@link module:engine/view/view~View} and is available by default.
|
|
14
|
+
*/
|
|
15
|
+
export default class KeyObserver extends DomEventObserver {
|
|
16
|
+
constructor() {
|
|
17
|
+
super(...arguments);
|
|
18
|
+
/**
|
|
19
|
+
* @inheritDoc
|
|
20
|
+
*/
|
|
21
|
+
this.domEventType = ['keydown', 'keyup'];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @inheritDoc
|
|
25
|
+
*/
|
|
26
|
+
onDomEvent(domEvt) {
|
|
27
|
+
const data = {
|
|
28
|
+
keyCode: domEvt.keyCode,
|
|
29
|
+
altKey: domEvt.altKey,
|
|
30
|
+
ctrlKey: domEvt.ctrlKey,
|
|
31
|
+
shiftKey: domEvt.shiftKey,
|
|
32
|
+
metaKey: domEvt.metaKey,
|
|
33
|
+
get keystroke() {
|
|
34
|
+
return getCode(this);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
this.fire(domEvt.type, domEvt, data);
|
|
38
|
+
}
|
|
39
|
+
}
|