1 /*
2  * Copyright (C) 2018 Alexander Borisov
3  *
4  * Author: Alexander Borisov <borisov@lexbor.com>
5  */
6 
7 #include "lexbor/html/interfaces/style_element.h"
8 #include "lexbor/html/interfaces/document.h"
9 
10 
11 lxb_html_style_element_t *
lxb_html_style_element_interface_create(lxb_html_document_t * document)12 lxb_html_style_element_interface_create(lxb_html_document_t *document)
13 {
14     lxb_html_style_element_t *element;
15 
16     element = lexbor_mraw_calloc(document->dom_document.mraw,
17                                  sizeof(lxb_html_style_element_t));
18     if (element == NULL) {
19         return NULL;
20     }
21 
22     lxb_dom_node_t *node = lxb_dom_interface_node(element);
23 
24     node->owner_document = lxb_html_document_original_ref(document);
25     node->type = LXB_DOM_NODE_TYPE_ELEMENT;
26 
27     return element;
28 }
29 
30 lxb_html_style_element_t *
lxb_html_style_element_interface_destroy(lxb_html_style_element_t * style_element)31 lxb_html_style_element_interface_destroy(lxb_html_style_element_t *style_element)
32 {
33     lxb_css_stylesheet_t *sst = style_element->stylesheet;
34 
35     (void) lxb_dom_node_interface_destroy(lxb_dom_interface_node(style_element));
36 
37     if (sst != NULL) {
38 #if 0
39         (void) lxb_css_stylesheet_destroy(sst, true);
40 #endif
41     }
42 
43     return NULL;
44 }
45 
46 lxb_status_t
lxb_html_style_element_parse(lxb_html_style_element_t * element)47 lxb_html_style_element_parse(lxb_html_style_element_t *element)
48 {
49 #if 0
50     lexbor_str_t *str;
51     lxb_dom_text_t *text;
52 #endif
53     lxb_dom_node_t *node;
54 
55     lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
56     lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
57     lxb_html_document_css_t *css = &doc->css;
58 
59     node = lxb_dom_interface_node(element);
60 
61     if (node->first_child == NULL
62         || node->first_child->local_name != LXB_TAG__TEXT
63         || node->first_child != node->last_child)
64     {
65         return LXB_STATUS_OK;
66     }
67 
68 #if 0
69     text = lxb_dom_interface_text(lxb_dom_interface_node(element)->first_child);
70     str = &text->char_data.data;
71 
72     element->stylesheet = lxb_css_stylesheet_parse(css->parser, str->data,
73                                                    str->length);
74 #endif
75     if (element->stylesheet == NULL) {
76         return css->parser->status;
77     }
78 
79     element->stylesheet->element = element;
80 
81     return LXB_STATUS_OK;
82 }
83 
84 lxb_status_t
lxb_html_element_style_remove(lxb_html_style_element_t * style)85 lxb_html_element_style_remove(lxb_html_style_element_t *style)
86 {
87     lxb_dom_document_t *ddoc = lxb_dom_interface_node(style)->owner_document;
88     lxb_html_document_t *doc = lxb_html_interface_document(ddoc);
89 
90     lxb_html_document_stylesheet_remove(doc, style->stylesheet);
91 
92     return LXB_STATUS_OK;
93 }
94