Ticket #3100: 3100_2.patch

File 3100_2.patch, 4.4 KB (added by Frederico Caldeira Knabben, 15 years ago)
  • _source/core/dom/element.js

     
    658658                        return false;
    659659                },
    660660
     661                isEditable : function()
     662                {
     663                        // Get the element name.
     664                        var name = this.getName();
     665
     666                        // Get the element DTD (defaults to span for unknown elements).
     667                        var dtd = !CKEDITOR.dtd.$nonEditable[ name ]
     668                                                && ( CKEDITOR.dtd[ name ] || CKEDITOR.dtd.span );
     669
     670                        // In the DTD # == text node.
     671                        return ( dtd && dtd['#'] );
     672                },
     673
    661674                isIdentical : function( otherElement )
    662675                {
    663676                        if ( this.getName() != otherElement.getName() )
  • _source/core/dom/range.js

     
    14181418                        walker.forward( CKEDITOR.dom.domWalker.blockBoundary() );
    14191419
    14201420                        return !walker.checkFailed;
     1421                },
     1422
     1423                /**
     1424                 * Moves the range boundaries to the first editing point inside an
     1425                 * element. For example, in an element tree like
     1426                 * "<p><b><i></i></b> Text</p>", the start editing point is
     1427                 * "<p><b><i>^</i></b> Text</p>" (inside <i>).
     1428                 * @param {CKEDITOR.dom.element} targetElement The element into which
     1429                 *              look for the editing spot.
     1430                 */
     1431                moveToElementEditStart : function( targetElement )
     1432                {
     1433                        var editableElement;
     1434
     1435                        while ( targetElement && targetElement.type == CKEDITOR.NODE_ELEMENT )
     1436                        {
     1437                                if ( targetElement.isEditable() )
     1438                                        editableElement = targetElement;
     1439                                else if ( editableElement )
     1440                                        break ;         // If we already found an editable element, stop the loop.
     1441
     1442                                targetElement = targetElement.getFirst();
     1443                        }
     1444
     1445                        if ( editableElement )
     1446                                this.moveToPosition( editableElement, CKEDITOR.POSITION_AFTER_START );
    14211447                }
    14221448        };
    14231449})();
  • _source/core/dtd.js

     
    7979                $listItem : {dd:1,dt:1,li:1},
    8080
    8181                /**
     82                 * Elements that accept text nodes, but are not possible to edit into
     83                 * the browser.
     84                 * @type Object
     85                 * @example
     86                 */
     87                $nonEditable : {applet:1,button:1,embed:1,iframe:1,map:1,object:1,option:1,script:1,textarea:1},
     88
     89                /**
    8290                 * List of elements that can be ignored if empty, like "b" or "span".
    8391                 * @type Object
    8492                 * @example
  • _source/plugins/wysiwygarea/plugin.js

     
    3232                if ( this.mode == 'wysiwyg' )
    3333                {
    3434                        var element = evt.data,
    35                                 isBlock = CKEDITOR.dtd.$block[ element.getName() ];
     35                                elementName = element.getName(),
     36                                isBlock = CKEDITOR.dtd.$block[ elementName ];
    3637
    3738                        var selection = this.getSelection(),
    3839                                ranges = selection.getRanges();
     
    4849
    4950                                clone = element.clone( true );
    5051
     52                                var toSplit;
     53
    5154                                // If the new node is a block element, split the current block (if any).
    5255                                if ( this.config.enterMode != 'br' && isBlock )
    5356                                {
    54                                         var startPath = new CKEDITOR.dom.elementPath( range.startContainer );
    55                                         if ( startPath.block )
    56                                                 range.splitBlock();
     57                                        var startPath = new CKEDITOR.dom.elementPath( range.startContainer ),
     58                                                j = 0,
     59                                                parent;
     60
     61                                        while( ( parent = startPath.elements[ j++ ] ) && parent != startPath.blockLimit )
     62                                        {
     63                                                var parentName = parent.getName(),
     64                                                        parentDtd = CKEDITOR.dtd[ parentName ];
     65
     66                                                if ( parentDtd && !parentDtd[ elementName ] )
     67                                                        toSplit = parent;
     68                                        }
    5769                                }
    5870
    5971                                // Insert the new node.
    6072                                range.insertNode( clone );
    6173
     74                                if ( toSplit )
     75                                        clone.breakParent( toSplit );
     76
    6277                                // Save the last element reference so we can make the
    6378                                // selection later.
    6479                                if ( !lastElement )
     
    6681                        }
    6782
    6883                        range.moveToPosition( lastElement, CKEDITOR.POSITION_AFTER_END );
     84
     85                        var next = lastElement.getNextSourceNode( true );
     86                        if ( next && next.type == CKEDITOR.NODE_ELEMENT )
     87                                range.moveToElementEditStart( next );
     88
    6989                        selection.selectRanges( [ range ] );
    7090                }
    7191        }
© 2003 – 2022, CKSource sp. z o.o. sp.k. All rights reserved. | Terms of use | Privacy policy