summaryrefslogtreecommitdiff
path: root/src/treebuilder/in_table.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/treebuilder/in_table.c')
-rw-r--r--src/treebuilder/in_table.c35
1 files changed, 26 insertions, 9 deletions
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;
}