Hubbub
in_caption.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 
25  const hubbub_token *token)
26 {
27  hubbub_error err = HUBBUB_OK;
28  bool handled = false;
29 
30  switch (token->type) {
32  {
34  &token->data.tag.name);
35 
36  if (type == CAPTION || type == COL || type == COLGROUP ||
37  type == TBODY || type == TD || type == TFOOT ||
38  type == TH || type == THEAD || type == TR) {
40  err = HUBBUB_REPROCESS;
41  } else {
42  /* Process as if "in body" */
43  err = handle_in_body(treebuilder, token);
44  }
45  }
46  break;
48  {
50  &token->data.tag.name);
51 
52  if (type == CAPTION) {
53  handled = true;
54  } else if (type == TABLE) {
56  err = HUBBUB_REPROCESS;
57  } else if (type == BODY || type == COL || type == COLGROUP ||
58  type == HTML || type == TBODY || type == TD ||
59  type == TFOOT || type == TH ||
60  type == THEAD || type == TR) {
62  } else {
63  /* Process as if "in body" */
64  err = handle_in_body(treebuilder, token);
65  }
66  }
67  break;
71  case HUBBUB_TOKEN_EOF:
72  /* Process as if "in body" */
73  err = handle_in_body(treebuilder, token);
74 
75  break;
76  }
77 
78  if (handled || err == HUBBUB_REPROCESS) {
79  hubbub_ns ns;
80  element_type otype = UNKNOWN;
81  void *node;
82 
85  close_implied_end_tags(treebuilder, UNKNOWN);
86 
87  while (otype != CAPTION) {
90  element_stack_pop(treebuilder, &ns, &otype, &node);
91 
92  treebuilder->tree_handler->unref_node(
93  treebuilder->tree_handler->ctx,
94  node);
95  }
96 
98 
99  treebuilder->context.mode = IN_TABLE;
100  }
101 
102  return err;
103 }
104 
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
void close_implied_end_tags(hubbub_treebuilder *treebuilder, element_type except)
Close implied end tags.
Definition: treebuilder.c:829
element_type
Definition: internal.h:13
hubbub_error handle_in_caption(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle tokens in "in caption" insertion mode.
Definition: in_caption.c:24
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
hubbub_tree_unref_node unref_node
Unreference node.
Definition: tree.h:279
Definition: internal.h:17
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.
Definition: modes.h:23
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
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:717