-
-
Notifications
You must be signed in to change notification settings - Fork 3.7k
/
text.js
147 lines (132 loc) · 4.15 KB
/
text.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/**
* @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
/**
* @module engine/view/text
*/
import Node from './node';
/**
* Tree view text node.
*
* The constructor of this class should not be used directly. To create a new text node instance
* use the {@link module:engine/view/downcastwriter~DowncastWriter#createText `DowncastWriter#createText()`}
* method when working on data downcasted from the model or the
* {@link module:engine/view/upcastwriter~UpcastWriter#createText `UpcastWriter#createText()`}
* method when working on non-semantic views.
*
* @extends module:engine/view/node~Node
*/
export default class Text extends Node {
/**
* Creates a tree view text node.
*
* @protected
* @param {module:engine/view/document~Document} document The document instance to which this text node belongs.
* @param {String} data The text's data.
*/
constructor( document, data ) {
super( document );
/**
* The text content.
*
* Setting the data fires the {@link module:engine/view/node~Node#event:change:text change event}.
*
* @protected
* @member {String} module:engine/view/text~Text#_textData
*/
this._textData = data;
}
/**
* Checks whether this object is of the given type.
*
* text.is( '$text' ); // -> true
* text.is( 'node' ); // -> true
* text.is( 'view:$text' ); // -> true
* text.is( 'view:node' ); // -> true
*
* text.is( 'model:$text' ); // -> false
* text.is( 'element' ); // -> false
* text.is( 'range' ); // -> false
*
* {@link module:engine/view/node~Node#is Check the entire list of view objects} which implement the `is()` method.
*
* **Note:** Until version 20.0.0 this method wasn't accepting `'$text'` type. The legacy `'text'` type is still
* accepted for backward compatibility.
*
* @param {String} type Type to check.
* @returns {Boolean}
*/
is( type ) {
return type === '$text' || type === 'view:$text' ||
// This are legacy values kept for backward compatibility.
type === 'text' || type === 'view:text' ||
// From super.is(). This is highly utilised method and cannot call super. See ckeditor/ckeditor5#6529.
type === 'node' || type === 'view:node';
}
/**
* The text content.
*
* @readonly
* @type {String}
*/
get data() {
return this._textData;
}
/**
* The `_data` property is controlled by a getter and a setter.
*
* The getter is required when using the addition assignment operator on protected property:
*
* const foo = downcastWriter.createText( 'foo' );
* const bar = downcastWriter.createText( 'bar' );
*
* foo._data += bar.data; // executes: `foo._data = foo._data + bar.data`
* console.log( foo.data ); // prints: 'foobar'
*
* If the protected getter didn't exist, `foo._data` will return `undefined` and result of the merge will be invalid.
*
* The setter sets data and fires the {@link module:engine/view/node~Node#event:change:text change event}.
*
* @protected
* @type {String}
*/
get _data() {
return this.data;
}
set _data( data ) {
this._fireChange( 'text', this );
this._textData = data;
}
/**
* Checks if this text node is similar to other text node.
* Both nodes should have the same data to be considered as similar.
*
* @param {module:engine/view/text~Text} otherNode Node to check if it is same as this node.
* @returns {Boolean}
*/
isSimilar( otherNode ) {
if ( !( otherNode instanceof Text ) ) {
return false;
}
return this === otherNode || this.data === otherNode.data;
}
/**
* Clones this node.
*
* @protected
* @returns {module:engine/view/text~Text} Text node that is a clone of this node.
*/
_clone() {
return new Text( this.document, this.data );
}
// @if CK_DEBUG_ENGINE // toString() {
// @if CK_DEBUG_ENGINE // return `#${ this.data }`;
// @if CK_DEBUG_ENGINE // }
// @if CK_DEBUG_ENGINE // log() {
// @if CK_DEBUG_ENGINE // console.log( 'ViewText: ' + this );
// @if CK_DEBUG_ENGINE // }
// @if CK_DEBUG_ENGINE // logExtended() {
// @if CK_DEBUG_ENGINE // console.log( 'ViewText: ' + this );
// @if CK_DEBUG_ENGINE // }
}