php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
element.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2018-2022 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
7#include "lexbor/html/style.h"
10
11
12typedef struct {
15}
17
25
26
27static lxb_status_t
28lxb_html_element_style_walk_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
29 lexbor_avl_node_t *node, void *ctx);
30
31static lxb_status_t
32lxb_html_element_style_weak_append(lxb_html_document_t *doc,
36
37static lxb_status_t
38lxb_html_element_style_serialize_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
39 lexbor_avl_node_t *node, void *ctx);
40
41#if 0
42static lxb_status_t
43lxb_html_element_style_serialize_str_cb(const lxb_char_t *data,
44 size_t len, void *ctx);
45#endif
46
47
50{
51 lxb_html_element_t *element;
52
53 element = lexbor_mraw_calloc(document->dom_document.mraw,
54 sizeof(lxb_html_element_t));
55 if (element == NULL) {
56 return NULL;
57 }
58
60
63
64 return element;
65}
66
73
76 const lxb_char_t *html, size_t size)
77{
78 lxb_dom_node_t *node, *child;
81
82 node = lxb_html_document_parse_fragment(doc, &element->element, html, size);
83 if (node == NULL) {
84 return NULL;
85 }
86
87 while (root->first_child != NULL) {
89 }
90
91 while (node->first_child != NULL) {
92 child = node->first_child;
93
95 lxb_dom_node_insert_child(root, child);
96 }
97
99
100 return lxb_html_interface_element(root);
101}
102
105 const lxb_char_t *name, size_t size)
106{
107#if 0
108 uintptr_t id;
110 lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
112
114 if (id == LXB_CSS_PROPERTY__UNDEF) {
115 return NULL;
116 }
117
118 node = (void *) lexbor_avl_search(doc->css.styles, element->style, id);
119
120 return (node != NULL) ? node->entry.value : NULL;
121#endif
122 return NULL;
123}
124
127{
128#if 0
129 const lxb_html_style_node_t *node;
130
131 node = lxb_html_element_style_node_by_id(element, id);
132 if (node == NULL) {
133 return NULL;
134 }
135
136 return node->entry.value;
137#endif
138 return NULL;
139}
140
143{
144 lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
146
148 element->style, id);
149}
150
153 const lxb_char_t *name, size_t size)
154{
155#if 0
156 uintptr_t id;
157 lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
159
161 if (id == LXB_CSS_PROPERTY__UNDEF) {
162 return NULL;
163 }
164
166 element->style, id);
167#endif
168 return NULL;
169}
170
171const void *
173{
174#if 0
176 const lxb_html_style_node_t *node;
177
178 node = lxb_html_element_style_node_by_id(element, id);
179 if (node == NULL) {
181 }
182
183 declr = node->entry.value;
184
185 return declr->u.user;
186#endif
187 return NULL;
188}
189
193 bool with_weak)
194{
196
197 walk.element = element;
198 walk.cb = cb;
199 walk.ctx = ctx;
200 walk.weak = with_weak;
201
202 return lexbor_avl_foreach(NULL, &element->style,
203 lxb_html_element_style_walk_cb, &walk);
204}
205
206static lxb_status_t
207lxb_html_element_style_walk_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
208 lexbor_avl_node_t *node, void *ctx)
209{
213 lxb_html_element_walk_ctx_t *walk = ctx;
214
215 style = (lxb_html_style_node_t *) node;
216
217 status = walk->cb(walk->element, node->value, walk->ctx, style->sp, false);
218 if (status != LXB_STATUS_OK) {
219 return status;
220 }
221
222 weak = style->weak;
223
224 while (weak != NULL) {
225 status = walk->cb(walk->element, weak->value, walk->ctx,
226 weak->sp, true);
227 if (status != LXB_STATUS_OK) {
228 return status;
229 }
230
231 weak = weak->next;
232 }
233
234 return LXB_STATUS_OK;
235}
236
239 const lxb_char_t *style, size_t size)
240{
241#if 0
243
244 lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
246 lxb_html_document_css_t *css = &doc->css;
247
249 style, size);
250 if (list == NULL) {
251 return css->parser->status;
252 }
253
254 element->list = list;
255
256 return lxb_html_element_style_list_append(element, list,
258#endif
259 return LXB_STATUS_ERROR;
260}
261
266{
267 uintptr_t id;
271
272 lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
274 lxb_html_document_css_t *css = &doc->css;
275
276 id = declr->type;
277
279
280 if (id == LXB_CSS_PROPERTY__CUSTOM) {
281 name = &declr->u.custom->name;
282
284 name->length);
285 if (id == 0) {
286 /* FIXME: what to do with an error? */
287 return LXB_STATUS_ERROR;
288 }
289 }
290
291 node = (void *) lexbor_avl_search(css->styles, element->style, id);
292 if (node != NULL) {
293 if (spec < node->sp) {
294 return lxb_html_element_style_weak_append(doc, node, declr, spec);
295 }
296
297 status = lxb_html_element_style_weak_append(doc, node,
298 node->entry.value, node->sp);
299 if (status != LXB_STATUS_OK) {
300 return status;
301 }
302
304
305 node->entry.value = declr;
306 node->sp = spec;
307
308 return LXB_STATUS_OK;
309 }
310
311 node = (void *) lexbor_avl_insert(css->styles, &element->style,
312 id, declr);
313 if (node == NULL) {
314 /* FIXME: what to do with an error? */
315 return LXB_STATUS_ERROR;
316 }
317
318 node->sp = spec;
319
320 return lxb_css_rule_ref_inc(lxb_css_rule(declr));
321}
322
323static lxb_status_t
324lxb_html_element_style_weak_append(lxb_html_document_t *doc,
328{
329 lxb_html_style_weak_t *weak, *prev, *new_weak;
330
331 new_weak = lexbor_dobject_alloc(doc->css.weak);
332 if (new_weak == NULL) {
334 }
335
336 new_weak->value = declr;
337 new_weak->sp = spec;
338
339 if (node->weak == NULL) {
340 node->weak = new_weak;
341 new_weak->next = NULL;
342
343 goto done;
344 }
345
346 weak = node->weak;
347
348 if (weak->sp <= spec) {
349 node->weak = new_weak;
350 new_weak->next = weak;
351
352 goto done;
353 }
354
355 prev = weak;
356 weak = weak->next;
357
358 while (weak != NULL) {
359 if (weak->sp <= spec) {
360 prev->next = new_weak;
361 new_weak->next = weak;
362
363 goto done;
364 }
365
366 prev = weak;
367 weak = weak->next;
368 }
369
370 prev->next = new_weak;
371 new_weak->next = NULL;
372
373done:
374
375 return lxb_css_rule_ref_inc(lxb_css_rule(declr));
376}
377
382{
384 lxb_css_rule_t *rule;
386
387 rule = list->first;
388
389 while (rule != NULL) {
390 if (rule->type != LXB_CSS_RULE_DECLARATION) {
391 goto next;
392 }
393
394 declr = lxb_css_rule_declaration(rule);
395
396 status = lxb_html_element_style_append(element, declr, spec);
397 if (status != LXB_STATUS_OK) {
398 /* FIXME: what to do with an error? */
399 }
400
401 next:
402
403 rule = rule->next;
404 }
405
406 return LXB_STATUS_OK;
407}
408
409void
411 const lxb_char_t *name, size_t size)
412{
413#if 0
414 uintptr_t id;
415 lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
417
419 if (id == LXB_CSS_PROPERTY__UNDEF) {
420 return;
421 }
422
424#endif
425}
426
427void
429{
430#if 0
432 lxb_dom_document_t *ddoc = lxb_dom_interface_node(element)->owner_document;
434
436 element->style, id);
437 if (node != NULL) {
438 lxb_html_element_style_remove_all(doc, &element->style, node);
439 }
440#endif
441}
442
445 lexbor_avl_node_t **root,
446 lxb_html_style_node_t *style, bool bs)
447{
449
450 weak = style->weak;
451 prev = NULL;
452
453 while (weak != NULL) {
454 next = weak->next;
455
456 if (lxb_css_selector_sp_s(weak->sp) == bs) {
458 lexbor_dobject_free(doc->css.weak, weak);
459
460 if (prev != NULL) {
461 prev->next = next;
462 }
463 else {
464 style->weak = next;
465 }
466 }
467 else {
468 prev = weak;
469 }
470
471 weak = next;
472 }
473
474 if (lxb_css_selector_sp_s(style->sp) != bs) {
475 return style;
476 }
477
479
480 if (style->weak == NULL) {
482 (lexbor_avl_node_t *) style);
483 return NULL;
484 }
485
486 weak = style->weak;
487
488 style->entry.value = weak->value;
489 style->sp = weak->sp;
490 style->weak = weak->next;
491
492 lexbor_dobject_free(doc->css.weak, weak);
493
494 return style;
495}
496
499 lexbor_avl_node_t **root,
501{
503
504 weak = style->weak;
505
506 while (weak != NULL) {
507 next = weak->next;
508
510 lexbor_dobject_free(doc->css.weak, weak);
511
512 weak = next;
513 }
514
517 (lexbor_avl_node_t *) style);
518 return NULL;
519}
520
523 lexbor_avl_node_t **root,
526{
528
529 weak = style->weak;
530 prev = NULL;
531
532 while (weak != NULL) {
533 next = weak->next;
534
535 if (((lxb_css_rule_declaration_t *) weak->value)->rule.parent
536 == (lxb_css_rule_t *) list)
537 {
539 lexbor_dobject_free(doc->css.weak, weak);
540
541 if (prev != NULL) {
542 prev->next = next;
543 }
544 else {
545 style->weak = next;
546 }
547 }
548 else {
549 prev = weak;
550 }
551
552 weak = next;
553 }
554
555 if (((lxb_css_rule_declaration_t *) style->entry.value)->rule.parent
556 != (lxb_css_rule_t *) list)
557 {
558 return style;
559 }
560
562
563 if (style->weak == NULL) {
565 (lexbor_avl_node_t *) style);
566 return NULL;
567 }
568
569 weak = style->weak;
570
571 style->entry.value = weak->value;
572 style->sp = weak->sp;
573 style->weak = weak->next;
574
575 lexbor_dobject_free(doc->css.weak, weak);
576
577 return style;
578}
579
583 lexbor_serialize_cb_f cb, void *ctx)
584{
586
587 context.cb = cb;
588 context.ctx = ctx;
589 context.opt = opt;
590 context.count = 0;
591
592 return lexbor_avl_foreach(NULL, &element->style,
593 lxb_html_element_style_serialize_cb, &context);
594}
595
596static lxb_status_t
597lxb_html_element_style_serialize_cb(lexbor_avl_t *avl, lexbor_avl_node_t **root,
598 lexbor_avl_node_t *node, void *ctx)
599{
600#if 0
603
604 static const lexbor_str_t splt = lexbor_str("; ");
605
606 if (context->count > 0) {
608 context->ctx, status);
609 }
610
611 context->count = 1;
612
613 return lxb_css_rule_serialize(node->value, context->cb, context->ctx);
614#endif
615 return LXB_STATUS_ERROR;
616}
617
620 lexbor_str_t *str,
622{
623#if 0
626
627 doc = lxb_dom_interface_node(element)->owner_document;
628
629 if (str->data == NULL) {
630 lexbor_str_init(str, doc->text, 1024);
631
632 if (str->data == NULL) {
634 }
635 }
636
637 context.str = str;
638 context.mraw = doc->text;
639
640 return lxb_html_element_style_serialize(element, opt,
641 lxb_html_element_style_serialize_str_cb, &context);
642#endif
643 return LXB_STATUS_ERROR;
644}
645
646#if 0
647static lxb_status_t
648lxb_html_element_style_serialize_str_cb(const lxb_char_t *data,
649 size_t len, void *ctx)
650{
653
654 ret = lexbor_str_append(context->str, context->mraw, data, len);
655 if (ret == NULL) {
657 }
658
659 return LXB_STATUS_OK;
660}
661#endif
size_t len
Definition apprentice.c:174
char * cb
Definition assert.c:26
lexbor_avl_node_t * lexbor_avl_search(lexbor_avl_t *avl, lexbor_avl_node_t *node, size_t type)
Definition avl.c:437
lexbor_avl_node_t * lexbor_avl_insert(lexbor_avl_t *avl, lexbor_avl_node_t **scope, size_t type, void *value)
Definition avl.c:258
void lexbor_avl_remove_by_node(lexbor_avl_t *avl, lexbor_avl_node_t **root, lexbor_avl_node_t *node)
Definition avl.c:426
lxb_status_t lexbor_avl_foreach(lexbor_avl_t *avl, lexbor_avl_node_t **scope, lexbor_avl_node_f cb, void *ctx)
Definition avl.c:455
struct lexbor_avl_node lexbor_avl_node_t
Definition avl.h:19
struct lexbor_avl lexbor_avl_t
Definition avl.h:18
prev(array|object &$array)
lxb_status_t(* lexbor_serialize_cb_f)(const lxb_char_t *data, size_t len, void *ctx)
Definition base.h:82
@ LXB_STATUS_ERROR_MEMORY_ALLOCATION
Definition base.h:51
@ LXB_STATUS_OK
Definition base.h:49
@ LXB_STATUS_ERROR
Definition base.h:50
#define lexbor_serialize_write(cb, data, length, ctx, status)
Definition serialize.h:14
struct lxb_css_rule_declaration lxb_css_rule_declaration_t
Definition base.h:70
struct lxb_css_rule_declaration_list lxb_css_rule_declaration_list_t
Definition base.h:69
@ LXB_CSS_PROPERTY__UNDEF
Definition const.h:22
@ LXB_CSS_PROPERTY__CUSTOM
Definition const.h:23
LXB_API lxb_css_rule_declaration_list_t * lxb_css_declaration_list_parse(lxb_css_parser_t *parser, lxb_css_memory_t *mem, const lxb_char_t *data, size_t length)
DNS_STATUS status
Definition dns_win32.c:49
void * lexbor_dobject_free(lexbor_dobject_t *dobject, void *data)
Definition dobject.c:135
void * lexbor_dobject_alloc(lexbor_dobject_t *dobject)
Definition dobject.c:91
struct lxb_dom_document lxb_dom_document_t
Definition interface.h:41
#define lxb_dom_interface_node(obj)
Definition interface.h:31
struct lxb_dom_node lxb_dom_node_t
Definition interface.h:38
@ LXB_DOM_NODE_TYPE_ELEMENT
Definition node.h:25
new_type size
Definition ffi.c:4365
#define NULL
Definition gdcache.h:45
#define lxb_html_interface_element(obj)
Definition interface.h:36
#define lxb_html_interface_document(obj)
Definition interface.h:20
struct lxb_html_element lxb_html_element_t
Definition interface.h:111
struct lxb_html_document lxb_html_document_t
Definition interface.h:95
lxb_inline lxb_dom_document_t * lxb_html_document_original_ref(lxb_html_document_t *document)
Definition document.h:218
lxb_status_t(* lxb_html_element_style_cb_f)(lxb_html_element_t *element, const lxb_css_rule_declaration_t *declr, void *ctx, lxb_css_selector_specificity_t spec, bool is_weak)
Definition element.h:35
lxb_html_element_style_opt_t
Definition element.h:28
void lxb_dom_node_remove(lxb_dom_node_t *node)
Definition node.c:478
lxb_dom_node_t * lxb_dom_node_destroy_deep(lxb_dom_node_t *root)
Definition node.c:260
void lxb_dom_node_insert_child(lxb_dom_node_t *to, lxb_dom_node_t *node)
Definition node.c:385
lxb_dom_node_t * lxb_dom_node_destroy(lxb_dom_node_t *node)
Definition node.c:248
lxb_dom_node_t * lxb_dom_node_interface_destroy(lxb_dom_node_t *node)
Definition node.c:124
lxb_dom_node_t * lxb_html_document_parse_fragment(lxb_html_document_t *document, lxb_dom_element_t *element, const lxb_char_t *html, size_t size)
Definition document.c:802
uintptr_t lxb_html_document_css_customs_id(lxb_html_document_t *document, const lxb_char_t *key, size_t length)
Definition document.c:410
void lxb_html_element_style_remove_by_id(lxb_html_element_t *element, uintptr_t id)
Definition element.c:428
lxb_status_t lxb_html_element_style_list_append(lxb_html_element_t *element, lxb_css_rule_declaration_list_t *list, lxb_css_selector_specificity_t spec)
Definition element.c:379
lxb_html_style_node_t * lxb_html_element_style_remove_all_not(lxb_html_document_t *doc, lexbor_avl_node_t **root, lxb_html_style_node_t *style, bool bs)
Definition element.c:444
const lxb_css_rule_declaration_t * lxb_html_element_style_by_name(lxb_html_element_t *element, const lxb_char_t *name, size_t size)
Definition element.c:104
const void * lxb_html_element_css_property_by_id(lxb_html_element_t *element, uintptr_t id)
Definition element.c:172
lxb_status_t lxb_html_element_style_parse(lxb_html_element_t *element, const lxb_char_t *style, size_t size)
Definition element.c:238
lxb_html_element_t * lxb_html_element_inner_html_set(lxb_html_element_t *element, const lxb_char_t *html, size_t size)
Definition element.c:75
const lxb_html_style_node_t * lxb_html_element_style_node_by_name(lxb_html_element_t *element, const lxb_char_t *name, size_t size)
Definition element.c:152
lxb_html_style_node_t * lxb_html_element_style_remove_by_list(lxb_html_document_t *doc, lexbor_avl_node_t **root, lxb_html_style_node_t *style, lxb_css_rule_declaration_list_t *list)
Definition element.c:522
const lxb_html_style_node_t * lxb_html_element_style_node_by_id(lxb_html_element_t *element, uintptr_t id)
Definition element.c:142
lxb_status_t lxb_html_element_style_append(lxb_html_element_t *element, lxb_css_rule_declaration_t *declr, lxb_css_selector_specificity_t spec)
Definition element.c:263
lxb_status_t lxb_html_element_style_walk(lxb_html_element_t *element, lxb_html_element_style_cb_f cb, void *ctx, bool with_weak)
Definition element.c:191
lxb_html_style_node_t * lxb_html_element_style_remove_all(lxb_html_document_t *doc, lexbor_avl_node_t **root, lxb_html_style_node_t *style)
Definition element.c:498
const lxb_css_rule_declaration_t * lxb_html_element_style_by_id(lxb_html_element_t *element, uintptr_t id)
Definition element.c:126
lxb_status_t lxb_html_element_style_serialize(lxb_html_element_t *element, lxb_html_element_style_opt_t opt, lexbor_serialize_cb_f cb, void *ctx)
Definition element.c:581
lxb_html_element_t * lxb_html_element_interface_destroy(lxb_html_element_t *element)
Definition element.c:68
lxb_html_element_t * lxb_html_element_interface_create(lxb_html_document_t *document)
Definition element.c:49
lxb_status_t lxb_html_element_style_serialize_str(lxb_html_element_t *element, lexbor_str_t *str, lxb_html_element_style_opt_t opt)
Definition element.c:619
void lxb_html_element_style_remove_by_name(lxb_html_element_t *element, const lxb_char_t *name, size_t size)
Definition element.c:410
#define next(ls)
Definition minilua.c:2661
void * lexbor_mraw_calloc(lexbor_mraw_t *mraw, size_t size)
Definition mraw.c:227
zend_constant * data
LXB_API const void * lxb_css_property_initial_by_id(uintptr_t id)
struct lxb_css_rule lxb_css_rule_t
Definition rule.h:41
#define lxb_css_rule_declaration(rule)
Definition rule.h:26
lxb_inline void lxb_css_rule_ref_dec_destroy(lxb_css_rule_t *rule)
Definition rule.h:340
lxb_inline lxb_status_t lxb_css_rule_ref_inc(lxb_css_rule_t *rule)
Definition rule.h:320
#define lxb_css_rule(rule)
Definition rule.h:20
@ LXB_CSS_RULE_DECLARATION
Definition rule.h:37
LXB_API lxb_status_t lxb_css_rule_serialize(const lxb_css_rule_t *rule, lexbor_serialize_cb_f cb, void *ctx)
lxb_inline void lxb_css_rule_ref_dec(lxb_css_rule_t *rule)
Definition rule.h:332
#define lxb_css_selector_sp_up_s(num)
Definition selector.h:157
uint32_t lxb_css_selector_specificity_t
Definition selector.h:107
#define lxb_css_selector_sp_set_i(sp, num)
Definition selector.h:129
#define lxb_css_selector_sp_s(sp)
Definition selector.h:117
lxb_char_t * lexbor_str_append(lexbor_str_t *str, lexbor_mraw_t *mraw, const lxb_char_t *buff, size_t length)
Definition str.c:131
lxb_char_t * lexbor_str_init(lexbor_str_t *str, lexbor_mraw_t *mraw, size_t size)
Definition str.c:22
#define lexbor_str(p)
Definition str.h:22
Definition dce.c:49
void * value
Definition avl.h:28
lxb_char_t * data
Definition str.h:47
size_t length
Definition str.h:48
lxb_status_t status
Definition parser.h:177
lxb_css_rule_t * first
Definition rule.h:94
union lxb_css_rule_declaration::@176340105247063216126056202012377115341175047152 u
lxb_css_property__custom_t * custom
Definition rule.h:106
lxb_css_rule_t * next
Definition rule.h:45
lxb_css_rule_type_t type
Definition rule.h:44
lexbor_mraw_t * mraw
Definition document.h:53
lexbor_mraw_t * text
Definition document.h:54
lxb_dom_node_t * first_child
Definition node.h:55
lxb_dom_document_t * owner_document
Definition node.h:50
lxb_dom_node_type_t type
Definition node.h:59
lexbor_avl_t * styles
Definition document.h:48
lxb_css_parser_t * parser
Definition document.h:46
lxb_css_memory_t * memory
Definition document.h:44
lexbor_dobject_t * weak
Definition document.h:50
lxb_html_document_css_t css
Definition document.h:65
lxb_dom_document_t dom_document
Definition document.h:58
lexbor_mraw_t * mraw
Definition element.c:14
lxb_html_element_style_cb_f cb
Definition element.c:20
lxb_html_element_t * element
Definition element.c:19
lexbor_avl_node_t * style
Definition element.h:24
lxb_css_rule_declaration_list_t * list
Definition element.h:25
lxb_dom_element_t element
Definition element.h:23
lxb_css_selector_specificity_t sp
Definition style.h:32
lexbor_avl_node_t entry
Definition style.h:29
lxb_html_style_weak_t * weak
Definition style.h:30
lxb_html_style_weak_t * next
Definition style.h:25
lxb_css_selector_specificity_t sp
Definition style.h:23
uintptr_t lxb_html_style_id_by_name(lxb_html_document_t *doc, const lxb_char_t *name, size_t size)
Definition style.c:11
struct lxb_html_style_weak lxb_html_style_weak_t
Definition style.h:19
unsigned int lxb_status_t
Definition types.h:28
unsigned char lxb_char_t
Definition types.h:27
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)
zend_string * name
zval * ret