Index: _source/core/htmlparser/fragment.js
===================================================================
--- _source/core/htmlparser/fragment.js (revision 6284)
+++ _source/core/htmlparser/fragment.js (revision )
@@ -46,8 +46,11 @@
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 ),
- listBlocks = CKEDITOR.dtd.$list, listItems = CKEDITOR.dtd.$listItem;
+ listBlocks = { ol:1, ul:1 }, listItems = CKEDITOR.dtd.$listItem;
+ // Dtd of the fragment element, basically it accept anything except for intermediate structure, e.g. orphan
.
+ var rootDtd = CKEDITOR.tools.extend( {}, { html: 1}, CKEDITOR.dtd.html, CKEDITOR.dtd.body, CKEDITOR.dtd.head );
+
/**
* Creates a {@link CKEDITOR.htmlParser.fragment} from an HTML string.
* @param {String} fragmentHtml The HTML to be parsed, filling the fragment.
@@ -114,13 +117,13 @@
currentNode.add( pendingBRs.shift() );
}
- function addElement( element, target, enforceCurrent )
+ function addElement( element, target, enforceCurrent, moveCurrent )
{
target = target || currentNode || fragment;
// If the target is the fragment and this inline element can't go inside
// body (if fixForBody).
- if ( fixForBody && !target.type )
+ if ( fixForBody && ( !target.type || target.name == 'body' ) )
{
var elementName, realElementName;
if ( element.attributes
@@ -170,6 +173,8 @@
currentNode = element.returnPoint;
delete element.returnPoint;
}
+ else if ( moveCurrent )
+ currentNode = target;
}
parser.onTagOpen = function( tagName, attributes, selfClosing )
@@ -203,9 +208,9 @@
var currentName = currentNode.name;
- var currentDtd = currentName
- && ( CKEDITOR.dtd[ currentName ]
- || ( currentNode._.isBlockLike ? CKEDITOR.dtd.div : CKEDITOR.dtd.span ) );
+ var currentDtd = currentName ? ( CKEDITOR.dtd[ currentName ]
+ || ( currentNode._.isBlockLike ? CKEDITOR.dtd.div : CKEDITOR.dtd.span ) )
+ : rootDtd;
// If the element cannot be child of the current element.
if ( currentDtd // Fragment could receive any elements.
@@ -238,7 +243,7 @@
}
else if ( tagName in CKEDITOR.dtd.$listItem )
{
- parser.onTagOpen( 'ul', {} );
+ parser.onTagOpen( tagName == 'li' ? 'ul' : 'dl', {} );
addPoint = currentNode;
reApply = true;
}
@@ -404,23 +409,8 @@
// Close all pending nodes.
while ( currentNode.type )
- {
- var parent = currentNode.parent,
- node = currentNode;
+ addElement( currentNode, currentNode.parent, 0, 1 );
- if ( fixForBody
- && ( !parent.type || parent.name == 'body' )
- && !CKEDITOR.dtd.$body[ node.name ] )
- {
- currentNode = parent;
- parser.onTagOpen( fixForBody, {} );
- parent = currentNode;
- }
-
- parent.add( node );
- currentNode = parent;
- }
-
return fragment;
};