talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 8e9f89bef30238e178d71344e5135b030933956e
parent 4d178a21c1d763945c6f27bc01814d58f7fa3dd7
Author: Ricardo Mones <ricardo@mones.org>
Date:   Mon, 13 Nov 2017 21:11:33 +0100

Use entity decoding API in HTML parser

Diffstat:
Msrc/html.c | 319+++----------------------------------------------------------------------------
Msrc/html.h | 8++------
2 files changed, 12 insertions(+), 315 deletions(-)

diff --git a/src/html.c b/src/html.c @@ -24,288 +24,12 @@ #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) diff --git a/src/html.h b/src/html.h @@ -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;