1 /*
2  * Copyright (C) 2018-2022 Alexander Borisov
3  *
4  * Author: Alexander Borisov <borisov@lexbor.com>
5  */
6 
7 #ifndef LEXBOR_HTML_ELEMENT_H
8 #define LEXBOR_HTML_ELEMENT_H
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 #include "lexbor/core/avl.h"
15 
16 #include "lexbor/html/interface.h"
17 #include "lexbor/html/style.h"
18 #include "lexbor/dom/interfaces/element.h"
19 #include "lexbor/css/rule.h"
20 
21 
22 struct lxb_html_element {
23     lxb_dom_element_t               element;
24     lexbor_avl_node_t               *style;
25     lxb_css_rule_declaration_list_t *list;
26 };
27 
28 typedef enum {
29     LXB_HTML_ELEMENT_OPT_UNDEF = 0x00
30 }
31 lxb_html_element_style_opt_t;
32 
33 
34 typedef lxb_status_t
35 (*lxb_html_element_style_cb_f)(lxb_html_element_t *element,
36                                const lxb_css_rule_declaration_t *declr,
37                                void *ctx, lxb_css_selector_specificity_t spec,
38                                bool is_weak);
39 
40 
41 LXB_API lxb_html_element_t *
42 lxb_html_element_interface_create(lxb_html_document_t *document);
43 
44 LXB_API lxb_html_element_t *
45 lxb_html_element_interface_destroy(lxb_html_element_t *element);
46 
47 
48 LXB_API lxb_html_element_t *
49 lxb_html_element_inner_html_set(lxb_html_element_t *element,
50                                 const lxb_char_t *html, size_t size);
51 
52 LXB_API const lxb_css_rule_declaration_t *
53 lxb_html_element_style_by_name(lxb_html_element_t *element,
54                                const lxb_char_t *name, size_t size);
55 
56 LXB_API const lxb_css_rule_declaration_t *
57 lxb_html_element_style_by_id(lxb_html_element_t *element, uintptr_t id);
58 
59 LXB_API const lxb_html_style_node_t *
60 lxb_html_element_style_node_by_id(lxb_html_element_t *element, uintptr_t id);
61 
62 LXB_API const lxb_html_style_node_t *
63 lxb_html_element_style_node_by_name(lxb_html_element_t *element,
64                                     const lxb_char_t *name, size_t size);
65 
66 LXB_API const void *
67 lxb_html_element_css_property_by_id(lxb_html_element_t *element, uintptr_t id);
68 
69 LXB_API lxb_status_t
70 lxb_html_element_style_walk(lxb_html_element_t *element,
71                             lxb_html_element_style_cb_f cb, void *ctx,
72                             bool with_weak);
73 
74 LXB_API lxb_status_t
75 lxb_html_element_style_parse(lxb_html_element_t *element,
76                              const lxb_char_t *style, size_t size);
77 
78 LXB_API lxb_status_t
79 lxb_html_element_style_append(lxb_html_element_t *element,
80                               lxb_css_rule_declaration_t *declr,
81                               lxb_css_selector_specificity_t spec);
82 
83 LXB_API lxb_status_t
84 lxb_html_element_style_list_append(lxb_html_element_t *element,
85                                    lxb_css_rule_declaration_list_t *list,
86                                    lxb_css_selector_specificity_t spec);
87 
88 LXB_API void
89 lxb_html_element_style_remove_by_id(lxb_html_element_t *element, uintptr_t id);
90 
91 LXB_API void
92 lxb_html_element_style_remove_by_name(lxb_html_element_t *element,
93                                       const lxb_char_t *name, size_t size);
94 
95 LXB_API lxb_html_style_node_t *
96 lxb_html_element_style_remove_all_not(lxb_html_document_t *doc,
97                                       lexbor_avl_node_t **root,
98                                       lxb_html_style_node_t *style, bool bs);
99 
100 LXB_API lxb_html_style_node_t *
101 lxb_html_element_style_remove_all(lxb_html_document_t *doc,
102                                   lexbor_avl_node_t **root,
103                                   lxb_html_style_node_t *style);
104 
105 LXB_API lxb_html_style_node_t *
106 lxb_html_element_style_remove_by_list(lxb_html_document_t *doc,
107                                       lexbor_avl_node_t **root,
108                                       lxb_html_style_node_t *style,
109                                       lxb_css_rule_declaration_list_t *list);
110 
111 LXB_API lxb_status_t
112 lxb_html_element_style_serialize(lxb_html_element_t *element,
113                                  lxb_html_element_style_opt_t opt,
114                                  lexbor_serialize_cb_f cb, void *ctx);
115 
116 LXB_API lxb_status_t
117 lxb_html_element_style_serialize_str(lxb_html_element_t *element,
118                                      lexbor_str_t *str,
119                                      lxb_html_element_style_opt_t opt);
120 
121 
122 /*
123  * Inline functions
124  */
125 lxb_inline lxb_tag_id_t
lxb_html_element_tag_id(lxb_html_element_t * element)126 lxb_html_element_tag_id(lxb_html_element_t *element)
127 {
128     return lxb_dom_interface_node(element)->local_name;
129 }
130 
131 lxb_inline lxb_ns_id_t
lxb_html_element_ns_id(lxb_html_element_t * element)132 lxb_html_element_ns_id(lxb_html_element_t *element)
133 {
134     return lxb_dom_interface_node(element)->ns;
135 }
136 
137 lxb_inline void
lxb_html_element_insert_before(lxb_html_element_t * dst,lxb_html_element_t * src)138 lxb_html_element_insert_before(lxb_html_element_t *dst, lxb_html_element_t *src)
139 {
140     lxb_dom_node_insert_before(lxb_dom_interface_node(dst),
141                                lxb_dom_interface_node(src));
142 }
143 
144 lxb_inline void
lxb_html_element_insert_after(lxb_html_element_t * dst,lxb_html_element_t * src)145 lxb_html_element_insert_after(lxb_html_element_t *dst, lxb_html_element_t *src)
146 {
147     lxb_dom_node_insert_after(lxb_dom_interface_node(dst),
148                               lxb_dom_interface_node(src));
149 }
150 
151 lxb_inline void
lxb_html_element_insert_child(lxb_html_element_t * dst,lxb_html_element_t * src)152 lxb_html_element_insert_child(lxb_html_element_t *dst, lxb_html_element_t *src)
153 {
154     lxb_dom_node_insert_child(lxb_dom_interface_node(dst),
155                               lxb_dom_interface_node(src));
156 }
157 
158 lxb_inline void
lxb_html_element_remove(lxb_html_element_t * element)159 lxb_html_element_remove(lxb_html_element_t *element)
160 {
161     lxb_dom_node_remove(lxb_dom_interface_node(element));
162 }
163 
164 lxb_inline lxb_html_document_t *
lxb_html_element_document(lxb_html_element_t * element)165 lxb_html_element_document(lxb_html_element_t *element)
166 {
167     return lxb_html_interface_document(lxb_dom_interface_node(element)->owner_document);
168 }
169 
170 
171 #ifdef __cplusplus
172 } /* extern "C" */
173 #endif
174 
175 #endif /* LEXBOR_HTML_ELEMENT_H */
176