X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=_source%2Fcore%2Fhtmlparser%2Ffragment.js;h=66bb3be0e9f8d848f29e8744e630a5aca630a400;hb=7cd80714081a8ffdf4a1a8d2c72f120ed5ef3d6d;hp=7f6c6df8620ac53b09fd51d66096c3bff6e43f82;hpb=ea7e3453c7b0f023b050aca6d9f83ab372860d91;p=ckeditor.git diff --git a/_source/core/htmlparser/fragment.js b/_source/core/htmlparser/fragment.js index 7f6c6df..66bb3be 100644 --- a/_source/core/htmlparser/fragment.js +++ b/_source/core/htmlparser/fragment.js @@ -45,7 +45,8 @@ CKEDITOR.htmlParser.fragment = function() // parser fixing. var nonBreakingBlocks = CKEDITOR.tools.extend( {table:1,ul:1,ol:1,dl:1}, - CKEDITOR.dtd.table, CKEDITOR.dtd.ul, CKEDITOR.dtd.ol, CKEDITOR.dtd.dl ); + CKEDITOR.dtd.table, CKEDITOR.dtd.ul, CKEDITOR.dtd.ol, CKEDITOR.dtd.dl ), + listBlocks = CKEDITOR.dtd.$list, listItems = CKEDITOR.dtd.$listItem; /** * Creates a {@link CKEDITOR.htmlParser.fragment} from an HTML string. @@ -189,13 +190,27 @@ CKEDITOR.htmlParser.fragment = function() if ( !currentName ) return; - var reApply = false; + var reApply = false, + addPoint; // New position to start adding nodes. + // Fixing malformed nested lists(#3828). + if( tagName in listBlocks + && currentName in listBlocks ) + { + var children = currentNode.children, + lastChild = children[ children.length - 1 ]; + // Move inner list into to previous list item if any. + if( lastChild && lastChild.name in listItems ) + returnPoint = currentNode, addPoint = lastChild; + // Move inner list outside in the worst case. + else + addElement( currentNode, currentNode.parent ); + } // If the element name is the same as the current element name, // then just close the current one and append the new one to the // parent. This situation usually happens with

,

  • ,
    and //
    , specially in IE. Do not enter in this if block in this case. - if ( tagName == currentName ) + else if ( tagName == currentName ) { addElement( currentNode, currentNode.parent ); } @@ -222,9 +237,11 @@ CKEDITOR.htmlParser.fragment = function() reApply = true; } - // In any of the above cases, we'll be adding, or trying to - // add it to the parent. - currentNode = currentNode.returnPoint || currentNode.parent; + if( addPoint ) + currentNode = addPoint; + // Try adding it to the return point, or the parent element. + else + currentNode = currentNode.returnPoint || currentNode.parent; if ( reApply ) { @@ -247,8 +264,18 @@ CKEDITOR.htmlParser.fragment = function() parser.onTagClose = function( tagName ) { - var index = 0, - pendingAdd = [], + // Check if there is any pending tag to be closed. + for ( var i = pendingInline.length - 1 ; i >= 0 ; i-- ) + { + // If found, just remove it from the list. + if ( tagName == pendingInline[ i ].name ) + { + pendingInline.splice( i, 1 ); + return; + } + } + + var pendingAdd = [], candidate = currentNode; while ( candidate.type && candidate.name != tagName ) @@ -256,14 +283,8 @@ CKEDITOR.htmlParser.fragment = function() // If this is an inline element, add it to the pending list, so // it will continue after the closing tag. if ( !candidate._.isBlockLike ) - { pendingInline.unshift( candidate ); - // Increase the index, so it will not get checked again in - // the pending list check that follows. - index++; - } - // This node should be added to it's parent at this point. But, // it should happen only if the closing tag is really closing // one of the nodes. So, for now, we just cache it. @@ -275,7 +296,7 @@ CKEDITOR.htmlParser.fragment = function() if ( candidate.type ) { // Add all elements that have been found in the above loop. - for ( var i = 0 ; i < pendingAdd.length ; i++ ) + for ( i = 0 ; i < pendingAdd.length ; i++ ) { var node = pendingAdd[ i ]; addElement( node, node.parent ); @@ -293,26 +314,6 @@ CKEDITOR.htmlParser.fragment = function() if ( candidate == currentNode ) currentNode = currentNode.parent; } - // The tag is not actually closing anything, thus we need invalidate - // the pending elements.(#3862) - else - { - pendingInline.splice( 0, index ); - index = 0; - } - - // Check if there is any pending tag to be closed. - for ( ; index < pendingInline.length ; index++ ) - { - // If found, just remove it from the list. - if ( tagName == pendingInline[ index ].name ) - { - pendingInline.splice( index, 1 ); - - // Decrease the index so we continue from the next one. - index--; - } - } }; parser.onText = function( text )