Ticket #4548: 4548_3.patch

File 4548_3.patch, 9.4 KB (added by Garry Yao, 10 years ago)
  • _source/plugins/fakecomment/plugin.js

     
     1/*
     2Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
     3For licensing, see LICENSE.html or http://ckeditor.com/license
     4*/
     5
     6/**
     7 * @file Comment place holder plugin which create a fake object to represent HTML
     8 * comments in certain patterns.
     9 */
     10
     11CKEDITOR.plugins.add( 'fakecomment',
     12{
     13        requires  : [ 'htmldataprocessor','fakeobjects' ],
     14        init : function( editor )
     15        {
     16                // Add the style that renders our placeholder.
     17                editor.addCss(
     18                        'img.cke_comment' +
     19                        '{' +
     20                                'background-image: url(' + CKEDITOR.getUrl( this.path + 'images/placeholder.gif' ) + ');' +
     21                            '-webkit-background-size: 20px 20px;' +
     22                            '-o-background-size: 20px 20px;' +
     23                                'background-position: center center;' +
     24                                'background-repeat: no-repeat;' +
     25                                'display: inline;' +
     26                                'width: 20px;' +
     27                                'vertical-align: middle;' +
     28                                'border: #999999 1px dotted;' +
     29                        '}' );
     30        },
     31
     32        // There's currently no gurantee on registration order, this make sure
     33        // the registration will come after the default ones in 'htmldataprocessor'.
     34        afterInit : function( editor )
     35        {
     36                var dataProcessor = editor.dataProcessor,
     37                        dataFilter = dataProcessor.dataFilter,
     38                        htmlFilter = dataProcessor.htmlFilter,
     39                        // Borrow the comment output filters to restore them.
     40                        commentFilters = htmlFilter._.comment,
     41                        filter = commentFilters.filter || commentFilters[ 0 ],
     42                        config = editor.config,
     43                        fakeComments = config.fakeComments || [] ;
     44
     45                if( ! ( fakeComments && fakeComments.length ) )
     46                        return;
     47
     48                var fakeComment,
     49                    // Used when 'displayName' is not presented in comment definition.
     50                        defaultDisplayName = 'cke:comment',
     51                        allFakeWrapperTagNames = {},
     52                        allFakeCommentPatterns = [];
     53
     54                for ( var i = 0; i < fakeComments.length; i++ )
     55                {
     56                        fakeComment = fakeComments[ i ];
     57                        if( fakeComment.displayName )
     58                                allFakeWrapperTagNames[ fakeComment.displayName ] = 1;
     59                        else if( !( defaultDisplayName in allFakeWrapperTagNames ) )
     60                                allFakeWrapperTagNames[ defaultDisplayName ] = 1;
     61
     62                        fakeComment.pattern && allFakeCommentPatterns.push(
     63                                [ fakeComment.pattern,
     64                                  fakeComment.displayName || defaultDisplayName ] );
     65                }
     66
     67                // Create fake objects for all fake comments.
     68                dataFilter.addRules(
     69                        {
     70                                comment : function( value )
     71                                {
     72                                        var data = filter( value ),
     73                                                fakeWrapper, fakeElement,
     74                                                pattern,
     75                                                fakeCommentName;
     76
     77                                        // Instance of CKEDITOR.htmlParser.cdata is expected.
     78                                        if ( data.value )
     79                                        {
     80                                                for ( var i = 0; i < allFakeCommentPatterns.length; i++ )
     81                                                {
     82                                                        pattern = allFakeCommentPatterns[ i ];
     83                                                        // Is it actually a comment and match the desired pattern?
     84                                                        data.value.replace( /<!--([\s\S]*?)-->/, function( match, content )
     85                                                        {
     86                                                                if( content.match( pattern[ 0 ] ) )
     87                                                                {
     88                                                                        fakeCommentName = pattern[ 1 ];
     89                                                                        fakeWrapper = new CKEDITOR.htmlParser.element( fakeCommentName, {} );
     90                                                                        fakeWrapper.add( data );
     91                                                                        fakeElement = editor.createFakeParserElement( fakeWrapper, 'cke_comment', fakeCommentName, false );
     92
     93                                                                        // Comment content specific style.
     94                                                                        fakeElement.attributes.style = pattern.style;
     95                                                                        allFakeWrapperTagNames[ fakeCommentName ] = 1;
     96                                                                }
     97                                                        } );
     98
     99                                                        if ( fakeElement )
     100                                                                return fakeElement;
     101                                                }
     102                                        }
     103                                        return value;
     104                                }
     105                        } );
     106
     107                // Reveal the real comments under cover on output.
     108                htmlFilter.addRules(
     109                {
     110                        elements :
     111                        {
     112                                '$' : function( element )
     113                                {
     114                                        // Drop the wrapper element.
     115                                        if ( element.name in allFakeWrapperTagNames )
     116                                        {
     117                                                delete element.name;
     118                                        }
     119                                }
     120                        }
     121                } );
     122
     123        }
     124} );
     125
     126/**
     127 * A list of comment definition which will be converted to fake element in wysiwyg mode.
     128 * @name CKEDITOR.config.fakeComments
     129 * @type Array
     130 * @default []
     131 * @example
     132 * CKEDITOR.config.fakeComments =
     133 * [
     134 *      {
     135 *              pattern : /^break$/,
     136 *              styles :
     137 *              {
     138 *                      display : 'block'
     139 *              },
     140 *              displayName : 'page-break'
     141 *      }
     142 * ];
     143 */
  • _source/core/dom/elementpath.js

     
    1 /*
     1/*
    22Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
    33For licensing, see LICENSE.html or http://ckeditor.com/license
    44*/
    55
    66(function()
    77{
    8         // Elements that may be considered the "Block boundary" in an element path.
    9         var pathBlockElements = { address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,de:1 };
    108
    119        // Elements that may be considered the "Block limit" in an element path.
    1210        var pathBlockLimitElements = { body:1,div:1,table:1,tbody:1,tr:1,td:1,th:1,caption:1,form:1 };
     
    4846
    4947                                if ( !blockLimit )
    5048                                {
    51                                         if ( !block && pathBlockElements[ elementName ] )
     49                                        if ( !block && e.isBlockBoundary() )
    5250                                                block = e;
    5351
    5452                                        if ( pathBlockLimitElements[ elementName ] )
  • _source/plugins/fakeobjects/plugin.js

     
    55
    66(function()
    77{
    8         var htmlFilterRules =
    9         {
    10                 elements :
    11                 {
    12                         $ : function( element )
    13                         {
    14                                 var realHtml = element.attributes._cke_realelement,
    15                                         realFragment = realHtml && new CKEDITOR.htmlParser.fragment.fromHtml( decodeURIComponent( realHtml ) ),
    16                                         realElement = realFragment && realFragment.children[ 0 ];
    17 
    18                                 if ( realElement )
    19                                 {
    20                                         // If we have width/height in the element, we must move it into
    21                                         // the real element.
    22 
    23                                         var style = element.attributes.style;
    24 
    25                                         if ( style )
    26                                         {
    27                                                 // Get the width from the style.
    28                                                 var match = /(?:^|\s)width\s*:\s*(\d+)/.exec( style ),
    29                                                         width = match && match[1];
    30 
    31                                                 // Get the height from the style.
    32                                                 match = /(?:^|\s)height\s*:\s*(\d+)/.exec( style );
    33                                                 var height = match && match[1];
    34 
    35                                                 if ( width )
    36                                                         realElement.attributes.width = width;
    37 
    38                                                 if ( height )
    39                                                         realElement.attributes.height = height;
    40                                         }
    41                                 }
    42 
    43                                 return realElement;
    44                         }
    45                 }
    46         };
    47 
    488        CKEDITOR.plugins.add( 'fakeobjects',
    499        {
    5010                requires : [ 'htmlwriter' ],
     
    5515                                htmlFilter = dataProcessor && dataProcessor.htmlFilter;
    5616
    5717                        if ( htmlFilter )
    58                                 htmlFilter.addRules( htmlFilterRules );
    59                 }
    60         });
     18                                htmlFilter.addRules(
     19                                {
     20                                        elements :
     21                                        {
     22                                                $ : CKEDITOR.editor.restoreParserElement
     23                                        }
     24                                } );
     25                }
     26        });
    6127})();
    6228
    6329CKEDITOR.editor.prototype.createFakeElement = function( realElement, className, realElementType, isResizable )
     
    10975        var html = decodeURIComponent( fakeElement.getAttribute( '_cke_realelement' ) );
    11076        return CKEDITOR.dom.element.createFromHtml( html, this.document );
    11177};
     78
     79CKEDITOR.editor.restoreParserElement = function( fakeElement )
     80{
     81        var realHtml = fakeElement.attributes._cke_realelement,
     82                realFragment = realHtml && new CKEDITOR.htmlParser.fragment.fromHtml( decodeURIComponent( realHtml ) ),
     83                realElement = realFragment && realFragment.children[ 0 ];
     84
     85        if ( realElement )
     86        {
     87                // If we have width/height in the fakeElement, we must move it into
     88                // the real fakeElement.
     89
     90                var style = fakeElement.attributes.style;
     91
     92                if ( style )
     93                {
     94                        // Get the width from the style.
     95                        var match = /(?:^|\s)width\s*:\s*(\d+)/.exec( style ),
     96                                width = match && match[1];
     97
     98                        // Get the height from the style.
     99                        match = /(?:^|\s)height\s*:\s*(\d+)/.exec( style );
     100                        var height = match && match[1];
     101
     102                        if ( width )
     103                                realElement.attributes.width = width;
     104
     105                        if ( height )
     106                                realElement.attributes.height = height;
     107                }
     108        }
     109
     110        return realElement;
     111}
  • _source/core/htmlparser/fragment.js

     
    107107                        // body (if fixForBody).
    108108                        if ( fixForBody && !target.type )
    109109                        {
    110                                 var elementName, realElementName;
     110                                var elementName, realElement;
    111111                                if ( element.attributes
    112                                          && ( realElementName =
    113                                                   element.attributes[ '_cke_real_element_type' ] ) )
    114                                         elementName = realElementName;
    115                                 else
    116                                         elementName =  element.name;
    117                                 if ( !( elementName in CKEDITOR.dtd.$body ) )
     112                                         && element.attributes[ '_cke_real_element_type' ] )
     113                                        realElement = CKEDITOR.editor.restoreParserElement( element );
     114
     115                                elementName =  realElement ?
     116                                               ( realElement.isUnknown ?    // Don't fix for unknown elements.
     117                                                 '' : realElement.name ) : element.name;
     118
     119                                if ( elementName && !( elementName in CKEDITOR.dtd.$body ) )
    118120                                {
    119121                                        var savedCurrent = currentNode;
    120122
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy