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