Ticket #2886: 2886_7.patch

File 2886_7.patch, 7.5 KB (added by Martin Kou, 10 years ago)
  • _source/plugins/htmldataprocessor/plugin.js

     
    55
    66(function()
    77{
     8        // Regex to scan for   at the end of blocks, which are actually placeholders.
     9        var tailNbspRegex = /^[\t\r\n ]* $/;
     10
     11        function trimFillers( block, fromSource )
     12        {
     13                // If the current node is a block, and if we're converting from source or
     14                // we're not in IE then search for and remove any tailing BR node.
     15                //
     16                // Also, any   at the end of blocks are fillers, remove them as well.
     17                // (#2886)
     18                var children = block.children;
     19                var lastChild = children[ children.length - 1 ];
     20                if ( lastChild )
     21                {
     22                        if ( ( fromSource || !CKEDITOR.env.ie ) && lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.name == 'br' )
     23                                children.pop();
     24                        if ( lastChild.type == CKEDITOR.NODE_TEXT && tailNbspRegex.test( lastChild.value ) )
     25                                children.pop();
     26                }
     27        }
     28
     29        function blockNeedsExtension( block )
     30        {
     31                if ( block.children.length < 1 )
     32                        return true;
     33
     34                var lastChild = block.children[ block.children.length - 1 ];
     35                return lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.name == 'br';
     36        }
     37
     38        function extendBlockForDisplay( block )
     39        {
     40                trimFillers( block, true );
     41
     42                if ( blockNeedsExtension( block ) )
     43                {
     44                        if ( CKEDITOR.env.ie )
     45                                block.children.push( new CKEDITOR.htmlParser.text( '\xa0' ) );
     46                        else
     47                                block.children.push( new CKEDITOR.htmlParser.element( 'br', {} ) );
     48                }
     49        }
     50
     51        function extendBlockForOutput( block )
     52        {
     53                trimFillers( block );
     54
     55                if ( blockNeedsExtension( block ) )
     56                        block.children.push( new CKEDITOR.htmlParser.text( '\xa0' ) );
     57        }
     58
     59        var dtd = CKEDITOR.dtd;
     60       
     61        // Find out the list of block-like tags that can contain <br>.
     62        var blockLikeTags = CKEDITOR.tools.extend( {}, dtd.$block, dtd.$listItem, dtd.$tableContent );
     63        for ( var i in blockLikeTags )
     64        {
     65                if ( ! ( 'br' in dtd[i] ) )
     66                        delete blockLikeTags[i];
     67        }
     68
    869        var defaultDataFilterRules =
    970        {
    1071                elementNames :
     
    2182                ]
    2283        };
    2384
     85        var defaultDataBlockFilterRules = { elements : {} };
     86
     87        for ( var i in blockLikeTags )
     88                defaultDataBlockFilterRules.elements[ i ] = extendBlockForDisplay;
     89
    2490        /**
    2591         * IE sucks with dynamic 'name' attribute after element is created, '_cke_saved_name' is used instead for this attribute.
    2692         */
     
    103169                        }
    104170                };
    105171
     172        var defaultHtmlBlockFilterRules = { elements : {} };
     173       
     174        for ( var i in blockLikeTags )
     175                defaultHtmlBlockFilterRules.elements[ i ] = extendBlockForOutput;
     176
    106177        if ( CKEDITOR.env.ie )
    107178        {
    108179                // IE outputs style attribute in capital letters. We should convert
     
    131202                        dataProcessor.writer.forceSimpleAmpersand = editor.config.forceSimpleAmpersand;
    132203
    133204                        dataProcessor.dataFilter.addRules( defaultDataFilterRules );
     205                        dataProcessor.dataFilter.addRules( defaultDataBlockFilterRules );
    134206                        dataProcessor.htmlFilter.addRules( defaultHtmlFilterRules );
     207                        dataProcessor.htmlFilter.addRules( defaultHtmlBlockFilterRules );
    135208                }
    136209        });
    137210
  • _source/tests/plugins/htmldataprocessor/htmldataprocessor.html

     
    33<head>
    44        <title>Plugin: htmldataprocessor</title>
    55        <link rel="stylesheet" type="text/css" href="../../test.css" />
    6         <script type="text/javascript" src="../../../../ckeditor_source.js"></script>
     6        <script type="text/javascript" src="../../../../ckeditor_source.js"></script> <!-- %REMOVE_LINE%
     7        <script type="text/javascript" src="../../../ckeditor.js"></script>
     8        %REMOVE_LINE% -->
    79        <script type="text/javascript" src="../../test.js"></script>
    810        <script type="text/javascript">
    911
     
    102104                                getDataProcessor().toDataFormat( '<INPUT type="checkbox" UNKNOWN  autocomplete=off>' ) );
    103105                },
    104106
     107                test_toDataFormat_ticket_2886_1 : function()
     108                {
     109                        var editor = CKEDITOR.instances.editor1;
     110                        var test = this;
     111                        var isReady = !!editor.dataProcessor;
     112
     113                        if ( !isReady )
     114                        {
     115                                editor.on( 'instanceReady', function()
     116                                {
     117                                        isReady = true;
     118                                } );
     119                        }
     120
     121                        this.wait( function()
     122                                {
     123                                        if ( !isReady )
     124                                        {
     125                                                test.wait( arguments.callee, 100 );
     126                                                return;
     127                                        }
     128
     129                                        assert.areSame( '<p>\n\t&nbsp;</p>\n',
     130                                                editor.dataProcessor.toDataFormat( '<p></p>' ) );
     131                                }, 100 );
     132                },
     133
     134                test_toDataFormat_ticket_2886_2 : function()
     135                {
     136                        var dataProcessor = CKEDITOR.instances.editor1.dataProcessor;
     137
     138                        var source = '<p>Some text<br><br><br></p>';
     139                        if ( CKEDITOR.env.ie )
     140                                source = '<p>Some text<br><br></p>';
     141                        assert.areSame( '<p>\n\tSome text<br />\n\t<br />\n\t&nbsp;</p>\n',
     142                                dataProcessor.toDataFormat( source ) );
     143                },
     144
     145                test_toDataFormat_ticket_2886_3 : function()
     146                {
     147                        var dataProcessor = CKEDITOR.instances.editor1.dataProcessor;
     148
     149                        assert.areSame( '<p>\n\tSome text<br />\n\t<br />\n\t<br />\n\tSome more text</p>\n',
     150                                dataProcessor.toDataFormat( '<p>Some text<br><br><br>Some more text</p>' ) );
     151                },
     152
     153                test_toDataFormat_ticket_2886_4 : function()
     154                {
     155                        var dataProcessor = CKEDITOR.instances.editor1.dataProcessor;
     156
     157                        assert.areSame( '<p>\n\tSome text<br />\n\t<br />\n\t&nbsp;</p>\n',
     158                                dataProcessor.toDataFormat( '<p>Some text<br><br>&nbsp;</p>' ) );
     159                },
     160
     161                test_toDataFormat_ticket_2886_5 : function()
     162                {
     163                        if ( CKEDITOR.env.ie )
     164                                return;
     165
     166                        var dataProcessor = CKEDITOR.instances.editor1.dataProcessor;
     167
     168                        assert.areSame( '<p>\n\t&nbsp;</p>\n',
     169                                dataProcessor.toDataFormat( '<p><br></p>' ) );
     170                },
     171
     172                test_toDataFormat_ticket_2886_6 : function()
     173                {
     174                        var dataProcessor = CKEDITOR.instances.editor1.dataProcessor;
     175
     176                        var source = '<p><br><br></p>';
     177                        if ( CKEDITOR.env.ie )
     178                                source = '<p><br></p>';
     179
     180                        assert.areSame( '<p>\n\t<br />\n\t&nbsp;</p>\n',
     181                                dataProcessor.toDataFormat( source ) );
     182                },
     183
     184                test_toHtml_ticket_2886_1 : function()
     185                {
     186                        var dataProcessor = CKEDITOR.instances.editor1.dataProcessor;
     187
     188                        var expected = '<p><br /></p>';
     189                        if ( CKEDITOR.env.ie )
     190                                expected = '<p>\xa0</p>';
     191                        assert.areSame( expected, dataProcessor.toHtml( '<p></p>' ) );
     192                },
     193
     194                test_toHtml_ticket_2886_2 : function()
     195                {
     196                        var dataProcessor = CKEDITOR.instances.editor1.dataProcessor;
     197
     198                        var expected = '<p>Some text<br />Some other text</p>';
     199                        assert.areSame( expected, dataProcessor.toHtml( '<p>Some text<br>Some other text</p>' ) );
     200                },
     201
     202                test_toHtml_ticket_2886_3 : function()
     203                {
     204                        var dataProcessor = CKEDITOR.instances.editor1.dataProcessor;
     205
     206                        var expected = '<p>Some text<br /><br /></p>';
     207                        if ( CKEDITOR.env.ie )
     208                                expected = '<p>Some text<br />\xa0</p>';
     209                        assert.areSame( expected, dataProcessor.toHtml( '<p>Some text<br>&nbsp;</p>' ) );
     210                },
     211
     212                test_toHtml_ticket_2886_4 : function()
     213                {
     214                        var dataProcessor = CKEDITOR.instances.editor1.dataProcessor;
     215
     216                        var expected = '<p>Some text</p>';
     217                        assert.areSame( expected, dataProcessor.toHtml( '<p>Some text<br></p>' ));
     218                },
     219
    105220                name : document.title
    106221        };
    107222})() );
     
    115230        </script>
    116231</head>
    117232<body>
     233        <textarea id="editor1" class="ckeditor" cols="80" rows="10"></textarea>
    118234</body>
    119235</html>
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy