1 /*
2 * Copyright (C) 2018-2020 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
7 #include "lexbor/html/tree/insertion_mode.h"
8 #include "lexbor/html/tree/open_elements.h"
9
10
11 lxb_inline bool
lxb_html_tree_insertion_mode_in_column_group_anything_else(lxb_html_tree_t * tree,lxb_html_token_t * token)12 lxb_html_tree_insertion_mode_in_column_group_anything_else(lxb_html_tree_t *tree,
13 lxb_html_token_t *token)
14 {
15 lxb_dom_node_t *node = lxb_html_tree_current_node(tree);
16
17 if (lxb_html_tree_node_is(node, LXB_TAG_COLGROUP) == false) {
18 lxb_html_tree_parse_error(tree, token,
19 LXB_HTML_RULES_ERROR_MIELINOPELST);
20
21 return true;
22 }
23
24 lxb_html_tree_open_elements_pop(tree);
25
26 tree->mode = lxb_html_tree_insertion_mode_in_table;
27
28 return false;
29 }
30
31 lxb_inline bool
lxb_html_tree_insertion_mode_in_column_group_text(lxb_html_tree_t * tree,lxb_html_token_t * token)32 lxb_html_tree_insertion_mode_in_column_group_text(lxb_html_tree_t *tree,
33 lxb_html_token_t *token)
34 {
35 lxb_html_token_t ws_token = {0};
36
37 tree->status = lxb_html_token_data_split_ws_begin(token, &ws_token);
38 if (tree->status != LXB_STATUS_OK) {
39 return lxb_html_tree_process_abort(tree);
40 }
41
42 if (ws_token.text_start != ws_token.text_end) {
43 tree->status = lxb_html_tree_insert_character(tree, &ws_token, NULL);
44 if (tree->status != LXB_STATUS_OK) {
45 return lxb_html_tree_process_abort(tree);
46 }
47 }
48
49 if (token->text_start == token->text_end) {
50 return true;
51 }
52
53 return lxb_html_tree_insertion_mode_in_column_group_anything_else(tree,
54 token);
55 }
56
57 lxb_inline bool
lxb_html_tree_insertion_mode_in_column_group_comment(lxb_html_tree_t * tree,lxb_html_token_t * token)58 lxb_html_tree_insertion_mode_in_column_group_comment(lxb_html_tree_t *tree,
59 lxb_html_token_t *token)
60 {
61 lxb_dom_comment_t *comment;
62
63 comment = lxb_html_tree_insert_comment(tree, token, NULL);
64 if (comment == NULL) {
65 tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
66
67 return lxb_html_tree_process_abort(tree);
68 }
69
70 return true;
71 }
72
73 lxb_inline bool
lxb_html_tree_insertion_mode_in_column_group_html(lxb_html_tree_t * tree,lxb_html_token_t * token)74 lxb_html_tree_insertion_mode_in_column_group_html(lxb_html_tree_t *tree,
75 lxb_html_token_t *token)
76 {
77 return lxb_html_tree_insertion_mode_in_body(tree, token);
78 }
79
80 lxb_inline bool
lxb_html_tree_insertion_mode_in_column_group_col(lxb_html_tree_t * tree,lxb_html_token_t * token)81 lxb_html_tree_insertion_mode_in_column_group_col(lxb_html_tree_t *tree,
82 lxb_html_token_t *token)
83 {
84 lxb_html_element_t *element;
85
86 element = lxb_html_tree_insert_html_element(tree, token);
87 if (element == NULL) {
88 tree->status = LXB_STATUS_ERROR_MEMORY_ALLOCATION;
89
90 return lxb_html_tree_process_abort(tree);
91 }
92
93 lxb_html_tree_open_elements_pop(tree);
94 lxb_html_tree_acknowledge_token_self_closing(tree, token);
95
96 return true;
97 }
98
99 lxb_inline bool
lxb_html_tree_insertion_mode_in_column_group_colgroup_closed(lxb_html_tree_t * tree,lxb_html_token_t * token)100 lxb_html_tree_insertion_mode_in_column_group_colgroup_closed(lxb_html_tree_t *tree,
101 lxb_html_token_t *token)
102 {
103 lxb_dom_node_t *node = lxb_html_tree_current_node(tree);
104
105 if (lxb_html_tree_node_is(node, LXB_TAG_COLGROUP) == false) {
106 lxb_html_tree_parse_error(tree, token,
107 LXB_HTML_RULES_ERROR_MIELINOPELST);
108
109 return true;
110 }
111
112 lxb_html_tree_open_elements_pop(tree);
113
114 tree->mode = lxb_html_tree_insertion_mode_in_table;
115
116 return true;
117 }
118
119 lxb_inline bool
lxb_html_tree_insertion_mode_in_column_group_col_closed(lxb_html_tree_t * tree,lxb_html_token_t * token)120 lxb_html_tree_insertion_mode_in_column_group_col_closed(lxb_html_tree_t *tree,
121 lxb_html_token_t *token)
122 {
123 lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNCLTO);
124
125 return true;
126 }
127
128 lxb_inline bool
lxb_html_tree_insertion_mode_in_column_group_template_open_closed(lxb_html_tree_t * tree,lxb_html_token_t * token)129 lxb_html_tree_insertion_mode_in_column_group_template_open_closed(lxb_html_tree_t *tree,
130 lxb_html_token_t *token)
131 {
132 return lxb_html_tree_insertion_mode_in_head(tree, token);
133 }
134
135 lxb_inline bool
lxb_html_tree_insertion_mode_in_column_group_end_of_file(lxb_html_tree_t * tree,lxb_html_token_t * token)136 lxb_html_tree_insertion_mode_in_column_group_end_of_file(lxb_html_tree_t *tree,
137 lxb_html_token_t *token)
138 {
139 return lxb_html_tree_insertion_mode_in_body(tree, token);
140 }
141
142 lxb_inline bool
lxb_html_tree_insertion_mode_in_column_group_anything_else_closed(lxb_html_tree_t * tree,lxb_html_token_t * token)143 lxb_html_tree_insertion_mode_in_column_group_anything_else_closed(lxb_html_tree_t *tree,
144 lxb_html_token_t *token)
145 {
146 return lxb_html_tree_insertion_mode_in_column_group_anything_else(tree, token);
147 }
148
149 bool
lxb_html_tree_insertion_mode_in_column_group(lxb_html_tree_t * tree,lxb_html_token_t * token)150 lxb_html_tree_insertion_mode_in_column_group(lxb_html_tree_t *tree,
151 lxb_html_token_t *token)
152 {
153 if (token->type & LXB_HTML_TOKEN_TYPE_CLOSE) {
154 switch (token->tag_id) {
155 case LXB_TAG_COLGROUP:
156 return lxb_html_tree_insertion_mode_in_column_group_colgroup_closed(tree,
157 token);
158 case LXB_TAG_COL:
159 return lxb_html_tree_insertion_mode_in_column_group_col_closed(tree,
160 token);
161 case LXB_TAG_TEMPLATE:
162 return lxb_html_tree_insertion_mode_in_column_group_template_open_closed(tree,
163 token);
164 default:
165 return lxb_html_tree_insertion_mode_in_column_group_anything_else_closed(tree,
166 token);
167 }
168 }
169
170 switch (token->tag_id) {
171 case LXB_TAG__TEXT:
172 return lxb_html_tree_insertion_mode_in_column_group_text(tree,
173 token);
174 case LXB_TAG__EM_COMMENT:
175 return lxb_html_tree_insertion_mode_in_column_group_comment(tree,
176 token);
177 case LXB_TAG_HTML:
178 return lxb_html_tree_insertion_mode_in_column_group_html(tree,
179 token);
180 case LXB_TAG_COL:
181 return lxb_html_tree_insertion_mode_in_column_group_col(tree,
182 token);
183 case LXB_TAG_TEMPLATE:
184 return lxb_html_tree_insertion_mode_in_column_group_template_open_closed(tree,
185 token);
186
187 case LXB_TAG__END_OF_FILE:
188 return lxb_html_tree_insertion_mode_in_column_group_end_of_file(tree,
189 token);
190 default:
191 return lxb_html_tree_insertion_mode_in_column_group_anything_else(tree,
192 token);
193 }
194 }
195