+ // Our starting and ending points of the range might be inside some blocks under a list item...\r
+ // So before playing with the iterator, we need to expand the block to include the list items.\r
+ var startContainer = range.startContainer,\r
+ endContainer = range.endContainer;\r
+ while ( startContainer && !startContainer.getParent().equals( listNode ) )\r
+ startContainer = startContainer.getParent();\r
+ while ( endContainer && !endContainer.getParent().equals( listNode ) )\r
+ endContainer = endContainer.getParent();\r
+\r
+ if ( !startContainer || !endContainer )\r
+ return;\r
+\r
+ // Now we can iterate over the individual items on the same tree depth.\r
+ var block = startContainer,\r
+ itemsToMove = [],\r
+ stopFlag = false;\r
+ while ( !stopFlag )\r
+ {\r
+ if ( block.equals( endContainer ) )\r
+ stopFlag = true;\r
+ itemsToMove.push( block );\r
+ block = block.getNext();\r
+ }\r
+ if ( itemsToMove.length < 1 )\r
+ return;\r
+\r
+ // Do indent or outdent operations on the array model of the list, not the\r
+ // list's DOM tree itself. The array model demands that it knows as much as\r
+ // possible about the surrounding lists, we need to feed it the further\r
+ // ancestor node that is still a list.\r
+ var listParents = listNode.getParents( true );\r
+ for ( var i = 0 ; i < listParents.length ; i++ )\r
+ {\r
+ if ( listParents[i].getName && listNodeNames[ listParents[i].getName() ] )\r
+ {\r
+ listNode = listParents[i];\r
+ break;\r
+ }\r
+ }\r
+ var indentOffset = self.name == 'indent' ? 1 : -1,\r
+ startItem = itemsToMove[0],\r
+ lastItem = itemsToMove[ itemsToMove.length - 1 ];\r