1 /*
2  * Copyright (C) 2018 Alexander Borisov
3  *
4  * Author: Alexander Borisov <borisov@lexbor.com>
5  */
6 
7 #ifndef LEXBOR_HTML_ACTIVE_FORMATTING_H
8 #define LEXBOR_HTML_ACTIVE_FORMATTING_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_html_element_t *
20 lxb_html_tree_active_formatting_marker(void);
21 
22 void
23 lxb_html_tree_active_formatting_up_to_last_marker(lxb_html_tree_t *tree);
24 
25 void
26 lxb_html_tree_active_formatting_remove_by_node(lxb_html_tree_t *tree,
27                                                lxb_dom_node_t *node);
28 
29 bool
30 lxb_html_tree_active_formatting_find_by_node(lxb_html_tree_t *tree,
31                                              lxb_dom_node_t *node,
32                                              size_t *return_pos);
33 
34 bool
35 lxb_html_tree_active_formatting_find_by_node_reverse(lxb_html_tree_t *tree,
36                                                      lxb_dom_node_t *node,
37                                                      size_t *return_pos);
38 
39 lxb_status_t
40 lxb_html_tree_active_formatting_reconstruct_elements(lxb_html_tree_t *tree);
41 
42 lxb_dom_node_t *
43 lxb_html_tree_active_formatting_between_last_marker(lxb_html_tree_t *tree,
44                                                     lxb_tag_id_t tag_idx,
45                                                     size_t *return_idx);
46 
47 void
48 lxb_html_tree_active_formatting_push_with_check_dupl(lxb_html_tree_t *tree,
49                                                      lxb_dom_node_t *node);
50 
51 
52 /*
53  * Inline functions
54  */
55 lxb_inline lxb_dom_node_t *
lxb_html_tree_active_formatting_current_node(lxb_html_tree_t * tree)56 lxb_html_tree_active_formatting_current_node(lxb_html_tree_t *tree)
57 {
58     if (tree->active_formatting->length == 0) {
59         return NULL;
60     }
61 
62     return (lxb_dom_node_t *) tree->active_formatting->list
63         [ (tree->active_formatting->length - 1) ];
64 }
65 
66 lxb_inline lxb_dom_node_t *
lxb_html_tree_active_formatting_first(lxb_html_tree_t * tree)67 lxb_html_tree_active_formatting_first(lxb_html_tree_t *tree)
68 {
69     return (lxb_dom_node_t *) lexbor_array_get(tree->active_formatting, 0);
70 }
71 
72 lxb_inline lxb_dom_node_t *
lxb_html_tree_active_formatting_get(lxb_html_tree_t * tree,size_t idx)73 lxb_html_tree_active_formatting_get(lxb_html_tree_t *tree, size_t idx)
74 {
75     return (lxb_dom_node_t *) lexbor_array_get(tree->active_formatting, idx);
76 }
77 
78 lxb_inline lxb_status_t
lxb_html_tree_active_formatting_push(lxb_html_tree_t * tree,lxb_dom_node_t * node)79 lxb_html_tree_active_formatting_push(lxb_html_tree_t *tree,
80                                      lxb_dom_node_t *node)
81 {
82     return lexbor_array_push(tree->active_formatting, node);
83 }
84 
85 lxb_inline lxb_dom_node_t *
lxb_html_tree_active_formatting_pop(lxb_html_tree_t * tree)86 lxb_html_tree_active_formatting_pop(lxb_html_tree_t *tree)
87 {
88     return (lxb_dom_node_t *) lexbor_array_pop(tree->active_formatting);
89 }
90 
91 lxb_inline lxb_status_t
lxb_html_tree_active_formatting_push_marker(lxb_html_tree_t * tree)92 lxb_html_tree_active_formatting_push_marker(lxb_html_tree_t *tree)
93 {
94     return lexbor_array_push(tree->active_formatting,
95                              lxb_html_tree_active_formatting_marker());
96 }
97 
98 lxb_inline lxb_status_t
lxb_html_tree_active_formatting_insert(lxb_html_tree_t * tree,lxb_dom_node_t * node,size_t idx)99 lxb_html_tree_active_formatting_insert(lxb_html_tree_t *tree,
100                                        lxb_dom_node_t *node, size_t idx)
101 {
102     return lexbor_array_insert(tree->active_formatting, idx, node);
103 }
104 
105 lxb_inline void
lxb_html_tree_active_formatting_remove(lxb_html_tree_t * tree,size_t idx)106 lxb_html_tree_active_formatting_remove(lxb_html_tree_t *tree, size_t idx)
107 {
108     lexbor_array_delete(tree->active_formatting, idx, 1);
109 }
110 
111 
112 #ifdef __cplusplus
113 } /* extern "C" */
114 #endif
115 
116 #endif /* LEXBOR_HTML_ACTIVE_FORMATTING_H */
117 
118