2012-02-06 23:50:56 +00:00
|
|
|
/**
|
2012-07-19 00:11:26 +00:00
|
|
|
* VisualEditor content editable namespace.
|
2012-07-19 21:25:16 +00:00
|
|
|
*
|
2012-07-19 00:11:26 +00:00
|
|
|
* @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.
|
2012-02-06 23:50:56 +00:00
|
|
|
*/
|
2012-03-06 22:39:43 +00:00
|
|
|
ve.ce = {
|
2012-06-20 01:20:28 +00:00
|
|
|
//'nodeFactory': Initialized in ve.ce.NodeFactory.js
|
|
|
|
};
|
|
|
|
|
2012-09-17 23:53:03 +00:00
|
|
|
/* Static Members */
|
|
|
|
|
2012-06-20 01:20:28 +00:00
|
|
|
/**
|
|
|
|
* RegExp pattern for matching all whitespaces in HTML text.
|
|
|
|
*
|
Remainder JSHint fixes on modules/ve/*
[jshint]
ce/ve.ce.Surface.js: line 670, col 9, Too many var statements.
ce/ve.ce.Surface.js: line 695, col 6, Missing semicolon.
ce/ve.ce.Surface.js: line 726, col 22, Expected '===' and instead saw '=='.
ce/ve.ce.Surface.js: line 726, col 41, Expected '===' and instead saw '=='.
ce/ve.ce.Surface.js: line 733, col 13, Too many var statements.
ce/ve.ce.Surface.js: line 734, col 24, Expected '===' and instead saw '=='.
ce/ve.ce.Surface.js: line 1013, col 13, Too many var statements.
ce/ve.ce.Surface.js: line 1019, col 17, Too many var statements.
ce/ve.ce.Surface.js: line 1023, col 18, Too many ar statements.
ce/ve.ce.Surface.js: line 1027, col 13, Too many var statements.
dm/annotations/ve.dm.LinkAnnotation.js: line 70, col 52, Insecure '.'.
dm/ve.dm.Converter.js: line 383, col 29, Empty block.
dm/ve.dm.Converter.js: line 423, col 33, Empty block.
Commands:
* jshint .
* ack '(if|else|function|switch|for|while)\('
* Sublime Text 2:
Find(*): (if|else|function|switch|for|while)\(
Replace: $1 (
* ack ' ' -Q # double spaces, except in certain comments
Change-Id: I8e34bf2924bc8688fdf8acef08bbc4f6707e93be
2012-09-02 21:45:01 +00:00
|
|
|
* \u0020 (32) space
|
2012-06-20 01:20:28 +00:00
|
|
|
* \u00A0 (160) non-breaking space
|
|
|
|
*
|
|
|
|
* @static
|
|
|
|
* @member
|
|
|
|
*/
|
|
|
|
ve.ce.whitespacePattern = /[\u0020\u00A0]/g;
|
2012-02-10 22:19:12 +00:00
|
|
|
|
2012-09-17 23:53:03 +00:00
|
|
|
/* Static Methods */
|
|
|
|
|
2012-06-20 01:20:28 +00:00
|
|
|
/**
|
2012-08-22 18:08:11 +00:00
|
|
|
* Gets the plain text of a DOM element (that is a node canContainContent === true)
|
2012-06-20 01:20:28 +00:00
|
|
|
*
|
2012-08-18 00:21:15 +00:00
|
|
|
* 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).
|
2012-06-20 01:20:28 +00:00
|
|
|
*
|
|
|
|
* @static
|
|
|
|
* @member
|
|
|
|
* @param {DOMElement} element DOM element to get text of
|
|
|
|
* @returns {String} Plain text of DOM element
|
|
|
|
*/
|
2012-08-07 01:50:44 +00:00
|
|
|
ve.ce.getDomText = function ( element ) {
|
|
|
|
var func = function ( element ) {
|
2012-06-20 01:20:28 +00:00
|
|
|
var nodeType = element.nodeType,
|
2012-08-18 00:21:15 +00:00
|
|
|
text = '',
|
2012-08-22 18:08:11 +00:00
|
|
|
numChars,
|
|
|
|
$element = $( element );
|
|
|
|
|
2012-06-20 01:20:28 +00:00
|
|
|
if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
|
2012-10-01 18:37:39 +00:00
|
|
|
if ( $element.hasClass( 've-ce-slug' ) ) {
|
|
|
|
// Slugs are not represented in the model at all, but they do
|
|
|
|
// contain a single nbsp/FEFF character in the DOM, so make sure
|
|
|
|
// that character isn't counted
|
|
|
|
return '';
|
|
|
|
} else if ( $element.hasClass( 've-ce-leafNode' ) ) {
|
2012-08-22 18:08:11 +00:00
|
|
|
// For leaf nodes, don't return the content, but return
|
2012-08-18 00:21:15 +00:00
|
|
|
// the right amount of characters so the offsets match up
|
2012-08-22 18:08:11 +00:00
|
|
|
numChars = $element.data( 'node' ).getOuterLength();
|
2012-08-18 00:21:15 +00:00
|
|
|
return new Array( numChars + 1 ).join( '\u2603' );
|
2012-03-09 22:45:22 +00:00
|
|
|
} else {
|
2012-06-20 23:01:02 +00:00
|
|
|
// Traverse its children
|
2012-10-01 18:37:39 +00:00
|
|
|
for ( element = element.firstChild; element; element = element.nextSibling ) {
|
2012-06-20 01:20:28 +00:00
|
|
|
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 ) {
|
2012-06-20 01:20:28 +00:00
|
|
|
return element.nodeValue;
|
2012-02-10 22:19:12 +00:00
|
|
|
}
|
2012-06-20 01:20:28 +00:00
|
|
|
return text;
|
2012-06-20 23:01:02 +00:00
|
|
|
};
|
2012-06-20 01:20:28 +00:00
|
|
|
// 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.
|
|
|
|
*
|
2012-08-18 00:21:15 +00:00
|
|
|
* In the returned string text nodes are represented as "#" and elements are represented as "<type>"
|
2012-06-20 01:20:28 +00:00
|
|
|
* and "</type>" where "type" is their element name. This effectively generates an HTML
|
2012-08-18 00:21:15 +00:00
|
|
|
* serialization without any attributes or text contents. This can be used to observe structural
|
2012-06-20 01:20:28 +00:00
|
|
|
* changes.
|
|
|
|
*
|
|
|
|
* @static
|
|
|
|
* @member
|
|
|
|
* @param {DOMElement} element DOM element to get hash of
|
|
|
|
* @returns {String} Hash of DOM element
|
|
|
|
*/
|
2012-08-07 01:50:44 +00:00
|
|
|
ve.ce.getDomHash = function ( element ) {
|
2012-06-20 01:20:28 +00:00
|
|
|
var nodeType = element.nodeType,
|
|
|
|
nodeName = element.nodeName,
|
|
|
|
hash = '';
|
2012-02-10 22:19:12 +00:00
|
|
|
|
2012-06-20 01:20:28 +00:00
|
|
|
if ( nodeType === 3 || nodeType === 4 ) {
|
|
|
|
return '#';
|
|
|
|
} else if ( nodeType === 1 || nodeType === 9 ) {
|
|
|
|
hash += '<' + nodeName + '>';
|
2012-06-20 23:01:02 +00:00
|
|
|
// Traverse its children
|
2012-06-20 01:20:28 +00:00
|
|
|
for ( element = element.firstChild; element; element = element.nextSibling) {
|
|
|
|
hash += ve.ce.getDomHash( element );
|
|
|
|
}
|
|
|
|
hash += '</' + nodeName + '>';
|
2012-03-09 22:45:22 +00:00
|
|
|
}
|
2012-06-20 01:20:28 +00:00
|
|
|
return hash;
|
2012-03-09 22:45:22 +00:00
|
|
|
};
|