From 7ba8d4327b849aee00a71bfefa17f5fcf5bb1eaa Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Mon, 7 Jul 2008 13:03:24 +0000 Subject: A bunch of fixes to table handling svn path=/trunk/hubbub/; revision=4525 --- src/treebuilder/in_table.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) (limited to 'src/treebuilder/in_table.c') diff --git a/src/treebuilder/in_table.c b/src/treebuilder/in_table.c index 229eba1..2fb9528 100644 --- a/src/treebuilder/in_table.c +++ b/src/treebuilder/in_table.c @@ -23,7 +23,7 @@ static inline void clear_stack_table_context(hubbub_treebuilder *treebuilder) { hubbub_ns ns; - element_type type = UNKNOWN; + element_type type = current_node(treebuilder); void *node; while (type != TABLE && type != HTML) { @@ -87,9 +87,10 @@ bool handle_in_table(hubbub_treebuilder *treebuilder, switch (token->type) { case HUBBUB_TOKEN_CHARACTER: - treebuilder->context.element_stack[ + if (treebuilder->context.element_stack[ treebuilder->context.current_table - ].tainted = true; + ].tainted) + handled = false; reprocess = process_characters_expect_whitespace(treebuilder, token, true); @@ -120,22 +121,37 @@ bool handle_in_table(hubbub_treebuilder *treebuilder, insert_element(treebuilder, &token->data.tag); treebuilder->context.mode = IN_CAPTION; } else if (type == COLGROUP || type == COL) { - clear_stack_table_context(treebuilder); - insert_element(treebuilder, &token->data.tag); - treebuilder->context.mode = IN_COLUMN_GROUP; + hubbub_tag tag = token->data.tag; if (type == COL) { + /* Insert colgroup and reprocess */ + tag.name.type = HUBBUB_STRING_PTR; + tag.name.data.ptr = + (const uint8_t *) "colgroup"; + tag.name.len = SLEN("colgroup"); + reprocess = true; } + + clear_stack_table_context(treebuilder); + insert_element(treebuilder, &tag); + treebuilder->context.mode = IN_COLUMN_GROUP; } else if (type == TBODY || type == TFOOT || type == THEAD || type == TD || type == TH || type == TR) { - clear_stack_table_context(treebuilder); - insert_element(treebuilder, &token->data.tag); - treebuilder->context.mode = IN_TABLE_BODY; + hubbub_tag tag = token->data.tag; if (type == TD || type == TH || type == TR) { + /* Insert tbody and reprocess */ + tag.name.type = HUBBUB_STRING_PTR; + tag.name.data.ptr = (const uint8_t *) "tbody"; + tag.name.len = SLEN("tbody"); + reprocess = true; } + + clear_stack_table_context(treebuilder); + insert_element(treebuilder, &tag); + treebuilder->context.mode = IN_TABLE_BODY; } else if (type == TABLE) { /** \todo parse error */ @@ -183,6 +199,7 @@ bool handle_in_table(hubbub_treebuilder *treebuilder, if (cur_node == TABLE || cur_node == TBODY || cur_node == TFOOT || cur_node == THEAD || cur_node == TR) { + /** \todo in_body needs to take account of this flag */ treebuilder->context.in_table_foster = true; } -- cgit v1.2.3