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