Moka Ihm Qt
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
HtmlEntities.cc
Go to the documentation of this file.
1 /*
2  * Moka : Un modeleur de 3-G-cartes.
3  * Copyright (C) 2004, Moka Team, Université de Poitiers, Laboratoire SIC
4  * http://www.sic.sp2mi.univ-poitiers.fr/
5  * Copyright (C) 2009, Guillaume Damiand, CNRS, LIRIS,
6  * guillaume.damiand@liris.cnrs.fr, http://liris.cnrs.fr/
7  *
8  * This file is part of Moka
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program. If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 #include <QtCore/QtAlgorithms>
25 #include <QtCore/QRegExp>
26 #include <QtCore/QStringList>
27 #include <QtCore/QtDebug>
28 
29 #include "HtmlEntities.hh"
30 
31 
32 
33  const int HTML::MaxEntities = 248;
34  const int HTML::FirstEntities = 10;
35 
36 
37  const HtmlEntity HTML::first[FirstEntities] =
38  {
39  { "acirc", 0x00e2 },
40  { "agrave", 0x00e0 },
41  { "ccedil", 0x00e7 },
42  { "eacute", 0x00e9 },
43  { "ecirc", 0x00ea },
44  { "egrave", 0x00e8 },
45  { "icirc", 0x00ee },
46  { "ocirc", 0x00f4 },
47  { "ucirc", 0x00fb },
48  { "ugrave", 0x00f9 },
49  };
50 
51  const HtmlEntity HTML::entities[MaxEntities] =
52  {
53  { "AElig", 0x00c6 },
54  { "Aacute", 0x00c1 },
55  { "Acirc", 0x00c2 },
56  { "Agrave", 0x00c0 },
57  { "Alpha", 0x0391 },
58  { "AMP", 38 },
59  { "Aring", 0x00c5 },
60  { "Atilde", 0x00c3 },
61  { "Auml", 0x00c4 },
62  { "Beta", 0x0392 },
63  { "Ccedil", 0x00c7 },
64  { "Chi", 0x03a7 },
65  { "Dagger", 0x2021 },
66  { "Delta", 0x0394 },
67  { "ETH", 0x00d0 },
68  { "Eacute", 0x00c9 },
69  { "Ecirc", 0x00ca },
70  { "Egrave", 0x00c8 },
71  { "Epsilon", 0x0395 },
72  { "Eta", 0x0397 },
73  { "Euml", 0x00cb },
74  { "Gamma", 0x0393 },
75  { "GT", 62 },
76  { "Iacute", 0x00cd },
77  { "Icirc", 0x00ce },
78  { "Igrave", 0x00cc },
79  { "Iota", 0x0399 },
80  { "Iuml", 0x00cf },
81  { "Kappa", 0x039a },
82  { "Lambda", 0x039b },
83  { "LT", 60 },
84  { "Mu", 0x039c },
85  { "Ntilde", 0x00d1 },
86  { "Nu", 0x039d },
87  { "OElig", 0x0152 },
88  { "Oacute", 0x00d3 },
89  { "Ocirc", 0x00d4 },
90  { "Ograve", 0x00d2 },
91  { "Omega", 0x03a9 },
92  { "Omicron", 0x039f },
93  { "Oslash", 0x00d8 },
94  { "Otilde", 0x00d5 },
95  { "Ouml", 0x00d6 },
96  { "Phi", 0x03a6 },
97  { "Pi", 0x03a0 },
98  { "Prime", 0x2033 },
99  { "Psi", 0x03a8 },
100  { "QUOT", 34 },
101  { "Rho", 0x03a1 },
102  { "Scaron", 0x0160 },
103  { "Sigma", 0x03a3 },
104  { "THORN", 0x00de },
105  { "Tau", 0x03a4 },
106  { "Theta", 0x0398 },
107  { "Uacute", 0x00da },
108  { "Ucirc", 0x00db },
109  { "Ugrave", 0x00d9 },
110  { "Upsilon", 0x03a5 },
111  { "Uuml", 0x00dc },
112  { "Xi", 0x039e },
113  { "Yacute", 0x00dd },
114  { "Yuml", 0x0178 },
115  { "Zeta", 0x0396 },
116  { "aacute", 0x00e1 },
117  { "acute", 0x00b4 },
118  { "aelig", 0x00e6 },
119  { "alefsym", 0x2135 },
120  { "alpha", 0x03b1 },
121  { "amp", 38 },
122  { "and", 0x22a5 },
123  { "ang", 0x2220 },
124  { "apos", 0x0027 },
125  { "aring", 0x00e5 },
126  { "asymp", 0x2248 },
127  { "atilde", 0x00e3 },
128  { "auml", 0x00e4 },
129  { "bdquo", 0x201e },
130  { "beta", 0x03b2 },
131  { "brvbar", 0x00a6 },
132  { "bull", 0x2022 },
133  { "cap", 0x2229 },
134  { "cedil", 0x00b8 },
135  { "cent", 0x00a2 },
136  { "chi", 0x03c7 },
137  { "circ", 0x02c6 },
138  { "clubs", 0x2663 },
139  { "cong", 0x2245 },
140  { "copy", 0x00a9 },
141  { "crarr", 0x21b5 },
142  { "cup", 0x222a },
143  { "cur" "ren", 0x00a4 },
144  { "dArr", 0x21d3 },
145  { "dagger", 0x2020 },
146  { "darr", 0x2193 },
147  { "deg", 0x00b0 },
148  { "delta", 0x03b4 },
149  { "diams", 0x2666 },
150  { "divide", 0x00f7 },
151  { "empty", 0x2205 },
152  { "emsp", 0x2003 },
153  { "ensp", 0x2002 },
154  { "epsilon", 0x03b5 },
155  { "equiv", 0x2261 },
156  { "eta", 0x03b7 },
157  { "eth", 0x00f0 },
158  { "euml", 0x00eb },
159  { "euro", 0x20ac },
160  { "exist", 0x2203 },
161  { "fnof", 0x0192 },
162  { "forall", 0x2200 },
163  { "frac12", 0x00bd },
164  { "frac14", 0x00bc },
165  { "frac34", 0x00be },
166  { "frasl", 0x2044 },
167  { "gamma", 0x03b3 },
168  { "ge", 0x2265 },
169  { "gt", 62 },
170  { "hArr", 0x21d4 },
171  { "harr", 0x2194 },
172  { "hearts", 0x2665 },
173  { "hellip", 0x2026 },
174  { "iacute", 0x00ed },
175  { "iexcl", 0x00a1 },
176  { "igrave", 0x00ec },
177  { "image", 0x2111 },
178  { "infin", 0x221e },
179  { "int", 0x222b },
180  { "iota", 0x03b9 },
181  { "iquest", 0x00bf },
182  { "isin", 0x2208 },
183  { "iuml", 0x00ef },
184  { "kappa", 0x03ba },
185  { "lArr", 0x21d0 },
186  { "lambda", 0x03bb },
187  { "lang", 0x2329 },
188  { "laquo", 0x00ab },
189  { "larr", 0x2190 },
190  { "lceil", 0x2308 },
191  { "ldquo", 0x201c },
192  { "le", 0x2264 },
193  { "lfloor", 0x230a },
194  { "lowast", 0x2217 },
195  { "loz", 0x25ca },
196  { "lrm", 0x200e },
197  { "lsaquo", 0x2039 },
198  { "lsquo", 0x2018 },
199  { "lt", 60 },
200  { "macr", 0x00af },
201  { "mdash", 0x2014 },
202  { "micro", 0x00b5 },
203  { "middot", 0x00b7 },
204  { "minus", 0x2212 },
205  { "mu", 0x03bc },
206  { "nabla", 0x2207 },
207  { "nbsp", 0x00a0 },
208  { "ndash", 0x2013 },
209  { "ne", 0x2260 },
210  { "ni", 0x220b },
211  { "not", 0x00ac },
212  { "notin", 0x2209 },
213  { "nsub", 0x2284 },
214  { "ntilde", 0x00f1 },
215  { "nu", 0x03bd },
216  { "oacute", 0x00f3 },
217  { "oelig", 0x0153 },
218  { "ograve", 0x00f2 },
219  { "oline", 0x203e },
220  { "omega", 0x03c9 },
221  { "omicron", 0x03bf },
222  { "oplus", 0x2295 },
223  { "or", 0x22a6 },
224  { "ordf", 0x00aa },
225  { "ordm", 0x00ba },
226  { "oslash", 0x00f8 },
227  { "otilde", 0x00f5 },
228  { "otimes", 0x2297 },
229  { "ouml", 0x00f6 },
230  { "para", 0x00b6 },
231  { "part", 0x2202 },
232  { "percnt", 0x0025 },
233  { "permil", 0x2030 },
234  { "perp", 0x22a5 },
235  { "phi", 0x03c6 },
236  { "pi", 0x03c0 },
237  { "piv", 0x03d6 },
238  { "plusmn", 0x00b1 },
239  { "pound", 0x00a3 },
240  { "prime", 0x2032 },
241  { "prod", 0x220f },
242  { "prop", 0x221d },
243  { "psi", 0x03c8 },
244  { "quot", 34 },
245  { "rArr", 0x21d2 },
246  { "radic", 0x221a },
247  { "rang", 0x232a },
248  { "raquo", 0x00bb },
249  { "rarr", 0x2192 },
250  { "rceil", 0x2309 },
251  { "rdquo", 0x201d },
252  { "real", 0x211c },
253  { "reg", 0x00ae },
254  { "rfloor", 0x230b },
255  { "rho", 0x03c1 },
256  { "rlm", 0x200f },
257  { "rsaquo", 0x203a },
258  { "rsquo", 0x2019 },
259  { "sbquo", 0x201a },
260  { "scaron", 0x0161 },
261  { "sdot", 0x22c5 },
262  { "sect", 0x00a7 },
263  { "shy", 0x00ad },
264  { "sigma", 0x03c3 },
265  { "sigmaf", 0x03c2 },
266  { "sim", 0x223c },
267  { "spades", 0x2660 },
268  { "sub", 0x2282 },
269  { "sube", 0x2286 },
270  { "sum", 0x2211 },
271  { "sup1", 0x00b9 },
272  { "sup2", 0x00b2 },
273  { "sup3", 0x00b3 },
274  { "sup", 0x2283 },
275  { "supe", 0x2287 },
276  { "szlig", 0x00df },
277  { "tau", 0x03c4 },
278  { "there4", 0x2234 },
279  { "theta", 0x03b8 },
280  { "thetasym", 0x03d1 },
281  { "thinsp", 0x2009 },
282  { "thorn", 0x00fe },
283  { "tilde", 0x02dc },
284  { "times", 0x00d7 },
285  { "trade", 0x2122 },
286  { "uArr", 0x21d1 },
287  { "uacute", 0x00fa },
288  { "uarr", 0x2191 },
289  { "uml", 0x00a8 },
290  { "upsih", 0x03d2 },
291  { "upsilon", 0x03c5 },
292  { "uuml", 0x00fc },
293  { "weierp", 0x2118 },
294  { "xi", 0x03be },
295  { "yacute", 0x00fd },
296  { "yen", 0x00a5 },
297  { "yuml", 0x00ff },
298  { "zeta", 0x03b6 },
299  { "zwj", 0x200d },
300  { "zwnj", 0x200c }
301  };
302 
303 
304 const HtmlEntity* HTML::end_ent = &entities[MaxEntities];
305 const HtmlEntity* HTML::start_ent = &entities[0];
306 
307 const HtmlEntity* HTML::end_first = &first[FirstEntities];
308 const HtmlEntity* HTML::start_first = &first[0];
309 
310 
311 static bool operator < (const QString &entityStr, const HtmlEntity &entity){
312  return entityStr < QLatin1String(entity.name);
313 }
314 
315 
316 static bool operator < (const HtmlEntity &entity, const QString &entityStr){
317  return QLatin1String(entity.name) < entityStr;
318 }
319 
320 
321 static bool operator == (const HtmlEntity &entity, const quint16 entityCode){
322  return entityCode == entity.code;
323 }
324 
325 
326 
327 /*
328 
329 const HtmlEntity* HTML::findEntity(const QString &entity)
330 {
331  for (int i=0;i<FirstEntities;i++)
332  if (entity == first[i].name) return &first[i];
333  return NULL;
334 }
335 
336 
337 
338 // Retourne le caractere associe a un caractere special HTML.
339 // La recherche est lineaire (non dichotomique).
340 
341 QChar HTML::resolveEntity(const QString &entity)
342 {
343  HtmlEntity* he = (HtmlEntity*) findEntity(entity);
344  if (he != end_first) return he->code;
345  he = (HtmlEntity*) qBinaryFind(start_ent,end_ent,entity);
346  if (he == end_ent) return QChar();
347  return he->code;
348 }
349 
350 */
351 
352 
353 // Retourne le caractere associe a un caractere special HTML.
354 
355 QChar HTML::resolveEntity(const QString &entity)
356 {
357  HtmlEntity* he = (HtmlEntity*) qBinaryFind(start_first,end_first,entity);
358  if (he != end_first) return he->code;
359  he = (HtmlEntity*) qBinaryFind(start_ent,end_ent,entity);
360  if (he == end_ent) return QChar();
361  return he->code;
362 }
363 
364 
365 
366 
367 // Retourne la chaine HTML representant le caractere "entityCode".
368 
369 QString HTML::resolveEntity(quint16 entityCode)
370 {
371  HtmlEntity* he = (HtmlEntity*) qFind(start_first,end_first,entityCode);
372  if (he != end_first) return he->name;
373  he = (HtmlEntity*) qFind(start_ent,end_ent,entityCode);
374  if (he == end_ent) return QString();
375  return he->name;
376 }
377 
378 
379 
380 // ------------------------------------------------------------------
381 // Fonction de decodage
382 // ------------------------------------------------------------------
383 
384 
385 
386 // Decode une chaine de caractere utilisant des
387 // caracteres speciaux d'HTML.
388 
389 void HTML::decodeStr(QString* str)
390 {
391  int index = 0;
392  QChar decodedChar;
393  QRegExp entityParser("(&([a-zA-Z]+);)",Qt::CaseInsensitive);
394 
395  while((index = entityParser.indexIn(*str,index)) != -1)
396  {
397  index++;
398  decodedChar = resolveEntity(entityParser.cap(2));
399  if (!decodedChar.isNull())
400  str->replace(entityParser.cap(1),decodedChar);
401  }
402 }
403 
404 
405 
406 // Decode une chaine de caractere utilisant des
407 // caracteres speciaux d'HTML.
408 
409 QString* HTML::decode(const QString* src)
410 {
411  QString* str = new QString(*src);
412  decodeStr(str);
413  return str;
414 }
415 
416 
417 
418 // Decode une chaine de caractere utilisant des
419 // caracteres speciaux d'HTML.
420 
421 QString* HTML::decode(const QString& src)
422 {
423  QString* str = new QString(src);
424  decodeStr(str);
425  return str;
426 }
427 
428 
429 
430 
431 
432 // Decode une chaine de caractere utilisant des
433 // caracteres speciaux d'HTML.
434 
435 QString* HTML::decode(const char* src)
436 {
437  QString* str = new QString(src);
438  decodeStr(str);
439  return str;
440 }
441 
442 
443 
444 
445 
446 // Decode une chaine de caractere utilisant des
447 // caracteres speciaux d'HTML.
448 
449 QString* HTML::decode(const string* src)
450 {
451  return decode(src->c_str());
452 }
453 
454 
455 
456 // Decode une chaine de caractere utilisant des
457 // caracteres speciaux d'HTML.
458 
459 QString* HTML::decode(const string& src)
460 {
461  return decode(src.c_str());
462 }
463 
464 
465 
466 
467 // ------------------------------------------------------------------
468 // Fonction d'encodage
469 // ------------------------------------------------------------------
470 
471 
472 
473 
474 // Encode une chaine de caractere utilisant des
475 // caracteres speciaux d'HTML.
476 
477 void HTML::encodeStr(QString* str)
478 {
479  QChar c;
480  QString encodedChar;
481 
482  for(int pos=0; pos<str->size(); pos++)
483  {
484  c = str->at(pos);
485  encodedChar = resolveEntity(c.unicode());
486  if (!encodedChar.isNull())
487  {
488  str->remove(pos, 1);
489  str->insert(pos, QString("&%1;").arg(encodedChar.toLower()));
490  pos += encodedChar.size() + 2;
491  }
492  }
493 }
494 
495 
496 
497 
498 // Encode une chaine de caractere utilisant des
499 // caracteres speciaux d'HTML.
500 
501 QString* HTML::encode(const QString* src)
502 {
503  QString* str = new QString(*src);
504  encodeStr(str);
505  return str;
506 }
507 
508 
509 
510 // Encode une chaine de caractere utilisant des
511 // caracteres speciaux d'HTML.
512 
513 QString* HTML::encode(const QString& src)
514 {
515  QString* str = new QString(src);
516  encodeStr(str);
517  return str;
518 }
519 
520 
521 
522 
523 
524 // Encode une chaine de caractere utilisant des
525 // caracteres speciaux d'HTML.
526 
527 QString* HTML::encode(const char* src)
528 {
529  QString* str = new QString(src);
530  encodeStr(str);
531  return str;
532 }
533 
534 
535 
536 
537 
538 // Encode une chaine de caractere utilisant des
539 // caracteres speciaux d'HTML.
540 
541 QString* HTML::encode(const string* src)
542 {
543  return encode(src->c_str());
544 }
545 
546 
547 
548 // Encode une chaine de caractere utilisant des
549 // caracteres speciaux d'HTML.
550 
551 QString* HTML::encode(const string& src)
552 {
553  return encode(src.c_str());
554 }
555 
556 
557 
558 
559 
560 
561