Changeset 4208


Ignore:
Timestamp:
09/09/09 20:01:26 (5 years ago)
Author:
garry.yao
Message:

Check in changes for #4395: Migrate all word clean up regexp rules to become filter based.

Location:
CKEditor/branches/features/pasting/_source
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • CKEditor/branches/features/pasting/_source/core/htmlparser/element.js

    r3654 r4208  
    1 /* 
     1/* 
    22Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved. 
    33For licensing, see LICENSE.html or http://ckeditor.com/license 
     
    100100                        var attributes = this.attributes; 
    101101 
    102                         // The "_cke_replacedata" indicates that this element is replacing 
    103                         // a data snippet, which should be outputted as is. 
    104                         if ( attributes._cke_replacedata ) 
    105                         { 
    106                                 writer.write( attributes._cke_replacedata ); 
    107                                 return; 
    108                         } 
    109  
    110102                        // Ignore cke: prefixes when writing HTML. 
    111103                        var element = this, 
  • CKEditor/branches/features/pasting/_source/core/tools.js

    r4176 r4208  
    6464                        var clone; 
    6565 
    66                         // Array. 
    67                         if ( obj && ( obj instanceof Array ) ) 
    68                         { 
    69                                 clone = []; 
    70  
    71                                 for ( var i = 0 ; i < obj.length ; i++ ) 
    72                                         clone[ i ] = this.clone( obj[ i ] ); 
    73  
    74                                 return clone; 
    75                         } 
    76  
    7766                        // "Static" types. 
    7867                        if ( obj === null 
     
    8170                                || ( obj instanceof Number ) 
    8271                                || ( obj instanceof Boolean ) 
    83                                 || ( obj instanceof Date ) ) 
     72                                || ( obj instanceof Date ) 
     73                                || ( obj instanceof RegExp) ) 
    8474                        { 
    8575                                return obj; 
  • CKEditor/branches/features/pasting/_source/plugins/pagebreak/plugin.js

    r3308 r4208  
    5656                                                div : function( element ) 
    5757                                                { 
    58                                                         var style = element.attributes.style, 
     58                                                        var attributes = element.attributes 
     59                                                                style = attributes && element.attributes.style, 
    5960                                                                child = style && element.children.length == 1 && element.children[ 0 ], 
    6061                                                                childStyle = child && ( child.name == 'span' ) && child.attributes.style; 
  • CKEditor/branches/features/pasting/_source/plugins/pastefromword/plugin.js

    r4207 r4208  
    2020                        } ); 
    2121                 
    22                 var config = editor.config; 
     22                var config = editor.config, 
     23                        keepHeadingStructure = config.pasteFromWordKeepsStructure, 
     24                        ignoreFontFace = config.pasteFromWordIgnoreFontFace, 
     25                        removeStyleAttr = config.pasteFromWordRemoveStyle; 
     26 
    2327                editor.on( 'paste', function( evt ) 
    2428                { 
     
    2832                                 && /(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test( mswordHtml ) ) 
    2933                        { 
     34                                var onlyChildOf = function( element ) 
     35                                { 
     36                                        var children = element.children, 
     37                                                count = children.length, 
     38                                                firstChild = count && children[ 0 ]; 
     39                                        return firstChild; 
     40                                }; 
     41 
     42                                var falsyFilter = function() 
     43                                         { 
     44                                                return false; 
     45                                         }, 
     46                                         dropStyles = function( styles ) 
     47                                         { 
     48                                                 return function( styleText ) 
     49                                                 { 
     50                                                         var rules = []; 
     51                                                         styleText.replace( /(?:"| |;|^ )\s*([^ :]+?)\s*:\s*([^;"]+?)\s*(?=;|"|$)/g, 
     52                                                                 function( match, name, value ) 
     53                                                                 { 
     54                                                                         name = name.toLowerCase(); 
     55                                                                         var namePattern, 
     56                                                                                 valuePattern; 
     57                                                                         for( var i = 0 ; i < styles.length ; i++ ) 
     58                                                                         { 
     59                                                                                namePattern = styles[ i ][ 0 ], 
     60                                                                                valuePattern = styles[ i ][ 1 ]; 
     61 
     62                                                                                if ( !( name.match( namePattern ) && ( !valuePattern || value.match( valuePattern ) ) ) ) 
     63                                                                                        rules.push( [ name, value ] ); 
     64                                                                         } 
     65                                                                 } ); 
     66 
     67                                                         for ( var i = 0 ; i < rules.length ; i++ ) 
     68                                                                 rules[ i ] = rules[ i ].join( ':' ); 
     69                                                         return rules && ( rules.join( ';' ).replace( /\s+/g, '' ) + ';' ); 
     70                                                 }; 
     71                                         }; 
     72 
    3073                                var filter = editor.pasteProcessor.dataFilter; 
    31                                 // TODO: Migrate the 'CKEDITOR.plugins.pastefromword' to filter rules. 
    3274                                filter.addRules( 
    3375                                { 
    34  
    35                                 } ); 
     76                                        elementNames : 
     77                                        [ 
     78                                                // Remove style, meta and link elements. 
     79                                                [ /style|meta|link/, '' ] 
     80                                        ], 
     81 
     82                                        elements : 
     83                                        { 
     84                                                $ : function( element ) 
     85                                                { 
     86                                                        var tagName = element.name, 
     87                                                                child = onlyChildOf( element ); 
     88 
     89                                                        var match, level; 
     90                                                        // Processing headings. 
     91                                                        if ( ( match = tagName.match( /h(\d)/i ) ) && ( level = match[ 1 ] ) ) 
     92                                                        { 
     93                                                                // Remove empty headings. 
     94                                                                if( child 
     95                                                                        && child.type == CKEDITOR.NODE_TEXT 
     96                                                                        && !CKEDITOR.tools.trim( child.value ) ) 
     97                                                                        return false; 
     98 
     99                                                                // The original <Hn> tag send from Word is something like this: <Hn style="margin-top:0px;margin-bottom:0px"> 
     100                                                                delete element.attributes; 
     101 
     102                                                                if ( keepHeadingStructure ) 
     103                                                                { 
     104                                                                        // Word likes to insert extra <font> tags, when using MSIE. (Wierd). 
     105                                                                        if ( child && child.type == CKEDITOR.NODE_ELEMENT 
     106                                                                                        && child.name.match( /em|font/ ) ) 
     107                                                                                element.children = child.children; 
     108                                                                } 
     109                                                                else 
     110                                                                { 
     111                                                                        // Transform headings to divs. 
     112                                                                        element.name = 'div'; 
     113                                                                        var bold = new CKEDITOR.htmlParser.element( 'b' ), 
     114                                                                                font = new CKEDITOR.htmlParser.element( 'font', { size : Math.abs( 7 - level ) } ); 
     115                                                                        font.children = element.children; 
     116                                                                        bold.children  = [ font ]; 
     117                                                                        element.children = [ bold ]; 
     118                                                                } 
     119                                                        } 
     120                                                        // Remove empty space inline wrapper. 
     121                                                        else if( tagName.match( /u|i|strike|/ ) ) 
     122                                                        { 
     123                                                                if ( child 
     124                                                                         && child.type == CKEDITOR.NODE_TEXT 
     125                                                                         && CKEDITOR.tools.trim( child.value ) == '&nbsp;' ) 
     126                                                                        delete element.name; 
     127                                                        } 
     128                                                        // Remove dummy wrapper span. 
     129                                                        else if( tagName.match( /span|font/ ) ) 
     130                                                        { 
     131                                                                if( !element.attributes ) 
     132                                                                        delete element.name; 
     133                                                        } 
     134                                                        // Remove namespaced element while preserving the content. 
     135                                                        else if( tagName.indexOf( ':' ) != -1 ) 
     136                                                        { 
     137                                                                delete element.name; 
     138                                                        } 
     139                                                } 
     140                                        }, 
     141 
     142                                        attributeNames : 
     143                                        [ 
     144                                                // Remove onmouseover and onmouseout events (from MS Word comments effect) 
     145                                                [ /^onmouse(:?out|over)/, '' ], 
     146                                                // Remove lang/language attributes. 
     147                                                [ /^lang/, '' ], 
     148                                                removeStyleAttr ? [ 'style', '' ] : 
     149                                                ignoreFontFace ? [ 'face', '' ] : null 
     150                                        ], 
     151 
     152                                        attributes : 
     153                                        { 
     154                                                // Remove mso-xxx styles. 
     155                                                // Remove margin styles. 
     156                                                'style' : dropStyles( 
     157                                                [ 
     158                                                        [ /^mso-/ ], 
     159                                                        [ 'margin', /0(?:cm|in) 0(?:cm|in) 0pt/ ], 
     160                                                        [ 'text-indent', '0cm' ], 
     161                                                        [ 'page-break-before' ], 
     162                                                        [ 'tab-stops' ], 
     163                                                        [ 'display', 'none' ], 
     164                                                        ignoreFontFace ? [ 'font-family' ] : null 
     165                                                ] ), 
     166                                                 
     167                                                'class' : falsyFilter, 
     168 
     169                                                // Remove align="left" attribute. 
     170                                                'align' : function( value ) 
     171                                                { 
     172                                                        return ! ( value == 'left ' ); 
     173                                                } 
     174                                        }, 
     175                                        // Remove comments [SF BUG-1481861]. 
     176                                        comment : falsyFilter 
     177                                }, 5 ); 
     178 
    36179                        } 
    37180                } ); 
     
    42185CKEDITOR.plugins.pastefromword = 
    43186{ 
     187        /** 
     188         * @depprecated Leave it here for reference. 
     189         */ 
    44190        cleanWord : function( editor, html, ignoreFont, removeStyles ) 
    45191        { 
     
    179325 * config.pasteFromWordRemoveStyle = true; 
    180326 */ 
    181 CKEDITOR.config.pasteFromWordRemoveStyle = false; 
     327CKEDITOR.config.pasteFromWordRemoveStyle = true; 
    182328 
    183329/** 
     
    190336 * config.pasteFromWordKeepsStructure = true; 
    191337 */ 
    192 CKEDITOR.config.pasteFromWordKeepsStructure = false; 
     338CKEDITOR.config.pasteFromWordKeepsStructure = true; 
  • CKEditor/branches/features/pasting/_source/plugins/styles/plugin.js

    r4050 r4208  
    199199                                                        continue; 
    200200 
    201                                                 var elementAttr = element.getAttribute( attName ); 
    202                                                 if ( attribs[attName] == 
     201                                                var elementAttr = element.getAttribute( attName ) || ''; 
     202                                                if ( attribs[ attName ] == 
    203203                                                         ( attName == 'style' ? 
    204204                                                           normalizeCssText( elementAttr, false ) : elementAttr  ) ) 
Note: See TracChangeset for help on using the changeset viewer.
© 2003 – 2012 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy