Ticket #6376: 6376_6.patch

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

     
    5252                        chromeRoot.removeClass( 'cke_mixed_dir_content' );
    5353        }
    5454
    55         function switchDir( element, dir, editor, state )
     55        function switchDir( element, dir, editor, database )
    5656        {
    57                 var dirBefore = element.getComputedStyle( 'direction' );
    58 
    59                 element.removeStyle( 'direction' );
    60                 element.removeAttribute( 'dir' );
     57                // Check first whether one of the ancestors
     58                // has already been styled.
     59                var parent = element;
     60                while ( ( parent = parent.getParent() ) && !parent.is( 'body' ) )
     61                {
     62                        if ( parent.getCustomData( 'bidi_processed' ) )
     63                        {
     64                                // Ancestor style must dominate.
     65                                element.removeStyle( 'direction' );
     66                                element.removeAttribute( 'dir' );
     67                                return;
     68                        }
     69                }
    6170
    62                 if ( state == CKEDITOR.TRISTATE_OFF && element.getComputedStyle( 'direction' ).toLowerCase() != dir )
    63                         element.setAttribute( 'dir', dir );
     71                var useComputedState = ( 'useComputedState' in editor.config ) ? editor.config.useComputedState : 1;
     72               
     73                var elementDir = useComputedState ? element.getComputedStyle( 'direction' )
     74                        : element.getStyle( 'direction' ) || element.hasAttribute( 'dir' );
     75
     76                // Stop if direction is same as present.
     77                if ( elementDir == dir )
     78                        return;
     79
     80                // Reuse computedState if we already have it.
     81                var dirBefore = useComputedState ? elementDir : element.getComputedStyle( 'direction' );
     82
     83                // Clear direction on this element.
     84                element.removeStyle( 'direction' );
     85
     86                // Set new direction for this element.
     87                element.setAttribute( 'dir', dir );
    6488
    6589                // If the element direction changed, we need to switch the margins of
    6690                // the element and all its children, so it will get really reflected
    6791                // like a mirror. (#5910)
    68                 var dirAfter = element.getComputedStyle( 'direction' );
    69                 if ( dirAfter != dirBefore )
     92                if ( dir != dirBefore )
    7093                {
    7194                        var range = new CKEDITOR.dom.range( element.getDocument() );
    7295                        range.setStartBefore( element );
     
    98121                }
    99122
    100123                editor.forceNextSelectionCheck();
     124
     125                CKEDITOR.dom.element.setMarker( database, element, 'bidi_processed', 1 );
     126
     127                return null;
    101128        }
    102129
    103130        function getFullySelected( selection, elements )
     
    124151
    125152                        if ( ranges && ranges.length )
    126153                        {
     154                                var database = {};
    127155                                // Apply do directly selected elements from guardElements.
    128156                                var selectedElement = ranges[ 0 ].getEnclosedNode();
    129157
     
    133161                                        )
    134162                                        selectedElement = getFullySelected( selection, guardElements );
    135163
    136                                 if ( selectedElement )
    137                                 {
    138                                         if ( !selectedElement.isReadOnly() )
    139                                                 switchDir( selectedElement, dir, editor, this.state );
    140                                 }
    141                                 else
    142                                 {
    143                                         // Creates bookmarks for selection, as we may split some blocks.
    144                                         var bookmarks = selection.createBookmarks();
     164                                if ( selectedElement && !selectedElement.isReadOnly() )
     165                                        switchDir( selectedElement, dir, editor, database );
     166                               
     167                                // Creates bookmarks for selection, as we may split some blocks.
     168                                var bookmarks = selection.createBookmarks();
    145169
    146                                         var iterator,
    147                                                 block;
     170                                var iterator,
     171                                        block;
    148172
    149                                         for ( var i = ranges.length - 1 ; i >= 0 ; i-- )
    150                                         {
    151                                                 // Array of elements processed as guardElements.
    152                                                 var processedElements = [];
    153                                                 // Walker searching for guardElements.
    154                                                 var walker = new CKEDITOR.dom.walker( ranges[ i ] );
    155                                                 walker.evaluator = function( node ){
    156                                                         return node.type == CKEDITOR.NODE_ELEMENT
    157                                                                 && node.getName() in guardElements
    158                                                                 && !( node.getName() == ( enterMode == CKEDITOR.ENTER_P ) ? 'p' : 'div'
    159                                                                         && node.getParent().type == CKEDITOR.NODE_ELEMENT
    160                                                                         && node.getParent().getName() == 'blockquote'
    161                                                                 );
    162                                                 };
     173                                for ( var i = ranges.length - 1 ; i >= 0 ; i-- )
     174                                {
     175                                        // Array of elements processed as guardElements.
     176                                        var processedElements = [];
     177                                        // Walker searching for guardElements.
     178                                        var walker = new CKEDITOR.dom.walker( ranges[ i ] );
     179                                        walker.evaluator = function( node )
     180                                        {
     181                                                return node.type == CKEDITOR.NODE_ELEMENT
     182                                                        && node.getName() in guardElements
     183                                                        && !( node.getName() == ( enterMode == CKEDITOR.ENTER_P ) ? 'p' : 'div'
     184                                                                && node.getParent().type == CKEDITOR.NODE_ELEMENT
     185                                                                && node.getParent().getName() == 'blockquote'
     186                                                        );
     187                                        };
    163188
    164                                                 while ( ( block = walker.next() ) )
    165                                                 {
    166                                                         switchDir( block, dir, editor, this.state );
    167                                                         processedElements.push( block );
    168                                                 }
     189                                        while ( ( block = walker.next() ) )
     190                                                switchDir( block, dir, editor, database );
    169191
    170                                                 iterator = ranges[ i ].createIterator();
    171                                                 iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;
     192                                        iterator = ranges[ i ].createIterator();
     193                                        iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;
    172194
    173                                                 while ( ( block = iterator.getNextParagraph( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ) )
    174                                                 {
    175                                                         if ( block.isReadOnly() )
    176                                                                 continue;
     195                                        while ( ( block = iterator.getNextParagraph( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ) )
     196                                                !block.isReadOnly() && switchDir( block, dir, editor, database );
    177197
    178                                                         var _break = 0;
     198                                        CKEDITOR.dom.element.clearAllMarkers( database );
    179199
    180                                                         // Check if block have been already processed by the walker above.
    181                                                         for ( var ii = 0; ii < processedElements.length; ii++ )
    182                                                         {
    183                                                                 var parent = block.getParent();
    184 
    185                                                                 while( parent && parent.getName() != 'body' )
    186                                                                 {
    187                                                                         if ( ( parent.$.isSameNode && parent.$.isSameNode( processedElements[ ii ].$ ) )
    188                                                                                         || parent.$ == processedElements[ ii ].$ )
    189                                                                         {
    190                                                                                 _break = 1;
    191                                                                                 break;
    192                                                                         }
    193                                                                         parent = parent.getParent();
    194                                                                 }
    195 
    196                                                                 if ( _break )
    197                                                                         break;
    198                                                         }
    199 
    200                                                         if ( !_break )
    201                                                         {
    202                                                                 switchDir( block, dir, editor, this.state );
    203                                                         }
    204                                                 }
    205                                         }
    206 
    207200                                        editor.forceNextSelectionCheck();
    208201                                        // Restore selection position.
    209202                                        selection.selectBookmarks( bookmarks );
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy