Hubbub
before_head.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 John-Mark Bell <jmb@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  err = process_characters_expect_whitespace(treebuilder,
33  token, false);
34  break;
36  err = process_comment_append(treebuilder, token,
37  treebuilder->context.element_stack[
38  treebuilder->context.current_node].node);
39  break;
42  break;
44  {
46  &token->data.tag.name);
47 
48  if (type == HTML) {
49  /* Process as if "in body" */
50  err = handle_in_body(treebuilder, token);
51  } else if (type == HEAD) {
52  handled = true;
53  } else {
54  err = HUBBUB_REPROCESS;
55  }
56  }
57  break;
59  {
61  &token->data.tag.name);
62 
63  if (type == HTML || type == BODY ||
64  type == HEAD || type == BR) {
65  err = HUBBUB_REPROCESS;
66  } else {
68  }
69  }
70  break;
71  case HUBBUB_TOKEN_EOF:
72  err = HUBBUB_REPROCESS;
73  break;
74  }
75 
76  if (handled || err == HUBBUB_REPROCESS) {
77  hubbub_error e;
78  hubbub_tag tag;
79 
80  if (err == HUBBUB_REPROCESS) {
81  /* Manufacture head tag */
82  tag.ns = HUBBUB_NS_HTML;
83  tag.name.ptr = (const uint8_t *) "head";
84  tag.name.len = SLEN("head");
85 
86  tag.n_attributes = 0;
87  tag.attributes = NULL;
88  } else {
89  tag = token->data.tag;
90  }
91 
92  e = insert_element(treebuilder, &tag, true);
93  if (e != HUBBUB_OK)
94  return e;
95 
96  treebuilder->tree_handler->ref_node(
97  treebuilder->tree_handler->ctx,
98  treebuilder->context.element_stack[
99  treebuilder->context.current_node].node);
100 
101  treebuilder->context.head_element =
102  treebuilder->context.element_stack[
103  treebuilder->context.current_node].node;
104 
105  treebuilder->context.mode = IN_HEAD;
106  }
107 
108  return err;
109 }
110 
#define SLEN(s)
Definition: utils.h:34
hubbub_error process_comment_append(hubbub_treebuilder *treebuilder, const hubbub_token *token, void *parent)
Process a comment token, appending it to the given parent.
Definition: treebuilder.c:420
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
Data for a tag.
Definition: types.h:108
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
const uint8_t * ptr
Pointer to data.
Definition: types.h:77
element_type
Definition: internal.h:13
hubbub_error process_characters_expect_whitespace(hubbub_treebuilder *treebuilder, const hubbub_token *token, bool insert_into_current_node)
Process a character token in cases where we expect only whitespace.
Definition: treebuilder.c:374
Definition: internal.h:17
Definition: internal.h:25
insertion_mode mode
The current insertion mode.
Definition: internal.h:75
hubbub_error handle_before_head(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle token in "before head" insertion mode.
Definition: before_head.c:24
size_t len
Byte length of string.
Definition: types.h:78
hubbub_error handle_in_body(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle tokens in "in body" insertion mode.
Definition: in_body.c:123
void * head_element
Pointer to HEAD element.
Definition: internal.h:88
hubbub_treebuilder_context context
Our context.
Definition: internal.h:120
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:751
hubbub_attribute * attributes
Array of attribute data.
Definition: types.h:112
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: modes.h:19
element_type type
Definition: treebuilder.c:25
No error.
Definition: errors.h:19
hubbub_tag tag
Definition: types.h:125
union hubbub_token::@3 data
Type-specific data.
Definition: internal.h:17
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
Treebuilder object.
Definition: internal.h:116
element_context * element_stack
Stack of open elements.
Definition: internal.h:79
uint32_t n_attributes
Count of attributes.
Definition: types.h:111
uint32_t current_node
Index of current node in stack.
Definition: internal.h:81
Definition: internal.h:19