JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.4.2
[ckeditor.git] / _source / plugins / list / plugin.js
index b0d5e8c..0b61c2d 100644 (file)
@@ -80,19 +80,19 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                indentLevel = Math.max( listArray[ baseIndex ].indent, 0 ),\r
                                currentListItem = null,\r
                                paragraphName = ( paragraphMode == CKEDITOR.ENTER_P ? 'p' : 'div' );\r
-                       while ( true )\r
+                       while ( 1 )\r
                        {\r
                                var item = listArray[ currentIndex ];\r
                                if ( item.indent == indentLevel )\r
                                {\r
                                        if ( !rootNode || listArray[ currentIndex ].parent.getName() != rootNode.getName() )\r
                                        {\r
-                                               rootNode = listArray[ currentIndex ].parent.clone( false, true );\r
+                                               rootNode = listArray[ currentIndex ].parent.clone( false, 1 );\r
                                                retval.append( rootNode );\r
                                        }\r
-                                       currentListItem = rootNode.append( item.element.clone( false, true ) );\r
+                                       currentListItem = rootNode.append( item.element.clone( 0, 1 ) );\r
                                        for ( var i = 0 ; i < item.contents.length ; i++ )\r
-                                               currentListItem.append( item.contents[i].clone( true, true ) );\r
+                                               currentListItem.append( item.contents[i].clone( 1, 1 ) );\r
                                        currentIndex++;\r
                                }\r
                                else if ( item.indent == Math.max( indentLevel, 0 ) + 1 )\r
@@ -108,19 +108,26 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                                currentListItem = item.element.clone( false, true );\r
                                        else\r
                                        {\r
-                                               // Create completely new blocks here, attributes are dropped.\r
-                                               if ( dir || ( paragraphMode != CKEDITOR.ENTER_BR && item.grandparent.getName() != 'td' ) )\r
+                                               // Create completely new blocks here.\r
+                                               if ( dir || item.element.hasAttributes() ||\r
+                                                       ( paragraphMode != CKEDITOR.ENTER_BR && item.grandparent.getName() != 'td' ) )\r
                                                {\r
                                                        currentListItem = doc.createElement( paragraphName );\r
-                                                       if ( dir )\r
-                                                               currentListItem.setAttribute( 'dir', dir );\r
+                                                       item.element.copyAttributes( currentListItem, { type:1, value:1 } );\r
+                                                       dir && currentListItem.setAttribute( 'dir', dir );\r
+\r
+                                                       // There might be a case where there are no attributes in the element after all\r
+                                                       // (i.e. when "type" or "value" are the only attributes set). In this case, if enterMode = BR,\r
+                                                       // the current item should be a fragment.\r
+                                                       if ( !dir && paragraphMode == CKEDITOR.ENTER_BR && !currentListItem.hasAttributes() )\r
+                                                               currentListItem = new CKEDITOR.dom.documentFragment( doc );\r
                                                }\r
                                                else\r
                                                        currentListItem = new CKEDITOR.dom.documentFragment( doc );\r
                                        }\r
 \r
                                        for ( i = 0 ; i < item.contents.length ; i++ )\r
-                                               currentListItem.append( item.contents[i].clone( true, true ) );\r
+                                               currentListItem.append( item.contents[i].clone( 1, 1 ) );\r
 \r
                                        if ( currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT\r
                                                 && currentIndex != listArray.length - 1 )\r
@@ -268,6 +275,11 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                for ( var i = 0 ; i < contents.length ; i++ )\r
                        commonParent = commonParent.getCommonAncestor( contents[i].getParent() );\r
 \r
+               var useComputedState = editor.config.useComputedState,\r
+                       listDir, explicitDirection;\r
+\r
+               useComputedState = useComputedState === undefined || useComputedState;\r
+\r
                // We want to insert things that are in the same tree level only, so calculate the contents again\r
                // by expanding the selected blocks to the same tree level.\r
                for ( i = 0 ; i < contents.length ; i++ )\r
@@ -279,6 +291,22 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                if ( parentNode.equals( commonParent ) )\r
                                {\r
                                        listContents.push( contentNode );\r
+\r
+                                       // Determine the lists's direction.\r
+                                       if ( !explicitDirection && contentNode.getDirection() )\r
+                                               explicitDirection = 1;\r
+\r
+                                       var itemDir = contentNode.getDirection( useComputedState );\r
+\r
+                                       if ( listDir !== null )\r
+                                       {\r
+                                               // If at least one LI have a different direction than current listDir, we can't have listDir.\r
+                                               if ( listDir && listDir != itemDir )\r
+                                                       listDir = null;\r
+                                               else\r
+                                                       listDir = itemDir;\r
+                                       }\r
+\r
                                        break;\r
                                }\r
                                contentNode = parentNode;\r
@@ -290,39 +318,40 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
 \r
                // Insert the list to the DOM tree.\r
                var insertAnchor = listContents[ listContents.length - 1 ].getNext(),\r
-                       listNode = doc.createElement( this.type ),\r
-                       dir;\r
+                       listNode = doc.createElement( this.type );\r
 \r
                listsCreated.push( listNode );\r
+\r
+               var contentBlock, listItem;\r
+\r
                while ( listContents.length )\r
                {\r
-                       var contentBlock = listContents.shift(),\r
-                               listItem = doc.createElement( 'li' );\r
+                       contentBlock = listContents.shift();\r
+                       listItem = doc.createElement( 'li' );\r
 \r
                        // Preserve preformat block and heading structure when converting to list item. (#5335) (#5271)\r
                        if ( contentBlock.is( 'pre' ) || headerTagRegex.test( contentBlock.getName() ) )\r
                                contentBlock.appendTo( listItem );\r
                        else\r
                        {\r
-                               if ( contentBlock.hasAttribute( 'dir' ) )\r
+                               // Remove DIR attribute if it was merged into list root.\r
+                               if ( listDir && contentBlock.getDirection() )\r
                                {\r
-                                       dir = dir || contentBlock.getAttribute( 'dir' );\r
+                                       contentBlock.removeStyle( 'direction' );\r
                                        contentBlock.removeAttribute( 'dir' );\r
                                }\r
+\r
                                contentBlock.copyAttributes( listItem );\r
                                contentBlock.moveChildren( listItem );\r
                                contentBlock.remove();\r
-\r
-                               // Append a bogus BR to force the LI to render at full height\r
-                               if ( !CKEDITOR.env.ie )\r
-                                       listItem.appendBogus();\r
                        }\r
 \r
                        listItem.appendTo( listNode );\r
                }\r
 \r
-               if ( dir )\r
-                       listNode.setAttribute( 'dir', dir );\r
+               // Apply list root dir only if it has been explicitly declared.\r
+               if ( listDir && explicitDirection )\r
+                       listNode.setAttribute( 'dir', listDir );\r
 \r
                if ( insertAnchor )\r
                        listNode.insertBefore( insertAnchor );\r
@@ -443,9 +472,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                                enclosedNode = range && range.getEnclosedNode();\r
                                        if ( enclosedNode && enclosedNode.is\r
                                                && this.type == enclosedNode.getName() )\r
-                                       {\r
-                                               setState.call( this, editor, CKEDITOR.TRISTATE_ON );\r
-                                       }\r
+                                                       setState.call( this, editor, CKEDITOR.TRISTATE_ON );\r
                                }\r
                        }\r
 \r
@@ -487,7 +514,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                                pathElements = path.elements,\r
                                                pathElementsCount = pathElements.length,\r
                                                listNode = null,\r
-                                               processedFlag = false,\r
+                                               processedFlag = 0,\r
                                                blockLimit = path.blockLimit,\r
                                                element;\r
 \r
@@ -513,7 +540,7 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                                                listGroups.push( groupObj );\r
                                                                CKEDITOR.dom.element.setMarker( database, element, 'list_group_object', groupObj );\r
                                                        }\r
-                                                       processedFlag = true;\r
+                                                       processedFlag = 1;\r
                                                        break;\r
                                                }\r
                                        }\r
@@ -566,10 +593,10 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
                                        {\r
                                                sibling.remove();\r
                                                // Move children order by merge direction.(#3820)\r
-                                               sibling.moveChildren( listNode, rtl ? true : false );\r
+                                               sibling.moveChildren( listNode, rtl );\r
                                        }\r
                                } )();\r
-                               mergeSibling( true );\r
+                               mergeSibling( 1 );\r
                        }\r
 \r
                        // Clean up, restore selection and update toolbar button states.\r