Changeset 4275


Ignore:
Timestamp:
09/22/2009 06:39:30 PM (5 years ago)
Author:
garry.yao
Message:

Various fixings including headings as list item, table styles and font-family on Safari.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CKEditor/branches/features/pasting/_source/plugins/pastefromword/plugin.js

    r4271 r4275  
    5959 
    6060                                // TODO: Support more list style type from MS-Word. 
    61                                 if ( bulletStyle[ 2 ] ) 
     61                                if( !bulletStyle ) 
     62                                { 
     63                                        bulletStyle = 'decimal'; 
     64                                        listType = 'ol'; 
     65                                } 
     66                                else if ( bulletStyle[ 2 ] ) 
    6267                                { 
    6368                                        if ( !isNaN( bulletStyle[ 1 ] ) ) 
     
    7479                                else 
    7580                                { 
    76                                         if ( bulletStyle[ 1 ].search(/[l·•]/) != -1 ) 
     81                                        if ( bulletStyle[ 1 ].search(/[l\u00B7\u2002]/) != -1 ) //l·• 
    7782                                                bulletStyle = 'disc'; 
    78                                         else if ( bulletStyle[ 1 ].search(/[oØ]/) != -1 ) 
     83                                        else if ( bulletStyle[ 1 ].search(/[\u006F\u00D8]/) != -1 )  //oØ 
    7984                                                bulletStyle = 'circle'; 
    80                                         else if ( bulletStyle[ 1 ].search(/[n◆]/) != -1 ) 
     85                                        else if ( bulletStyle[ 1 ].search(/[\u006E\u25C6]/) != -1 ) //n◆ 
    8186                                                bulletStyle = 'square'; 
    8287                                        else 
     
    101106                                if( /mso-list:\s*Ignore/i.test( styleText ) ) 
    102107                                        return true; 
     108                        }, 
     109 
     110                        resolveList : function( element ) 
     111                        { 
     112                                // <cke:listbullet> lies inside indicate a list item. 
     113                                var children = element.children, 
     114                                        attrs = element.attributes, 
     115                                        listMarker; 
     116                                if( ( listMarker = element.anyChildWithName( 'cke:listbullet' ) ) 
     117                                          && listMarker.length 
     118                                          && ( listMarker = listMarker[ 0 ] ) ) 
     119                                { 
     120                                        element.name = 'cke:li'; 
     121                                        attrs.style = CKEDITOR.plugins.pastefromword.filters.stylesFilter( 
     122                                        [ 
     123                                                [ 'text-indent' ], 
     124                                                [ 'margin-left', null, function( value ) 
     125                                                { 
     126                                                        // Resolve indent level from 'margin-left' style. 
     127                                                        attrs[ 'cke:indent' ] = parseInt( value ); 
     128                                                } ] 
     129                                        ] )( attrs.style, element ) || '' ; 
     130 
     131                                        // Inherit list-type-style from bullet. 
     132                                        var listBulletAttrs = listMarker.attributes, 
     133                                                listBulletStyle = listBulletAttrs.style; 
     134 
     135                                        attrs.style += listBulletStyle; 
     136                                        CKEDITOR.tools.extend( attrs, listBulletAttrs ); 
     137                                        children.splice( 0, 1 ); 
     138                                        return true; 
     139                                } 
    103140                        } 
    104141 
     
    185222                                                element.name = styleDef.element; 
    186223                                                CKEDITOR.tools.extend( element.attributes, CKEDITOR.tools.clone( styleDef.attributes ) ); 
    187                                                 var attrs = element.attributes; 
    188                                                 attrs.style = ( attrs.style || '' ) + CKEDITOR.style.getStyleText( styleDef ); 
     224                                                element.addStyle( CKEDITOR.style.getStyleText( styleDef ) ); 
    189225                                        } 
    190226                                }, 
     
    235271                                createListBulletMarker = this.utils.createListBulletMarker, 
    236272                                isListBulletIndicator = this.utils.isListBulletIndicator, 
     273                                resolveList = this.utils.resolveList, 
    237274                                listDtdParents = CKEDITOR.dtd.parentOf( 'ol' ), 
    238275                                config = editor.config, 
     
    257294                                                { 
    258295                                                        element.filterChildren(); 
    259                                                         var onlyChild = element.onlyChild(); 
    260                                                         // Remove empty headings. 
    261                                                         if( onlyChild && onlyChild.value 
    262                                                                 && !CKEDITOR.tools.trim( onlyChild.value ) ) 
    263                                                                 return false; 
    264                                                         delete element.attributes; 
     296                                                        // Heading might be a list. 
     297                                                        if( resolveList( element ) ) 
     298                                                                return; 
     299 
    265300                                                        // Migrate heading formatting to editor configured ones. 
    266301                                                        elementMigrateFilter( config[ 'format_' + tagName ] )( element ); 
     
    274309                                                                delete element.name; 
    275310                                                } 
    276                                                 // Remove namespaced element while preserving the content. 
     311                                                // Remove ms-office namespaced element while preserving the content. 
    277312                                                else if( tagName.indexOf( ':' ) != -1 
    278313                                                                 && tagName.indexOf( 'cke' ) == -1 ) 
     
    391426                                                { 
    392427                                                        if( attrs && attrs.style ) 
    393                                                                 parent.attributes.style += ( attrs.style + ';' ); 
     428                                                                parent.addStyle( attrs.style  ); 
     429 
    394430                                                        delete element.name; 
    395431                                                        return; 
    396432                                                } 
    397                                                 // <cke:listbullet> lies inside any paragraph indicate a list item. 
    398                                                 var childs; 
    399                                                 if( ( childs = element.anyChildWithName( 'cke:listbullet' ) ) 
    400                                                          && childs.length ) 
    401                                                 { 
    402                                                         var listMaker = childs[ 0 ]; 
    403                                                         element.name = 'cke:li'; 
    404                                                         attrs.style = stylesFilter( 
    405                                                         [ 
    406                                                                 [ 'text-indent' ], 
    407                                                                 [ 'margin-left', null, function( value ) 
    408                                                                 { 
    409                                                                         // Resolve indent level from 'margin-left' style. 
    410                                                                         attrs[ 'cke:indent' ] = parseInt( value ); 
    411                                                                 } ] 
    412                                                         ] )( attrs.style, element ) || '' ; 
    413  
    414                                                         // Inherit list-type-style from bullet.  
    415                                                         var listBulletAttrs = listMaker.attributes, 
    416                                                                 listBulletStyle = listBulletAttrs.style; 
    417  
    418                                                         attrs.style += listBulletStyle; 
    419                                                         CKEDITOR.tools.extend( attrs, listBulletAttrs ); 
    420                                                         children.splice( 0, 1 ); 
     433 
     434                                                // Paragraph might be a list. 
     435                                                if( resolveList( element ) ) 
    421436                                                        return; 
    422                                                 } 
    423437 
    424438                                                // Migrate paragraph formatting based on editor's enter-mode. 
     
    510524                                                attrs.style = stylesFilter( 
    511525                                                                        [ 
    512                                                                                 [ 'font-family', null, styleMigrateFilter( config[ 'font_style' ], 'family' ) ], 
     526                                                                                [ /^font-family$/, null, styleMigrateFilter( config[ 'font_style' ], 'family' ) ], 
    513527                                                                                // TODO: Convert 'pt' length unit into 'px'. 
    514                                                                                 [ 'font-size', null, styleMigrateFilter( config[ 'fontSize_style' ], 'size' ) ], 
     528                                                                                [ /^font-size$/, null, styleMigrateFilter( config[ 'fontSize_style' ], 'size' ) ], 
    515529                                                                                // TODO: Convert 'rgb' and 'descriptive' color into 'hexadecimal'.  
    516530                                                                                [ /^color$/, null, styleMigrateFilter( config[ 'colorButton_foreStyle' ], 'color' ) ], 
    517                                                                                 [ 'background-color', null, styleMigrateFilter( config[ 'colorButton_backStyle' ], 'color' ) ] 
     531                                                                                [ /^background-color$/, null, styleMigrateFilter( config[ 'colorButton_backStyle' ], 'color' ) ] 
    518532                                                                        ] )( styleText, element ) || ''; 
    519533                                        }, 
     
    556570                                                [ /mso-/ ], 
    557571                                                [ /-moz-/ ], 
    558                                                 // Replace verbose background color style. 
    559                                                 [ /^background$/, null, function( value ) 
    560                                                 { 
    561                                                         return value.match( /^[^\s]+/ )[ 0 ]; 
    562                                                 }, 'background-color' ], 
    563572                                                [ 'background-color', 'transparent' ], 
    564                                                 // Remove verbose border-color style within Firefox. 
    565                                                 CKEDITOR.env.gecko ? [ 'border-color', /(:?windowtext|-moz-use-text-color|\s)*/ ] : null, 
     573                                                // Firefox: replacing Mozilla-specific color value. 
     574                                                CKEDITOR.env.gecko ? [ '-color', null, function( value, element ) 
     575                                                { 
     576                                                        return value.replace( /-moz-use-text-color/g, 'transparent' );   
     577                                                } ]: null, 
     578                                                // Remove default border style. 
     579                                                [ /^border$/, /^(:?medium\s*)?none\s*$/ ], 
    566580                                                // 'Indent' format migration(to use editor's indent unit). 
    567581                                                [ /margin-?/, null, function( value, element ) 
     
    569583                                                        if( element.name == 'p' ) 
    570584                                                        { 
     585                                                                //TODO: Migrate to 'indentClasses' based indenting format.   
    571586                                                                value = value.replace( /\d*\.?\d+pt/g, function( length ) 
    572587                                                                { 
    573588                                                                        var pt = parseInt( length ); 
    574                                                                         // Assume MS-Word indent unit length as '11pt'. 
    575                                                                         return ( pt / 11 * config.indentOffset ) + config.indentUnit; 
     589                                                                        // MS-Word indent unit is roughly 11pt. 
     590                                                                        return Math.round( pt / 11 * config.indentOffset ) + config.indentUnit; 
    576591                                                                } ); 
    577592                                                        } 
     
    599614                                        }, 
    600615 
    601                                         // We always have both 'text-align' style company with 
    602                                         // 'align' attribute, drop the attribute. 
    603                                         'align' : falsyFilter 
     616                                        // MS-Word always generate both 'text-align' along with 
     617                                        // 'align' attribute( 'background-color' along with 'bgcolor'), 
     618                                        // simply drop the deprecated attributes. 
     619                                        'align' : falsyFilter, 
     620                                        'bgcolor' : falsyFilter, 
     621                                        // Deprecate 'valign' attribute in favor of 'vertical-align'. 
     622                                        'valign' : function( value, element ) 
     623                                        { 
     624                                                // TODO: The style chang doesn't work now because of filtering system.  
     625                                                if( value != 'top' ) 
     626                                                        element.addStyle( 'vertical-align', value ); 
     627                                                return false; 
     628                                        }, 
     629 
     630                                        // Avoid table 'border' attribute in favor of cell border styles. 
     631                                        'border' : function( value, element ) 
     632                                        { 
     633                                                if( element.name == 'table' ) 
     634                                                        return false; 
     635                                        } 
    604636                                }, 
    605637 
     
    660692                return childs; 
    661693        }; 
     694 
     695        // Adding a (set) of styles to the element's attributes. 
     696        elementPrototype.addStyle = function( name, value ) 
     697        { 
     698                var styleText, addingStyleText = ''; 
     699                // style literal. 
     700                if( typeof name == 'object' ) 
     701                { 
     702                        for( var style in name ) 
     703                        { 
     704                                if( name.hasOwnProperty( style) ) 
     705                                        addingStyleText += style + ':' + name[ style ] + ';'; 
     706                        } 
     707                } 
     708                // name/value pair. 
     709                else if( value ) 
     710                        addingStyleText += name + ':' + value + ';'; 
     711                // raw style text form. 
     712                else 
     713                        addingStyleText += name; 
     714 
     715                if( !this.attributes ) 
     716                        this.attributes = {}; 
     717                styleText = this.attributes.style; 
     718                if( !styleText ) 
     719                        this.attributes.style = ""; 
     720                else if( !/;$/.test( styleText ) ) 
     721                        this.attributes.style = styleText + ';'; 
     722 
     723                this.attributes.style += addingStyleText; 
     724        } 
    662725 
    663726        fragmentPrototype.firstTextChild = elementPrototype.firstTextChild = function() 
Note: See TracChangeset for help on using the changeset viewer.
© 2003 – 2012 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy