Ticket #2886: 2886_ref.patch

File 2886_ref.patch, 8.5 KB (added by Garry Yao, 10 years ago)
  • _source/core/htmlparser/element.js

     
    4444        /** @private */
    4545        this._ =
    4646        {
    47                 isBlockLike : isBlockLike,
    48                 hasInlineStarted : isEmpty || !isBlockLike
     47                isBlockLike : isBlockLike
    4948        };
    5049};
    5150
  • _source/plugins/htmlwriter/plugin.js

     
    6464                this._.indent = false;
    6565                this._.indentation = '';
    6666                this._.rules = {};
     67                this._.cdata = 0;
    6768
    6869                var dtd = CKEDITOR.dtd;
    6970
     
    7172                {
    7273                        this.setRules( e,
    7374                                {
    74                                         indent : true,
     75                                        indent : ( e != 'pre' ),
    7576                                        breakBeforeOpen : true,
    7677                                        breakAfterOpen : true,
    7778                                        breakBeforeClose : !dtd[ e ][ '#' ],
     
    110111                        }
    111112
    112113                        this._.output.push( '<', tagName );
     114                        if ( tagName == 'pre' )
     115                                this._.cdata++;
    113116                },
    114117
    115118                /**
     
    140143
    141144                        if ( rules && rules.breakAfterOpen )
    142145                                this.lineBreak();
     146                        if ( tagName == 'pre' )
     147                                this._.cdata--;
    143148                },
    144149
    145150                /**
  • _source/core/htmlparser/text.js

     
    1212         * @constructor
    1313         * @example
    1414         */
    15         CKEDITOR.htmlParser.text = function( value )
     15        CKEDITOR.htmlParser.text = function( value, noSpacesFix )
    1616        {
    1717                /**
    1818                 * The text value.
     
    1919                 * @type String
    2020                 * @example
    2121                 */
    22                 this.value = value.replace( spacesRegex, ' ' );
     22                this.value = noSpacesFix ? value : value.replace( spacesRegex, ' ' );
    2323
    2424                /** @private */
    2525                this._ =
  • _source/core/htmlparser/fragment.js

     
    3030        /** @private */
    3131        this._ =
    3232        {
    33                 isBlockLike : true,
    34                 hasInlineStarted : false
     33                isBlockLike : true
    3534        };
    3635};
    3736
     
    6261                        html = [],
    6362                        fragment = new CKEDITOR.htmlParser.fragment(),
    6463                        pendingInline = [],
     64                        isBrPending, isBrOptional,
     65                        isPre,
     66                        hasInlineContent,
    6567                        currentNode = fragment,
    6668                        returnPoint;
    6769
     
    6769
    6870                function checkPending( newTagName )
    6971                {
     72                        if ( isBrPending )
     73                        {
     74                                // Pending the first one when multiple 'br' encountered.
     75                                if ( newTagName == 'br'  )
     76                                        isBrPending = true;
     77                                else
     78                                {
     79                                        if ( !newTagName || CKEDITOR.dtd.$empty[ newTagName ] )
     80                                        {
     81                                                currentNode.add( new CKEDITOR.htmlParser.element( 'br', {} ) );
     82                                        }
     83                                        isBrPending = false;
     84                                }
     85                        }
     86                       
    7087                        if ( pendingInline.length > 0 )
    7188                        {
    7289                                for ( var i = 0 ; i < pendingInline.length ; i++ )
     
    8097                                        {
    8198                                                // Get a clone for the pending element.
    8299                                                pendingElement = pendingElement.clone();
     100                                               
     101                                                if ( hasInlineContent )
     102                                                        hasInlineContent = !pendingElement._.isBlockLike && pendingElement.name != 'br';
    83103
    84104                                                // Add it to the current node and make it the current,
    85105                                                // so the new element will be added inside of it.
     
    127147
    128148                parser.onTagOpen = function( tagName, attributes, selfClosing )
    129149                {
     150                        if ( tagName == 'br' )
     151                        {
     152                                if ( isPre )
     153                                {
     154                                        currentNode.add( new CKEDITOR.htmlParser.text( '\n', true ) );
     155                                        return;
     156                                }
     157                                else if ( isBrOptional )
     158                                {
     159                                        isBrPending = true;
     160                                        isBrOptional = false;
     161                                        return;
     162                                }
     163                        }
     164                        else if ( tagName == 'pre' )
     165                                isPre = true;
     166
    130167                        var element = new CKEDITOR.htmlParser.element( tagName, attributes );
    131168
    132169                        // "isEmpty" will be always "false" for unknown elements, so we
     
    141178                                return;
    142179                        }
    143180
     181                        if ( element.isEmpty )
     182                                isBrOptional = true;
     183
    144184                        var currentName = currentNode.name,
    145185                                currentDtd = ( currentName && CKEDITOR.dtd[ currentName ] ) || ( currentNode._.isBlockLike ? CKEDITOR.dtd.div : CKEDITOR.dtd.span );
    146186
     
    180220                                                        // and try adding the new one after it.
    181221                                                        pendingInline.unshift( currentNode );
    182222                                                }
     223                                                else if ( isBrPending )
     224                                                        isBrPending = !currentNode._.isBlockLike;
    183225                                        }
     226                                       
    184227
    185228                                        reApply = true;
    186229                                }
     
    247290                                currentNode = candidate;
    248291
    249292                                addElement( candidate, candidate.parent );
     293                               
     294                                if ( isBrPending )
     295                                        isBrPending = !currentNode._.isBlockLike;
     296                                if ( currentNode.name == 'pre' )
     297                                        isPre = false;
    250298
    251299                                // The parent should start receiving new nodes now, except if
    252300                                // addElement changed the currentNode.
     
    273321
    274322                parser.onText = function( text )
    275323                {
    276                         if ( !currentNode._.hasInlineStarted )
     324                        if ( !hasInlineContent && !isPre )
    277325                        {
    278326                                text = CKEDITOR.tools.ltrim( text );
    279327
     
    286334                        if ( fixForBody && !currentNode.type )
    287335                                this.onTagOpen( 'p', {} );
    288336
    289                         currentNode.add( new CKEDITOR.htmlParser.text( text ) );
     337                        currentNode.add( new CKEDITOR.htmlParser.text( text, isPre ) );
     338                        isBrOptional = true;
    290339                };
    291340
    292341                parser.onComment = function( comment )
     
    357406                        node.parent = this;
    358407
    359408                        this.children.push( node );
    360 
    361                         this._.hasInlineStarted = node.type == CKEDITOR.NODE_TEXT || ( node.type == CKEDITOR.NODE_ELEMENT && !node._.isBlockLike );
    362409                },
    363410
    364411                /**
  • _source/tests/plugins/htmldataprocessor/htmldataprocessor.html

     
    1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    22<html xmlns="http://www.w3.org/1999/xhtml">
    33<head>
    44        <title>Plugin: htmldataprocessor</title>
     
    8989                        else
    9090                                assert.areSame( '<p class="MsoNormal"><b><i><span lang="EN-US"><o:p>Test</o:p></span></i></b></p>', getDataProcessor().toDataFormat( element.getHtml() ) );
    9191                },
     92                test_toDataFormat_4 : function()
     93                {
     94                        var element = new CKEDITOR.dom.element.createFromHtml( '<div><p><br></p></div>' );
     95
     96                        assert.areSame( '<p><br /></p>', getDataProcessor().toDataFormat( element.getHtml() ) );
     97                },
     98
     99                test_toDataFormat_5 : function()
     100                {
     101                        var element = new CKEDITOR.dom.element.createFromHtml( '<div><p><br>A</p></div>' );
     102
     103                        assert.areSame( '<p><br />A</p>', getDataProcessor().toDataFormat( element.getHtml() ) );
     104                },
     105
     106                test_toDataFormat_6 : function()
     107                {
     108                        var element = new CKEDITOR.dom.element.createFromHtml( '<div><p>A<br></p></div>' );
     109
     110                        assert.areSame( '<p>A</p>', getDataProcessor().toDataFormat( element.getHtml() ) );
     111                },
     112
     113                test_toDataFormat_7 : function()
     114                {
     115                        var element = new CKEDITOR.dom.element.createFromHtml( '<div><p> \n  \n   A<br>  \n   \n   </p></div>' );
     116
     117                        assert.areSame( '<p>A</p>', getDataProcessor().toDataFormat( element.getHtml() ) );
     118                },
     119
     120                test_toDataFormat_8 : function()
     121                {
     122                        var element = new CKEDITOR.dom.element.createFromHtml( '<div><p>A<br><br></p></div>' );
     123
     124                        assert.areSame( '<p>A<br /></p>', getDataProcessor().toDataFormat( element.getHtml() ) );
     125                },
     126
     127                test_toDataFormat_9 : function()
     128                {
     129                        var element = new CKEDITOR.dom.element.createFromHtml( '<div><p>A<br><hr></p></div>' );
     130
     131                        // Both the following cases are acceptable. It depends on the way the browser parses the HTML.
     132                        try
     133                        {
     134                                // IE, Opera and Safari
     135                                assert.areSame( '<p>A</p><hr /><p></p>', getDataProcessor().toDataFormat( element.getHtml() ) );
     136                        }
     137                        catch ( e )
     138                        {
     139                                // FF
     140                                assert.areSame( '<p>A</p><hr />', getDataProcessor().toDataFormat( element.getHtml() ) );
     141                        }
     142                },
     143
     144                test_toDataFormat_10 : function()
     145                {
     146                        var element = new CKEDITOR.dom.element.createFromHtml( '<div><p><br><br>A</p></div>' );
     147                        assert.areSame( '<p><br /><br />A</p>', getDataProcessor().toDataFormat( element.getHtml() ) );
     148                },
    92149
    93150                name : document.title
    94151        };
     
    94151        };
    95152})() );
    96153
     154//window.onload = testCase.test_toDataFormat_6;
    97155        //]]>
    98156        </script>
    99157</head>
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy