Ticket #1653: 1653.patch

File 1653.patch, 5.3 KB (added by Alfonso Martínez de Lizarrondo, 10 years ago)

Proposed patch

  • _source/core/tools.js

     
    1 /*
     1/*
    22Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
    33For licensing, see LICENSE.html or http://ckeditor.com/license
    44*/
     
    330330                 * element.setAttribute( 'title', '<a " b >' );
    331331                 * alert( CKEDITOR.tools.htmlEncodeAttr( element.getAttribute( 'title' ) );  // "&gt;a &quot; b &lt;"
    332332                 */
    333                 htmlEncodeAttr : function( text ) 
     333                htmlEncodeAttr : function( text )
    334334                {
    335335                        return text.replace( /"/g, '&quot;' ).replace( /</g, '&lt;' ).replace( />/, '&gt;' );
    336336                },
    337                
     337
    338338                /**
     339                 * Try to avoid differences in the style attribute
     340                 * @param {String} The style data to be normalized
     341                 * @param {Boolean} Parse the data using the browser
     342                 * @returns {String} The normalized value.
     343                 */
     344                normalizeCssText : function( unparsedCssText, nativeNormalize )
     345                {
     346                        var styleText;
     347                        if ( nativeNormalize !== false )
     348                        {
     349                                // Injects the style in a temporary span object, so the browser parses it,
     350                                // retrieving its final format.
     351                                var temp = new CKEDITOR.dom.element( 'span' );
     352                                temp.setAttribute( 'style', unparsedCssText );
     353                                styleText = temp.getAttribute( 'style' ) || '';
     354                        }
     355                        else
     356                                styleText = unparsedCssText;
     357
     358                        styleText = CKEDITOR.tools.convertRGBToHex( styleText );
     359
     360                        // Shrinking white-spaces around colon and semi-colon (#4147).
     361                        // Compensate tail semi-colon.
     362                        return styleText.replace( /\s*([;:])\s*/g, '$1' )
     363                                                                 .replace( /(;)$/, '')
     364                                                                 .replace( /,\s+/g, ',' ) // Trimming spaces after comma (e.g. font-family name)(#4107).
     365                                                                 .toLowerCase();
     366                },
     367
     368                /**
     369                * Convert a CSS rgb(R, G, B) color back to #RRGGBB format.
     370                 * @param Css style string (can include more than one color
     371                 * @return Converted css style.
     372                */
     373                convertRGBToHex : function( cssStyle )
     374                {
     375                        return cssStyle.replace( /(?:rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\))/gi, function( match, red, green, blue )
     376                                {
     377                                        red = parseInt( red, 10 ).toString( 16 );
     378                                        green = parseInt( green, 10 ).toString( 16 );
     379                                        blue = parseInt( blue, 10 ).toString( 16 );
     380                                        var color = [red, green, blue] ;
     381
     382                                        // Add padding zeros if the hex value is less than 0x10.
     383                                        for ( var i = 0 ; i < color.length ; i++ )
     384                                                color[i] = String( '0' + color[i] ).slice( -2 ) ;
     385
     386                                        return '#' + color.join( '' ) ;
     387                                });
     388                },
     389
     390                /**
    339391                 * Replace characters can't be represented through CSS Selectors string
    340392                 * by CSS Escape Notation where the character escape sequence consists
    341393                 * of a backslash character (\) followed by the orginal characters.
  • _source/plugins/htmlwriter/plugin.js

     
    177177                                this.forceSimpleAmpersand && ( attValue = attValue.replace( /&amp;/g, '&' ) );
    178178                                // Browsers don't always escape special character in attribute values. (#4683, #4719).
    179179                                attValue = CKEDITOR.tools.htmlEncodeAttr( attValue );
     180
     181                                if ( attName == 'style' )
     182                                                attValue = CKEDITOR.tools.normalizeCssText( attValue, false );
    180183                        }
    181184
    182185                        this._.output.push( ' ', attName, '="', attValue, '"' );
  • _source/plugins/styles/plugin.js

     
    252252
    253253                                                var elementAttr = element.getAttribute( attName ) || '';
    254254                                                if ( attName == 'style' ?
    255                                                         compareCssText( attribs[ attName ], normalizeCssText( elementAttr, false ) )
     255                                                        compareCssText( attribs[ attName ], CKEDITOR.tools.normalizeCssText( elementAttr, false ) )
    256256                                                        : attribs[ attName ] == elementAttr  )
    257257                                                {
    258258                                                        if ( !fullMatch )
     
    366366                // Browsers make some changes to the style when applying them. So, here
    367367                // we normalize it to the browser format.
    368368                if ( stylesText.length )
    369                         stylesText = normalizeCssText( stylesText );
     369                        stylesText = CKEDITOR.tools.normalizeCssText( stylesText );
    370370
    371371                stylesText += specialStylesText;
    372372
     
    12681268                return temp[ isStyle ? 'getStyle' : 'getAttribute' ]( name );
    12691269        }
    12701270
    1271         function normalizeCssText( unparsedCssText, nativeNormalize )
    1272         {
    1273                 var styleText;
    1274                 if ( nativeNormalize !== false )
    1275                 {
    1276                         // Injects the style in a temporary span object, so the browser parses it,
    1277                         // retrieving its final format.
    1278                         var temp = new CKEDITOR.dom.element( 'span' );
    1279                         temp.setAttribute( 'style', unparsedCssText );
    1280                         styleText = temp.getAttribute( 'style' ) || '';
    1281                 }
    1282                 else
    1283                         styleText = unparsedCssText;
    1284 
    1285                 // Shrinking white-spaces around colon and semi-colon (#4147).
    1286                 // Compensate tail semi-colon.
    1287                 return styleText.replace( /\s*([;:])\s*/, '$1' )
    1288                                                          .replace( /([^\s;])$/, '$1;')
    1289                                                          .replace( /,\s+/g, ',' ) // Trimming spaces after comma (e.g. font-family name)(#4107).
    1290                                                          .toLowerCase();
    1291         }
    1292 
    12931271        // Turn inline style text properties into one hash.
    12941272        function parseStyleText( styleText )
    12951273        {
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy