Hubbub
in_row.c
Go to the documentation of this file.
1 /*
2  * This file is part of Hubbub.
3  * Licensed under the MIT License,
4  * http://www.opensource.org/licenses/mit-license.php
5  * Copyright 2008 Andrew Sidwell <takkaria@netsurf-browser.org>
6  */
7 
8 #include <assert.h>
9 #include <string.h>
10 
11 #include "treebuilder/modes.h"
12 #include "treebuilder/internal.h"
14 #include "utils/utils.h"
15 
16 
22 static void table_clear_stack(hubbub_treebuilder *treebuilder)
23 {
24  element_type cur_node = current_node(treebuilder);
25 
26  while (cur_node != TR && cur_node != HTML) {
27  hubbub_ns ns;
29  void *node;
30 
31  element_stack_pop(treebuilder, &ns, &type, &node);
32 
33  treebuilder->tree_handler->unref_node(
34  treebuilder->tree_handler->ctx,
35  node);
36 
37  cur_node = current_node(treebuilder);
38  }
39 
40  return;
41 }
42 
43 
51 {
52  hubbub_ns ns;
53  element_type otype;
54  void *node;
55 
58  table_clear_stack(treebuilder);
59 
60  element_stack_pop(treebuilder, &ns, &otype, &node);
61 
62  treebuilder->tree_handler->unref_node(treebuilder->tree_handler->ctx,
63  node);
64 
65  treebuilder->context.mode = IN_TABLE_BODY;
66 
67  return HUBBUB_REPROCESS;
68 }
69 
70 
79  const hubbub_token *token)
80 {
81  hubbub_error err = HUBBUB_OK;
82 
83  switch (token->type) {
85  {
87  &token->data.tag.name);
88 
89  if (type == TH || type == TD) {
90  table_clear_stack(treebuilder);
91 
92  err = insert_element(treebuilder, &token->data.tag,
93  true);
94  if (err != HUBBUB_OK)
95  return err;
96 
97  treebuilder->context.mode = IN_CELL;
98 
99  /* ref node for formatting list */
100  treebuilder->tree_handler->ref_node(
101  treebuilder->tree_handler->ctx,
102  treebuilder->context.element_stack[
103  treebuilder->context.current_node].node);
104 
105  err = formatting_list_append(treebuilder,
106  token->data.tag.ns, type,
107  treebuilder->context.element_stack[
108  treebuilder->context.current_node].node,
109  treebuilder->context.current_node);
110  if (err != HUBBUB_OK) {
111  hubbub_ns ns;
113  void *node;
114 
115  /* Revert changes */
116 
117  remove_node_from_dom(treebuilder,
118  treebuilder->context.element_stack[
119  treebuilder->context.current_node].node);
120  element_stack_pop(treebuilder, &ns, &type,
121  &node);
122 
123  return err;
124  }
125  } else if (type == CAPTION || type == COL ||
126  type == COLGROUP || type == TBODY ||
127  type == TFOOT || type == THEAD || type == TR) {
128  err = act_as_if_end_tag_tr(treebuilder);
129  } else {
130  err = handle_in_table(treebuilder, token);
131  }
132  }
133  break;
135  {
137  &token->data.tag.name);
138 
139  if (type == TR) {
140  /* We're done with this token, but act_as_if_end_tag_tr
141  * will return HUBBUB_REPROCESS. Therefore, ignore the
142  * return value. */
143  (void) act_as_if_end_tag_tr(treebuilder);
144  } else if (type == TABLE) {
145  err = act_as_if_end_tag_tr(treebuilder);
146  } else if (type == BODY || type == CAPTION || type == COL ||
147  type == COLGROUP || type == HTML ||
148  type == TD || type == TH) {
150  /* Ignore the token */
151  } else {
152  err = handle_in_table(treebuilder, token);
153  }
154  }
155  break;
159  case HUBBUB_TOKEN_EOF:
160  err = handle_in_table(treebuilder, token);
161  break;
162  }
163 
164  return err;
165 }
166 
element_type current_node(hubbub_treebuilder *treebuilder)
Peek at the top element of the element stack.
Definition: treebuilder.c:1259
Definition: internal.h:25
hubbub_token_type type
The token type.
Definition: types.h:120
void * ctx
Context pointer.
Definition: tree.h:292
hubbub_ns ns
Tag namespace.
Definition: types.h:109
Token data.
Definition: types.h:119
hubbub_string name
Tag name.
Definition: types.h:110
hubbub_tree_handler * tree_handler
Callback table.
Definition: internal.h:122
Definition: modes.h:28
element_type
Definition: internal.h:13
Definition: internal.h:17
Definition: internal.h:25
Definition: internal.h:25
Definition: internal.h:22
Definition: internal.h:25
insertion_mode mode
The current insertion mode.
Definition: internal.h:75
Definition: internal.h:22
hubbub_error handle_in_row(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle tokens in "in row" insertion mode.
Definition: in_row.c:78
hubbub_error handle_in_table(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle token in "in table" insertion mode.
Definition: in_table.c:74
hubbub_treebuilder_context context
Our context.
Definition: internal.h:120
hubbub_error remove_node_from_dom(hubbub_treebuilder *treebuilder, void *node)
Remove a node from the DOM.
Definition: treebuilder.c:681
hubbub_error insert_element(hubbub_treebuilder *treebuilder, const hubbub_tag *tag_name, bool push)
Create element and insert it into the DOM, potentially pushing it on the stack.
Definition: treebuilder.c:752
static hubbub_error act_as_if_end_tag_tr(hubbub_treebuilder *treebuilder)
Handle and anything that acts "as if" was emitted.
Definition: in_row.c:50
hubbub_error
Definition: errors.h:18
void * node
Node pointer.
Definition: internal.h:54
hubbub_tree_ref_node ref_node
Reference node.
Definition: tree.h:278
Definition: internal.h:22
Definition: internal.h:17
hubbub_tree_unref_node unref_node
Unreference node.
Definition: tree.h:279
element_type type
Definition: treebuilder.c:26
No error.
Definition: errors.h:19
hubbub_tag tag
Definition: types.h:125
hubbub_ns
Possible namespaces.
Definition: types.h:63
union hubbub_token::@3 data
Type-specific data.
hubbub_error formatting_list_append(hubbub_treebuilder *treebuilder, hubbub_ns ns, element_type type, void *node, uint32_t stack_index)
Append an element to the end of the list of active formatting elements.
Definition: treebuilder.c:1292
hubbub_error element_stack_pop(hubbub_treebuilder *treebuilder, hubbub_ns *ns, element_type *type, void **node)
Pop an element off the stack of open elements.
Definition: treebuilder.c:1113
element_type element_type_from_name(hubbub_treebuilder *treebuilder, const hubbub_string *tag_name)
Convert an element name into an element type.
Definition: treebuilder.c:987
Definition: internal.h:23
static void table_clear_stack(hubbub_treebuilder *treebuilder)
Clear the stack back to a table row context.
Definition: in_row.c:22
Treebuilder object.
Definition: internal.h:116
element_context * element_stack
Stack of open elements.
Definition: internal.h:79
uint32_t current_node
Index of current node in stack.
Definition: internal.h:81