Use entity decoding API in HTML parser
authorRicardo Mones <ricardo@mones.org>
Mon, 13 Nov 2017 20:11:33 +0000 (21:11 +0100)
committerRicardo Mones <ricardo@mones.org>
Wed, 15 Nov 2017 19:36:30 +0000 (20:36 +0100)
src/html.c
src/html.h

index 95f5a08..e982794 100644 (file)
 #include "html.h"
 #include "codeconv.h"
 #include "utils.h"
+#include "entity.h"
 
 #define SC_HTMLBUFSIZE 8192
 #define HR_STR         "────────────────────────────────────────────────"
 #define LI_STR         "• "
 
-typedef struct _SC_HTMLSymbol  SC_HTMLSymbol;
-
-struct _SC_HTMLSymbol
-{
-       gchar *const key;
-       gchar *const val;
-};
-
-static SC_HTMLSymbol symbol_list[] = {
- {"&#34;", "\42"},
- {"&#38;", "\46"},
- {"&#39;", "\47"},
- {"&#60;", "\74"},
- {"&#62;", "\76"},
- {"&#034;", "\42"},
- {"&#038;", "\46"},
- {"&#039;", "\47"},
- {"&#060;", "\74"},
- {"&#062;", "\76"},
- {"&#146;", "\47"},
- {"&#153;", "\342\204\242"},
- {"&#160;", "\40"},
- {"&#161;", "\302\241"},
- {"&#162;", "\302\242"},
- {"&#163;", "\302\243"},
- {"&#164;", "\302\244"},
- {"&#165;", "\302\245"},
- {"&#166;", "\302\246"},
- {"&#167;", "\302\247"},
- {"&#168;", "\302\250"},
- {"&#169;", "\302\251"},
- {"&#170;", "\302\252"},
- {"&#171;", "\302\253"},
- {"&#172;", "\302\254"},
- {"&#173;", "\302\255"},
- {"&#174;", "\302\256"},
- {"&#175;", "\302\257"},
- {"&#176;", "\302\260"},
- {"&#177;", "\302\261"},
- {"&#178;", "\302\262"},
- {"&#179;", "\302\263"},
- {"&#180;", "\302\264"},
- {"&#181;", "\302\265"},
- {"&#182;", "\302\266"},
- {"&#183;", "\302\267"},
- {"&#184;", "\302\270"},
- {"&#185;", "\302\271"},
- {"&#186;", "\302\272"},
- {"&#187;", "\302\273"},
- {"&#188;", "\302\274"},
- {"&#189;", "\302\275"},
- {"&#190;", "\302\276"},
- {"&#191;", "\302\277"},
- {"&#192;", "\303\200"},
- {"&#193;", "\303\201"},
- {"&#194;", "\303\202"},
- {"&#195;", "\303\203"},
- {"&#196;", "\303\204"},
- {"&#197;", "\303\205"},
- {"&#198;", "\303\206"},
- {"&#199;", "\303\207"},
- {"&#200;", "\303\210"},
- {"&#201;", "\303\211"},
- {"&#202;", "\303\212"},
- {"&#203;", "\303\213"},
- {"&#204;", "\303\214"},
- {"&#205;", "\303\215"},
- {"&#206;", "\303\216"},
- {"&#207;", "\303\217"},
- {"&#208;", "\303\220"},
- {"&#209;", "\303\221"},
- {"&#210;", "\303\222"},
- {"&#211;", "\303\223"},
- {"&#212;", "\303\224"},
- {"&#213;", "\303\225"},
- {"&#214;", "\303\226"},
- {"&#215;", "\303\227"},
- {"&#216;", "\303\230"},
- {"&#217;", "\303\231"},
- {"&#218;", "\303\232"},
- {"&#219;", "\303\233"},
- {"&#220;", "\303\234"},
- {"&#221;", "\303\235"},
- {"&#222;", "\303\236"},
- {"&#223;", "\303\237"},
- {"&#224;", "\303\240"},
- {"&#225;", "\303\241"},
- {"&#226;", "\303\242"},
- {"&#227;", "\303\243"},
- {"&#228;", "\303\244"},
- {"&#229;", "\303\245"},
- {"&#230;", "\303\246"},
- {"&#231;", "\303\247"},
- {"&#232;", "\303\250"},
- {"&#233;", "\303\251"},
- {"&#234;", "\303\252"},
- {"&#235;", "\303\253"},
- {"&#236;", "\303\254"},
- {"&#237;", "\303\255"},
- {"&#238;", "\303\256"},
- {"&#239;", "\303\257"},
- {"&#240;", "\303\260"},
- {"&#241;", "\303\261"},
- {"&#242;", "\303\262"},
- {"&#243;", "\303\263"},
- {"&#244;", "\303\264"},
- {"&#245;", "\303\265"},
- {"&#246;", "\303\266"},
- {"&#247;", "\303\267"},
- {"&#248;", "\303\270"},
- {"&#249;", "\303\271"},
- {"&#250;", "\303\272"},
- {"&#251;", "\303\273"},
- {"&#252;", "\303\274"},
- {"&#253;", "\303\275"},
- {"&#254;", "\303\276"},
- {"&#255;", "\303\277"},
- {"&#338;", "\305\222"},
- {"&#339;", "\305\223"},
- {"&#352;", "\305\240"},
- {"&#353;", "\305\241"},
- {"&#376;", "\305\270"},
- {"&#710;", "\313\206"},
- {"&#732;", "\313\234"},
- {"&#8194;", "\342\200\202"},
- {"&#8195;", "\342\200\203"},
- {"&#8201;", "\342\200\211"},
- {"&#8211;", "\342\200\223"},
- {"&#8212;", "\342\200\224"},
- {"&#8216;", "\342\200\230"},
- {"&#8217;", "\342\200\231"},
- {"&#8218;", "\342\200\232"},
- {"&#8220;", "\342\200\234"},
- {"&#8221;", "\342\200\235"},
- {"&#8222;", "\342\200\236"},
- {"&#8224;", "\342\200\240"},
- {"&#8225;", "\342\200\241"},
- {"&#8226;", "\342\200\242"},
- {"&#8230;", "\342\200\246"},
- {"&#8240;", "\342\200\260"},
- {"&#8249;", "\342\200\271"},
- {"&#8250;", "\342\200\272"},
- {"&#8364;", "\342\202\254"},
- {"&#8482;", "\342\204\242"},
- {"&quot;", "\42"},
- {"&amp;", "\46"},
- {"&apos;", "\47"},
- {"&lt;", "\74"},
- {"&gt;", "\76"},
- {"&squot;", "\47"},
- {"&nbsp;", "\40"},
- {"&iexcl;", "\302\241"},
- {"&cent;", "\302\242"},
- {"&pound;", "\302\243"},
- {"&curren;", "\302\244"},
- {"&yen;", "\302\245"},
- {"&brvbar;", "\302\246"},
- {"&sect;", "\302\247"},
- {"&uml;", "\302\250"},
- {"&copy;", "\302\251"},
- {"&ordf;", "\302\252"},
- {"&laquo;", "\302\253"},
- {"&not;", "\302\254"},
- {"&shy;", "\302\255"},
- {"&reg;", "\302\256"},
- {"&macr;", "\302\257"},
- {"&deg;", "\302\260"},
- {"&plusmn;", "\302\261"},
- {"&sup2;", "\302\262"},
- {"&sup3;", "\302\263"},
- {"&acute;", "\302\264"},
- {"&micro;", "\302\265"},
- {"&para;", "\302\266"},
- {"&middot;", "\302\267"},
- {"&cedil;", "\302\270"},
- {"&sup1;", "\302\271"},
- {"&ordm;", "\302\272"},
- {"&raquo;", "\302\273"},
- {"&frac14;", "\302\274"},
- {"&frac12;", "\302\275"},
- {"&frac34;", "\302\276"},
- {"&iquest;", "\302\277"},
- {"&Agrave;", "\303\200"},
- {"&Aacute;", "\303\201"},
- {"&Acirc;", "\303\202"},
- {"&Atilde;", "\303\203"},
- {"&Auml;", "\303\204"},
- {"&Aring;", "\303\205"},
- {"&AElig;", "\303\206"},
- {"&Ccedil;", "\303\207"},
- {"&Egrave;", "\303\210"},
- {"&Eacute;", "\303\211"},
- {"&Ecirc;", "\303\212"},
- {"&Euml;", "\303\213"},
- {"&Igrave;", "\303\214"},
- {"&Iacute;", "\303\215"},
- {"&Icirc;", "\303\216"},
- {"&Iuml;", "\303\217"},
- {"&ETH;", "\303\220"},
- {"&Ntilde;", "\303\221"},
- {"&Ograve;", "\303\222"},
- {"&Oacute;", "\303\223"},
- {"&Ocirc;", "\303\224"},
- {"&Otilde;", "\303\225"},
- {"&Ouml;", "\303\226"},
- {"&times;", "\303\227"},
- {"&Oslash;", "\303\230"},
- {"&Ugrave;", "\303\231"},
- {"&Uacute;", "\303\232"},
- {"&Ucirc;", "\303\233"},
- {"&Uuml;", "\303\234"},
- {"&Yacute;", "\303\235"},
- {"&THORN;", "\303\236"},
- {"&szlig;", "\303\237"},
- {"&agrave;", "\303\240"},
- {"&aacute;", "\303\241"},
- {"&acirc;", "\303\242"},
- {"&atilde;", "\303\243"},
- {"&auml;", "\303\244"},
- {"&aring;", "\303\245"},
- {"&aelig;", "\303\246"},
- {"&ccedil;", "\303\247"},
- {"&egrave;", "\303\250"},
- {"&eacute;", "\303\251"},
- {"&ecirc;", "\303\252"},
- {"&euml;", "\303\253"},
- {"&igrave;", "\303\254"},
- {"&iacute;", "\303\255"},
- {"&icirc;", "\303\256"},
- {"&iuml;", "\303\257"},
- {"&eth;", "\303\260"},
- {"&ntilde;", "\303\261"},
- {"&ograve;", "\303\262"},
- {"&oacute;", "\303\263"},
- {"&ocirc;", "\303\264"},
- {"&otilde;", "\303\265"},
- {"&ouml;", "\303\266"},
- {"&divide;", "\303\267"},
- {"&oslash;", "\303\270"},
- {"&ugrave;", "\303\271"},
- {"&uacute;", "\303\272"},
- {"&ucirc;", "\303\273"},
- {"&uuml;", "\303\274"},
- {"&yacute;", "\303\275"},
- {"&thorn;", "\303\276"},
- {"&yuml;", "\303\277"},
- {"&OElig;", "\305\222"},
- {"&oelig;", "\305\223"},
- {"&Scaron;", "\305\240"},
- {"&scaron;", "\305\241"},
- {"&Yuml;", "\305\270"},
- {"&circ;", "\313\206"},
- {"&tilde;", "\313\234"},
- {"&ensp;", "\342\200\202"},
- {"&emsp;", "\342\200\203"},
- {"&thinsp;", "\342\200\211"},
- {"&ndash;", "\342\200\223"},
- {"&mdash;", "\342\200\224"},
- {"&lsquo;", "\342\200\230"},
- {"&rsquo;", "\342\200\231"},
- {"&sbquo;", "\342\200\232"},
- {"&ldquo;", "\342\200\234"},
- {"&rdquo;", "\342\200\235"},
- {"&bdquo;", "\342\200\236"},
- {"&dagger;", "\342\200\240"},
- {"&Dagger;", "\342\200\241"},
- {"&bull;", "\342\200\242"},
- {"&hellip;", "\342\200\246"},
- {"&permil;", "\342\200\260"},
- {"&lsaquo;", "\342\200\271"},
- {"&rsaquo;", "\342\200\272"},
- {"&euro;", "\342\202\254"},
- {"&trade;", "\342\204\242"}
-};
-
-static GHashTable *default_symbol_table;
-
 static SC_HTMLState sc_html_read_line  (SC_HTMLParser  *parser);
 static void sc_html_append_char                        (SC_HTMLParser  *parser,
                                         gchar           ch);
@@ -340,16 +64,6 @@ SC_HTMLParser *sc_html_parser_new(FILE *fp, CodeConverter *conv)
        parser->pre = FALSE;
        parser->indent = 0;
 
-       if (!default_symbol_table) {
-               gint i;
-               default_symbol_table = g_hash_table_new(g_str_hash, g_str_equal);
-               for (i = 0; i < sizeof(symbol_list) / sizeof(symbol_list[0]); i++)
-                       g_hash_table_insert(default_symbol_table,
-                                                               symbol_list[i].key, symbol_list[i].val);
-       }
-
-       parser->symbol_table = default_symbol_table;
-
        return parser;
 }
 
@@ -612,8 +326,7 @@ static void decode_href(SC_HTMLParser *parser)
        tparser->str = g_string_new(NULL);
        tparser->buf = g_string_new(parser->href);
        tparser->bufp = tparser->buf->str;
-       tparser->symbol_table = default_symbol_table;
-       
+
        tmp = sc_html_parse(tparser);
        
        g_free(parser->href);
@@ -725,33 +438,21 @@ static SC_HTMLState sc_html_parse_tag(SC_HTMLParser *parser)
 
 static void sc_html_parse_special(SC_HTMLParser *parser)
 {
-       gchar symbol_name[9];
-       gint n;
-       const gchar *val;
+       gchar *entity;
 
        parser->state = SC_HTML_UNKNOWN;
        cm_return_if_fail(*parser->bufp == '&');
 
-       /* &foo; */
-       for (n = 0; parser->bufp[n] != '\0' && parser->bufp[n] != ';'; n++)
-               ;
-       if (n > 7 || parser->bufp[n] != ';') {
+       entity = entity_decode(parser->bufp);
+       if (entity != NULL) {
+               sc_html_append_str(parser, entity, -1);
+               g_free(entity);
+               while (*parser->bufp++ != ';');
+       } else {
                /* output literal `&' */
                sc_html_append_char(parser, *parser->bufp++);
-               parser->state = SC_HTML_NORMAL;
-               return;
        }
-       strncpy2(symbol_name, parser->bufp, n + 2);
-       parser->bufp += n + 1;
-
-       if ((val = g_hash_table_lookup(parser->symbol_table, symbol_name))
-           != NULL) {
-               sc_html_append_str(parser, val, -1);
-               parser->state = SC_HTML_NORMAL;
-               return;
-       } 
-
-       sc_html_append_str(parser, symbol_name, -1);
+       parser->state = SC_HTML_NORMAL;
 }
 
 static gchar *sc_html_find_tag(SC_HTMLParser *parser, const gchar *tag)
index 98e2f3a..922389a 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2012 Hiroyuki Yamamoto and the Claws Mail team
+ * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2017 Hiroyuki Yamamoto and the Claws Mail team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -14,7 +14,6 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
- * 
  */
 
 #ifndef __HTML_H__
@@ -51,9 +50,6 @@ struct _SC_HTMLParser
        FILE *fp;
        CodeConverter *conv;
 
-       GHashTable *symbol_table;
-       GHashTable *alt_symbol_table;
-
        GString *str;
        GString *buf;