X-Git-Url: https://jasonwoof.com/gitweb/?p=ckeditor.git;a=blobdiff_plain;f=_source%2Fplugins%2Findent%2Fplugin.js;h=50b13567bb60e2dc9fe3a67ce9c1acf43bf37077;hp=4c1406eb1040257eddeb68cb2958b179d97ff798;hb=039a051ccf3901311661022a30afd60fc38130c9;hpb=c9fdde67e6384bd5a66adc2b3bba5c4ce9db56c7 diff --git a/_source/plugins/indent/plugin.js b/_source/plugins/indent/plugin.js index 4c1406e..50b1356 100644 --- a/_source/plugins/indent/plugin.js +++ b/_source/plugins/indent/plugin.js @@ -256,72 +256,77 @@ For licensing, see LICENSE.html or http://ckeditor.com/license } else { - var indentCssProperty = getIndentCssProperty( element ); - var currentOffset = parseInt( element.getStyle( indentCssProperty ), 10 ); + var indentCssProperty = getIndentCssProperty( element ), + currentOffset = parseInt( element.getStyle( indentCssProperty ), 10 ); if ( isNaN( currentOffset ) ) currentOffset = 0; - currentOffset += ( self.name == 'indent' ? 1 : -1 ) * editor.config.indentOffset; + var indentOffset = editor.config.indentOffset || 40; + currentOffset += ( self.name == 'indent' ? 1 : -1 ) * indentOffset; if ( currentOffset < 0 ) return false; currentOffset = Math.max( currentOffset, 0 ); - currentOffset = Math.ceil( currentOffset / editor.config.indentOffset ) * editor.config.indentOffset; - element.setStyle( indentCssProperty, currentOffset ? currentOffset + editor.config.indentUnit : '' ); + currentOffset = Math.ceil( currentOffset / indentOffset ) * indentOffset; + element.setStyle( indentCssProperty, currentOffset ? currentOffset + ( editor.config.indentUnit || 'px' ) : '' ); if ( element.getAttribute( 'style' ) === '' ) element.removeAttribute( 'style' ); } - CKEDITOR.dom.element.setMarker( database, element, 'indent_processed', true ); + CKEDITOR.dom.element.setMarker( database, element, 'indent_processed', 1 ); return true; } var selection = editor.getSelection(), - bookmarks = selection.createBookmarks( true ), - ranges = selection && selection.getRanges( true ), + bookmarks = selection.createBookmarks( 1 ), + ranges = selection && selection.getRanges( 1 ), range; - var skipBookmarks = function( node ) - { - return ! node.hasAttribute( '_cke_bookmark' ); - }; var iterator = ranges.createIterator(); while ( ( range = iterator.getNextRange() ) ) { - // Do not indent body. (#6138) - range.shrink( CKEDITOR.SHRINK_ELEMENT ); - if ( range.endContainer.getName() == 'body' ) - range.setEndAt( range.endContainer.getLast( skipBookmarks ), CKEDITOR.POSITION_BEFORE_END ); - - var startContainer = range.startContainer, - endContainer = range.endContainer, - rangeRoot = range.getCommonAncestor(), + var rangeRoot = range.getCommonAncestor(), nearestListBlock = rangeRoot; while ( nearestListBlock && !( nearestListBlock.type == CKEDITOR.NODE_ELEMENT && listNodeNames[ nearestListBlock.getName() ] ) ) nearestListBlock = nearestListBlock.getParent(); + // Avoid having selection enclose the entire list. (#6138) + // [] => + if ( !nearestListBlock ) + { + var selectedNode = range.getEnclosedNode(); + if ( selectedNode + && selectedNode.type == CKEDITOR.NODE_ELEMENT + && selectedNode.getName() in listNodeNames) + { + range.setStartAt( selectedNode, CKEDITOR.POSITION_AFTER_START ); + range.setEndAt( selectedNode, CKEDITOR.POSITION_BEFORE_END ); + nearestListBlock = selectedNode; + } + } + // Avoid selection anchors under list root. // => - if ( nearestListBlock && startContainer.type == CKEDITOR.NODE_ELEMENT - && startContainer.getName() in listNodeNames ) + if ( nearestListBlock && range.startContainer.type == CKEDITOR.NODE_ELEMENT + && range.startContainer.getName() in listNodeNames ) { var walker = new CKEDITOR.dom.walker( range ); walker.evaluator = isListItem; range.startContainer = walker.next(); } - if ( nearestListBlock && endContainer.type == CKEDITOR.NODE_ELEMENT - && endContainer.getName() in listNodeNames ) + if ( nearestListBlock && range.endContainer.type == CKEDITOR.NODE_ELEMENT + && range.endContainer.getName() in listNodeNames ) { walker = new CKEDITOR.dom.walker( range ); walker.evaluator = isListItem; range.endContainer = walker.previous(); } - if ( nearestListBlock ) + if ( nearestListBlock ) { var firstListItem = nearestListBlock.getFirst( function( node ) { @@ -330,9 +335,12 @@ For licensing, see LICENSE.html or http://ckeditor.com/license rangeStart = range.startContainer, indentWholeList = firstListItem.equals( rangeStart ) || firstListItem.contains( rangeStart ); - // Indent the entire list if cursor is inside the first list item. (#3893) - if ( !( indentWholeList && indentElement( nearestListBlock ) ) ) - indentList( nearestListBlock ); + // Indent the entire list if cursor is inside the first list item. (#3893) + // Only do that for indenting or when using indent classes or when there is something to outdent. (#6141) + if ( !( indentWholeList && + ( self.name == 'indent' || self.useIndentClasses || parseInt( nearestListBlock.getStyle( getIndentCssProperty( nearestListBlock ) ), 10 ) ) && + indentElement( nearestListBlock ) ) ) + indentList( nearestListBlock ); } else indentBlock(); @@ -382,43 +390,43 @@ For licensing, see LICENSE.html or http://ckeditor.com/license " padding-left: 40px;" + "}" ); } - }, - requires : [ 'domiterator', 'list' ] - } ); -})(); + // Register dirChanged listener. + editor.on( 'dirChanged', function( e ) + { + var range = new CKEDITOR.dom.range( editor.document ); + range.setStartBefore( e.data ); + range.setEndAfter( e.data ); -CKEDITOR.tools.extend( CKEDITOR.config, - { - indentOffset : 40, - indentUnit : 'px', - indentClasses : null - }); + var walker = new CKEDITOR.dom.walker( range ), + node; -/** - * Size of each indentation step - * @type Number - * @example - * config.indentOffset = 40; - */ + 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.getDirection() ) + { + range.setStartAfter( node ); + walker = new CKEDITOR.dom.walker( range ); + continue; + } - /** - * Unit for the indentation style - * @type String - * @example - * config.indentUnit = 'px'; - */ + // Switch the margins. + var marginLeft = node.getStyle( 'margin-right' ), + marginRight = node.getStyle( 'margin-left' ); - /** - * List of classes to use for indenting the contents. - * @type Array - * @example - * // Don't use classes for indenting. (this is the default value) - * config.indentClasses = null; - * @example - * // Use the classes 'Indent1', 'Indent2', 'Indent3' - * config.indentClasses = ['Indent1', 'Indent2', 'Indent3']; - */ + marginLeft ? node.setStyle( 'margin-left', marginLeft ) : node.removeStyle( 'margin-left' ); + marginRight ? node.setStyle( 'margin-right', marginRight ) : node.removeStyle( 'margin-right' ); + } + } + }); + }, + + requires : [ 'domiterator', 'list' ] + } ); +})(); /** * Size of each indentation step