Ticket #3599: 3599_2.patch

File 3599_2.patch, 3.4 KB (added by Garry Yao, 9 years ago)
  • _source/plugins/styles/plugin.js

     
    138138                                                : null ).call( this, range );
    139139                },
    140140
     141                // Removes any conflicting styles from within the specified range..
     142                removeConflictsFromRange : function ( range )
     143                {
     144                        var style = this,
     145                                        overrides = getOverrides( style ),
     146                                        candidates1 = [],
     147                                        candidates2 = [];
     148
     149                        var walker = new CKEDITOR.dom.walker( range );
     150                        walker.evaluator = function( node )
     151                        {
     152                                if( node.type == CKEDITOR.NODE_ELEMENT )
     153                                {
     154                                        if( node.is( style.element ) )
     155                                                candidates1.push( node );
     156                                        if( node.getName() in overrides )
     157                                                candidates2.push( node );
     158                                }
     159                        };
     160                        walker.lastForward();
     161
     162                        var count1 = candidates1.length,
     163                                        count2 = candidates2.length;
     164                       
     165                        // First remove from element any style conflictions.
     166                        for ( var i = 0; i < count1; i++ )
     167                                removeFromElement( style,  candidates1[ i ] );
     168
     169                        // Now remove any other element with different name that is
     170                        // defined to be overriden.
     171                        for ( i = 0; i < count2; i++ )
     172                                removeOverrides( candidates2[ i ], overrides[ candidates2[ i ].getName() ] ) ;
     173                },
     174
    141175                applyToObject : function( element )
    142176                {
    143177                        setupElement( element, this );
     
    310344                range.enlarge( CKEDITOR.ENLARGE_ELEMENT );
    311345                range.trim();
    312346
     347                // Remove all style conflictions within the range,
     348                // e.g. style="color:red" is conflicting with style="color:blue".
     349                var enlargedBookmark = range.createBookmark();
     350                this.removeConflictsFromRange( range );
     351                range.moveToBookmark( enlargedBookmark );
     352
    313353                // Get the first node to be processed and the last, which concludes the
    314354                // processing.
    315355                var boundaryNodes = range.getBoundaryNodes();
     
    480520                                        // Move the contents of the range to the style element.
    481521                                        styleRange.extractContents().appendTo( styleNode );
    482522
    483                                         // Here we do some cleanup, removing all duplicated
    484                                         // elements from the style element.
    485                                         removeFromInsideElement( this, styleNode );
    486 
    487523                                        // Insert it into the range position (it is collapsed after
    488524                                        // extractContents.
    489525                                        styleRange.insertNode( styleNode );
     
    900936                removeNoAttribsElement( element );
    901937        }
    902938
    903         // Removes a style from inside an element.
    904         function removeFromInsideElement( style, element )
    905         {
    906                 var def = style._.definition,
    907                         attribs = def.attributes,
    908                         styles = def.styles,
    909                         overrides = getOverrides( style );
    910 
    911                 var innerElements = element.getElementsByTag( style.element );
    912 
    913                 for ( var i = innerElements.count(); --i >= 0 ; )
    914                         removeFromElement( style,  innerElements.getItem( i ) );
    915 
    916                 // Now remove any other element with different name that is
    917                 // defined to be overriden.
    918                 for ( var overrideElement in overrides )
    919                 {
    920                         if ( overrideElement != style.element )
    921                         {
    922                                 innerElements = element.getElementsByTag( overrideElement ) ;
    923                                 for ( i = innerElements.count() - 1 ; i >= 0 ; i-- )
    924                                 {
    925                                         var innerElement = innerElements.getItem( i );
    926                                         removeOverrides( innerElement, overrides[ overrideElement ] ) ;
    927                                 }
    928                         }
    929                 }
    930 
    931         }
    932 
    933939        /**
    934940         *  Remove overriding styles/attributes from the specific element.
    935941         *  Note: Remove the element if no attributes remain.
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy