001    package railo.commons.lang;
002    
003    
004    
005    
006    /**
007     * <p>Provides HTML and XML entity utilities.</p>
008     *
009     */
010    public final class HTMLEntities {
011            
012        public static final short HTMLV20=1;
013        public static final short HTMLV32=1;
014        public static final short HTMLV40=2;
015    
016        
017    // Basic
018        private static final int OFFSET_BASIC=34;
019        private static final String[] BASIC_ARRAY = new String[63 - OFFSET_BASIC];
020        static {
021            BASIC_ARRAY[34 - OFFSET_BASIC]="quot";
022            BASIC_ARRAY[38 - OFFSET_BASIC]="amp";
023            BASIC_ARRAY[60 - OFFSET_BASIC]="lt";
024            BASIC_ARRAY[62 - OFFSET_BASIC]="gt";
025        }
026    // HTML 32
027        private static final int OFFSET_ISO8859_1=160;
028        private static final String[] ISO8859_1_ARRAY = new String[256 - OFFSET_ISO8859_1];
029        static {
030            ISO8859_1_ARRAY[160 - OFFSET_ISO8859_1]="nbsp";
031            ISO8859_1_ARRAY[161 - OFFSET_ISO8859_1]="iexcl";
032            ISO8859_1_ARRAY[162 - OFFSET_ISO8859_1]="cent";
033            ISO8859_1_ARRAY[163 - OFFSET_ISO8859_1]="pound";
034            ISO8859_1_ARRAY[164 - OFFSET_ISO8859_1]="curren";
035            ISO8859_1_ARRAY[165 - OFFSET_ISO8859_1]="yen";
036            ISO8859_1_ARRAY[166 - OFFSET_ISO8859_1]="brvbar";
037            ISO8859_1_ARRAY[167 - OFFSET_ISO8859_1]="sect";
038            ISO8859_1_ARRAY[168 - OFFSET_ISO8859_1]="uml";
039            ISO8859_1_ARRAY[169 - OFFSET_ISO8859_1]="copy";
040            ISO8859_1_ARRAY[170 - OFFSET_ISO8859_1]="ordf";
041            ISO8859_1_ARRAY[171 - OFFSET_ISO8859_1]="laquo";
042            ISO8859_1_ARRAY[172 - OFFSET_ISO8859_1]="not";
043            ISO8859_1_ARRAY[173 - OFFSET_ISO8859_1]="shy";
044            ISO8859_1_ARRAY[174 - OFFSET_ISO8859_1]="reg";
045            ISO8859_1_ARRAY[175 - OFFSET_ISO8859_1]="macr";
046            ISO8859_1_ARRAY[176 - OFFSET_ISO8859_1]="deg";
047            ISO8859_1_ARRAY[177 - OFFSET_ISO8859_1]="plusmn";
048            ISO8859_1_ARRAY[178 - OFFSET_ISO8859_1]="sup2";
049            ISO8859_1_ARRAY[179 - OFFSET_ISO8859_1]="sup3";
050            ISO8859_1_ARRAY[180 - OFFSET_ISO8859_1]="acute";
051            ISO8859_1_ARRAY[181 - OFFSET_ISO8859_1]="micro";
052            ISO8859_1_ARRAY[182 - OFFSET_ISO8859_1]="para";
053            ISO8859_1_ARRAY[183 - OFFSET_ISO8859_1]="middot";
054            ISO8859_1_ARRAY[184 - OFFSET_ISO8859_1]="cedil";
055            ISO8859_1_ARRAY[185 - OFFSET_ISO8859_1]="sup1";
056            ISO8859_1_ARRAY[186 - OFFSET_ISO8859_1]="ordm";
057            ISO8859_1_ARRAY[187 - OFFSET_ISO8859_1]="raquo";
058            ISO8859_1_ARRAY[188 - OFFSET_ISO8859_1]="frac14";
059            ISO8859_1_ARRAY[189 - OFFSET_ISO8859_1]="frac12";
060            ISO8859_1_ARRAY[190 - OFFSET_ISO8859_1]="frac34";
061            ISO8859_1_ARRAY[191 - OFFSET_ISO8859_1]="iquest";
062            ISO8859_1_ARRAY[192 - OFFSET_ISO8859_1]="Agrave";
063            ISO8859_1_ARRAY[193 - OFFSET_ISO8859_1]="Aacute";
064            ISO8859_1_ARRAY[194 - OFFSET_ISO8859_1]="Acirc";
065            ISO8859_1_ARRAY[195 - OFFSET_ISO8859_1]="Atilde";
066            ISO8859_1_ARRAY[196 - OFFSET_ISO8859_1]="Auml";
067            ISO8859_1_ARRAY[197 - OFFSET_ISO8859_1]="Aring";
068            ISO8859_1_ARRAY[198 - OFFSET_ISO8859_1]="AElig";
069            ISO8859_1_ARRAY[199 - OFFSET_ISO8859_1]="Ccedil";
070            ISO8859_1_ARRAY[200 - OFFSET_ISO8859_1]="Egrave";
071            ISO8859_1_ARRAY[201 - OFFSET_ISO8859_1]="Eacute";
072            ISO8859_1_ARRAY[202 - OFFSET_ISO8859_1]="Ecirc";
073            ISO8859_1_ARRAY[203 - OFFSET_ISO8859_1]="Euml";
074            ISO8859_1_ARRAY[204 - OFFSET_ISO8859_1]="Igrave";
075            ISO8859_1_ARRAY[205 - OFFSET_ISO8859_1]="Iacute";
076            ISO8859_1_ARRAY[206 - OFFSET_ISO8859_1]="Icirc";
077            ISO8859_1_ARRAY[207 - OFFSET_ISO8859_1]="Iuml";
078            ISO8859_1_ARRAY[208 - OFFSET_ISO8859_1]="ETH";
079            ISO8859_1_ARRAY[209 - OFFSET_ISO8859_1]="Ntilde";
080            ISO8859_1_ARRAY[210 - OFFSET_ISO8859_1]="Ograve";
081            ISO8859_1_ARRAY[211 - OFFSET_ISO8859_1]="Oacute";
082            ISO8859_1_ARRAY[212 - OFFSET_ISO8859_1]="Ocirc";
083            ISO8859_1_ARRAY[213 - OFFSET_ISO8859_1]="Otilde";
084            ISO8859_1_ARRAY[214 - OFFSET_ISO8859_1]="Ouml";
085            ISO8859_1_ARRAY[215 - OFFSET_ISO8859_1]="times";
086            ISO8859_1_ARRAY[216 - OFFSET_ISO8859_1]="Oslash";
087            ISO8859_1_ARRAY[217 - OFFSET_ISO8859_1]="Ugrave";
088            ISO8859_1_ARRAY[218 - OFFSET_ISO8859_1]="Uacute";
089            ISO8859_1_ARRAY[219 - OFFSET_ISO8859_1]="Ucirc";
090            ISO8859_1_ARRAY[220 - OFFSET_ISO8859_1]="Uuml";
091            ISO8859_1_ARRAY[221 - OFFSET_ISO8859_1]="Yacute";
092            ISO8859_1_ARRAY[222 - OFFSET_ISO8859_1]="THORN";
093            ISO8859_1_ARRAY[223 - OFFSET_ISO8859_1]="szlig";
094            ISO8859_1_ARRAY[224 - OFFSET_ISO8859_1]="agrave";
095            ISO8859_1_ARRAY[225 - OFFSET_ISO8859_1]="aacute";
096            ISO8859_1_ARRAY[226 - OFFSET_ISO8859_1]="acirc";
097            ISO8859_1_ARRAY[227 - OFFSET_ISO8859_1]="atilde";
098            ISO8859_1_ARRAY[228 - OFFSET_ISO8859_1]="auml";
099            ISO8859_1_ARRAY[229 - OFFSET_ISO8859_1]="aring";
100            ISO8859_1_ARRAY[230 - OFFSET_ISO8859_1]="aelig";
101            ISO8859_1_ARRAY[231 - OFFSET_ISO8859_1]="ccedil";
102            ISO8859_1_ARRAY[232 - OFFSET_ISO8859_1]="egrave";
103            ISO8859_1_ARRAY[233 - OFFSET_ISO8859_1]="eacute";
104            ISO8859_1_ARRAY[234 - OFFSET_ISO8859_1]="ecirc";
105            ISO8859_1_ARRAY[235 - OFFSET_ISO8859_1]="euml";
106            ISO8859_1_ARRAY[236 - OFFSET_ISO8859_1]="igrave";
107            ISO8859_1_ARRAY[237 - OFFSET_ISO8859_1]="iacute";
108            ISO8859_1_ARRAY[238 - OFFSET_ISO8859_1]="icirc";
109            ISO8859_1_ARRAY[239 - OFFSET_ISO8859_1]="iuml";
110            ISO8859_1_ARRAY[240 - OFFSET_ISO8859_1]="eth";
111            ISO8859_1_ARRAY[241 - OFFSET_ISO8859_1]="ntilde";
112            ISO8859_1_ARRAY[242 - OFFSET_ISO8859_1]="ograve";
113            ISO8859_1_ARRAY[243 - OFFSET_ISO8859_1]="oacute";
114            ISO8859_1_ARRAY[244 - OFFSET_ISO8859_1]="ocirc";
115            ISO8859_1_ARRAY[245 - OFFSET_ISO8859_1]="otilde";
116            ISO8859_1_ARRAY[246 - OFFSET_ISO8859_1]="ouml";
117            ISO8859_1_ARRAY[247 - OFFSET_ISO8859_1]="divide";
118            ISO8859_1_ARRAY[248 - OFFSET_ISO8859_1]="oslash";
119            ISO8859_1_ARRAY[249 - OFFSET_ISO8859_1]="ugrave";
120            ISO8859_1_ARRAY[250 - OFFSET_ISO8859_1]="uacute";
121            ISO8859_1_ARRAY[251 - OFFSET_ISO8859_1]="ucirc";
122            ISO8859_1_ARRAY[252 - OFFSET_ISO8859_1]="uuml";
123            ISO8859_1_ARRAY[253 - OFFSET_ISO8859_1]="yacute";
124            ISO8859_1_ARRAY[254 - OFFSET_ISO8859_1]="thorn";
125            ISO8859_1_ARRAY[255 - OFFSET_ISO8859_1]="yuml";
126        }
127    
128    //  HTML 40 (1)
129        private static final int OFFSET_HTML40_1=402;
130        private static final String[] HTML40_1_ARRAY = new String[403 - OFFSET_HTML40_1];
131        static {
132            HTML40_1_ARRAY[402 - OFFSET_HTML40_1]="fnof";
133        }
134    
135    //  HTML 40 (2)
136        private static final int OFFSET_HTML40_2=913;
137        private static final String[] HTML40_2_ARRAY = new String[983 - OFFSET_HTML40_2];
138        static {            
139            HTML40_2_ARRAY[913 - OFFSET_HTML40_2]="Alpha";
140            HTML40_2_ARRAY[914 - OFFSET_HTML40_2]="Beta";
141            HTML40_2_ARRAY[915 - OFFSET_HTML40_2]="Gamma";
142            HTML40_2_ARRAY[916 - OFFSET_HTML40_2]="Delta";
143            HTML40_2_ARRAY[917 - OFFSET_HTML40_2]="Epsilon";
144            HTML40_2_ARRAY[918 - OFFSET_HTML40_2]="Zeta";
145            HTML40_2_ARRAY[919 - OFFSET_HTML40_2]="Eta";
146            HTML40_2_ARRAY[920 - OFFSET_HTML40_2]="Theta";
147            HTML40_2_ARRAY[921 - OFFSET_HTML40_2]="Iota";
148            HTML40_2_ARRAY[922 - OFFSET_HTML40_2]="Kappa";
149            HTML40_2_ARRAY[923 - OFFSET_HTML40_2]="Lambda";
150            HTML40_2_ARRAY[924 - OFFSET_HTML40_2]="Mu";
151            HTML40_2_ARRAY[925 - OFFSET_HTML40_2]="Nu";
152            HTML40_2_ARRAY[926 - OFFSET_HTML40_2]="Xi";
153            HTML40_2_ARRAY[927 - OFFSET_HTML40_2]="Omicron";
154            HTML40_2_ARRAY[928 - OFFSET_HTML40_2]="Pi";
155            HTML40_2_ARRAY[929 - OFFSET_HTML40_2]="Rho";
156            HTML40_2_ARRAY[931 - OFFSET_HTML40_2]="Sigma";
157            HTML40_2_ARRAY[932 - OFFSET_HTML40_2]="Tau";
158            HTML40_2_ARRAY[933 - OFFSET_HTML40_2]="Upsilon";
159            HTML40_2_ARRAY[934 - OFFSET_HTML40_2]="Phi";
160            HTML40_2_ARRAY[935 - OFFSET_HTML40_2]="Chi";
161            HTML40_2_ARRAY[936 - OFFSET_HTML40_2]="Psi";
162            HTML40_2_ARRAY[937 - OFFSET_HTML40_2]="Omega";
163            HTML40_2_ARRAY[945 - OFFSET_HTML40_2]="alpha";
164            HTML40_2_ARRAY[946 - OFFSET_HTML40_2]="beta";
165            HTML40_2_ARRAY[947 - OFFSET_HTML40_2]="gamma";
166            HTML40_2_ARRAY[948 - OFFSET_HTML40_2]="delta";
167            HTML40_2_ARRAY[949 - OFFSET_HTML40_2]="epsilon";
168            HTML40_2_ARRAY[950 - OFFSET_HTML40_2]="zeta";
169            HTML40_2_ARRAY[951 - OFFSET_HTML40_2]="eta";
170            HTML40_2_ARRAY[952 - OFFSET_HTML40_2]="theta";
171            HTML40_2_ARRAY[953 - OFFSET_HTML40_2]="iota";
172            HTML40_2_ARRAY[954 - OFFSET_HTML40_2]="kappa";
173            HTML40_2_ARRAY[955 - OFFSET_HTML40_2]="lambda";
174            HTML40_2_ARRAY[956 - OFFSET_HTML40_2]="mu";
175            HTML40_2_ARRAY[957 - OFFSET_HTML40_2]="nu";
176            HTML40_2_ARRAY[958 - OFFSET_HTML40_2]="xi";
177            HTML40_2_ARRAY[959 - OFFSET_HTML40_2]="omicron";
178            HTML40_2_ARRAY[960 - OFFSET_HTML40_2]="pi";
179            HTML40_2_ARRAY[961 - OFFSET_HTML40_2]="rho";
180            HTML40_2_ARRAY[962 - OFFSET_HTML40_2]="sigmaf";
181            HTML40_2_ARRAY[963 - OFFSET_HTML40_2]="sigma";
182            HTML40_2_ARRAY[964 - OFFSET_HTML40_2]="tau";
183            HTML40_2_ARRAY[965 - OFFSET_HTML40_2]="upsilon";
184            HTML40_2_ARRAY[966 - OFFSET_HTML40_2]="phi";
185            HTML40_2_ARRAY[967 - OFFSET_HTML40_2]="chi";
186            HTML40_2_ARRAY[968 - OFFSET_HTML40_2]="psi";
187            HTML40_2_ARRAY[969 - OFFSET_HTML40_2]="omega";
188            HTML40_2_ARRAY[977 - OFFSET_HTML40_2]="thetasym";
189            HTML40_2_ARRAY[978 - OFFSET_HTML40_2]="upsih";
190            HTML40_2_ARRAY[982 - OFFSET_HTML40_2]="piv";
191        }
192    
193    //  HTML 40 (3)
194        private static final int OFFSET_HTML40_3=338;
195        private static final String[] HTML40_3_ARRAY = new String[377 - OFFSET_HTML40_3];
196        static { 
197                    HTML40_2_ARRAY[338 - OFFSET_HTML40_3]="OElig";
198                    HTML40_2_ARRAY[339 - OFFSET_HTML40_3]="oelig";
199                    HTML40_2_ARRAY[352 - OFFSET_HTML40_3]="Scaron";
200                    HTML40_2_ARRAY[353 - OFFSET_HTML40_3]="scaron";
201                    HTML40_2_ARRAY[376 - OFFSET_HTML40_3]="Yuml";
202        }
203    
204    //  HTML 40 (4)
205        private static final int OFFSET_HTML40_4=710;
206        private static final String[] HTML40_4_ARRAY = new String[733 - OFFSET_HTML40_4];
207        static { 
208            HTML40_4_ARRAY[710 - OFFSET_HTML40_4]="circ";
209            HTML40_4_ARRAY[732 - OFFSET_HTML40_4]="tilde";
210        }
211    
212    //  HTML 40 (5)
213        private static final int OFFSET_HTML40_5=8194;
214        private static final String[] HTML40_5_ARRAY = new String[9831 - OFFSET_HTML40_5];
215        static { 
216            HTML40_5_ARRAY[8194 - OFFSET_HTML40_5]="ensp";
217            HTML40_5_ARRAY[8195 - OFFSET_HTML40_5]="emsp";
218            HTML40_5_ARRAY[8201 - OFFSET_HTML40_5]="thinsp";
219            HTML40_5_ARRAY[8204 - OFFSET_HTML40_5]="zwnj";
220            HTML40_5_ARRAY[8205 - OFFSET_HTML40_5]="zwj";
221            HTML40_5_ARRAY[8206 - OFFSET_HTML40_5]="lrm";
222            HTML40_5_ARRAY[8207 - OFFSET_HTML40_5]="rlm";
223            HTML40_5_ARRAY[8211 - OFFSET_HTML40_5]="ndash";
224            HTML40_5_ARRAY[8212 - OFFSET_HTML40_5]="mdash";
225            HTML40_5_ARRAY[8216 - OFFSET_HTML40_5]="lsquo";
226            HTML40_5_ARRAY[8217 - OFFSET_HTML40_5]="rsquo";
227            HTML40_5_ARRAY[8218 - OFFSET_HTML40_5]="sbquo";
228            HTML40_5_ARRAY[8220 - OFFSET_HTML40_5]="ldquo";
229            HTML40_5_ARRAY[8221 - OFFSET_HTML40_5]="rdquo";
230            HTML40_5_ARRAY[8222 - OFFSET_HTML40_5]="bdquo";
231            HTML40_5_ARRAY[8224 - OFFSET_HTML40_5]="dagger";
232            HTML40_5_ARRAY[8225 - OFFSET_HTML40_5]="Dagger";        
233            HTML40_5_ARRAY[8226 - OFFSET_HTML40_5]="bull";
234            HTML40_5_ARRAY[8230 - OFFSET_HTML40_5]="hellip";
235            HTML40_5_ARRAY[8240 - OFFSET_HTML40_5]="permil";
236            HTML40_5_ARRAY[8242 - OFFSET_HTML40_5]="prime";
237            HTML40_5_ARRAY[8243 - OFFSET_HTML40_5]="Prime";
238            HTML40_5_ARRAY[8249 - OFFSET_HTML40_5]="lsaquo";
239            HTML40_5_ARRAY[8250 - OFFSET_HTML40_5]="rsaquo";
240            HTML40_5_ARRAY[8254 - OFFSET_HTML40_5]="oline";
241            HTML40_5_ARRAY[8260 - OFFSET_HTML40_5]="frasl";
242            HTML40_5_ARRAY[8364 - OFFSET_HTML40_5]="euro";
243            HTML40_5_ARRAY[8472 - OFFSET_HTML40_5]="weierp";
244            HTML40_5_ARRAY[8465 - OFFSET_HTML40_5]="image";
245            HTML40_5_ARRAY[8476 - OFFSET_HTML40_5]="real";
246            HTML40_5_ARRAY[8482 - OFFSET_HTML40_5]="trade";
247            HTML40_5_ARRAY[8501 - OFFSET_HTML40_5]="alefsym";
248            HTML40_5_ARRAY[8592 - OFFSET_HTML40_5]="larr";
249            HTML40_5_ARRAY[8593 - OFFSET_HTML40_5]="uarr";
250            HTML40_5_ARRAY[8594 - OFFSET_HTML40_5]="rarr";
251            HTML40_5_ARRAY[8595 - OFFSET_HTML40_5]="darr";
252            HTML40_5_ARRAY[8596 - OFFSET_HTML40_5]="harr";
253            HTML40_5_ARRAY[8629 - OFFSET_HTML40_5]="crarr";
254            HTML40_5_ARRAY[8656 - OFFSET_HTML40_5]="lArr";
255            HTML40_5_ARRAY[8657 - OFFSET_HTML40_5]="uArr";
256            HTML40_5_ARRAY[8658 - OFFSET_HTML40_5]="rArr";
257            HTML40_5_ARRAY[8659 - OFFSET_HTML40_5]="dArr";
258            HTML40_5_ARRAY[8660 - OFFSET_HTML40_5]="hArr";
259            HTML40_5_ARRAY[8704 - OFFSET_HTML40_5]="forall";
260            HTML40_5_ARRAY[8706 - OFFSET_HTML40_5]="part";
261            HTML40_5_ARRAY[8707 - OFFSET_HTML40_5]="exist";
262            HTML40_5_ARRAY[8709 - OFFSET_HTML40_5]="empty";
263            HTML40_5_ARRAY[8711 - OFFSET_HTML40_5]="nabla";
264            HTML40_5_ARRAY[8712 - OFFSET_HTML40_5]="isin";
265            HTML40_5_ARRAY[8713 - OFFSET_HTML40_5]="notin";
266            HTML40_5_ARRAY[8715 - OFFSET_HTML40_5]="ni";
267            HTML40_5_ARRAY[8719 - OFFSET_HTML40_5]="prod";
268            HTML40_5_ARRAY[8721 - OFFSET_HTML40_5]="sum";
269            HTML40_5_ARRAY[8722 - OFFSET_HTML40_5]="minus";
270            HTML40_5_ARRAY[8727 - OFFSET_HTML40_5]="lowast";
271            HTML40_5_ARRAY[8730 - OFFSET_HTML40_5]="radic";
272            HTML40_5_ARRAY[8733 - OFFSET_HTML40_5]="prop";
273            HTML40_5_ARRAY[8734 - OFFSET_HTML40_5]="infin";
274            HTML40_5_ARRAY[8736 - OFFSET_HTML40_5]="ang";
275            HTML40_5_ARRAY[8743 - OFFSET_HTML40_5]="and";
276            HTML40_5_ARRAY[8744 - OFFSET_HTML40_5]="or";
277            HTML40_5_ARRAY[8745 - OFFSET_HTML40_5]="cap";
278            HTML40_5_ARRAY[8746 - OFFSET_HTML40_5]="cup";
279            HTML40_5_ARRAY[8747 - OFFSET_HTML40_5]="int";
280            HTML40_5_ARRAY[8756 - OFFSET_HTML40_5]="there4";
281            HTML40_5_ARRAY[8764 - OFFSET_HTML40_5]="sim";
282            HTML40_5_ARRAY[8773 - OFFSET_HTML40_5]="cong";
283            HTML40_5_ARRAY[8776 - OFFSET_HTML40_5]="asymp";
284            HTML40_5_ARRAY[8800 - OFFSET_HTML40_5]="ne";
285            HTML40_5_ARRAY[8801 - OFFSET_HTML40_5]="equiv";
286            HTML40_5_ARRAY[8804 - OFFSET_HTML40_5]="le";
287            HTML40_5_ARRAY[8805 - OFFSET_HTML40_5]="ge";
288            HTML40_5_ARRAY[8834 - OFFSET_HTML40_5]="sub";
289            HTML40_5_ARRAY[8835 - OFFSET_HTML40_5]="sup";
290            HTML40_5_ARRAY[8838 - OFFSET_HTML40_5]="sube";
291            HTML40_5_ARRAY[8839 - OFFSET_HTML40_5]="supe";
292            HTML40_5_ARRAY[8853 - OFFSET_HTML40_5]="oplus";
293            HTML40_5_ARRAY[8855 - OFFSET_HTML40_5]="otimes";
294            HTML40_5_ARRAY[8869 - OFFSET_HTML40_5]="perp";
295            HTML40_5_ARRAY[8901 - OFFSET_HTML40_5]="sdot";
296            HTML40_5_ARRAY[8968 - OFFSET_HTML40_5]="lceil";
297            HTML40_5_ARRAY[8969 - OFFSET_HTML40_5]="rceil";
298            HTML40_5_ARRAY[8970 - OFFSET_HTML40_5]="lfloor";
299            HTML40_5_ARRAY[8971 - OFFSET_HTML40_5]="rfloor";
300            HTML40_5_ARRAY[9001 - OFFSET_HTML40_5]="lang";
301            HTML40_5_ARRAY[9002 - OFFSET_HTML40_5]="rang";
302            HTML40_5_ARRAY[9674 - OFFSET_HTML40_5]="loz";
303            HTML40_5_ARRAY[9824 - OFFSET_HTML40_5]="spades";
304            HTML40_5_ARRAY[9827 - OFFSET_HTML40_5]="clubs";
305            HTML40_5_ARRAY[9829 - OFFSET_HTML40_5]="hearts";
306            HTML40_5_ARRAY[9830 - OFFSET_HTML40_5]="diams";
307        }
308    
309    //  HTML 20
310         private static final String[][] HTML20_DATA= {
311                    BASIC_ARRAY
312         };
313         private static final int[] HTML20_OFFSET= {
314                    OFFSET_BASIC
315         };
316         
317    //  HTML 32
318         private static final String[][] HTML32_DATA= {
319                    BASIC_ARRAY,
320                            ISO8859_1_ARRAY
321         };
322         private static final int[] HTML32_OFFSET= {
323                    OFFSET_BASIC,
324                            OFFSET_ISO8859_1
325         };
326    
327    //   HTML 40
328          private static final String[][] HTML40_DATA= {
329                    BASIC_ARRAY,
330                            ISO8859_1_ARRAY,
331                            HTML40_1_ARRAY,
332                            HTML40_2_ARRAY,
333                            HTML40_3_ARRAY,
334                            HTML40_4_ARRAY,
335                            HTML40_5_ARRAY
336          };
337          private static final int[] HTML40_OFFSET= {
338                    OFFSET_BASIC,
339                            OFFSET_ISO8859_1,
340                            OFFSET_HTML40_1,
341                            OFFSET_HTML40_2,
342                            OFFSET_HTML40_3,
343                            OFFSET_HTML40_4,
344                            OFFSET_HTML40_5
345          };
346    
347          
348          /**
349         * escapes html character inside a string
350         * @param str html code to escape
351         * @return escaped html code
352         */
353        public static String escapeHTML(String str) {
354            return escapeHTML(str,HTMLV40);
355        }
356        
357        /**
358         * escapes html character inside a string
359         * @param str html code to escape
360         * @param version HTML Version ()
361         * @return escaped html code
362         */
363        public static String escapeHTML(String str,short version) {
364            String[][] data;
365            int[] offset;
366            StringBuilder rtn=new StringBuilder(str.length());
367            char[] chars=str.toCharArray();
368            
369            if(version==HTMLV20) {
370                    data=HTML20_DATA;
371                    offset=HTML20_OFFSET;
372            }
373            else if(version==HTMLV32) {
374                    data=HTML32_DATA;
375                    offset=HTML32_OFFSET;
376            }
377            else {
378                    data=HTML40_DATA;
379                    offset=HTML40_OFFSET;
380            }
381            
382            outer:for(int i=0;i<chars.length;i++) {
383                    char c=chars[i];
384                    for(int y=0;y<offset.length;y++) {
385                            if(c>=offset[y] && c<data[y].length+offset[y]) {
386                                    
387                                    String replacement=data[y][c-offset[y]];
388                                    if(replacement!=null) {
389                                            rtn.append('&');
390                                            rtn.append(replacement);
391                                            rtn.append(';');
392                                            continue outer;
393                                    }
394                            }
395                    }
396                    rtn.append(c);
397            }
398            return rtn.toString();
399          }
400        
401        /**
402         * unescapes html character inside a string
403         * @param str html code to unescape
404         * @return unescaped html code
405         */
406        public static String unescapeHTML(String str) {
407            
408            StringBuilder rtn=new StringBuilder();
409            int posStart=-1;
410            int posFinish=-1;
411            while((posStart=str.indexOf('&',posStart))!=-1) {
412                    int last=posFinish+1;
413                    
414                    posFinish=str.indexOf(';',posStart);
415                    if(posFinish==-1)break;
416                    rtn.append(str.substring(last,posStart));
417                    if(posStart+1<posFinish) {
418                            rtn.append(unescapeHTMLEntity(str.substring(posStart+1,posFinish)));
419                    }
420                    else {
421                            rtn.append("&;");
422                    }
423                    
424                    posStart=posFinish+1;
425            }
426            rtn.append(str.substring(posFinish+1));
427            return rtn.toString();
428        }
429        
430        private static String unescapeHTMLEntity(String str) {
431            String[][] ranges=HTML40_DATA;
432            int[] offset=HTML40_OFFSET;
433            
434            // Number Entity
435                    if(str.indexOf('#')==0) {
436                            if(str.length()==1)return "&"+str+";"; 
437                            try {
438                                    return ((char)Integer.parseInt(str.substring(1)))+"";
439                            }
440                            catch(NumberFormatException nfe) {
441                                    return "&"+str+";";
442                            }
443                    }
444                    
445            // String Entity
446                    //else {
447                            for(int i=0;i<ranges.length;i++) {
448                                    String[] range=ranges[i];
449                                    for(int y=0;y<range.length;y++) {
450                                            String el=range[y];
451                                            if(el!=null && el.equalsIgnoreCase(str)) {
452                                                    return ((char)(y+offset[i]))+"";
453                                            }
454                                    }
455                            }
456                    //}
457            
458            return "&"+str+";";
459        }
460    }