Ticket #6376: 6376_7.patch

File 6376_7.patch, 5.8 KB (added by Tobiasz Cudnik, 9 years ago)
  • _source/plugins/bidi/plugin.js

     
    7474                return node;
    7575        }
    7676
    77         function switchDir( element, dir, editor, state )
     77        function switchDir( element, dir, editor, database )
    7878        {
    79                 var dirBefore = element.getComputedStyle( 'direction' );
     79                // Mark this element as processed by switchDir.
     80                CKEDITOR.dom.element.setMarker( database, element, 'bidi_processed', 1 );
    8081
    81                 element.removeStyle( 'direction' );
    82                 element.removeAttribute( 'dir' );
     82                // Check whether one of the ancestors has already been styled.
     83                var parent = element;
     84                while ( ( parent = parent.getParent() ) && !parent.is( 'body' ) )
     85                {
     86                        if ( parent.getCustomData( 'bidi_processed' ) )
     87                        {
     88                                // Ancestor style must dominate.
     89                                element.removeStyle( 'direction' );
     90                                element.removeAttribute( 'dir' );
     91                                return null;
     92                        }
     93                }
    8394
    84                 if ( state == CKEDITOR.TRISTATE_OFF && element.getComputedStyle( 'direction' ).toLowerCase() != dir )
    85                         element.setAttribute( 'dir', dir );
     95                var useComputedState = ( 'useComputedState' in editor.config ) ? editor.config.useComputedState : 1;
     96               
     97                var elementDir = useComputedState ? element.getComputedStyle( 'direction' )
     98                        : element.getStyle( 'direction' ) || element.hasAttribute( 'dir' );
     99
     100                // Stop if direction is same as present.
     101                if ( elementDir == dir )
     102                        return null;
     103
     104                // Reuse computedState if we already have it.
     105                var dirBefore = useComputedState ? elementDir : element.getComputedStyle( 'direction' );
     106
     107                // Clear direction on this element.
     108                element.removeStyle( 'direction' );
     109
     110                // Set new direction for this element.
     111                element.setAttribute( 'dir', dir );
    86112
    87113                // If the element direction changed, we need to switch the margins of
    88114                // the element and all its children, so it will get really reflected
     
    92118                        editor.fire( 'dirChanged', element );
    93119
    94120                editor.forceNextSelectionCheck();
     121
     122                return null;
    95123        }
    96124
    97125        function getFullySelected( selection, elements )
     
    118146
    119147                        if ( ranges && ranges.length )
    120148                        {
     149                                var database = {};
    121150                                // Apply do directly selected elements from guardElements.
    122151                                var selectedElement = ranges[ 0 ].getEnclosedNode();
    123152
     
    127156                                        )
    128157                                        selectedElement = getFullySelected( selection, guardElements );
    129158
    130                                 if ( selectedElement )
    131                                 {
    132                                         if ( !selectedElement.isReadOnly() )
    133                                                 switchDir( selectedElement, dir, editor, this.state );
    134                                 }
    135                                 else
    136                                 {
    137                                         // Creates bookmarks for selection, as we may split some blocks.
    138                                         var bookmarks = selection.createBookmarks();
     159                                if ( selectedElement && !selectedElement.isReadOnly() )
     160                                        switchDir( selectedElement, dir, editor, database );
     161                               
     162                                // Creates bookmarks for selection, as we may split some blocks.
     163                                var bookmarks = selection.createBookmarks();
    139164
    140                                         var iterator,
    141                                                 block;
     165                                var iterator,
     166                                        block;
    142167
    143                                         for ( var i = ranges.length - 1 ; i >= 0 ; i-- )
    144                                         {
    145                                                 // Array of elements processed as guardElements.
    146                                                 var processedElements = [];
    147                                                 // Walker searching for guardElements.
    148                                                 var walker = new CKEDITOR.dom.walker( ranges[ i ] );
    149                                                 walker.evaluator = function( node ){
    150                                                         return node.type == CKEDITOR.NODE_ELEMENT
    151                                                                 && node.getName() in guardElements
    152                                                                 && !( node.getName() == ( enterMode == CKEDITOR.ENTER_P ) ? 'p' : 'div'
    153                                                                         && node.getParent().type == CKEDITOR.NODE_ELEMENT
    154                                                                         && node.getParent().getName() == 'blockquote'
    155                                                                 );
    156                                                 };
     168                                for ( var i = ranges.length - 1 ; i >= 0 ; i-- )
     169                                {
     170                                        // Array of elements processed as guardElements.
     171                                        var processedElements = [];
     172                                        // Walker searching for guardElements.
     173                                        var walker = new CKEDITOR.dom.walker( ranges[ i ] );
     174                                        walker.evaluator = function( node )
     175                                        {
     176                                                return node.type == CKEDITOR.NODE_ELEMENT
     177                                                        && node.getName() in guardElements
     178                                                        && !( node.getName() == ( enterMode == CKEDITOR.ENTER_P ) ? 'p' : 'div'
     179                                                                && node.getParent().type == CKEDITOR.NODE_ELEMENT
     180                                                                && node.getParent().getName() == 'blockquote'
     181                                                        );
     182                                        };
    157183
    158                                                 while ( ( block = walker.next() ) )
    159                                                 {
    160                                                         switchDir( block, dir, editor, this.state );
    161                                                         processedElements.push( block );
    162                                                 }
     184                                        while ( ( block = walker.next() ) )
     185                                                switchDir( block, dir, editor, database );
    163186
    164                                                 iterator = ranges[ i ].createIterator();
    165                                                 iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;
     187                                        iterator = ranges[ i ].createIterator();
     188                                        iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;
    166189
    167                                                 while ( ( block = iterator.getNextParagraph( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ) )
    168                                                 {
    169                                                         if ( block.isReadOnly() )
    170                                                                 continue;
     190                                        while ( ( block = iterator.getNextParagraph( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ) )
     191                                                !block.isReadOnly() && switchDir( block, dir, editor, database );
    171192
    172                                                         var _break = 0;
     193                                        CKEDITOR.dom.element.clearAllMarkers( database );
    173194
    174                                                         // Check if block have been already processed by the walker above.
    175                                                         for ( var ii = 0; ii < processedElements.length; ii++ )
    176                                                         {
    177                                                                 var parent = block.getParent();
    178 
    179                                                                 while( parent && parent.getName() != 'body' )
    180                                                                 {
    181                                                                         if ( ( parent.$.isSameNode && parent.$.isSameNode( processedElements[ ii ].$ ) )
    182                                                                                         || parent.$ == processedElements[ ii ].$ )
    183                                                                         {
    184                                                                                 _break = 1;
    185                                                                                 break;
    186                                                                         }
    187                                                                         parent = parent.getParent();
    188                                                                 }
    189 
    190                                                                 if ( _break )
    191                                                                         break;
    192                                                         }
    193 
    194                                                         if ( !_break )
    195                                                         {
    196                                                                 switchDir( block, dir, editor, this.state );
    197                                                         }
    198                                                 }
    199                                         }
    200 
    201195                                        editor.forceNextSelectionCheck();
    202196                                        // Restore selection position.
    203197                                        selection.selectBookmarks( bookmarks );
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy