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