]>
Commit | Line | Data |
---|---|---|
3332bebe | 1 | /**\r |
317f8f8f | 2 | * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.\r |
3332bebe IB |
3 | * For licensing, see LICENSE.md or http://ckeditor.com/license\r |
4 | */\r | |
5 | \r | |
6 | ( function() {\r | |
7 | // Basic HTML entities.\r | |
8 | var htmlbase = 'nbsp,gt,lt,amp';\r | |
9 | \r | |
10 | var entities =\r | |
11 | // Latin-1 entities\r | |
12 | 'quot,iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,' +\r | |
13 | 'not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,' +\r | |
14 | 'cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,' +\r | |
15 | \r | |
16 | // Symbols\r | |
17 | 'fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,' +\r | |
18 | 'alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,' +\r | |
19 | 'forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,' +\r | |
20 | 'radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,' +\r | |
21 | 'equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,' +\r | |
22 | 'rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,' +\r | |
23 | \r | |
24 | // Other special characters\r | |
25 | 'circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,' +\r | |
26 | 'rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,' +\r | |
27 | 'euro';\r | |
28 | \r | |
29 | // Latin letters entities\r | |
30 | var latin = 'Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,' +\r | |
31 | 'Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,' +\r | |
32 | 'Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,' +\r | |
33 | 'agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,' +\r | |
34 | 'ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,' +\r | |
35 | 'otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,' +\r | |
36 | 'OElig,oelig,Scaron,scaron,Yuml';\r | |
37 | \r | |
38 | // Greek letters entities.\r | |
39 | var greek = 'Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,' +\r | |
40 | 'Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,' +\r | |
41 | 'beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,' +\r | |
42 | 'omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,' +\r | |
43 | 'upsih,piv';\r | |
44 | \r | |
45 | // Create a mapping table between one character and its entity form from a list of entity names.\r | |
46 | // @param reverse {Boolean} Whether to create a reverse map from the entity string form to an actual character.\r | |
47 | function buildTable( entities, reverse ) {\r | |
48 | var table = {},\r | |
49 | regex = [];\r | |
50 | \r | |
51 | // Entities that the browsers' DOM does not automatically transform to the\r | |
52 | // final character.\r | |
53 | var specialTable = {\r | |
54 | nbsp: '\u00A0', // IE | FF\r | |
55 | shy: '\u00AD', // IE\r | |
56 | gt: '\u003E', // IE | FF | -- | Opera\r | |
57 | lt: '\u003C', // IE | FF | Safari | Opera\r | |
58 | amp: '\u0026', // ALL\r | |
59 | apos: '\u0027', // IE\r | |
60 | quot: '\u0022' // IE\r | |
61 | };\r | |
62 | \r | |
63 | entities = entities.replace( /\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g, function( match, entity ) {\r | |
64 | var org = reverse ? '&' + entity + ';' : specialTable[ entity ],\r | |
65 | result = reverse ? specialTable[ entity ] : '&' + entity + ';';\r | |
66 | \r | |
67 | table[ org ] = result;\r | |
68 | regex.push( org );\r | |
69 | return '';\r | |
70 | } );\r | |
71 | \r | |
72 | if ( !reverse && entities ) {\r | |
73 | // Transforms the entities string into an array.\r | |
74 | entities = entities.split( ',' );\r | |
75 | \r | |
76 | // Put all entities inside a DOM element, transforming them to their\r | |
77 | // final characters.\r | |
78 | var div = document.createElement( 'div' ),\r | |
79 | chars;\r | |
80 | div.innerHTML = '&' + entities.join( ';&' ) + ';';\r | |
81 | chars = div.innerHTML;\r | |
82 | div = null;\r | |
83 | \r | |
84 | // Add all characters to the table.\r | |
85 | for ( var i = 0; i < chars.length; i++ ) {\r | |
86 | var charAt = chars.charAt( i );\r | |
87 | table[ charAt ] = '&' + entities[ i ] + ';';\r | |
88 | regex.push( charAt );\r | |
89 | }\r | |
90 | }\r | |
91 | \r | |
92 | table.regex = regex.join( reverse ? '|' : '' );\r | |
93 | \r | |
94 | return table;\r | |
95 | }\r | |
96 | \r | |
97 | CKEDITOR.plugins.add( 'entities', {\r | |
98 | afterInit: function( editor ) {\r | |
99 | var config = editor.config;\r | |
100 | \r | |
101 | function getChar( character ) {\r | |
102 | return baseEntitiesTable[ character ];\r | |
103 | }\r | |
104 | \r | |
105 | function getEntity( character ) {\r | |
106 | return config.entities_processNumerical == 'force' || !entitiesTable[ character ] ? '&#' + character.charCodeAt( 0 ) + ';'\r | |
107 | : entitiesTable[ character ];\r | |
108 | }\r | |
109 | \r | |
110 | var dataProcessor = editor.dataProcessor,\r | |
111 | htmlFilter = dataProcessor && dataProcessor.htmlFilter;\r | |
112 | \r | |
113 | if ( htmlFilter ) {\r | |
114 | // Mandatory HTML basic entities.\r | |
115 | var selectedEntities = [];\r | |
116 | \r | |
117 | if ( config.basicEntities !== false )\r | |
118 | selectedEntities.push( htmlbase );\r | |
119 | \r | |
120 | if ( config.entities ) {\r | |
121 | if ( selectedEntities.length )\r | |
122 | selectedEntities.push( entities );\r | |
123 | \r | |
124 | if ( config.entities_latin )\r | |
125 | selectedEntities.push( latin );\r | |
126 | \r | |
127 | if ( config.entities_greek )\r | |
128 | selectedEntities.push( greek );\r | |
129 | \r | |
130 | if ( config.entities_additional )\r | |
131 | selectedEntities.push( config.entities_additional );\r | |
132 | }\r | |
133 | \r | |
134 | var entitiesTable = buildTable( selectedEntities.join( ',' ) );\r | |
135 | \r | |
136 | // Create the Regex used to find entities in the text, leave it matches nothing if entities are empty.\r | |
137 | var entitiesRegex = entitiesTable.regex ? '[' + entitiesTable.regex + ']' : 'a^';\r | |
138 | delete entitiesTable.regex;\r | |
139 | \r | |
140 | if ( config.entities && config.entities_processNumerical )\r | |
141 | entitiesRegex = '[^ -~]|' + entitiesRegex;\r | |
142 | \r | |
143 | entitiesRegex = new RegExp( entitiesRegex, 'g' );\r | |
144 | \r | |
145 | // Decode entities that the browsers has transformed\r | |
146 | // at first place.\r | |
147 | var baseEntitiesTable = buildTable( [ htmlbase, 'shy' ].join( ',' ), true ),\r | |
148 | baseEntitiesRegex = new RegExp( baseEntitiesTable.regex, 'g' );\r | |
149 | \r | |
150 | htmlFilter.addRules( {\r | |
151 | text: function( text ) {\r | |
152 | return text.replace( baseEntitiesRegex, getChar ).replace( entitiesRegex, getEntity );\r | |
153 | }\r | |
154 | }, {\r | |
155 | applyToAll: true,\r | |
156 | excludeNestedEditable: true\r | |
157 | } );\r | |
158 | }\r | |
159 | }\r | |
160 | } );\r | |
161 | } )();\r | |
162 | \r | |
163 | /**\r | |
164 | * Whether to escape basic HTML entities in the document, including:\r | |
165 | *\r | |
166 | * * ` `\r | |
167 | * * `>`\r | |
168 | * * `<`\r | |
169 | * * `&`\r | |
170 | *\r | |
171 | * **Note:** This option should not be changed unless when outputting a non-HTML data format like BBCode.\r | |
172 | *\r | |
173 | * config.basicEntities = false;\r | |
174 | *\r | |
175 | * @cfg {Boolean} [basicEntities=true]\r | |
176 | * @member CKEDITOR.config\r | |
177 | */\r | |
178 | CKEDITOR.config.basicEntities = true;\r | |
179 | \r | |
180 | /**\r | |
181 | * Whether to use HTML entities in the editor output.\r | |
182 | *\r | |
183 | * config.entities = false;\r | |
184 | *\r | |
185 | * @cfg {Boolean} [entities=true]\r | |
186 | * @member CKEDITOR.config\r | |
187 | */\r | |
188 | CKEDITOR.config.entities = true;\r | |
189 | \r | |
190 | /**\r | |
191 | * Whether to convert some Latin characters (Latin alphabet No. 1, ISO 8859-1)\r | |
192 | * to HTML entities. The list of entities can be found in the\r | |
193 | * [W3C HTML 4.01 Specification, section 24.2.1](http://www.w3.org/TR/html4/sgml/entities.html#h-24.2.1).\r | |
194 | *\r | |
195 | * config.entities_latin = false;\r | |
196 | *\r | |
197 | * @cfg {Boolean} [entities_latin=true]\r | |
198 | * @member CKEDITOR.config\r | |
199 | */\r | |
200 | CKEDITOR.config.entities_latin = true;\r | |
201 | \r | |
202 | /**\r | |
203 | * Whether to convert some symbols, mathematical symbols, and Greek letters to\r | |
204 | * HTML entities. This may be more relevant for users typing text written in Greek.\r | |
205 | * The list of entities can be found in the\r | |
206 | * [W3C HTML 4.01 Specification, section 24.3.1](http://www.w3.org/TR/html4/sgml/entities.html#h-24.3.1).\r | |
207 | *\r | |
208 | * config.entities_greek = false;\r | |
209 | *\r | |
210 | * @cfg {Boolean} [entities_greek=true]\r | |
211 | * @member CKEDITOR.config\r | |
212 | */\r | |
213 | CKEDITOR.config.entities_greek = true;\r | |
214 | \r | |
215 | /**\r | |
216 | * Whether to convert all remaining characters not included in the ASCII\r | |
217 | * character table to their relative decimal numeric representation of HTML entity.\r | |
218 | * When set to `force`, it will convert all entities into this format.\r | |
219 | *\r | |
220 | * For example the phrase: `'This is Chinese: 汉语.'` would be output\r | |
221 | * as: `'This is Chinese: 汉语.'`\r | |
222 | *\r | |
223 | * config.entities_processNumerical = true;\r | |
224 | * config.entities_processNumerical = 'force'; // Converts from ' ' into ' ';\r | |
225 | *\r | |
226 | * @cfg {Boolean/String} [entities_processNumerical=false]\r | |
227 | * @member CKEDITOR.config\r | |
228 | */\r | |
229 | \r | |
230 | /**\r | |
231 | * A comma-separated list of additional entities to be used. Entity names\r | |
232 | * or numbers must be used in a form that excludes the `'&'` prefix and the `';'` ending.\r | |
233 | *\r | |
234 | * config.entities_additional = '#1049'; // Adds Cyrillic capital letter Short I (Й).\r | |
235 | *\r | |
236 | * @cfg {String} [entities_additional='#39' (The single quote (') character)]\r | |
237 | * @member CKEDITOR.config\r | |
238 | */\r | |
239 | CKEDITOR.config.entities_additional = '#39';\r |