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 
9 
10 bool
lxb_html_tree_insertion_mode_after_after_body(lxb_html_tree_t * tree,lxb_html_token_t * token)11 lxb_html_tree_insertion_mode_after_after_body(lxb_html_tree_t *tree,
12                                               lxb_html_token_t *token)
13 {
14     switch (token->tag_id) {
15         case LXB_TAG__EM_COMMENT: {
16             lxb_dom_comment_t *comment;
17 
18             comment = lxb_html_tree_insert_comment(tree, token,
19                                                    lxb_dom_interface_node(tree->document));
20             if (comment == NULL) {
21                 return lxb_html_tree_process_abort(tree);
22             }
23 
24             break;
25         }
26 
27         case LXB_TAG__EM_DOCTYPE:
28         case LXB_TAG_HTML:
29             return lxb_html_tree_insertion_mode_in_body(tree, token);
30 
31         case LXB_TAG__END_OF_FILE:
32             tree->status = lxb_html_tree_stop_parsing(tree);
33             if (tree->status != LXB_STATUS_OK) {
34                 return lxb_html_tree_process_abort(tree);
35             }
36 
37             break;
38 
39         case LXB_TAG__TEXT: {
40             lxb_html_token_t ws_token = *token;
41 
42             tree->status = lxb_html_token_data_skip_ws_begin(&ws_token);
43             if (tree->status != LXB_STATUS_OK) {
44                 return lxb_html_tree_process_abort(tree);
45             }
46 
47             if (ws_token.text_start == ws_token.text_end) {
48                 return lxb_html_tree_insertion_mode_in_body(tree, token);
49             }
50         }
51         /* fall through */
52 
53         default:
54             lxb_html_tree_parse_error(tree, token, LXB_HTML_RULES_ERROR_UNTO);
55 
56             tree->mode = lxb_html_tree_insertion_mode_in_body;
57 
58             return false;
59     }
60 
61     return true;
62 }
63