php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
tree.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2018 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
7#ifndef LEXBOR_HTML_TREE_H
8#define LEXBOR_HTML_TREE_H
9
10#ifdef __cplusplus
11extern "C" {
12#endif
13
16
17#include "lexbor/html/base.h"
18#include "lexbor/html/node.h"
21#include "lexbor/html/tag.h"
23
24
25typedef bool
27 lxb_html_token_t *token);
28
31 lxb_dom_attr_t *attr, void *ctx);
32
33typedef struct {
36}
38
70
76
77
80
83
86
89
90LXB_API void
92
95
98
99LXB_API bool
101
102LXB_API void
105
106LXB_API bool
108 lxb_html_token_t *token);
109
112 lxb_dom_node_t *override_target,
114
117 lxb_html_token_t *token, lxb_ns_id_t ns);
118
121 lxb_html_token_t *token, lxb_ns_id_t ns);
122
125 lxb_dom_element_t *element,
126 lxb_html_token_t *token, lxb_ns_id_t ns);
127
130 lxb_dom_element_t *element,
131 lxb_dom_element_t *from,
132 lxb_ns_id_t ns);
133
136 lxb_dom_attr_t *attr, void *ctx);
137
140 lxb_dom_attr_t *attr, void *ctx);
141
144 lxb_dom_attr_t *attr, void *ctx);
145
148 lxb_dom_node_t **ret_node);
149
152 lexbor_str_t *str,
153 lxb_dom_node_t **ret_node);
154
158
161 lxb_html_token_t *token);
162
163LXB_API void
165
168 lxb_html_token_t *token);
169
172 lxb_html_token_t *token);
173
174LXB_API void
176 lxb_tag_id_t ex_tag, lxb_ns_id_t ex_ns);
177
178LXB_API void
180 lxb_tag_id_t ex_tag,
181 lxb_ns_id_t ex_ns);
182
183LXB_API void
185
189
192 lxb_dom_node_t *by_node,
194
197
200
203
204LXB_API bool
206
207LXB_API void
209
210LXB_API bool
212 lxb_html_token_t *token,
214
215LXB_API bool
217
220 lxb_dom_attr_t *attr, void *ctx);
221
224 lxb_dom_attr_t *attr, void *ctx);
225
226
227/*
228 * Inline functions
229 */
232{
233 tree->document = document;
234
235 return lxb_html_tokenizer_begin(tree->tkz_ref);
236}
237
240{
241 return lxb_html_tokenizer_chunk(tree->tkz_ref, html, size);
242}
243
246{
247 if (tree->document->done != NULL) {
248 tree->document->done(tree->document);
249 }
250
251 return lxb_html_tokenizer_end(tree->tkz_ref);
252}
253
256 const lxb_char_t *html, size_t size)
257{
258 tree->status = lxb_html_tree_begin(tree, document);
259 if (tree->status != LXB_STATUS_OK) {
260 return tree->status;
261 }
262
263 tree->status = lxb_html_tree_chunk(tree, html, size);
264 if (tree->status != LXB_STATUS_OK) {
265 return tree->status;
266 }
267
268 return lxb_html_tree_end(tree);
269}
270
273 lxb_tag_id_t tag_id, lxb_ns_id_t ns)
274{
276 tag_id, ns);
277}
278
279lxb_inline bool
281{
282 return node->local_name == tag_id && node->ns == LXB_NS_HTML;
283}
284
287{
288 if (tree->open_elements->length == 0) {
289 return NULL;
290 }
291
292 return (lxb_dom_node_t *)
293 tree->open_elements->list[ (tree->open_elements->length - 1) ];
294}
295
298{
299 if(tree->fragment != NULL && tree->open_elements->length == 1) {
300 return lxb_dom_interface_node(tree->fragment);
301 }
302
303 return lxb_html_tree_current_node(tree);
304}
305
312
313lxb_inline void
324
325/* TODO: if we not need to save parse errors?! */
326lxb_inline void
328 lxb_html_token_t *token)
329{
330 if ((token->type & LXB_HTML_TOKEN_TYPE_CLOSE_SELF) == 0) {
331 return;
332 }
333
334 bool is_void = lxb_html_tag_is_void(token->tag_id);
335
336 if (!is_void) {
337 lxb_html_tree_parse_error(tree, token,
339 }
340}
341
342lxb_inline bool
344{
345 if (node->ns == LXB_NS_MATH) {
346 switch (node->local_name) {
347 case LXB_TAG_MI:
348 case LXB_TAG_MO:
349 case LXB_TAG_MN:
350 case LXB_TAG_MS:
351 case LXB_TAG_MTEXT:
352 return true;
353 }
354 }
355
356 return false;
357}
358
359lxb_inline bool
361{
362 return tree->scripting;
363}
364
365lxb_inline void
367{
368 tree->scripting = scripting;
369}
370
371lxb_inline void
376
377/*
378 * No inline functions for ABI.
379 */
382
385 size_t size);
386
389
392 const lxb_char_t *html, size_t size);
393
396 lxb_tag_id_t tag_id, lxb_ns_id_t ns);
397
398LXB_API bool
400
403
406
409 lxb_html_token_t *token);
410
411LXB_API void
414
415LXB_API void
417 lxb_html_token_t *token);
418
419LXB_API bool
421
422LXB_API bool
424
425LXB_API void
427
428LXB_API void
431
432
433#ifdef __cplusplus
434} /* extern "C" */
435#endif
436
437#endif /* LEXBOR_HTML_TREE_H */
@ LXB_STATUS_OK
Definition base.h:49
#define LXB_API
Definition def.h:48
DNS_STATUS status
Definition dns_win32.c:49
struct lxb_dom_document_type lxb_dom_document_type_t
Definition interface.h:42
#define lxb_dom_interface_node(obj)
Definition interface.h:31
struct lxb_dom_comment lxb_dom_comment_t
Definition interface.h:49
struct lxb_dom_node lxb_dom_node_t
Definition interface.h:38
struct lxb_dom_attr lxb_dom_attr_t
Definition interface.h:40
struct lxb_dom_element lxb_dom_element_t
Definition interface.h:39
lxb_dom_interface_t * lxb_html_interface_create(lxb_html_document_t *document, lxb_tag_id_t tag_id, lxb_ns_id_t ns)
Definition interface.c:25
lxb_status_t lxb_html_tokenizer_chunk(lxb_html_tokenizer_t *tkz, const lxb_char_t *data, size_t size)
Definition tokenizer.c:308
lxb_status_t lxb_html_tokenizer_begin(lxb_html_tokenizer_t *tkz)
Definition tokenizer.c:273
lxb_status_t lxb_html_tokenizer_end(lxb_html_tokenizer_t *tkz)
Definition tokenizer.c:344
new_type size
Definition ffi.c:4365
new_type attr
Definition ffi.c:4364
#define NULL
Definition gdcache.h:45
struct lxb_html_tokenizer lxb_html_tokenizer_t
Definition base.h:26
struct lxb_html_tree lxb_html_tree_t
Definition base.h:28
struct lxb_html_element lxb_html_element_t
Definition interface.h:111
struct lxb_html_form_element lxb_html_form_element_t
Definition interface.h:115
struct lxb_html_document lxb_html_document_t
Definition interface.h:95
lxb_inline bool lxb_html_tag_is_void(lxb_tag_id_t tag_id)
Definition tag.h:72
int lxb_html_tag_category_t
Definition tag.h:21
@ LXB_HTML_TOKEN_TYPE_CLOSE_SELF
Definition token.h:28
lxb_html_tree_error_id_t
Definition error.h:20
@ LXB_HTML_RULES_ERROR_NOVOHTELSTTAWITRSO
Definition error.h:44
void lxb_dom_node_insert_before_wo_events(lxb_dom_node_t *to, lxb_dom_node_t *node)
Definition node.c:395
void lxb_dom_node_insert_child_wo_events(lxb_dom_node_t *to, lxb_dom_node_t *node)
Definition node.c:368
uintptr_t lxb_ns_id_t
Definition const.h:20
@ LXB_NS_MATH
Definition const.h:27
@ LXB_NS_HTML
Definition const.h:26
unsigned const char * pos
Definition php_ffi.h:52
size_t length
Definition array.h:20
void ** list
Definition array.h:18
uintptr_t ns
Definition node.h:48
uintptr_t local_name
Definition node.h:46
lxb_html_document_done_cb_f done
Definition document.h:68
lxb_html_token_type_t type
Definition token.h:49
lxb_tag_id_t tag_id
Definition token.h:48
lexbor_array_obj_t * text_list
Definition tree.h:34
bool has_explicit_html_tag
Definition tree.h:58
lxb_html_tree_append_attr_f before_append_attr
Definition tree.h:64
bool scripting
Definition tree.h:57
lxb_html_tree_pending_table_t pending_table
Definition tree.h:51
size_t ref_count
Definition tree.h:68
bool frameset_ok
Definition tree.h:56
lxb_html_tree_insertion_mode_f original_mode
Definition tree.h:63
lexbor_array_obj_t * template_insertion_modes
Definition tree.h:49
bool has_explicit_head_tag
Definition tree.h:59
lxb_html_tokenizer_t * tkz_ref
Definition tree.h:40
lxb_html_form_element_t * form
Definition tree.h:45
lxb_status_t status
Definition tree.h:66
lexbor_array_t * active_formatting
Definition tree.h:48
lexbor_array_obj_t * parse_errors
Definition tree.h:53
lxb_html_tree_insertion_mode_f mode
Definition tree.h:62
lexbor_array_t * open_elements
Definition tree.h:47
bool foster_parenting
Definition tree.h:55
lxb_html_document_t * document
Definition tree.h:42
bool has_explicit_body_tag
Definition tree.h:60
lxb_dom_node_t * fragment
Definition tree.h:43
@ LXB_TAG_MS
Definition const.h:155
@ LXB_TAG_MTEXT
Definition const.h:156
@ LXB_TAG_MO
Definition const.h:154
@ LXB_TAG_MI
Definition const.h:152
@ LXB_TAG_MN
Definition const.h:153
uintptr_t lxb_tag_id_t
Definition const.h:21
LXB_API bool lxb_html_tree_scripting_noi(lxb_html_tree_t *tree)
LXB_API lxb_status_t lxb_html_tree_begin_noi(lxb_html_tree_t *tree, lxb_html_document_t *document)
LXB_API void lxb_html_tree_parse_error(lxb_html_tree_t *tree, lxb_html_token_t *token, lxb_html_tree_error_id_t id)
Definition tree.c:237
LXB_API lxb_dom_node_t * lxb_html_tree_element_in_scope(lxb_html_tree_t *tree, lxb_tag_id_t tag_id, lxb_ns_id_t ns, lxb_html_tag_category_t ct)
Definition tree.c:1152
lxb_html_tree_insertion_position_t
Definition tree.h:71
@ LXB_HTML_TREE_INSERTION_POSITION_BEFORE
Definition tree.h:73
@ LXB_HTML_TREE_INSERTION_POSITION_CHILD
Definition tree.h:72
LXB_API lxb_html_element_t * lxb_html_tree_generic_rawtext_parsing(lxb_html_tree_t *tree, lxb_html_token_t *token)
Definition tree.c:863
LXB_API lxb_status_t lxb_html_tree_append_attributes_from_element(lxb_html_tree_t *tree, lxb_dom_element_t *element, lxb_dom_element_t *from, lxb_ns_id_t ns)
Definition tree.c:504
LXB_API void lxb_html_tree_clean(lxb_html_tree_t *tree)
Definition tree.c:156
LXB_API lxb_dom_node_t * lxb_html_tree_appropriate_place_inserting_node(lxb_html_tree_t *tree, lxb_dom_node_t *override_target, lxb_html_tree_insertion_position_t *ipos)
Definition tree.c:304
LXB_API void lxb_html_tree_insert_node_noi(lxb_dom_node_t *to, lxb_dom_node_t *node, lxb_html_tree_insertion_position_t ipos)
LXB_API lxb_dom_node_t * lxb_html_tree_element_in_scope_tbody_thead_tfoot(lxb_html_tree_t *tree)
Definition tree.c:1242
LXB_API bool lxb_html_tree_construction_dispatcher(lxb_html_tree_t *tree, lxb_html_token_t *token)
Definition tree.c:244
lxb_inline lxb_status_t lxb_html_tree_build(lxb_html_tree_t *tree, lxb_html_document_t *document, const lxb_char_t *html, size_t size)
Definition tree.h:255
LXB_API lxb_status_t lxb_html_tree_build_noi(lxb_html_tree_t *tree, lxb_html_document_t *document, const lxb_char_t *html, size_t size)
LXB_API lxb_html_element_t * lxb_html_tree_create_element_for_token(lxb_html_tree_t *tree, lxb_html_token_t *token, lxb_ns_id_t ns)
Definition tree.c:422
lxb_status_t(* lxb_html_tree_append_attr_f)(lxb_html_tree_t *tree, lxb_dom_attr_t *attr, void *ctx)
Definition tree.h:30
lxb_inline void lxb_html_tree_attach_document(lxb_html_tree_t *tree, lxb_html_document_t *doc)
Definition tree.h:372
LXB_API lxb_dom_node_t * lxb_html_tree_current_node_noi(lxb_html_tree_t *tree)
LXB_API void lxb_html_tree_close_p_element(lxb_html_tree_t *tree, lxb_html_token_t *token)
Definition tree.c:1350
LXB_API bool lxb_html_tree_check_scope_element(lxb_html_tree_t *tree)
Definition tree.c:1313
lxb_inline bool lxb_html_tree_mathml_text_integration_point(lxb_dom_node_t *node)
Definition tree.h:343
LXB_API void lxb_html_tree_scripting_set_noi(lxb_html_tree_t *tree, bool scripting)
LXB_API bool lxb_html_tree_mathml_text_integration_point_noi(lxb_dom_node_t *node)
lxb_inline bool lxb_html_tree_scripting(lxb_html_tree_t *tree)
Definition tree.h:360
lxb_inline void lxb_html_tree_insert_node(lxb_dom_node_t *to, lxb_dom_node_t *node, lxb_html_tree_insertion_position_t ipos)
Definition tree.h:314
LXB_API lxb_status_t lxb_html_tree_end_noi(lxb_html_tree_t *tree)
LXB_API lxb_dom_node_t * lxb_html_tree_create_node_noi(lxb_html_tree_t *tree, lxb_tag_id_t tag_id, lxb_ns_id_t ns)
LXB_API lxb_html_element_t * lxb_html_tree_generic_rcdata_parsing(lxb_html_tree_t *tree, lxb_html_token_t *token)
Definition tree.c:889
bool(* lxb_html_tree_insertion_mode_f)(lxb_html_tree_t *tree, lxb_html_token_t *token)
Definition tree.h:26
LXB_API lxb_html_tree_t * lxb_html_tree_ref(lxb_html_tree_t *tree)
Definition tree.c:128
LXB_API lxb_status_t lxb_html_tree_stop_parsing(lxb_html_tree_t *tree)
Definition tree.c:216
lxb_inline lxb_status_t lxb_html_tree_begin(lxb_html_tree_t *tree, lxb_html_document_t *document)
Definition tree.h:231
LXB_API void lxb_html_tree_generate_implied_end_tags(lxb_html_tree_t *tree, lxb_tag_id_t ex_tag, lxb_ns_id_t ex_ns)
Definition tree.c:914
LXB_API lxb_status_t lxb_html_tree_init(lxb_html_tree_t *tree, lxb_html_tokenizer_t *tkz)
Definition tree.c:53
lxb_inline lxb_dom_node_t * lxb_html_tree_current_node(lxb_html_tree_t *tree)
Definition tree.h:286
LXB_API lxb_dom_document_type_t * lxb_html_tree_create_document_type_from_token(lxb_html_tree_t *tree, lxb_html_token_t *token)
Definition tree.c:828
LXB_API bool lxb_html_tree_process_abort(lxb_html_tree_t *tree)
Definition tree.c:224
lxb_inline void lxb_html_tree_acknowledge_token_self_closing(lxb_html_tree_t *tree, lxb_html_token_t *token)
Definition tree.h:327
lxb_inline lxb_dom_node_t * lxb_html_tree_adjusted_current_node(lxb_html_tree_t *tree)
Definition tree.h:297
LXB_API void lxb_html_tree_attach_document_noi(lxb_html_tree_t *tree, lxb_html_document_t *doc)
lxb_inline void lxb_html_tree_scripting_set(lxb_html_tree_t *tree, bool scripting)
Definition tree.h:366
LXB_API lxb_html_element_t * lxb_html_tree_insert_foreign_element(lxb_html_tree_t *tree, lxb_html_token_t *token, lxb_ns_id_t ns)
Definition tree.c:392
LXB_API void lxb_html_tree_generate_all_implied_end_tags_thoroughly(lxb_html_tree_t *tree, lxb_tag_id_t ex_tag, lxb_ns_id_t ex_ns)
Definition tree.c:952
LXB_API lxb_status_t lxb_html_tree_insert_character_for_data(lxb_html_tree_t *tree, lexbor_str_t *str, lxb_dom_node_t **ret_node)
Definition tree.c:697
LXB_API lxb_dom_comment_t * lxb_html_tree_insert_comment(lxb_html_tree_t *tree, lxb_html_token_t *token, lxb_dom_node_t *pos)
Definition tree.c:790
LXB_API lxb_dom_node_t * lxb_html_tree_element_in_scope_td_th(lxb_html_tree_t *tree)
Definition tree.c:1278
LXB_API lxb_status_t lxb_html_tree_adjust_mathml_attributes(lxb_html_tree_t *tree, lxb_dom_attr_t *attr, void *ctx)
Definition tree.c:543
lxb_inline lxb_dom_node_t * lxb_html_tree_create_node(lxb_html_tree_t *tree, lxb_tag_id_t tag_id, lxb_ns_id_t ns)
Definition tree.h:272
LXB_API lxb_status_t lxb_html_tree_adjust_attributes_mathml(lxb_html_tree_t *tree, lxb_dom_attr_t *attr, void *ctx)
Definition tree.c:1706
lxb_inline bool lxb_html_tree_node_is(lxb_dom_node_t *node, lxb_tag_id_t tag_id)
Definition tree.h:280
LXB_API void lxb_html_tree_acknowledge_token_self_closing_noi(lxb_html_tree_t *tree, lxb_html_token_t *token)
LXB_API bool lxb_html_tree_html_integration_point(lxb_dom_node_t *node)
Definition tree.c:1664
LXB_API lxb_html_tree_t * lxb_html_tree_create(void)
Definition tree.c:47
LXB_API bool lxb_html_tree_adoption_agency_algorithm(lxb_html_tree_t *tree, lxb_html_token_t *token, lxb_status_t *status)
Definition tree.c:1368
LXB_API lxb_status_t lxb_html_tree_insert_character(lxb_html_tree_t *tree, lxb_html_token_t *token, lxb_dom_node_t **ret_node)
Definition tree.c:669
LXB_API lxb_dom_node_t * lxb_html_tree_adjusted_current_node_noi(lxb_html_tree_t *tree)
LXB_API lxb_html_tree_t * lxb_html_tree_unref(lxb_html_tree_t *tree)
Definition tree.c:140
LXB_API void lxb_html_tree_reset_insertion_mode_appropriately(lxb_html_tree_t *tree)
Definition tree.c:999
LXB_API lxb_html_tree_t * lxb_html_tree_destroy(lxb_html_tree_t *tree)
Definition tree.c:179
LXB_API bool lxb_html_tree_node_is_noi(lxb_dom_node_t *node, lxb_tag_id_t tag_id)
LXB_API void lxb_html_tree_node_delete_deep(lxb_html_tree_t *tree, lxb_dom_node_t *node)
Definition tree.c:857
LXB_API lxb_dom_node_t * lxb_html_tree_element_in_scope_h123456(lxb_html_tree_t *tree)
Definition tree.c:1203
lxb_inline lxb_html_element_t * lxb_html_tree_insert_html_element(lxb_html_tree_t *tree, lxb_html_token_t *token)
Definition tree.h:307
LXB_API lxb_status_t lxb_html_tree_chunk_noi(lxb_html_tree_t *tree, const lxb_char_t *html, size_t size)
LXB_API lxb_dom_node_t * lxb_html_tree_element_in_scope_by_node(lxb_html_tree_t *tree, lxb_dom_node_t *by_node, lxb_html_tag_category_t ct)
Definition tree.c:1177
LXB_API lxb_status_t lxb_html_tree_append_attributes(lxb_html_tree_t *tree, lxb_dom_element_t *element, lxb_html_token_t *token, lxb_ns_id_t ns)
Definition tree.c:452
LXB_API lxb_status_t lxb_html_tree_adjust_attributes_svg(lxb_html_tree_t *tree, lxb_dom_attr_t *attr, void *ctx)
Definition tree.c:1720
LXB_API lxb_status_t lxb_html_tree_adjust_svg_attributes(lxb_html_tree_t *tree, lxb_dom_attr_t *attr, void *ctx)
Definition tree.c:569
LXB_API lxb_html_element_t * lxb_html_tree_insert_html_element_noi(lxb_html_tree_t *tree, lxb_html_token_t *token)
lxb_inline lxb_status_t lxb_html_tree_chunk(lxb_html_tree_t *tree, const lxb_char_t *html, size_t size)
Definition tree.h:239
lxb_inline lxb_status_t lxb_html_tree_end(lxb_html_tree_t *tree)
Definition tree.h:245
LXB_API lxb_status_t lxb_html_tree_adjust_foreign_attributes(lxb_html_tree_t *tree, lxb_dom_attr_t *attr, void *ctx)
Definition tree.c:606
unsigned int lxb_status_t
Definition types.h:28
#define lxb_inline
Definition types.h:21
unsigned char lxb_char_t
Definition types.h:27