Ticket #5769: 5769_2.patch

File 5769_2.patch, 5.9 KB (added by garry.yao, 5 years ago)
  • _source/plugins/entities/plugin.js

     
    1 /* 
     1/* 
    22Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved. 
    33For licensing, see LICENSE.html or http://ckeditor.com/license 
    44*/ 
    55 
    66(function() 
    77{ 
    8         var entities = 
    9  
    10                 // Base HTML entities. 
    11                 'nbsp,gt,lt,quot,' + 
    12  
     8        // Base HTML entities. 
     9        var htmlbase = 'nbsp,gt,lt,quot'; 
     10         
     11        var entities = 
    1312                // Latin-1 Entities 
    1413                'iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,' + 
    1514                'not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,' + 
     
    4645                'omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,' + 
    4746                'upsih,piv'; 
    4847 
    49         function buildTable( entities ) 
     48        /** 
     49         * Create a mapping table between one character and it's entity form from a list of entity names. 
     50         * @param reverse {Boolean} Whether create a reverse map from the entity string form to actual character. 
     51         */ 
     52        function buildTable( entities, reverse ) 
    5053        { 
    5154                var table = {}, 
    5255                        regex = []; 
     
    6366 
    6467                entities = entities.replace( /\b(nbsp|shy|gt|lt|amp)(?:,|$)/g, function( match, entity ) 
    6568                        { 
    66                                 table[ specialTable[ entity ] ] = '&' + entity + ';'; 
    67                                 regex.push( specialTable[ entity ] ); 
     69                                var org = reverse ? '&' + entity + ';' : specialTable[ entity ], 
     70                                        result = reverse ? specialTable[ entity ] : '&' + entity + ';'; 
     71 
     72                                table[ org ] = result; 
     73                                regex.push( org ); 
    6874                                return ''; 
    6975                        }); 
    7076 
    71                 // Transforms the entities string into an array. 
    72                 entities = entities.split( ',' ); 
     77                if ( !reverse ) 
     78                { 
     79                        // Transforms the entities string into an array. 
     80                        entities = entities.split( ',' ); 
    7381 
    74                 // Put all entities inside a DOM element, transforming them to their 
    75                 // final chars. 
    76                 var div = document.createElement( 'div' ), 
    77                         chars; 
    78                 div.innerHTML = '&' + entities.join( ';&' ) + ';'; 
    79                 chars = div.innerHTML; 
    80                 div = null; 
     82                        // Put all entities inside a DOM element, transforming them to their 
     83                        // final chars. 
     84                        var div = document.createElement( 'div' ), 
     85                                chars; 
     86                        div.innerHTML = '&' + entities.join( ';&' ) + ';'; 
     87                        chars = div.innerHTML; 
     88                        div = null; 
    8189 
    82                 // Add all chars to the table. 
    83                 for ( var i = 0 ; i < chars.length ; i++ ) 
    84                 { 
    85                         var charAt = chars.charAt( i ); 
    86                         table[ charAt ] = '&' + entities[ i ] + ';'; 
    87                         regex.push( charAt ); 
    88                 } 
     90                        // Add all chars to the table. 
     91                        for ( var i = 0 ; i < chars.length ; i++ ) 
     92                        { 
     93                                var charAt = chars.charAt( i ); 
     94                                table[ charAt ] = '&' + entities[ i ] + ';'; 
     95                                regex.push( charAt ); 
     96                        } 
     97                } 
    8998 
    90                 table.regex = regex.join( '' ); 
     99                table.regex = regex.join( reverse ? '|' : '' ); 
    91100 
    92101                return table; 
    93102        } 
     
    98107                { 
    99108                        var config = editor.config; 
    100109 
    101                         if ( !config.entities ) 
    102                                 return; 
    103  
    104110                        var dataProcessor = editor.dataProcessor, 
    105111                                htmlFilter = dataProcessor && dataProcessor.htmlFilter; 
    106112 
    107113                        if ( htmlFilter ) 
    108114                        { 
    109                                 var selectedEntities = entities; 
     115                                // Mandatory HTML base entities. 
     116                                var selectedEntities = htmlbase; 
    110117 
    111                                 if ( config.entities_latin ) 
    112                                         selectedEntities += ',' + latin; 
     118                                if ( config.entities ) 
     119                                { 
     120                                        selectedEntities += ',' + entities; 
     121 
     122                                        if ( config.entities_latin ) 
     123                                                selectedEntities += ',' + latin; 
    113124 
    114                                 if ( config.entities_greek ) 
    115                                         selectedEntities += ',' + greek; 
     125                                        if ( config.entities_greek ) 
     126                                                selectedEntities += ',' + greek; 
    116127 
    117                                 if ( config.entities_additional ) 
    118                                         selectedEntities += ',' + config.entities_additional; 
     128                                        if ( config.entities_additional ) 
     129                                                selectedEntities += ',' + config.entities_additional; 
     130                                } 
    119131 
    120132                                var entitiesTable = buildTable( selectedEntities ); 
    121133 
     
    123135                                var entitiesRegex = '[' + entitiesTable.regex + ']'; 
    124136                                delete entitiesTable.regex; 
    125137 
    126                                 if ( config.entities_processNumerical ) 
     138                                if ( config.entities && config.entities_processNumerical ) 
    127139                                        entitiesRegex = '[^ -~]|' + entitiesRegex ; 
    128140 
    129141                                entitiesRegex = new RegExp( entitiesRegex, 'g' ); 
    130142 
     143                                function getEntity( character ) 
     144                                { 
     145                                        return config.entities_processNumerical == 'force' || !entitiesTable[ character ] ? 
     146                                                   '&#' + character.charCodeAt(0) + ';' 
     147                                                        : entitiesTable[ character ]; 
     148                                } 
     149 
     150                                // Decode entities that the browsers has transformed 
     151                                // at first place. 
     152                                var baseEntitiesTable = buildTable( [ htmlbase, 'shy' ].join( ',' ) , true ), 
     153                                        baseEntitiesRegex = new RegExp( baseEntitiesTable.regex, 'g' ); 
     154 
    131155                                function getChar( character ) 
    132156                                { 
    133                                         return entitiesTable[ character ] || ( '&#' + character.charCodeAt(0) + ';' ); 
     157                                        return baseEntitiesTable[ character ]; 
    134158                                } 
    135159 
    136160                                htmlFilter.addRules( 
    137161                                        { 
    138162                                                text : function( text ) 
    139163                                                { 
    140                                                         return text.replace( entitiesRegex, getChar ); 
     164                                                        return text.replace( baseEntitiesRegex, getChar ) 
     165                                                                        .replace( entitiesRegex, getEntity ); 
    141166                                                } 
    142167                                        }); 
    143168                        } 
     
    179204 
    180205/** 
    181206 * Whether to convert all remaining characters, not comprised in the ASCII 
    182  * character table, to their relative numeric representation of HTML entity. 
     207 * character table, to their relative decimal numeric representation of HTML entity. 
     208 * When specified as the value 'force', it will simply convert all entities into the above form. 
    183209 * For example, the phrase "This is Chinese: &#27721;&#35821;." is outputted 
    184210 * as "This is Chinese: &amp;#27721;&amp;#35821;." 
    185  * @type Boolean 
     211 * @type Boolean|String 
    186212 * @default false 
    187213 * @example 
    188214 * config.entities_processNumerical = true; 
     215 * config.entities_processNumerical = 'force';          //Convert from "&nbsp;" into "&#160;"; 
    189216 */ 
    190217CKEDITOR.config.entities_processNumerical = false; 
    191218 
© 2003 – 2012 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy