1 /* 2 * Copyright (C) 2018-2023 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 #include "lexbor/html/tree/open_elements.h" 10 #include "lexbor/html/interfaces/style_element.h" 11 12 13 bool lxb_html_tree_insertion_mode_text(lxb_html_tree_t * tree,lxb_html_token_t * token)14lxb_html_tree_insertion_mode_text(lxb_html_tree_t *tree, 15 lxb_html_token_t *token) 16 { 17 lxb_dom_node_t *node; 18 lxb_html_style_element_t *style; 19 20 switch (token->tag_id) { 21 case LXB_TAG__TEXT: { 22 tree->status = lxb_html_tree_insert_character(tree, token, NULL); 23 if (tree->status != LXB_STATUS_OK) { 24 return lxb_html_tree_process_abort(tree); 25 } 26 27 break; 28 } 29 30 case LXB_TAG__END_OF_FILE: { 31 lxb_dom_node_t *node; 32 33 lxb_html_tree_parse_error(tree, token, 34 LXB_HTML_RULES_ERROR_UNENOFFI); 35 36 node = lxb_html_tree_current_node(tree); 37 38 if (lxb_html_tree_node_is(node, LXB_TAG_SCRIPT)) { 39 /* TODO: mark the script element as "already started" */ 40 } 41 42 lxb_html_tree_open_elements_pop(tree); 43 44 tree->mode = tree->original_mode; 45 46 return false; 47 } 48 49 /* TODO: need to implement */ 50 case LXB_TAG_SCRIPT: 51 lxb_html_tree_open_elements_pop(tree); 52 53 tree->mode = tree->original_mode; 54 55 break; 56 57 case LXB_TAG_STYLE: 58 node = lxb_html_tree_open_elements_pop(tree); 59 60 tree->mode = tree->original_mode; 61 62 if (!tree->document->css_init) { 63 break; 64 } 65 66 style = lxb_html_interface_style(node); 67 68 tree->status = lxb_html_style_element_parse(style); 69 if (tree->status != LXB_STATUS_OK) { 70 return lxb_html_tree_process_abort(tree); 71 } 72 73 tree->status = lxb_html_document_stylesheet_add(tree->document, 74 style->stylesheet); 75 if (tree->status != LXB_STATUS_OK) { 76 return lxb_html_tree_process_abort(tree); 77 } 78 79 break; 80 81 default: 82 lxb_html_tree_open_elements_pop(tree); 83 84 tree->mode = tree->original_mode; 85 86 break; 87 } 88 89 return true; 90 } 91