Ticket #6173: 6173_2.patch

File 6173_2.patch, 5.7 KB (added by Paweł Horzela, 11 years ago)

Patch

  • _source/plugins/list/plugin.js

     
    694694                        // Register the state changing handlers.
    695695                        editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, numberedListCommand ) );
    696696                        editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, bulletedListCommand ) );
     697
     698                        // Registering keydown delete/backspace key handling logic.
     699                        editor.on( 'contentDom', function()
     700                                {
     701                                        editor.document.on( 'keydown', function( evt )
     702                                                {
     703                                                        var keyCode = evt.data.getKeystroke();
     704
     705                                                        // Backspace or Delete.
     706                                                        if ( keyCode in { 8 : 1, 46 : 1 } )
     707                                                        {
     708                                                                var range = editor.getSelection().getRanges()[ 0 ],
     709                                                                        block = new CKEDITOR.dom.elementPath( range.startContainer ).block,
     710                                                                        li;
     711
     712                                                                if ( range.collapsed && ( li = block.getAscendant( 'li', true ) ) )
     713                                                                {
     714                                                                        // Backspace
     715                                                                        if ( keyCode == 8 && range.checkStartOfBlock() )
     716                                                                        {
     717                                                                                var previous, list, sublist;
     718
     719                                                                                if (
     720                                                                                        // Previous element is item of the same list.
     721                                                                                        ( ( previous = li.getPrevious() ) && previous.is( 'li' ) ) ||
     722                                                                                        // Previous element is item of the parent list.
     723                                                                                        ( ( list = li.getParent() ) && list.is( 'ol', 'ul' ) && ( previous = list.getParent() ) && previous.is( 'li' ) )
     724                                                                                )
     725                                                                                {
     726                                                                                        // If next list item of li also contains list, remove it and add aggain later.
     727                                                                                        var sublist = li.getFirst( function( node ){ return node.is && node.is( 'ol', 'ul' ); } );
     728                                                                                        sublist && sublist.remove();
     729                                                                                        list && list.remove();
     730
     731                                                                                        // In Gecko, the last child node is <br>.
     732                                                                                        if ( CKEDITOR.env.gecko )
     733                                                                                        {
     734                                                                                                li.getLast() && li.getLast().is && li.getLast().is( 'br' ) && li.getLast().remove();
     735                                                                                                previous.getLast() && previous.getLast().is && previous.getLast().is( 'br' ) && previous.getLast().remove();
     736                                                                                        }
     737
     738                                                                                        // If current list item or next list item contains block element
     739                                                                                        // <li><p>...</p></li>
     740                                                                                        var innerLi = li.getFirst() && li.getFirst().type == CKEDITOR.NODE_ELEMENT ? li.getFirst() : li;
     741                                                                                        var innerPrevious = previous.getFirst() && previous.getFirst().type == CKEDITOR.NODE_ELEMENT ? previous.getFirst() : previous;
     742
     743                                                                                        range.moveToElementEditEnd( innerPrevious );
     744                                                                                        innerLi.moveChildren( innerPrevious );
     745                                                                                        li.remove();
     746
     747                                                                                        list && sublist && sublist.getChildCount() && sublist.moveChildren( list, true );
     748                                                                                        list && list.getChildCount() && previous.append( list );
     749
     750                                                                                        range.select();
     751                                                                                        evt.data.preventDefault();
     752                                                                                }
     753                                                                        }
     754                                                                        // Delete
     755                                                                        else if ( keyCode == 46 )
     756                                                                        {
     757                                                                                var sublist = li.getFirst( function( node ){ return node.is && node.is( 'ol', 'ul' ); } );
     758
     759                                                                                // Check if cursor (range) is set in the end of current list item.
     760                                                                                // If list item doesn't contain any sublist we can use range::checkEndOfBlock() function.
     761                                                                                // If list item contains sublist, we have to use walker to find if the next element is sublist.
     762                                                                                if ( !range.checkEndOfBlock() )
     763                                                                                {
     764                                                                                        if ( sublist )
     765                                                                                        {
     766                                                                                                var walkerRange = range.clone();
     767                                                                                                walkerRange.setEndAt( sublist, CKEDITOR.POSITION_AFTER_START );
     768
     769                                                                                                var walker = new CKEDITOR.dom.walker( walkerRange );
     770                                                                                                walker.evaluator = function( node )
     771                                                                                                {
     772                                                                                                        if ( CKEDITOR.env.gecko && node.is && node.is( 'br' ) && node.getNext().is && node.getNext().is( 'ul' ) )
     773                                                                                                                return false;
     774                                                                                                }
     775
     776                                                                                                if ( !walker.next().equals( sublist ) )
     777                                                                                                        return;
     778                                                                                        }
     779                                                                                        else
     780                                                                                                return;
     781                                                                                }
     782
     783                                                                                // Get next list item.
     784                                                                                var next = sublist ?
     785                                                                                        sublist.getFirst( function( node ) { return node.is( 'li' ) } ) :
     786                                                                                        li.getNext();
     787
     788                                                                                if ( !next )
     789                                                                                        return;
     790
     791                                                                                // If next list item from sublist also contains list, remove it and add aggain later.
     792                                                                                var nextSublist = sublist && next.getFirst( function( node ){ return node.is && node.is( 'ol', 'ul' ); } );
     793                                                                                nextSublist && nextSublist.remove();
     794                                                                                sublist && sublist.remove();
     795
     796                                                                                // In Gecko, the last child node is <br>.
     797                                                                                if ( CKEDITOR.env.gecko )
     798                                                                                {
     799                                                                                        li.getLast() && li.getLast().is && li.getLast().is( 'br' ) && li.getLast().remove();
     800                                                                                        next.getLast() && next.getLast().is && next.getLast().is( 'br' ) && next.getLast().remove();
     801                                                                                }
     802
     803                                                                                // If current list item or next list item contains block element
     804                                                                                // <li><p>...</p></li>
     805                                                                                var innerLi = ( li.getChildCount() == 1 && li.getChild(0).type == CKEDITOR.NODE_ELEMENT ) ? li.getChild(0) : li;
     806                                                                                var innerNext = ( next.getChildCount() == 1 && next.getChild(0).type == CKEDITOR.NODE_ELEMENT ) ? next.getChild(0) : next;
     807
     808                                                                                range.moveToElementEditEnd( innerLi );
     809                                                                                innerNext.moveChildren( innerLi );
     810                                                                                next.remove();
     811
     812                                                                                sublist && nextSublist && nextSublist.getChildCount() && nextSublist.moveChildren( sublist, true );
     813                                                                                sublist && sublist.getChildCount() && li.append( sublist );
     814
     815                                                                                range.select();
     816                                                                                evt.data.preventDefault();
     817                                                                        }
     818                                                                }
     819                                                        }
     820                                                });
     821                                });
    697822                },
    698823
    699824                afterInit : function ( editor )
© 2003 – 2022, CKSource sp. z o.o. sp.k. All rights reserved. | Terms of use | Privacy policy