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