1 28 29 package com.caucho.xml; 30 31 import com.caucho.util.IntMap; 32 33 import java.io.IOException ; 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['<'] = "<".toCharArray(); 82 _latin1['>'] = ">".toCharArray(); 83 _latin1['&'] = "&".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 _attrLatin1['<'] = "<".toCharArray(); 100 _attrLatin1['>'] = ">".toCharArray(); 101 _attrLatin1['"'] = """.toCharArray(); 102 _attrLatin1['\n'] = " ".toCharArray(); 103 _attrLatin1['\r'] = " ".toCharArray(); 104 } 105 106 int getEntity(String entity) 107 { 108 return _entityToChar.get(entity); 109 } 110 111 114 void printText(XmlPrinter os, 115 char []text, int offset, int length, 116 boolean attr) 117 throws IOException 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 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 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 |