Hubbub
after_body.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 
29  switch (token->type) {
31  {
32  /* mostly cribbed from process_characters_expect_whitespace */
33  const uint8_t *data = token->data.character.ptr;
34  size_t len = token->data.character.len;
35  size_t c;
36 
37  /* Scan for whitespace */
38  for (c = 0; c < len; c++) {
39  if (data[c] != 0x09 && data[c] != 0x0A &&
40  data[c] != 0x0C && data[c] != 0x20)
41  break;
42  }
43 
44  /* Whitespace characters in token, so handle as in body */
45  if (c > 0) {
46  hubbub_token temp = *token;
47  temp.data.character.len = c;
48 
49  err = handle_in_body(treebuilder, &temp);
50  if (err != HUBBUB_OK)
51  return err;
52  }
53 
54  /* Anything else, switch to in body */
55  if (c != len) {
56  /* Update token data to strip leading whitespace */
57  ((hubbub_token *) token)->data.character.ptr += c;
58  ((hubbub_token *) token)->data.character.len -= c;
59 
60  treebuilder->context.mode = IN_BODY;
61  err = HUBBUB_REPROCESS;
62  }
63  }
64  break;
66  err = process_comment_append(treebuilder, token,
67  treebuilder->context.element_stack[
68  0].node);
69  break;
72  break;
74  {
76  &token->data.tag.name);
77 
78  if (type == HTML) {
79  /* Process as if "in body" */
80  err = handle_in_body(treebuilder, token);
81  } else {
83  treebuilder->context.mode = IN_BODY;
84  err = HUBBUB_REPROCESS;
85  }
86  }
87  break;
89  {
91  &token->data.tag.name);
92 
93  if (type == HTML) {
96  treebuilder->context.mode = AFTER_AFTER_BODY;
97  } else {
99  treebuilder->context.mode = IN_BODY;
100  err = HUBBUB_REPROCESS;
101  }
102  }
103  break;
104  case HUBBUB_TOKEN_EOF:
105  break;
106  }
107 
108  return err;
109 }
110 
hubbub_error handle_after_body(hubbub_treebuilder *treebuilder, const hubbub_token *token)
Handle token in "after body" insertion mode.
Definition: after_body.c:24
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:421
hubbub_token_type type
The token type.
Definition: types.h:120
Token data.
Definition: types.h:119
hubbub_string name
Tag name.
Definition: types.h:110
const uint8_t * ptr
Pointer to data.
Definition: types.h:77
element_type
Definition: internal.h:13
Definition: internal.h:25
insertion_mode mode
The current insertion mode.
Definition: internal.h:75
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
Definition: modes.h:22
hubbub_treebuilder_context context
Our context.
Definition: internal.h:120
hubbub_error
Definition: errors.h:18
void * node
Node pointer.
Definition: internal.h:54
hubbub_string character
Definition: types.h:129
element_type type
Definition: treebuilder.c:26
No error.
Definition: errors.h:19
size_t len
Definition: initial.c:23
hubbub_tag tag
Definition: types.h:125
union hubbub_token::@3 data
Type-specific data.
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
Treebuilder object.
Definition: internal.h:116
element_context * element_stack
Stack of open elements.
Definition: internal.h:79