X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fplugins%2Fjustify%2Fplugin.js;h=2de9b0b77f37393e5530b2b0f6b7cebf893fe8bc;hb=614511639979907ceb0da3614122a4d8eb963ad4;hp=a3ff0ddd192aad332bdff771e0d5d85d7b720fc1;hpb=c6e377a02b54abc07129d72b632763c727476a15;p=ckeditor.git diff --git a/_source/plugins/justify/plugin.js b/_source/plugins/justify/plugin.js index a3ff0dd..2de9b0b 100644 --- a/_source/plugins/justify/plugin.js +++ b/_source/plugins/justify/plugin.js @@ -9,8 +9,6 @@ For licensing, see LICENSE.html or http://ckeditor.com/license (function() { - var alignRemoveRegex = /(-moz-|-webkit-|start|auto)/i; - function getState( editor, path ) { var firstBlock = path.block || path.blockLimit; @@ -18,10 +16,35 @@ For licensing, see LICENSE.html or http://ckeditor.com/license if ( !firstBlock || firstBlock.getName() == 'body' ) return CKEDITOR.TRISTATE_OFF; - var currentAlign = firstBlock.getComputedStyle( 'text-align' ).replace( alignRemoveRegex, '' ); - if ( ( !currentAlign && this.isDefaultAlign ) || currentAlign == this.value ) - return CKEDITOR.TRISTATE_ON; - return CKEDITOR.TRISTATE_OFF; + return ( getAlignment( firstBlock, editor.config.useComputedState ) == this.value ) ? + CKEDITOR.TRISTATE_ON : + CKEDITOR.TRISTATE_OFF; + } + + function getAlignment( element, useComputedState ) + { + useComputedState = useComputedState === undefined || useComputedState; + + var align; + if ( useComputedState ) + align = element.getComputedStyle( 'text-align' ); + else + { + while ( !element.hasAttribute || !( element.hasAttribute( 'align' ) || element.getStyle( 'text-align' ) ) ) + { + var parent = element.getParent(); + if ( !parent ) + break; + element = parent; + } + align = element.getStyle( 'text-align' ) || element.getAttribute( 'align' ) || ''; + } + + align && ( align = align.replace( /-moz-|-webkit-|start|auto/i, '' ) ); + + !align && useComputedState && ( align = element.getComputedStyle( 'direction' ) == 'rtl' ? 'right' : 'left' ); + + return align; } function onSelectionChange( evt ) @@ -36,10 +59,6 @@ For licensing, see LICENSE.html or http://ckeditor.com/license this.name = name; this.value = value; - var contentDir = editor.config.contentsLangDirection; - this.isDefaultAlign = ( value == 'left' && contentDir == 'ltr' ) || - ( value == 'right' && contentDir == 'rtl' ); - var classes = editor.config.justifyClasses; if ( classes ) { @@ -63,6 +82,59 @@ For licensing, see LICENSE.html or http://ckeditor.com/license } } + function onDirChanged( e ) + { + var editor = e.editor; + + var range = new CKEDITOR.dom.range( editor.document ); + range.setStartBefore( e.data.node ); + range.setEndAfter( e.data.node ); + + var walker = new CKEDITOR.dom.walker( range ), + node; + + while ( ( node = walker.next() ) ) + { + if ( node.type == CKEDITOR.NODE_ELEMENT ) + { + // A child with the defined dir is to be ignored. + if ( !node.equals( e.data.node ) && node.getDirection() ) + { + range.setStartAfter( node ); + walker = new CKEDITOR.dom.walker( range ); + continue; + } + + // Switch the alignment. + var classes = editor.config.justifyClasses; + if ( classes ) + { + // The left align class. + if ( node.hasClass( classes[ 0 ] ) ) + { + node.removeClass( classes[ 0 ] ); + node.addClass( classes[ 2 ] ); + } + // The right align class. + else if ( node.hasClass( classes[ 2 ] ) ) + { + node.removeClass( classes[ 2 ] ); + node.addClass( classes[ 0 ] ); + } + } + + // Always switch CSS margins. + var style = 'text-align'; + var align = node.getStyle( style ); + + if ( align == 'left' ) + node.setStyle( style, 'right' ); + else if ( align == 'right' ) + node.setStyle( style, 'left' ); + } + } + } + justifyCommand.prototype = { exec : function( editor ) { @@ -73,12 +145,15 @@ For licensing, see LICENSE.html or http://ckeditor.com/license return; var bookmarks = selection.createBookmarks(), - ranges = selection.getRanges(); - + ranges = selection.getRanges( true ); var cssClassName = this.cssClassName, iterator, block; + + var useComputedState = editor.config.useComputedState; + useComputedState = useComputedState === undefined || useComputedState; + for ( var i = ranges.length - 1 ; i >= 0 ; i-- ) { iterator = ranges[ i ].createIterator(); @@ -87,26 +162,26 @@ For licensing, see LICENSE.html or http://ckeditor.com/license while ( ( block = iterator.getNextParagraph() ) ) { block.removeAttribute( 'align' ); + block.removeStyle( 'text-align' ); + + // Remove any of the alignment classes from the className. + var className = cssClassName && ( block.$.className = + CKEDITOR.tools.ltrim( block.$.className.replace( this.cssClassRegex, '' ) ) ); + + var apply = + ( this.state == CKEDITOR.TRISTATE_OFF ) && + ( !useComputedState || ( getAlignment( block, true ) != this.value ) ); if ( cssClassName ) { - // Remove any of the alignment classes from the className. - var className = block.$.className = - CKEDITOR.tools.ltrim( block.$.className.replace( this.cssClassRegex, '' ) ); - // Append the desired class name. - if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign ) + if ( apply ) block.addClass( cssClassName ); else if ( !className ) block.removeAttribute( 'class' ); } - else - { - if ( this.state == CKEDITOR.TRISTATE_OFF && !this.isDefaultAlign ) - block.setStyle( 'text-align', this.value ); - else - block.removeStyle( 'text-align' ); - } + else if ( apply ) + block.setStyle( 'text-align', this.value ); } } @@ -156,13 +231,9 @@ For licensing, see LICENSE.html or http://ckeditor.com/license editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, right ) ); editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, center ) ); editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, justify ) ); + editor.on( 'dirChanged', onDirChanged ); }, requires : [ 'domiterator' ] }); })(); - -CKEDITOR.tools.extend( CKEDITOR.config, - { - justifyClasses : null - } );