Hubbub
in_cell.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 inline void close_cell(hubbub_treebuilder *treebuilder)
23 {
24  hubbub_ns ns;
25  element_type otype = UNKNOWN;
26  void *node;
27 
29 
30  if (element_in_scope(treebuilder, TD, true)) {
31  type = TD;
32  } else {
33  type = TH;
34  }
35 
36  /* Act as if an end tag token of type `type` has been seen */
37 
38  close_implied_end_tags(treebuilder, UNKNOWN);
41  while (otype != type) {
42  element_stack_pop(treebuilder, &ns, &otype, &node);
43 
44  treebuilder->tree_handler->unref_node(
45  treebuilder->tree_handler->ctx,
46  node);
47  }
48 
50  treebuilder->context.mode = IN_ROW;
51 
52  return;
53 }
54 
55 
64  const hubbub_token *token)
65 {
66  hubbub_error err = HUBBUB_OK;
67 
68  switch (token->type) {
70  {
72  &token->data.tag.name);
73 
74  if (type == CAPTION || type == COL ||
75  type == COLGROUP || type == TBODY ||
76  type == TD || type == TFOOT || type == TH ||
77  type == THEAD || type == TR) {
79  close_cell(treebuilder);
80  err = HUBBUB_REPROCESS;
81  } else {
82  err = handle_in_body(treebuilder, token);
83  }
84  }
85  break;
87  {
89  &token->data.tag.name);
90 
91  if (type == TH || type == TD) {
92  if (element_in_scope(treebuilder, type, true)) {
93  hubbub_ns ns;
94  element_type otype = UNKNOWN;
95  void *node;
96 
97  close_implied_end_tags(treebuilder, UNKNOWN);
100  while (otype != type) {
101  element_stack_pop(treebuilder,
102  &ns, &otype, &node);
103 
104  treebuilder->tree_handler->unref_node(
105  treebuilder->tree_handler->ctx,
106  node);
107  }
108 
110  treebuilder);
111 
112  treebuilder->context.mode = IN_ROW;
113  } else {
115  }
116  } else if (type == BODY || type == CAPTION || type == COL ||
117  type == COLGROUP || type == HTML) {
119  } else if (type == TABLE || type == TBODY || type == TFOOT ||
120  type == THEAD || type == TR) {
121  if (element_in_scope(treebuilder, type, true)) {
122  close_cell(treebuilder);
123  err = HUBBUB_REPROCESS;
124  } else {
126  }
127  } else {
128  err = handle_in_body(treebuilder, token);
129  }
130  }
131  break;
135  case HUBBUB_TOKEN_EOF:
136  err = handle_in_body(treebuilder, token);
137  break;
138  }
139 
140  return err;
141 }
142 
Definition: internal.h:25
hubbub_token_type type
The token type.
Definition: types.h:120
void * ctx
Context pointer.
Definition: tree.h:292
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:27
void close_implied_end_tags(hubbub_treebuilder *treebuilder, element_type except)
Close implied end tags.
Definition: treebuilder.c:828
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_body(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle tokens in "in body" insertion mode.
Definition: in_body.c:123
hubbub_treebuilder_context context
Our context.
Definition: internal.h:120
hubbub_error
Definition: errors.h:18
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:25
No error.
Definition: errors.h:19
hubbub_error handle_in_cell(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle tokens in "in cell" insertion mode.
Definition: in_cell.c:63
hubbub_tag tag
Definition: types.h:125
hubbub_ns
Possible namespaces.
Definition: types.h:63
union hubbub_token::@3 data
Type-specific data.
uint32_t element_in_scope(hubbub_treebuilder *treebuilder, element_type type, bool in_table)
Determine if an element is in (table) scope.
Definition: treebuilder.c:499
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:1112
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:986
static void close_cell(hubbub_treebuilder *treebuilder)
Clear the stack back to a table row context.
Definition: in_cell.c:22
Definition: internal.h:23
Treebuilder object.
Definition: internal.h:116
void clear_active_formatting_list_to_marker(hubbub_treebuilder *treebuilder)
Clear the list of active formatting elements up to the last marker.
Definition: treebuilder.c:716