X-Git-Url: https://jasonwoof.com/gitweb/?p=ckeditor.git;a=blobdiff_plain;f=_source%2Fcore%2Ftools.js;h=4b2a5f7738191a4ae631fdff2e6443fb38847078;hp=148c588caebf3a87042d6902415c568c766568fa;hb=fb481ba0a7d298e3e7b9034fcb9f2afdc6e8e796;hpb=6e682412d5cc0dfaedb376482e585bf2989c6863 diff --git a/_source/core/tools.js b/_source/core/tools.js index 148c588..4b2a5f7 100644 --- a/_source/core/tools.js +++ b/_source/core/tools.js @@ -756,7 +756,82 @@ For licensing, see LICENSE.html or http://ckeditor.com/license genKey : function() { return Array.prototype.slice.call( arguments ).join( '-' ); + }, + + /** + * Try to avoid differences in the style attribute. + * + * @param {String} styleText The style data to be normalized. + * @param {Boolean} [nativeNormalize=false] Parse the data using the browser. + * @returns {String} The normalized value. + */ + normalizeCssText: function( styleText, nativeNormalize ) { + var props = [], + name, + parsedProps = CKEDITOR.tools.parseCssText( styleText, true, nativeNormalize ); + + for ( name in parsedProps ) + props.push( name + ':' + parsedProps[ name ] ); + + props.sort(); + + return props.length ? ( props.join( ';' ) + ';' ) : ''; + }, + + /** + * Find and convert rgb(x,x,x) colors definition to hexadecimal notation. + * @param {String} styleText The style data (or just a string containing rgb colors) to be converted. + * @returns {String} The style data with rgb colors converted to hexadecimal equivalents. + */ + convertRgbToHex: function( styleText ) { + return styleText.replace( /(?:rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\))/gi, function( match, red, green, blue ) { + var color = [ red, green, blue ]; + // Add padding zeros if the hex value is less than 0x10. + for ( var i = 0; i < 3; i++ ) + color[ i ] = ( '0' + parseInt( color[ i ], 10 ).toString( 16 ) ).slice( -2 ); + return '#' + color.join( '' ); + }); + }, + + /** + * Turn inline style text properties into one hash. + * + * @param {String} styleText The style data to be parsed. + * @param {Boolean} [normalize=false] Normalize properties and values + * (e.g. trim spaces, convert to lower case). + * @param {Boolean} [nativeNormalize=false] Parse the data using the browser. + * @returns {String} The object containing parsed properties. + */ + parseCssText: function( styleText, normalize, nativeNormalize ) { + var retval = {}; + + if ( nativeNormalize ) { + // Injects the style in a temporary span object, so the browser parses it, + // retrieving its final format. + var temp = new CKEDITOR.dom.element( 'span' ); + temp.setAttribute( 'style', styleText ); + styleText = CKEDITOR.tools.convertRgbToHex( temp.getAttribute( 'style' ) || '' ); + } + + // IE will leave a single semicolon when failed to parse the style text. (#3891) + if ( !styleText || styleText == ';' ) + return retval; + + styleText.replace( /"/g, '"' ).replace( /\s*([^:;\s]+)\s*:\s*([^;]+)\s*(?=;|$)/g, function( match, name, value ) { + if ( normalize ) { + name = name.toLowerCase(); + // Normalize font-family property, ignore quotes and being case insensitive. (#7322) + // http://www.w3.org/TR/css3-fonts/#font-family-the-font-family-property + if ( name == 'font-family' ) + value = value.toLowerCase().replace( /["']/g, '' ).replace( /\s*,\s*/g, ',' ); + value = CKEDITOR.tools.trim( value ); + } + + retval[ name ] = value; + }); + return retval; } + }; })();