mediawiki-extensions-Visual.../modules/ve/ce/ve.ce.js

97 lines
2.9 KiB
JavaScript
Raw Normal View History

/**
* VisualEditor content editable namespace.
*
* @copyright 2011-2012 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* Namespace for all VisualEditor content editable classes, static methods and static properties.
*/
ve.ce = {
//'nodeFactory': Initialized in ve.ce.NodeFactory.js
};
/**
* RegExp pattern for matching all whitespaces in HTML text.
*
* \u0020 (32) space
* \u00A0 (160) non-breaking space
*
* @static
* @member
*/
ve.ce.whitespacePattern = /[\u0020\u00A0]/g;
2012-02-10 22:19:12 +00:00
/**
* Gets the plain text of a DOM element (that is a node canContainContent === true)
*
* In the returned string only the contents of text nodes are included, and the contents of
* non-editable elements are excluded (but replaced with the appropriate number of characters
* so the offsets match up with the linear model).
*
* @static
* @member
* @param {DOMElement} element DOM element to get text of
* @returns {String} Plain text of DOM element
*/
ve.ce.getDomText = function ( element ) {
var func = function ( element ) {
var nodeType = element.nodeType,
text = '',
numChars,
$element = $( element );
if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
if ( $element.hasClass( 've-ce-leafNode' ) ) {
// For leaf nodes, don't return the content, but return
// the right amount of characters so the offsets match up
numChars = $element.data( 'node' ).getOuterLength();
return new Array( numChars + 1 ).join( '\u2603' );
2012-03-09 22:45:22 +00:00
} else {
// Traverse its children
for ( element = element.firstChild; element; element = element.nextSibling) {
text += func( element );
2012-03-09 22:45:22 +00:00
}
2012-02-10 22:19:12 +00:00
}
2012-03-09 22:45:22 +00:00
} else if ( nodeType === 3 || nodeType === 4 ) {
return element.nodeValue;
2012-02-10 22:19:12 +00:00
}
return text;
};
// Return the text, replacing spaces and non-breaking spaces with spaces?
// TODO: Why are we replacing spaces (\u0020) with spaces (' ')
return func( element ).replace( ve.ce.whitespacePattern, ' ' );
};
/**
* Gets a hash of a DOM element's structure.
*
* In the returned string text nodes are represented as "#" and elements are represented as "<type>"
* and "</type>" where "type" is their element name. This effectively generates an HTML
* serialization without any attributes or text contents. This can be used to observe structural
* changes.
*
* @static
* @member
* @param {DOMElement} element DOM element to get hash of
* @returns {String} Hash of DOM element
*/
ve.ce.getDomHash = function ( element ) {
var nodeType = element.nodeType,
nodeName = element.nodeName,
hash = '';
2012-02-10 22:19:12 +00:00
if ( nodeType === 3 || nodeType === 4 ) {
return '#';
} else if ( nodeType === 1 || nodeType === 9 ) {
hash += '<' + nodeName + '>';
// Traverse its children
for ( element = element.firstChild; element; element = element.nextSibling) {
hash += ve.ce.getDomHash( element );
}
hash += '</' + nodeName + '>';
2012-03-09 22:45:22 +00:00
}
return hash;
2012-03-09 22:45:22 +00:00
};