1 /*
2  * Copyright (C) 2018 Alexander Borisov
3  *
4  * Author: Alexander Borisov <borisov@lexbor.com>
5  */
6 
7 #ifndef LEXBOR_HTML_OPEN_ELEMENTS_H
8 #define LEXBOR_HTML_OPEN_ELEMENTS_H
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 #include "lexbor/core/array.h"
15 
16 #include "lexbor/html/tree.h"
17 
18 
19 LXB_API void
20 lxb_html_tree_open_elements_remove_by_node(lxb_html_tree_t *tree,
21                                            lxb_dom_node_t *node);
22 
23 void
24 lxb_html_tree_open_elements_pop_until_tag_id(lxb_html_tree_t *tree,
25                                              lxb_tag_id_t tag_id,
26                                              lxb_ns_id_t ns,
27                                              bool exclude);
28 
29 void
30 lxb_html_tree_open_elements_pop_until_h123456(lxb_html_tree_t *tree);
31 
32 void
33 lxb_html_tree_open_elements_pop_until_td_th(lxb_html_tree_t *tree);
34 
35 void
36 lxb_html_tree_open_elements_pop_until_node(lxb_html_tree_t *tree,
37                                            lxb_dom_node_t *node,
38                                            bool exclude);
39 
40 void
41 lxb_html_tree_open_elements_pop_until(lxb_html_tree_t *tree, size_t idx,
42                                       bool exclude);
43 
44 bool
45 lxb_html_tree_open_elements_find_by_node(lxb_html_tree_t *tree,
46                                          lxb_dom_node_t *node,
47                                          size_t *return_pos);
48 
49 bool
50 lxb_html_tree_open_elements_find_by_node_reverse(lxb_html_tree_t *tree,
51                                                  lxb_dom_node_t *node,
52                                                  size_t *return_pos);
53 
54 lxb_dom_node_t *
55 lxb_html_tree_open_elements_find(lxb_html_tree_t *tree,
56                                  lxb_tag_id_t tag_id, lxb_ns_id_t ns,
57                                  size_t *return_index);
58 
59 lxb_dom_node_t *
60 lxb_html_tree_open_elements_find_reverse(lxb_html_tree_t *tree,
61                                          lxb_tag_id_t tag_id, lxb_ns_id_t ns,
62                                          size_t *return_index);
63 
64 
65 /*
66  * Inline functions
67  */
68 lxb_inline lxb_dom_node_t *
lxb_html_tree_open_elements_first(lxb_html_tree_t * tree)69 lxb_html_tree_open_elements_first(lxb_html_tree_t *tree)
70 {
71     return (lxb_dom_node_t *) lexbor_array_get(tree->open_elements, 0);
72 }
73 
74 lxb_inline lxb_dom_node_t *
lxb_html_tree_open_elements_get(lxb_html_tree_t * tree,size_t idx)75 lxb_html_tree_open_elements_get(lxb_html_tree_t *tree, size_t idx)
76 {
77     return (lxb_dom_node_t *) lexbor_array_get(tree->open_elements, idx);
78 }
79 
80 lxb_inline lxb_status_t
lxb_html_tree_open_elements_push(lxb_html_tree_t * tree,lxb_dom_node_t * node)81 lxb_html_tree_open_elements_push(lxb_html_tree_t *tree, lxb_dom_node_t *node)
82 {
83     return lexbor_array_push(tree->open_elements, node);
84 }
85 
86 lxb_inline lxb_dom_node_t *
lxb_html_tree_open_elements_pop(lxb_html_tree_t * tree)87 lxb_html_tree_open_elements_pop(lxb_html_tree_t *tree)
88 {
89     return (lxb_dom_node_t *) lexbor_array_pop(tree->open_elements);
90 }
91 
92 lxb_inline lxb_status_t
lxb_html_tree_open_elements_insert_after(lxb_html_tree_t * tree,lxb_dom_node_t * node,size_t idx)93 lxb_html_tree_open_elements_insert_after(lxb_html_tree_t *tree, lxb_dom_node_t *node,
94                                     size_t idx)
95 {
96     return lexbor_array_insert(tree->open_elements, (idx + 1), node);
97 }
98 
99 
100 #ifdef __cplusplus
101 } /* extern "C" */
102 #endif
103 
104 #endif /* LEXBOR_HTML_OPEN_ELEMENTS_H */
105 
106