diff --git a/src/document/html/parser/table.c b/src/document/html/parser/table.c index d325965f..320d0d29 100644 --- a/src/document/html/parser/table.c +++ b/src/document/html/parser/table.c @@ -533,10 +533,10 @@ parse_table(unsigned char *html, unsigned char *eof, unsigned char **end, { struct table *table; struct table_cell *cell; - unsigned char *t_name, *t_attr, *en; + unsigned char *t_name, *t_attr, *en, *name; unsigned char *l_fragment_id = NULL; color_T last_bgcolor; - int t_namelen; + int t_namelen, namelen; int in_cell = 0; int l_al = ALIGN_LEFT; int l_val = VALIGN_MIDDLE; @@ -547,6 +547,7 @@ parse_table(unsigned char *html, unsigned char *eof, unsigned char **end, int cols, rows; int col = 0, row = -1; int maxj; + int closing_tag; *end = html; @@ -583,63 +584,77 @@ see: goto se; } - if (!strlcasecmp(t_name, t_namelen, "TABLE", 5)) { - en = skip_table(en, eof); - goto see; + name = t_name; + namelen = t_namelen; + if (name[0] == '/') { + name++; namelen--; + closing_tag = 1; + + } else { + closing_tag = 0; } - if (!strlcasecmp(t_name, t_namelen, "/TABLE", 6)) { - if (c_span) new_columns(table, c_span, c_width, c_al, c_val, 1); - if (in_cell) CELL(table, col, row)->end = html; - add_table_bad_html_end(table, html); + if (!strlcasecmp(name, namelen, "TABLE", 5)) { + if (!closing_tag) { + en = skip_table(en, eof); + goto see; - goto scan_done; + } else { + if (c_span) new_columns(table, c_span, c_width, c_al, c_val, 1); + if (in_cell) CELL(table, col, row)->end = html; + + add_table_bad_html_end(table, html); + + goto scan_done; + } } - if (!strlcasecmp(t_name, t_namelen, "CAPTION", 7)) { - add_table_bad_html_end(table, html); - if (!table->caption.start) - table->caption.start = html; - goto see; + if (!strlcasecmp(name, namelen, "CAPTION", 7)) { + if (!closing_tag) { + add_table_bad_html_end(table, html); + if (!table->caption.start) + table->caption.start = html; + goto see; + + } else { + if (table->caption.start && !table->caption.end) + table->caption.end = html; + goto see; + } } - if (!strlcasecmp(t_name, t_namelen, "/CAPTION", 8)) { - if (table->caption.start && !table->caption.end) - table->caption.end = html; - goto see; + if (!strlcasecmp(name, namelen, "COLGROUP", 8)) { + if (!closing_tag) { + if (c_span) new_columns(table, c_span, c_width, c_al, c_val, 1); + + add_table_bad_html_end(table, html); + + c_al = ALIGN_TR; + c_val = VALIGN_TR; + c_width = WIDTH_AUTO; + get_align(html_context, t_attr, &c_al); + get_valign(html_context, t_attr, &c_val); + get_column_width(t_attr, &c_width, sh, html_context); + c_span = get_num(t_attr, "span", html_context->options); + if (c_span == -1) c_span = 1; + else if (c_span > HTML_MAX_COLSPAN) c_span = HTML_MAX_COLSPAN; + goto see; + + } else { + if (c_span) new_columns(table, c_span, c_width, c_al, c_val, 1); + + add_table_bad_html_end(table, html); + + c_span = 0; + c_al = ALIGN_TR; + c_val = VALIGN_TR; + c_width = WIDTH_AUTO; + goto see; + } } - if (!strlcasecmp(t_name, t_namelen, "COLGROUP", 8)) { - if (c_span) new_columns(table, c_span, c_width, c_al, c_val, 1); - - add_table_bad_html_end(table, html); - - c_al = ALIGN_TR; - c_val = VALIGN_TR; - c_width = WIDTH_AUTO; - get_align(html_context, t_attr, &c_al); - get_valign(html_context, t_attr, &c_val); - get_column_width(t_attr, &c_width, sh, html_context); - c_span = get_num(t_attr, "span", html_context->options); - if (c_span == -1) c_span = 1; - else if (c_span > HTML_MAX_COLSPAN) c_span = HTML_MAX_COLSPAN; - goto see; - } - - if (!strlcasecmp(t_name, t_namelen, "/COLGROUP", 9)) { - if (c_span) new_columns(table, c_span, c_width, c_al, c_val, 1); - - add_table_bad_html_end(table, html); - - c_span = 0; - c_al = ALIGN_TR; - c_val = VALIGN_TR; - c_width = WIDTH_AUTO; - goto see; - } - - if (!strlcasecmp(t_name, t_namelen, "COL", 3)) { + if (!closing_tag && !strlcasecmp(name, namelen, "COL", 3)) { int sp, width, al, val; add_table_bad_html_end(table, html); @@ -660,10 +675,9 @@ see: } /* /TR /TD /TH */ - if (t_namelen == 3 - && t_name[0] == '/' - && toupper(t_name[1]) == 'T') { - unsigned char c = toupper(t_name[2]); + if (closing_tag && namelen == 2 + && toupper(name[0]) == 'T') { + unsigned char c = toupper(name[1]); if (c == 'R' || c == 'D' || c == 'H') { if (c_span)