Ticket #3165: 3165_2.patch

File 3165_2.patch, 5.7 KB (added by Garry Yao, 10 years ago)
  • _source/plugins/enterkey/plugin.js

     
    101101                if ( !isStartOfBlock && !isEndOfBlock )
    102102                {
    103103                        // If the next block is an <li> with another list tree as the first
    104                         // child, we'll need to append a placeholder or the list item
     104                        // child, we'll need to append a filler (<br>/NBSP) or the list item
    105105                        // wouldn't be editable. (#1420)
    106                         if ( nextBlock.is( 'li' ) && ( node = nextBlock.getFirst() )
    107                                         && node.is && node.is( 'ul', 'ol') )
    108                                 nextBlock.insertBefore( doc.createText( '\xa0' ), node );
     106                        if ( nextBlock.is( 'li' )
     107                                 && ( node = nextBlock.getFirst( CKEDITOR.dom.walker.invisible( true ) ) )
     108                                 && node.is && node.is( 'ul', 'ol' ) )
     109                                ( CKEDITOR.env.ie ? doc.createText( '\xa0') : doc.createElement( 'br' ) ).insertBefore( node );
    109110
    110111                        // Move the selection to the end block.
    111112                        if ( nextBlock )
  • _source/core/dom/element.js

     
    627627
    628628                /**
    629629                 * Gets the first child node of this element.
     630                 * @param {Function} evaluator Filtering the result node.
    630631                 * @returns {CKEDITOR.dom.node} The first child node or null if not
    631632                 *              available.
    632633                 * @example
     
    634635                 * var first = <b>element.getFirst()</b>;
    635636                 * alert( first.getName() );  // "b"
    636637                 */
    637                 getFirst : function()
     638                getFirst : function( evaluator )
    638639                {
    639                         var $ = this.$.firstChild;
    640                         return $ ? new CKEDITOR.dom.node( $ ) : null;
     640                        var first = this.$.firstChild,
     641                                retval = first && new CKEDITOR.dom.node( first );
     642                        if ( retval && evaluator && !evaluator( retval ) )
     643                                retval = retval.getNext( evaluator );
     644
     645                        return retval;
    641646                },
    642647
    643648                /**
  • _source/core/dom/walker.js

     
    408408                        return isReject ^ isWhitespace;
    409409                };
    410410        };
     411
     412        /**
     413         * Whether the node is invisible in wysiwyg mode.
     414         * @param isReject
     415         */
     416        CKEDITOR.dom.walker.invisible = function( isReject )
     417        {
     418                var whitespace = CKEDITOR.dom.walker.whitespaces();
     419                return function( node )
     420                {
     421                        // Nodes that take no spaces in wysiwyg:
     422                        // 1. White-spaces but not including NBSP;
     423                        // 2. Empty inline elements, e.g. <b></b> we're checking here 'offsetHeight'
     424                        // instead of width for properly excluding all sorts of empty paragraph, e.g. <br />.
     425                        var isInvisible = whitespace( node )
     426                                        || !node.$.offsetHeight;
     427                        return isReject ^ isInvisible;
     428                };
     429        };
     430
    411431})();
  • _source/plugins/htmldataprocessor/plugin.js

     
    4545                return !lastChild || lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.name == 'br';
    4646        }
    4747
     48        function extendNestedListForDisplay( list )
     49        {
     50                var children = list.children,
     51                        firstChild = children && children[ 0 ],
     52                        secondChild = children && children[ 1 ];
     53
     54                if( firstChild &&
     55                    firstChild.type == CKEDITOR.NODE_TEXT
     56                        && tailNbspRegex.test( firstChild.value )
     57                    && secondChild && secondChild.type == CKEDITOR.NODE_ELEMENT
     58                        && secondChild.name in CKEDITOR.dtd.$list )
     59                        children[ 0 ] = new CKEDITOR.htmlParser.element( 'br', {} );
     60        }
     61
    4862        function extendBlockForDisplay( block )
    4963        {
    5064                trimFillers( block, true );
     
    6680                        block.add( new CKEDITOR.htmlParser.text( '\xa0' ) );
    6781        }
    6882
     83        function extendNestedListForOutput( list )
     84        {
     85                var children = list.children,
     86                        firstChild = children && children[ 0 ],
     87                        secondChild = children && children[ 1 ];
     88
     89                if( firstChild && firstChild.type == CKEDITOR.NODE_ELEMENT
     90                        && firstChild.name == 'br'
     91                    && secondChild && secondChild.type == CKEDITOR.NODE_ELEMENT
     92                        && secondChild.name in CKEDITOR.dtd.$list )
     93                        children[ 0 ] = new CKEDITOR.htmlParser.text( '\xa0' );
     94        }
     95
    6996        var dtd = CKEDITOR.dtd;
    7097
    7198        // Find out the list of block-like tags that can contain <br>.
     
    93120        for ( i in blockLikeTags )
    94121                defaultDataBlockFilterRules.elements[ i ] = extendBlockForDisplay;
    95122
     123        var defaultListDataFilterRules = { elements : {} };
     124        if( !CKEDITOR.env.ie )
     125        {
     126                for( i in dtd.$listItem )
     127                        defaultListDataFilterRules.elements[ i ] = extendNestedListForDisplay;
     128        }
     129
    96130        var defaultHtmlFilterRules =
    97131                {
    98132                        elementNames :
     
    189223        for ( i in blockLikeTags )
    190224                defaultHtmlBlockFilterRules.elements[ i ] = extendBlockForOutput;
    191225
     226        var defaultListHtmlFilterRules = { elements : {} };
     227        if( !CKEDITOR.env.ie )
     228        {
     229                for( i in dtd.$listItem )
     230                        defaultListHtmlFilterRules.elements[ i ] = extendNestedListForOutput;
     231        }
     232
    192233        if ( CKEDITOR.env.ie )
    193234        {
    194235                // IE outputs style attribute in capital letters. We should convert
     
    293334
    294335                        dataProcessor.dataFilter.addRules( defaultDataFilterRules );
    295336                        dataProcessor.dataFilter.addRules( defaultDataBlockFilterRules );
     337                        dataProcessor.dataFilter.addRules( defaultListDataFilterRules );
    296338                        dataProcessor.htmlFilter.addRules( defaultHtmlFilterRules );
    297339                        dataProcessor.htmlFilter.addRules( defaultHtmlBlockFilterRules );
     340                        dataProcessor.htmlFilter.addRules( defaultListHtmlFilterRules );
    298341                }
    299342        });
    300343
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy