X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fplugins%2Findent%2Fplugin.js;h=5dcfe6323cc0c0589e0da349e8f098af851a6e12;hb=4e90e78dc97789709ee7404359a5517540c27553;hp=80fc71da023d751337a48cc82ad1d5764c37a894;hpb=f8fc585c18d287eb325c575596d183122486b641;p=ckeditor.git diff --git a/_source/plugins/indent/plugin.js b/_source/plugins/indent/plugin.js index 80fc71d..5dcfe63 100644 --- a/_source/plugins/indent/plugin.js +++ b/_source/plugins/indent/plugin.js @@ -1,5 +1,5 @@ /* -Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. +Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ @@ -9,33 +9,25 @@ For licensing, see LICENSE.html or http://ckeditor.com/license (function() { - var listNodeNames = { ol : 1, ul : 1 }; - - var isNotWhitespaces = CKEDITOR.dom.walker.whitespaces( true ), + var listNodeNames = { ol : 1, ul : 1 }, + isNotWhitespaces = CKEDITOR.dom.walker.whitespaces( true ), isNotBookmark = CKEDITOR.dom.walker.bookmark( false, true ); - function setState( editor, state ) - { - editor.getCommand( this.name ).setState( state ); - } - function onSelectionChange( evt ) { - var editor = evt.editor; - - var elementPath = evt.data.path, - list = elementPath && elementPath.contains( listNodeNames ); + var editor = evt.editor, + elementPath = evt.data.path, + list = elementPath && elementPath.contains( listNodeNames ), + firstBlock = elementPath.block || elementPath.blockLimit; if ( list ) - return setState.call( this, editor, CKEDITOR.TRISTATE_OFF ); + return this.setState( CKEDITOR.TRISTATE_OFF ); if ( !this.useIndentClasses && this.name == 'indent' ) - return setState.call( this, editor, CKEDITOR.TRISTATE_OFF ); + return this.setState( CKEDITOR.TRISTATE_OFF ); - var path = evt.data.path, - firstBlock = path.block || path.blockLimit; if ( !firstBlock ) - return setState.call( this, editor, CKEDITOR.TRISTATE_DISABLED ); + return this.setState( CKEDITOR.TRISTATE_DISABLED ); if ( this.useIndentClasses ) { @@ -48,274 +40,302 @@ For licensing, see LICENSE.html or http://ckeditor.com/license } if ( ( this.name == 'outdent' && !indentStep ) || ( this.name == 'indent' && indentStep == editor.config.indentClasses.length ) ) - return setState.call( this, editor, CKEDITOR.TRISTATE_DISABLED ); - return setState.call( this, editor, CKEDITOR.TRISTATE_OFF ); + return this.setState( CKEDITOR.TRISTATE_DISABLED ); + return this.setState( CKEDITOR.TRISTATE_OFF ); } else { - var indent = parseInt( firstBlock.getStyle( this.indentCssProperty ), 10 ); + var indent = parseInt( firstBlock.getStyle( getIndentCssProperty( firstBlock ) ), 10 ); if ( isNaN( indent ) ) indent = 0; if ( indent <= 0 ) - return setState.call( this, editor, CKEDITOR.TRISTATE_DISABLED ); - return setState.call( this, editor, CKEDITOR.TRISTATE_OFF ); + return this.setState( CKEDITOR.TRISTATE_DISABLED ); + return this.setState( CKEDITOR.TRISTATE_OFF ); } } - function indentList( editor, range, listNode ) + function indentCommand( editor, name ) { - // Our starting and ending points of the range might be inside some blocks under a list item... - // So before playing with the iterator, we need to expand the block to include the list items. - var startContainer = range.startContainer, - endContainer = range.endContainer; - while ( startContainer && !startContainer.getParent().equals( listNode ) ) - startContainer = startContainer.getParent(); - while ( endContainer && !endContainer.getParent().equals( listNode ) ) - endContainer = endContainer.getParent(); - - if ( !startContainer || !endContainer ) - return; - - // Now we can iterate over the individual items on the same tree depth. - var block = startContainer, - itemsToMove = [], - stopFlag = false; - while ( !stopFlag ) - { - if ( block.equals( endContainer ) ) - stopFlag = true; - itemsToMove.push( block ); - block = block.getNext(); - } - if ( itemsToMove.length < 1 ) - return; - - // Do indent or outdent operations on the array model of the list, not the - // list's DOM tree itself. The array model demands that it knows as much as - // possible about the surrounding lists, we need to feed it the further - // ancestor node that is still a list. - var listParents = listNode.getParents( true ); - for ( var i = 0 ; i < listParents.length ; i++ ) + this.name = name; + this.useIndentClasses = editor.config.indentClasses && editor.config.indentClasses.length > 0; + if ( this.useIndentClasses ) { - if ( listParents[i].getName && listNodeNames[ listParents[i].getName() ] ) - { - listNode = listParents[i]; - break; - } + this.classNameRegex = new RegExp( '(?:^|\\s+)(' + editor.config.indentClasses.join( '|' ) + ')(?=$|\\s)' ); + this.indentClassMap = {}; + for ( var i = 0 ; i < editor.config.indentClasses.length ; i++ ) + this.indentClassMap[ editor.config.indentClasses[i] ] = i + 1; } - var indentOffset = this.name == 'indent' ? 1 : -1, - startItem = itemsToMove[0], - lastItem = itemsToMove[ itemsToMove.length - 1 ], - database = {}; - // Convert the list DOM tree into a one dimensional array. - var listArray = CKEDITOR.plugins.list.listToArray( listNode, database ); - - // Apply indenting or outdenting on the array. - var baseIndent = listArray[ lastItem.getCustomData( 'listarray_index' ) ].indent; - for ( i = startItem.getCustomData( 'listarray_index' ); i <= lastItem.getCustomData( 'listarray_index' ); i++ ) - { - listArray[ i ].indent += indentOffset; - // Make sure the newly created sublist get a brand-new element of the same type. (#5372) - var listRoot = listArray[ i ].parent; - listArray[ i ].parent = new CKEDITOR.dom.element( listRoot.getName(), listRoot.getDocument() ); - } + this.startDisabled = name == 'outdent'; + } - for ( i = lastItem.getCustomData( 'listarray_index' ) + 1 ; - i < listArray.length && listArray[i].indent > baseIndent ; i++ ) - listArray[i].indent += indentOffset; + // Returns the CSS property to be used for identing a given element. + function getIndentCssProperty( element, dir ) + { + return ( dir || element.getComputedStyle( 'direction' ) ) == 'ltr' ? 'margin-left' : 'margin-right'; + } - // Convert the array back to a DOM forest (yes we might have a few subtrees now). - // And replace the old list with the new forest. - var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode, 0 ); + function isListItem( node ) + { + return node.type = CKEDITOR.NODE_ELEMENT && node.is( 'li' ); + } - // Avoid nested
  • after outdent even they're visually same, - // recording them for later refactoring.(#3982) - if ( this.name == 'outdent' ) + indentCommand.prototype = { + exec : function( editor ) { - var parentLiElement; - if ( ( parentLiElement = listNode.getParent() ) && parentLiElement.is( 'li' ) ) - { - var children = newList.listNode.getChildren(), - pendingLis = [], - count = children.count(), - child; + var self = this, database = {}; - for ( i = count - 1 ; i >= 0 ; i-- ) + function indentList( listNode ) + { + // Our starting and ending points of the range might be inside some blocks under a list item... + // So before playing with the iterator, we need to expand the block to include the list items. + var startContainer = range.startContainer, + endContainer = range.endContainer; + while ( startContainer && !startContainer.getParent().equals( listNode ) ) + startContainer = startContainer.getParent(); + while ( endContainer && !endContainer.getParent().equals( listNode ) ) + endContainer = endContainer.getParent(); + + if ( !startContainer || !endContainer ) + return; + + // Now we can iterate over the individual items on the same tree depth. + var block = startContainer, + itemsToMove = [], + stopFlag = false; + while ( !stopFlag ) { - if ( ( child = children.getItem( i ) ) && child.is && child.is( 'li' ) ) - pendingLis.push( child ); + if ( block.equals( endContainer ) ) + stopFlag = true; + itemsToMove.push( block ); + block = block.getNext(); } - } - } + if ( itemsToMove.length < 1 ) + return; + + // Do indent or outdent operations on the array model of the list, not the + // list's DOM tree itself. The array model demands that it knows as much as + // possible about the surrounding lists, we need to feed it the further + // ancestor node that is still a list. + var listParents = listNode.getParents( true ); + for ( var i = 0 ; i < listParents.length ; i++ ) + { + if ( listParents[i].getName && listNodeNames[ listParents[i].getName() ] ) + { + listNode = listParents[i]; + break; + } + } + var indentOffset = self.name == 'indent' ? 1 : -1, + startItem = itemsToMove[0], + lastItem = itemsToMove[ itemsToMove.length - 1 ]; - if ( newList ) - newList.listNode.replace( listNode ); + // Convert the list DOM tree into a one dimensional array. + var listArray = CKEDITOR.plugins.list.listToArray( listNode, database ); - // Move the nested
  • to be appeared after the parent. - if ( pendingLis && pendingLis.length ) - { - for ( i = 0; i < pendingLis.length ; i++ ) - { - var li = pendingLis[ i ], - followingList = li; - - // Nest preceding