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 )