Ticket #3407: 3407_4.patch

File 3407_4.patch, 4.7 KB (added by Artur Formella, 10 years ago)
  • _source/core/htmlparser/comment.js

     
    4545                if ( filter && !( comment = filter.onComment( comment ) ) )
    4646                        return;
    4747
    48                 writer.comment( comment );
     48                if ( typeof comment == 'string' )
     49                        writer.comment( comment );
     50                else
     51                {
     52                        var fragment = new CKEDITOR.htmlParser.fragment();
     53                        fragment.add( comment )
     54                        fragment.writeHtml( writer, filter );
     55                }
    4956        }
    5057};
  • _source/core/htmlparser/filter.js

     
    1111                {
    1212                        this._ =
    1313                        {
     14                                regExp : [],
    1415                                elementNames : [],
    1516                                attributeNames : [],
    1617                                elements : { $length : 0 },
     
    2829                                if ( typeof priority != 'number' )
    2930                                        priority = 10;
    3031
     32                                // Add regular expressions
     33                                addItemsToList( this._.regExp, rules.regExp, priority );
     34
    3135                                // Add the elementNames.
    3236                                addItemsToList( this._.elementNames, rules.elementNames, priority );
    3337
  • _source/plugins/htmldataprocessor/plugin.js

     
    1212                        // Elements that cause problems in wysiwyg mode.
    1313                        [ ( /^(object|embed|param)$/ ), 'cke:$1' ]
    1414                ],
    15 
     15                regExp : [],
    1616                attributeNames :
    1717                [
    1818                        // Event attributes (onXYZ) must not be directly set. They can become
     
    8484                                }
    8585                        },
    8686
     87                        comment : function( content )
     88                        {
     89                                return restoreProtectedElement( content, true );
     90                        },
     91
    8792                        attributes :
    8893                        {
    8994                                'class' : function( value, element )
     
    9499                        }
    95100                };
    96101
     102        var restoreProtectedElement = function( content, forParser )
     103        {
     104                if ( forParser )
     105                {
     106                        var realData = content.match( /^cke_protected\((.*?)\)$/i );
     107                        if ( realData )
     108                        {
     109                                realData = decodeURIComponent( realData[1] );
     110                                return new CKEDITOR.htmlParser.cdata( realData );
     111                        }
     112                        return content;
     113                }
     114                else
     115                {
     116                        content = content.replace(/<\!--cke_protected\((.*?)\)-->/g,
     117                                function( comment )
     118                                        {
     119                                                return decodeURIComponent(
     120                                                                comment.substr( 18, ( comment.length -22 ) )                                    // Get the content.
     121                                                        );
     122                                        }
     123                        );
     124                        return content;
     125                }
     126        };
     127        var createProtectedElement = function( realdata )
     128        {
     129                var realdata = restoreProtectedElement( realdata, false ),                                      // Restore inner text to avoid the second pass.
     130                        protectedData = encodeURIComponent( realdata ).replace( /--/g, "%2D%2D" );              // Protect comments in comment.
     131
     132                return '<!--cke_protected(' + protectedData + ')-->';
     133        };
     134
    97135        if ( CKEDITOR.env.ie )
    98136        {
    99137                // IE outputs style attribute in capital letters. We should convert
     
    111149                return html.replace( protectAttributeRegex, '$& _cke_saved_$1' );
    112150        }
    113151
     152        function protectSource( html, filter )
     153        {
     154                var rules = filter._.regExp;
     155                for ( var i = 0 ; i < rules.length ; i++ )
     156                        html = html.replace( rules[ i ], createProtectedElement );
     157
     158                return html;
     159        }
     160
    114161        CKEDITOR.plugins.add( 'htmldataprocessor',
    115162        {
    116163                requires : [ 'htmlwriter' ],
     
    121168
    122169                        dataProcessor.writer.forceSimpleAmpersand = editor.config.forceSimpleAmpersand;
    123170
     171                        // Create rules.
     172                        protectedSource = editor.config.protectedSource;
     173                        for ( var i=0; i < protectedSource.length; i++ )
     174                                defaultDataFilterRules.regExp.push(     protectedSource[ i ] );
     175       
    124176                        dataProcessor.dataFilter.addRules( defaultDataFilterRules );
    125177                        dataProcessor.htmlFilter.addRules( defaultHtmlFilterRules );
    126178                }
     
    140192                        // The source data is already HTML, but we need to clean
    141193                        // it up and apply the filter.
    142194
    143                         // Before anything, we must protect the URL attributes as the
     195                        // Before anything, we must protect the PHP and ASP content.
     196                        data = protectSource( data, this.dataFilter );
     197
     198                        // We must protect the URL attributes as the
    144199                        // browser may changing them when setting the innerHTML later in
    145200                        // the code.
    146201                        data = protectAttributes( data );
     
    175230})();
    176231
    177232CKEDITOR.config.forceSimpleAmpersand = false;
     233
     234CKEDITOR.config.protectedSource =
     235    [
     236                /<\!--[\s\S]*?-->/g,    // Protect existing coments before anything.
     237                /<%[\s\S]*?%>/g,                // ASP Code
     238                /(<asp:[^\>]+>[\s|\S]*?<\/asp:[^\>]+>)|(<asp:[^\>]+\/>)/gi,             // ASP.Net Tags
     239                /<\?[\s\S]*?\?>/g,              // PHP code
     240                /<script[\s\S]*?<\/script[^>]*>/gi              //Script code
     241    ];
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy