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)11lxb_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