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 bool
lxb_html_tree_insertion_mode_after_body(lxb_html_tree_t * tree,lxb_html_token_t * token)12 lxb_html_tree_insertion_mode_after_body(lxb_html_tree_t *tree,
13 lxb_html_token_t *token)
14 {
15 switch (token->tag_id) {
16 case LXB_TAG__EM_COMMENT: {
17 lxb_dom_comment_t *comment;
18 lxb_dom_node_t *html_node;
19
20 html_node = lxb_html_tree_open_elements_first(tree);
21
22 comment = lxb_html_tree_insert_comment(tree, token, html_node);
23 if (comment == NULL) {
24 return lxb_html_tree_process_abort(tree);
25 }
26
27 break;
28 }
29
30 case LXB_TAG__EM_DOCTYPE:
31 lxb_html_tree_parse_error(tree, token,
32 LXB_HTML_RULES_ERROR_DOTOAFBOMO);
33 break;
34
35 case LXB_TAG_HTML:
36 if (token->type & LXB_HTML_TOKEN_TYPE_CLOSE)
37 {
38 if (tree->fragment != NULL) {
39 lxb_html_tree_parse_error(tree, token,
40 LXB_HTML_RULES_ERROR_UNCLTO);
41 return true;
42 }
43
44 tree->mode = lxb_html_tree_insertion_mode_after_after_body;
45
46 return true;
47 }
48
49 return lxb_html_tree_insertion_mode_in_body(tree, token);
50
51 case LXB_TAG__END_OF_FILE:
52 tree->status = lxb_html_tree_stop_parsing(tree);
53 if (tree->status != LXB_STATUS_OK) {
54 return lxb_html_tree_process_abort(tree);
55 }
56
57 break;
58
59 case LXB_TAG__TEXT: {
60 lxb_html_token_t ws_token = *token;
61
62 tree->status = lxb_html_token_data_skip_ws_begin(&ws_token);
63 if (tree->status != LXB_STATUS_OK) {
64 return lxb_html_tree_process_abort(tree);
65 }
66
67 if (ws_token.text_start == ws_token.text_end) {
68 return lxb_html_tree_insertion_mode_in_body(tree, token);
69 }
70 }
71 /* fall through */
72
73 default:
74 lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO);
75
76 tree->mode = lxb_html_tree_insertion_mode_in_body;
77
78 return false;
79 }
80
81 return true;
82 }
83