KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > caucho > xml > HtmlEntities


1 /*
2  * Copyright (c) 1998-2006 Caucho Technology -- all rights reserved
3  *
4  * This file is part of Resin(R) Open Source
5  *
6  * Each copy or derived work must preserve the copyright notice and this
7  * notice unmodified.
8  *
9  * Resin Open Source is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * Resin Open Source is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
17  * of NON-INFRINGEMENT. See the GNU General Public License for more
18  * details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with Resin Open Source; if not, write to the
22  * Free SoftwareFoundation, Inc.
23  * 59 Temple Place, Suite 330
24  * Boston, MA 02111-1307 USA
25  *
26  * @author Scott Ferguson
27  */

28
29 package com.caucho.xml;
30
31 import com.caucho.util.IntMap;
32
33 import java.io.IOException JavaDoc;
34
35 class HtmlEntities extends Entities {
36   private static HtmlEntities _html40;
37   private static HtmlEntities _html32;
38
39   protected char [][]_latin1;
40   protected char [][]_attrLatin1;
41
42   protected char [][]_sparseEntity = new char[8192][];
43   protected char[]_sparseChar = new char[8192];
44
45   protected IntMap _entityToChar;
46
47   static Entities create(double version)
48   {
49     if (version == 0 || version >= 4.0) {
50       if (_html40 == null)
51     _html40 = new HtmlEntities(4.0);
52       return _html40;
53     }
54     else {
55       if (_html32 == null)
56     _html32 = new HtmlEntities(3.2);
57       return _html32;
58     }
59   }
60
61   protected HtmlEntities(double version)
62   {
63     _entityToChar = new IntMap();
64     initLatin1();
65     if (version >= 4.0) {
66       initSymbol();
67       initSpecial();
68     }
69
70     _latin1 = new char[256][];
71     for (int i = 0; i < 32; i++) {
72       _latin1[i] = ("&#" + i + ";").toCharArray();
73     }
74     _latin1['\t'] = "\t".toCharArray();
75     _latin1['\n'] = "\n".toCharArray();
76     _latin1['\r'] = "\r".toCharArray();
77
78     for (int i = 32; i < 127; i++)
79       _latin1[i] = ("" + (char) i).toCharArray();
80
81     _latin1['<'] = "&lt;".toCharArray();
82     _latin1['>'] = "&gt;".toCharArray();
83     _latin1['&'] = "&amp;".toCharArray();
84
85     for (int i = 127; i < 256; i++) {
86       char []value = getSparseEntity(i);
87
88       if (value != null)
89     _latin1[i] = value;
90       else
91     _latin1[i] = ("&#" + i + ";").toCharArray();
92     }
93
94     _attrLatin1 = new char[256][];
95     for (int i = 0; i < _latin1.length; i++)
96       _attrLatin1[i] = _latin1[i];
97
98     // unquoted matches Xalan/Xerces
99
_attrLatin1['<'] = "<".toCharArray();
100     _attrLatin1['>'] = ">".toCharArray();
101     _attrLatin1['"'] = "&quot;".toCharArray();
102     _attrLatin1['\n'] = "&#10;".toCharArray();
103     _attrLatin1['\r'] = "&#13;".toCharArray();
104   }
105
106   int getEntity(String JavaDoc entity)
107   {
108     return _entityToChar.get(entity);
109   }
110
111   /**
112    * Prints escaped text.
113    */

114   void printText(XmlPrinter os,
115                  char []text, int offset, int length,
116                  boolean attr)
117     throws IOException JavaDoc
118   {
119     for (int i = 0; i < length; i++) {
120       char ch = text[offset + i];
121
122       if (ch == '&') {
123     if (i + 1 < length && text[offset + i + 1] == '{')
124       os.print('&');
125         else if (attr)
126           os.print(_attrLatin1[ch]);
127         else
128       os.print(_latin1[ch]);
129       }
130       else if (ch < 256) {
131         if (attr)
132           os.print(_attrLatin1[ch]);
133         else
134           os.print(_latin1[ch]);
135       }
136       else {
137     char []value = getSparseEntity(ch);
138     if (value != null) {
139       os.print(value);
140     } else {
141       os.print("&#");
142       os.print((int) ch);
143       os.print(";");
144     }
145       }
146     }
147   }
148   
149   private void initLatin1()
150   {
151     entity("nbsp", 160);
152     entity("iexcl", 161);
153     entity("cent", 162);
154     entity("pound", 163);
155     entity("curren", 164);
156     entity("yen", 165);
157     entity("brvbar", 166);
158     entity("sect", 167);
159     entity("uml", 168);
160     entity("copy", 169);
161     entity("ordf", 170);
162     entity("laquo", 171);
163     entity("not", 172);
164     entity("shy", 173);
165     entity("reg", 174);
166     entity("macr", 175);
167     entity("deg", 176);
168     entity("plusmn", 177);
169     entity("sup2", 178);
170     entity("sup3", 179);
171     entity("acute", 180);
172     entity("micro", 181);
173     entity("para", 182);
174     entity("middot", 183);
175     entity("cedil", 184);
176     entity("sup1", 185);
177     entity("ordm", 186);
178     entity("raquo", 187);
179     entity("frac14", 188);
180     entity("frac12", 189);
181     entity("frac34", 190);
182     entity("iquest", 191);
183     entity("Agrave", 192);
184     entity("Aacute", 193);
185     entity("Acirc", 194);
186     entity("Atilde", 195);
187     entity("Auml", 196);
188     entity("Aring", 197);
189     entity("AElig", 198);
190     entity("Ccedil", 199);
191     entity("Egrave", 200);
192     entity("Eacute", 201);
193     entity("Ecirc", 202);
194     entity("Euml", 203);
195     entity("Igrave", 204);
196     entity("Iacute", 205);
197     entity("Icirc", 206);
198     entity("Iuml", 207);
199     entity("ETH", 208);
200     entity("Ntilde", 209);
201     entity("Ograve", 210);
202     entity("Oacute", 211);
203     entity("Ocirc", 212);
204     entity("Otilde", 213);
205     entity("Ouml", 214);
206     entity("times", 215);
207     entity("Oslash", 216);
208     entity("Ugrave", 217);
209     entity("Uacute", 218);
210     entity("Ucirc", 219);
211     entity("Uuml", 220);
212     entity("Yacute", 221);
213     entity("THORN", 222);
214     entity("szlig", 223);
215     entity("agrave", 224);
216     entity("aacute", 225);
217     entity("acirc", 226);
218     entity("atilde", 227);
219     entity("auml", 228);
220     entity("aring", 229);
221     entity("aelig", 230);
222     entity("ccedil", 231);
223     entity("egrave", 232);
224     entity("eacute", 233);
225     entity("ecirc", 234);
226     entity("euml", 235);
227     entity("igrave", 236);
228     entity("iacute", 237);
229     entity("icirc", 238);
230     entity("iuml", 239);
231     entity("eth", 240);
232     entity("ntilde", 241);
233     entity("ograve", 242);
234     entity("oacute", 243);
235     entity("ocirc", 244);
236     entity("otilde", 245);
237     entity("ouml", 246);
238     entity("divide", 247);
239     entity("oslash", 248);
240     entity("ugrave", 249);
241     entity("uacute", 250);
242     entity("ucirc", 251);
243     entity("uuml", 252);
244     entity("yacute", 253);
245     entity("thorn", 254);
246     entity("yuml", 255);
247   }
248
249   private void initSymbol()
250   {
251     entity("fnof", 402);
252     entity("Alpha", 913);
253     entity("Beta", 914);
254     entity("Gamma", 915);
255     entity("Delta", 916);
256     entity("Epsilon", 917);
257     entity("Zeta", 918);
258     entity("Eta", 919);
259     entity("Theta", 920);
260     entity("Iota", 921);
261     entity("Kappa", 922);
262     entity("Lambda", 923);
263     entity("Mu", 924);
264     entity("Nu", 925);
265     entity("Xi", 926);
266     entity("Omicron", 927);
267     entity("Pi", 928);
268     entity("Rho", 929);
269     entity("Sigma", 931);
270     entity("Tau", 932);
271     entity("Upsilon", 933);
272     entity("Phi", 934);
273     entity("Chi", 935);
274     entity("Psi", 936);
275     entity("Omega", 937);
276     entity("alpha", 945);
277     entity("beta", 946);
278     entity("gamma", 947);
279     entity("delta", 948);
280     entity("epsilon", 949);
281     entity("zeta", 950);
282     entity("eta", 951);
283     entity("theta", 952);
284     entity("iota", 953);
285     entity("kappa", 954);
286     entity("lambda", 955);
287     entity("mu", 956);
288     entity("nu", 957);
289     entity("xi", 958);
290     entity("omicron", 959);
291     entity("pi", 960);
292     entity("rho", 961);
293     entity("sigmaf", 962);
294     entity("sigma", 963);
295     entity("tau", 964);
296     entity("upsilon", 965);
297     entity("phi", 966);
298     entity("chi", 967);
299     entity("psi", 968);
300     entity("omega", 969);
301     entity("thetasym", 977);
302     entity("upsih", 978);
303     entity("piv", 982);
304
305     entity("bull", 8226);
306     entity("hellip", 8230);
307     entity("prime", 8242);
308     entity("Prime", 8243);
309     entity("oline", 8254);
310     entity("frasl", 8260);
311     entity("weirp", 8472);
312     entity("image", 8465);
313     entity("real", 8476);
314     entity("trade", 8482);
315     entity("alefsym", 8501);
316
317     entity("larr", 8592);
318     entity("uarr", 8593);
319     entity("rarr", 8594);
320     entity("darr", 8595);
321     entity("harr", 8596);
322     entity("crarr", 8629);
323     entity("lArr", 8656);
324     entity("uArr", 8657);
325     entity("rArr", 8658);
326     entity("dArr", 8659);
327     entity("hArr", 8660);
328
329     entity("forall", 8704);
330     entity("part", 8706);
331     entity("exist", 8707);
332     entity("empty", 8709);
333     entity("nabla", 8711);
334     entity("isin", 8712);
335     entity("ni", 8715);
336     entity("prod", 8719);
337     entity("sum", 8721);
338     entity("minus", 8722);
339     entity("lowas", 8727);
340     entity("radic", 8730);
341     entity("prop", 8733);
342     entity("infin", 8734);
343     entity("ang", 8736);
344     entity("and", 8743);
345     entity("or", 8744);
346     entity("cap", 8745);
347     entity("cup", 8746);
348     entity("int", 8747);
349     entity("there4", 8756);
350     entity("sim", 8764);
351     entity("cong", 8773);
352     entity("asymp", 8776);
353     entity("ne", 8800);
354     entity("equiv", 8801);
355     entity("le", 8804);
356     entity("ge", 8805);
357     entity("sub", 8834);
358     entity("sup", 8835);
359     entity("nsub", 8836);
360     entity("sube", 8838);
361     entity("supe", 8839);
362     entity("oplus", 8853);
363     entity("otimes", 8855);
364     entity("perp", 8869);
365     entity("sdot", 8901);
366     entity("lceil", 8968);
367     entity("rceil", 8969);
368     entity("lfloor", 8970);
369     entity("rfloor", 8971);
370     entity("lang", 9001);
371     entity("rang", 9002);
372
373     entity("loz", 9674);
374     entity("spades", 9824);
375     entity("clubs", 9827);
376     entity("hearts", 9829);
377     entity("diams", 9830);
378   }
379
380   private void initSpecial()
381   {
382     entity("quot", 34);
383     entity("amp", 38);
384     entity("lt", 60);
385     entity("gt", 62);
386     entity("apos", '\'');
387     entity("OElig", 338);
388     entity("oelig", 339);
389     entity("Scaron", 352);
390     entity("scaron", 353);
391     entity("Yuml", 376);
392     entity("circ", 710);
393     entity("tilde", 732);
394     entity("ensp", 8194);
395     entity("emsp", 8195);
396     entity("thinsp", 8201);
397     entity("zwnj", 8204);
398     entity("zwj", 8205);
399     entity("lrm", 8206);
400     entity("rlm", 8207);
401     entity("ndash", 8211);
402     entity("mdash", 8212);
403     entity("lsquo", 8216);
404     entity("rsquo", 8217);
405     entity("sbquo", 8218);
406     entity("ldquo", 8220);
407     entity("rdquo", 8221);
408     entity("bdquo", 8222);
409     entity("dagger", 8224);
410     entity("Dagger", 8225);
411     entity("permil", 8240);
412     entity("lsaquo", 8249);
413     entity("rsaquo", 8250);
414     entity("euro", 8364);
415   }
416
417   /**
418    * Returns the character entity for the given character. The
419    * map is sparse.
420    */

421   protected char []getSparseEntity(int ch)
422   {
423     int size = _sparseChar.length;
424     
425     int i = (ch * 65521) % size;
426     if (i < 0)
427       i = -i;
428     for (;
429      _sparseChar[i] != ch && _sparseEntity[i] != null;
430      i = (i + 1) % size) {
431     }
432
433     return _sparseEntity[i];
434   }
435
436   private void entity(String JavaDoc name, int ch)
437   {
438     _entityToChar.put(name, ch);
439
440     int size = _sparseChar.length;
441     
442     int i = (ch * 65521) % size;
443     if (i < 0)
444       i = -i;
445     for (;
446      _sparseChar[i] != ch && _sparseEntity[i] != null;
447      i = (i + 1) % size) {
448     }
449
450     _sparseChar[i] = (char) ch;
451     _sparseEntity[i] = ("&" + name + ";").toCharArray();
452   }
453 }
454
Popular Tags