liuxiaolong
2019-05-09 0d1d88cdb668e75ea8609417ac18ae19947e9525
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
/*
Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
For licensing, see LICENSE.html or http://ckeditor.com/license
*/
 
/**
 * @fileOverview Defines the {@link CKEDITOR.dom.text} class, which represents
 *        a DOM text node.
 */
 
/**
 * Represents a DOM text node.
 * @constructor
 * @augments CKEDITOR.dom.node
 * @param {Object|String} text A native DOM text node or a string containing
 *        the text to use to create a new text node.
 * @param {CKEDITOR.dom.document} [ownerDocument] The document that will contain
 *        the node in case of new node creation. Defaults to the current document.
 * @example
 * var nativeNode = document.createTextNode( 'Example' );
 * var text = CKEDITOR.dom.text( nativeNode );
 * @example
 * var text = CKEDITOR.dom.text( 'Example' );
 */
CKEDITOR.dom.text = function( text, ownerDocument )
{
    if ( typeof text == 'string' )
        text = ( ownerDocument ? ownerDocument.$ : document ).createTextNode( text );
 
    // Theoretically, we should call the base constructor here
    // (not CKEDITOR.dom.node though). But, IE doesn't support expando
    // properties on text node, so the features provided by domObject will not
    // work for text nodes (which is not a big issue for us).
    //
    // CKEDITOR.dom.domObject.call( this, element );
 
    /**
     * The native DOM text node represented by this class instance.
     * @type Object
     * @example
     * var element = new CKEDITOR.dom.text( 'Example' );
     * alert( element.$.nodeType );  // "3"
     */
    this.$ = text;
};
 
CKEDITOR.dom.text.prototype = new CKEDITOR.dom.node();
 
CKEDITOR.tools.extend( CKEDITOR.dom.text.prototype,
    /** @lends CKEDITOR.dom.text.prototype */
    {
        /**
         * The node type. This is a constant value set to
         * {@link CKEDITOR.NODE_TEXT}.
         * @type Number
         * @example
         */
        type : CKEDITOR.NODE_TEXT,
 
        getLength : function()
        {
            return this.$.nodeValue.length;
        },
 
        getText : function()
        {
            return this.$.nodeValue;
        },
 
        setText : function( text )
        {
            this.$.nodeValue = text;
        },
 
        /**
         * Breaks this text node into two nodes at the specified offset,
         * keeping both in the tree as siblings. This node then only contains
         * all the content up to the offset point. A new text node, which is
         * inserted as the next sibling of this node, contains all the content
         * at and after the offset point. When the offset is equal to the
         * length of this node, the new node has no data.
         * @param {Number} The position at which to split, starting from zero.
         * @returns {CKEDITOR.dom.text} The new text node.
         */
        split : function( offset )
        {
            // If the offset is after the last char, IE creates the text node
            // on split, but don't include it into the DOM. So, we have to do
            // that manually here.
            if ( CKEDITOR.env.ie && offset == this.getLength() )
            {
                var next = this.getDocument().createText( '' );
                next.insertAfter( this );
                return next;
            }
 
            var doc = this.getDocument();
            var retval = new CKEDITOR.dom.text( this.$.splitText( offset ), doc );
 
            // IE BUG: IE8 does not update the childNodes array in DOM after splitText(),
            // we need to make some DOM changes to make it update. (#3436)
            if ( CKEDITOR.env.ie8 )
            {
                var workaround = new CKEDITOR.dom.text( '', doc );
                workaround.insertAfter( retval );
                workaround.remove();
            }
 
            return retval;
        },
 
        /**
         * Extracts characters from indexA up to but not including indexB.
         * @param {Number} indexA An integer between 0 and one less than the
         *        length of the text.
         * @param {Number} [indexB] An integer between 0 and the length of the
         *        string. If omitted, extracts characters to the end of the text.
         */
        substring : function( indexA, indexB )
        {
            // We need the following check due to a Firefox bug
            // https://bugzilla.mozilla.org/show_bug.cgi?id=458886
            if ( typeof indexB != 'number' )
                return this.$.nodeValue.substr( indexA );
            else
                return this.$.nodeValue.substring( indexA, indexB );
        }
    });