Ticket #6946: 6946_2.patch
File 6946_2.patch, 3.0 KB (added by , 13 years ago) |
---|
-
_source/core/htmlparser/fragment.js
46 46 var nonBreakingBlocks = CKEDITOR.tools.extend( 47 47 {table:1,ul:1,ol:1,dl:1}, 48 48 CKEDITOR.dtd.table, CKEDITOR.dtd.ul, CKEDITOR.dtd.ol, CKEDITOR.dtd.dl ), 49 listBlocks = CKEDITOR.dtd.$list, listItems = CKEDITOR.dtd.$listItem;49 listBlocks = { ol:1, ul:1 }, listItems = CKEDITOR.dtd.$listItem; 50 50 51 // Dtd of the fragment element, basically it accept anything except for intermediate structure, e.g. orphan <li>. 52 var rootDtd = CKEDITOR.tools.extend( {}, { html: 1}, CKEDITOR.dtd.html, CKEDITOR.dtd.body, CKEDITOR.dtd.head ); 53 51 54 /** 52 55 * Creates a {@link CKEDITOR.htmlParser.fragment} from an HTML string. 53 56 * @param {String} fragmentHtml The HTML to be parsed, filling the fragment. … … 114 117 currentNode.add( pendingBRs.shift() ); 115 118 } 116 119 117 function addElement( element, target, enforceCurrent )120 function addElement( element, target, enforceCurrent, moveCurrent ) 118 121 { 119 122 target = target || currentNode || fragment; 120 123 121 124 // If the target is the fragment and this inline element can't go inside 122 125 // body (if fixForBody). 123 if ( fixForBody && !target.type)126 if ( fixForBody && ( !target.type || target.name == 'body' ) ) 124 127 { 125 128 var elementName, realElementName; 126 129 if ( element.attributes … … 170 173 currentNode = element.returnPoint; 171 174 delete element.returnPoint; 172 175 } 176 else if ( moveCurrent ) 177 currentNode = target; 173 178 } 174 179 175 180 parser.onTagOpen = function( tagName, attributes, selfClosing ) … … 203 208 204 209 var currentName = currentNode.name; 205 210 206 var currentDtd = currentName 207 && ( CKEDITOR.dtd[ currentName ]208 || ( currentNode._.isBlockLike ? CKEDITOR.dtd.div : CKEDITOR.dtd.span ) );211 var currentDtd = currentName ? ( CKEDITOR.dtd[ currentName ] 212 || ( currentNode._.isBlockLike ? CKEDITOR.dtd.div : CKEDITOR.dtd.span ) ) 213 : rootDtd; 209 214 210 215 // If the element cannot be child of the current element. 211 216 if ( currentDtd // Fragment could receive any elements. … … 238 243 } 239 244 else if ( tagName in CKEDITOR.dtd.$listItem ) 240 245 { 241 parser.onTagOpen( 'ul', {} );246 parser.onTagOpen( tagName == 'li' ? 'ul' : 'dl', {} ); 242 247 addPoint = currentNode; 243 248 reApply = true; 244 249 } … … 404 409 405 410 // Close all pending nodes. 406 411 while ( currentNode.type ) 407 { 408 var parent = currentNode.parent, 409 node = currentNode; 412 addElement( currentNode, currentNode.parent, 0, 1 ); 410 413 411 if ( fixForBody412 && ( !parent.type || parent.name == 'body' )413 && !CKEDITOR.dtd.$body[ node.name ] )414 {415 currentNode = parent;416 parser.onTagOpen( fixForBody, {} );417 parent = currentNode;418 }419 420 parent.add( node );421 currentNode = parent;422 }423 424 414 return fragment; 425 415 }; 426 416