1 /* 2 Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. 3 For licensing, see LICENSE.html or http://ckeditor.com/license 4 */ 5 6 /** 7 * @fileOverview Defines the {@link CKEDITOR.dom.text} class, which represents 8 * a DOM text node. 9 */ 10 11 /** 12 * Represents a DOM text node. 13 * @constructor 14 * @augments CKEDITOR.dom.node 15 * @param {Object|String} text A native DOM text node or a string containing 16 * the text to use to create a new text node. 17 * @param {CKEDITOR.dom.document} [ownerDocument] The document that will contain 18 * the node in case of new node creation. Defaults to the current document. 19 * @example 20 * var nativeNode = document.createTextNode( 'Example' ); 21 * var text = CKEDITOR.dom.text( nativeNode ); 22 * @example 23 * var text = CKEDITOR.dom.text( 'Example' ); 24 */ 25 CKEDITOR.dom.text = function( text, ownerDocument ) 26 { 27 if ( typeof text == 'string' ) 28 text = ( ownerDocument ? ownerDocument.$ : document ).createTextNode( text ); 29 30 // Theoretically, we should call the base constructor here 31 // (not CKEDITOR.dom.node though). But, IE doesn't support expando 32 // properties on text node, so the features provided by domObject will not 33 // work for text nodes (which is not a big issue for us). 34 // 35 // CKEDITOR.dom.domObject.call( this, element ); 36 37 /** 38 * The native DOM text node represented by this class instance. 39 * @type Object 40 * @example 41 * var element = new CKEDITOR.dom.text( 'Example' ); 42 * alert( element.$.nodeType ); // "3" 43 */ 44 this.$ = text; 45 }; 46 47 CKEDITOR.dom.text.prototype = new CKEDITOR.dom.node(); 48 49 CKEDITOR.tools.extend( CKEDITOR.dom.text.prototype, 50 /** @lends CKEDITOR.dom.text.prototype */ 51 { 52 /** 53 * The node type. This is a constant value set to 54 * {@link CKEDITOR.NODE_TEXT}. 55 * @type Number 56 * @example 57 */ 58 type : CKEDITOR.NODE_TEXT, 59 60 getLength : function() 61 { 62 return this.$.nodeValue.length; 63 }, 64 65 getText : function() 66 { 67 return this.$.nodeValue; 68 }, 69 70 setText : function( text ) 71 { 72 this.$.nodeValue = text; 73 }, 74 75 /** 76 * Breaks this text node into two nodes at the specified offset, 77 * keeping both in the tree as siblings. This node then only contains 78 * all the content up to the offset point. A new text node, which is 79 * inserted as the next sibling of this node, contains all the content 80 * at and after the offset point. When the offset is equal to the 81 * length of this node, the new node has no data. 82 * @param {Number} The position at which to split, starting from zero. 83 * @returns {CKEDITOR.dom.text} The new text node. 84 */ 85 split : function( offset ) 86 { 87 // If the offset is after the last char, IE creates the text node 88 // on split, but don't include it into the DOM. So, we have to do 89 // that manually here. 90 if ( CKEDITOR.env.ie && offset == this.getLength() ) 91 { 92 var next = this.getDocument().createText( '' ); 93 next.insertAfter( this ); 94 return next; 95 } 96 97 var doc = this.getDocument(); 98 var retval = new CKEDITOR.dom.text( this.$.splitText( offset ), doc ); 99 100 // IE BUG: IE8 does not update the childNodes array in DOM after splitText(), 101 // we need to make some DOM changes to make it update. (#3436) 102 if ( CKEDITOR.env.ie8 ) 103 { 104 var workaround = new CKEDITOR.dom.text( '', doc ); 105 workaround.insertAfter( retval ); 106 workaround.remove(); 107 } 108 109 return retval; 110 }, 111 112 /** 113 * Extracts characters from indexA up to but not including indexB. 114 * @param {Number} indexA An integer between 0 and one less than the 115 * length of the text. 116 * @param {Number} [indexB] An integer between 0 and the length of the 117 * string. If omitted, extracts characters to the end of the text. 118 */ 119 substring : function( indexA, indexB ) 120 { 121 // We need the following check due to a Firefox bug 122 // https://bugzilla.mozilla.org/show_bug.cgi?id=458886 123 if ( typeof indexB != 'number' ) 124 return this.$.nodeValue.substr( indexA ); 125 else 126 return this.$.nodeValue.substring( indexA, indexB ); 127 } 128 }); 129