Ticket #6946: 6946_2.patch

File 6946_2.patch, 3.0 KB (added by Garry Yao, 8 years ago)
  • _source/core/htmlparser/fragment.js

     
    4646        var nonBreakingBlocks = CKEDITOR.tools.extend(
    4747                        {table:1,ul:1,ol:1,dl:1},
    4848                        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;
    5050
     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
    5154        /**
    5255         * Creates a {@link CKEDITOR.htmlParser.fragment} from an HTML string.
    5356         * @param {String} fragmentHtml The HTML to be parsed, filling the fragment.
     
    114117                                currentNode.add( pendingBRs.shift() );
    115118                }
    116119
    117                 function addElement( element, target, enforceCurrent )
     120                function addElement( element, target, enforceCurrent, moveCurrent )
    118121                {
    119122                        target = target || currentNode || fragment;
    120123
    121124                        // If the target is the fragment and this inline element can't go inside
    122125                        // body (if fixForBody).
    123                         if ( fixForBody && !target.type )
     126                        if ( fixForBody && ( !target.type || target.name == 'body' ) )
    124127                        {
    125128                                var elementName, realElementName;
    126129                                if ( element.attributes
     
    170173                                currentNode = element.returnPoint;
    171174                                delete element.returnPoint;
    172175                        }
     176                        else if ( moveCurrent )
     177                                currentNode = target;
    173178                }
    174179
    175180                parser.onTagOpen = function( tagName, attributes, selfClosing )
     
    203208
    204209                        var currentName = currentNode.name;
    205210
    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;
    209214
    210215                        // If the element cannot be child of the current element.
    211216                        if ( currentDtd   // Fragment could receive any elements.
     
    238243                                }
    239244                                else if ( tagName in CKEDITOR.dtd.$listItem )
    240245                                {
    241                                         parser.onTagOpen( 'ul', {} );
     246                                        parser.onTagOpen( tagName == 'li' ? 'ul' : 'dl', {} );
    242247                                        addPoint = currentNode;
    243248                                        reApply = true;
    244249                                }
     
    404409
    405410                // Close all pending nodes.
    406411                while ( currentNode.type )
    407                 {
    408                         var parent = currentNode.parent,
    409                                 node = currentNode;
     412                        addElement( currentNode, currentNode.parent, 0, 1 );
    410413
    411                         if ( fixForBody
    412                                  && ( !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 
    424414                return fragment;
    425415        };
    426416
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy