14static const char lxb_css_selectors_module_name[] =
"Selectors";
17#define lxb_css_selectors_state_string_dup_m(selectors, name) \
19 (status) = lxb_css_syntax_token_string_dup( \
20 lxb_css_syntax_token_string(token), (name), \
21 (parser)->memory->mraw); \
22 if ((status) != LXB_STATUS_OK) { \
28#define lxb_css_selectors_state_append(parser, selectors, selector) \
30 (selector) = lxb_css_selector_create((selectors)->list_last); \
31 if ((selector) == NULL) { \
32 return lxb_css_parser_memory_fail(parser); \
35 lxb_css_selectors_append_next((selectors), (selector)); \
37 (selector)->combinator = (selectors)->combinator; \
38 (selectors)->combinator = LXB_CSS_SELECTOR_COMBINATOR_CLOSE; \
42#define lxb_css_selectors_state_list_append(parser, selectors, list) \
44 (list) = lxb_css_selector_list_create((parser)->memory); \
45 if ((list) == NULL) { \
46 return lxb_css_parser_memory_fail(parser); \
49 lxb_css_selectors_list_append_next((selectors), (list)); \
51 (list)->parent = selectors->parent; \
79 void *ctx,
bool list,
bool root);
94 void *ctx,
bool root);
234 last->specificity = 0;
257 last->specificity = 0;
272 if (
prev->specificity >
last->specificity) {
273 last->specificity =
prev->specificity;
276 prev->specificity = 0;
290 lxb_css_selectors_state_complex_wo_root,
291 lxb_css_selectors_state_complex_list_end,
293 if (states ==
NULL) {
305 return lxb_css_selectors_state_list_end(parser, token,
306 lxb_css_selectors_state_complex_wo_root);
320 lxb_css_selectors_state_relative_list_wo_root,
321 lxb_css_selectors_state_relative_list_end,
323 if (states ==
NULL) {
335 return lxb_css_selectors_state_list_end(parser, token,
336 lxb_css_selectors_state_relative_list_wo_root);
350 lxb_css_selectors_state_relative_wo_root,
351 lxb_css_selectors_state_end,
353 if (states ==
NULL) {
365 return lxb_css_selectors_state_relative_handler(parser, token, ctx,
true,
374 return lxb_css_selectors_state_relative_handler(parser, token, ctx,
false,
381 void *ctx,
bool list,
bool root)
389 switch (token->
type) {
436 back = (list) ? lxb_css_selectors_state_complex_end
437 : lxb_css_selectors_state_end;
440 lxb_css_selectors_state_compound_wo_root,
442 if (states ==
NULL) {
459 lxb_css_selectors_state_complex_wo_root,
460 lxb_css_selectors_state_end,
462 if (states ==
NULL) {
474 return lxb_css_selectors_state_complex_handler(parser, token, ctx,
false);
480 void *ctx,
bool root)
485 lxb_css_selectors_state_compound_wo_root,
486 lxb_css_selectors_state_complex_end,
488 if (states ==
NULL) {
506 switch (token->
type) {
592 lxb_css_selectors_state_compound_wo_root,
593 lxb_css_selectors_state_compound_list_end,
595 if (states ==
NULL) {
607 return lxb_css_selectors_state_list_end(parser, token,
608 lxb_css_selectors_state_compound_wo_root);
623 lxb_css_selectors_state_compound_wo_root,
624 lxb_css_selectors_state_end,
626 if (states ==
NULL) {
659 switch (token->
type) {
661 status = lxb_css_selectors_state_hash(parser, token);
668 status = lxb_css_selectors_state_class(parser, token);
673 status = lxb_css_selectors_state_element_ns(parser, token);
683 status = lxb_css_selectors_state_element(parser, token);
688 status = lxb_css_selectors_state_attribute(parser);
696 status = lxb_css_selectors_state_pseudo_class(parser, token);
705 lxb_css_selectors_state_compound_pseudo);
706 status = lxb_css_selectors_state_pseudo_element(parser, token);
713 status = lxb_css_selectors_state_pseudo_element_function(parser, token,
714 lxb_css_selectors_state_compound_pseudo);
721 status = lxb_css_selectors_state_pseudo_class_function(parser, token,
722 lxb_css_selectors_state_compound_sub);
770 switch (token->
type) {
772 status = lxb_css_selectors_state_hash(parser, token);
779 status = lxb_css_selectors_state_class(parser, token);
790 status = lxb_css_selectors_state_attribute(parser);
798 status = lxb_css_selectors_state_pseudo_class(parser, token);
807 lxb_css_selectors_state_compound_pseudo);
808 status = lxb_css_selectors_state_pseudo_element(parser,
816 status = lxb_css_selectors_state_pseudo_element_function(parser,
817 token, lxb_css_selectors_state_compound_pseudo);
824 status = lxb_css_selectors_state_pseudo_class_function(parser, token,
825 lxb_css_selectors_state_compound_sub);
858 status = lxb_css_selectors_state_pseudo_class(parser, token);
865 status = lxb_css_selectors_state_pseudo_element(parser, token);
868 status = lxb_css_selectors_state_pseudo_element_function(parser, token,
869 lxb_css_selectors_state_compound_pseudo);
879 status = lxb_css_selectors_state_pseudo_class_function(parser, token,
880 lxb_css_selectors_state_compound_pseudo);
905 lxb_css_selectors_state_simple_list_end,
907 if (states ==
NULL) {
919 return lxb_css_selectors_state_list_end(parser, token,
920 lxb_css_selectors_state_simple_wo_root);
933 lxb_css_selectors_state_simple_wo_root,
934 lxb_css_selectors_state_end,
936 if (states ==
NULL) {
968 switch (token->
type) {
970 status = lxb_css_selectors_state_hash(parser, token);
977 status = lxb_css_selectors_state_class(parser, token);
982 status = lxb_css_selectors_state_element_ns(parser, token);
992 status = lxb_css_selectors_state_element(parser, token);
997 status = lxb_css_selectors_state_attribute(parser);
1005 status = lxb_css_selectors_state_pseudo_class(parser, token);
1012 status = lxb_css_selectors_state_pseudo_class_function(parser, token,
1013 lxb_css_selectors_state_simple_back);
1069 last->specificity = 0;
1138 return lxb_css_selectors_state_ns(parser, selector);
1143 return lxb_css_selectors_state_ns_ident(parser, selector);
1166 return lxb_css_selectors_state_ns(parser, selector);
1185 switch (token->
type) {
1205 selector->
ns.
data[0] =
'*';
1206 selector->
ns.
data[1] =
'\0';
1245 selector->
ns = selector->
name;
1260 switch (token->
type) {
1291 goto string_or_ident;
1384 return lxb_css_selectors_state_ns_ident(parser, selector);
1407 selector->
ns = selector->
name;
1424 selector->
ns = selector->
name;
1460 if (pseudo ==
NULL) {
1464 switch (pseudo->
id) {
1485 lxb_css_selectors_module_name,
1486 (
const char *) selector->
name.
data);
1536 lxb_css_selectors_module_name,
1537 (
const char *) selector->
name.
data);
1558 selectors->
parent = selector;
1596 if (pseudo ==
NULL) {
1600 switch (pseudo->
id) {
1614 lxb_css_selectors_module_name,
1615 (
const char *) selector->
name.
data);
1664 selectors->
parent = selector;
1688 parent = selectors->
parent;
1707 void *ctx,
bool failed)
1715 "%s. End Of File in pseudo function",
1716 lxb_css_selectors_module_name);
1720 lxb_css_selectors_state_restore_parent(selectors, ctx);
1724 lxb_css_selectors_state_restore_parent(selectors, ctx);
1741 "%s. Pseudo function can't be empty: %S()",
1742 lxb_css_selectors_module_name, &selector->
name);
1756 void *ctx,
bool failed)
1758 return lxb_css_selectors_state_forgiving_cb(parser, token, ctx,
1766 void *ctx,
bool failed)
1768 return lxb_css_selectors_state_forgiving_cb(parser, token, ctx,
1787 "%s. End Of File in pseudo function",
1788 lxb_css_selectors_module_name);
1792 lxb_css_selectors_state_restore_parent(selectors, ctx);
1802 lxb_css_selectors_state_restore_parent(selectors, ctx);
1818 "%s. Pseudo function can't be empty: %S()",
1819 lxb_css_selectors_module_name, &selector->
name);
1837 dst =
last->specificity;
1850 else if (src > dst) {
1854 last->specificity = dst;
1858 last->last->u.pseudo.data = selectors->
list;
1883 token = lxb_css_selectors_state_function_error(parser, token);
1884 if (token ==
NULL) {
1905 token = lxb_css_selectors_state_function_error(parser, token);
1906 if (token ==
NULL) {
1940 token = lxb_css_selectors_state_function_error(parser, token);
1941 if (token ==
NULL) {
1951 token = lxb_css_selectors_state_function_error(parser, token);
1952 if (token ==
NULL) {
1980 selector = selectors->
parent;
1982 if (selector !=
NULL) {
1991 cy =
func->forgiving;
1992 comma =
func->comma;
1997 if (origin ==
NULL) {
2008 if (origin !=
NULL) {
2010 "Selectors") ==
NULL)
2023 while (token !=
NULL
2045 while (token !=
NULL
prev(array|object &$array)
@ LXB_STATUS_ERROR_MEMORY_ALLOCATION
struct lxb_css_parser_state lxb_css_parser_state_t
struct lxb_css_syntax_token lxb_css_syntax_token_t
bool(* lxb_css_parser_state_f)(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
struct lxb_css_parser lxb_css_parser_t
bool lxb_css_parser_unexpected(lxb_css_parser_t *parser)
bool lxb_css_parser_success(lxb_css_parser_t *parser)
lxb_status_t lxb_css_parser_unexpected_status(lxb_css_parser_t *parser)
bool lxb_css_parser_fail(lxb_css_parser_t *parser, lxb_status_t status)
bool lxb_css_parser_memory_fail(lxb_css_parser_t *parser)
lxb_css_parser_state_t * lxb_css_parser_states_next(lxb_css_parser_t *parser, lxb_css_parser_state_f next, lxb_css_parser_state_f back, void *ctx, bool root)
lxb_inline void lxb_css_parser_set_ok(lxb_css_parser_t *parser)
#define lxb_css_parser_token_status_m(parser, token)
#define lxb_css_parser_token_status_wo_ws_m(parser, token)
lxb_inline lxb_css_parser_state_t * lxb_css_parser_states_to_root(lxb_css_parser_t *parser)
lxb_inline size_t lxb_css_parser_rule_deep(lxb_css_parser_t *parser)
#define lxb_css_parser_token_next_m(parser, token)
#define lxb_css_parser_token_m(parser, token)
lxb_inline bool lxb_css_parser_states_set_back(lxb_css_parser_t *parser)
lxb_inline lxb_css_parser_state_t * lxb_css_parser_states_current(lxb_css_parser_t *parser)
lxb_inline void lxb_css_parser_state_set(lxb_css_parser_t *parser, lxb_css_parser_state_f state)
lxb_inline void lxb_css_parser_failed_set_by_id(lxb_css_parser_t *parser, int idx, bool is)
lxb_inline lxb_css_parser_state_t * lxb_css_parser_states_pop(lxb_css_parser_t *parser)
lxb_inline bool lxb_css_parser_is_failed(lxb_css_parser_t *parser)
struct lxb_css_selector lxb_css_selector_t
struct lxb_css_selector_list lxb_css_selector_list_t
struct lxb_css_selectors lxb_css_selectors_t
#define lxb_css_selectors_state_string_dup_m(selectors, name)
bool lxb_css_selectors_state_compound(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_compound_list(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_simple(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
lxb_inline void lxb_css_selectors_state_restore_combinator(lxb_css_selectors_t *selectors)
#define lxb_css_selectors_state_append(parser, selectors, selector)
lxb_status_t lxb_css_selectors_state_function_forgiving_relative(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx, bool failed)
lxb_inline bool lxb_css_selectors_done(lxb_css_parser_t *parser)
bool lxb_css_selectors_state_relative_list(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_complex(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
bool lxb_css_selectors_state_relative(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
lxb_inline void lxb_css_selectors_state_func_specificity(lxb_css_selectors_t *selectors)
lxb_status_t lxb_css_selectors_state_function_forgiving(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx, bool failed)
lxb_inline void lxb_css_selectors_state_specificity_set_c(lxb_css_selectors_t *selectors)
bool lxb_css_selectors_state_complex_list(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
lxb_status_t lxb_css_selectors_state_function_end(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx, bool failed)
#define lxb_css_selectors_state_list_append(parser, selectors, list)
lxb_inline void lxb_css_selectors_state_specificity_set_b(lxb_css_selectors_t *selectors)
bool lxb_css_selectors_state_simple_list(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, void *ctx)
lxb_css_syntax_rule_t * lxb_css_syntax_parser_function_push(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, lxb_css_parser_state_f state_back, const lxb_css_syntax_cb_function_t *func, void *ctx)
const lxb_css_syntax_token_t * lxb_css_syntax_parser_token(lxb_css_parser_t *parser)
void lxb_css_syntax_parser_consume(lxb_css_parser_t *parser)
lxb_css_log_message_t * lxb_css_syntax_token_error(lxb_css_parser_t *parser, const lxb_css_syntax_token_t *token, const char *module_name)
lxb_css_syntax_token_t * lxb_css_syntax_token(lxb_css_syntax_tokenizer_t *tkz)
lxb_status_t lxb_css_syntax_token_string_dup(lxb_css_syntax_token_string_t *token, lexbor_str_t *str, lexbor_mraw_t *mraw)
void lxb_css_syntax_token_consume(lxb_css_syntax_tokenizer_t *tkz)
#define lxb_css_syntax_token_string(token)
@ LXB_CSS_SYNTAX_TOKEN_FUNCTION
@ LXB_CSS_SYNTAX_TOKEN_LS_BRACKET
@ LXB_CSS_SYNTAX_TOKEN__EOF
@ LXB_CSS_SYNTAX_TOKEN_COMMA
@ LXB_CSS_SYNTAX_TOKEN_DELIM
@ LXB_CSS_SYNTAX_TOKEN_COLON
@ LXB_CSS_SYNTAX_TOKEN_RS_BRACKET
@ LXB_CSS_SYNTAX_TOKEN_STRING
@ LXB_CSS_SYNTAX_TOKEN_IDENT
@ LXB_CSS_SYNTAX_TOKEN_WHITESPACE
@ LXB_CSS_SYNTAX_TOKEN_HASH
@ LXB_CSS_SYNTAX_TOKEN__END
#define lxb_css_syntax_token_delim_char(token)
lxb_css_log_message_t * lxb_css_log_format(lxb_css_log_t *log, lxb_css_log_type_t type, const char *format,...)
lxb_css_log_message_t * lxb_css_log_not_supported(lxb_css_log_t *log, const char *module_name, const char *description)
void * lexbor_mraw_alloc(lexbor_mraw_t *mraw, size_t size)
const lxb_css_selectors_pseudo_data_func_t * lxb_css_selector_pseudo_class_function_by_id(unsigned id)
const lxb_css_selectors_pseudo_data_func_t * lxb_css_selector_pseudo_element_function_by_id(unsigned id)
bool lxb_css_selector_pseudo_function_can_empty(unsigned id, bool is_class)
const lxb_css_selectors_pseudo_data_func_t * lxb_css_selector_pseudo_class_function_by_name(const lxb_char_t *name, size_t length)
const lxb_css_selectors_pseudo_data_func_t * lxb_css_selector_pseudo_function_by_id(unsigned id, bool is_class)
const lxb_css_selectors_pseudo_data_func_t * lxb_css_selector_pseudo_element_function_by_name(const lxb_char_t *name, size_t length)
const lxb_css_selectors_pseudo_data_t * lxb_css_selector_pseudo_class_by_name(const lxb_char_t *name, size_t length)
const lxb_css_selectors_pseudo_data_t * lxb_css_selector_pseudo_element_by_name(const lxb_char_t *name, size_t length)
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_IN_RANGE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_PAST
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_WARNING
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_TARGET_WITHIN
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_LOCAL_LINK
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FULLSCREEN
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_CURRENT
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_VISITED
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FOCUS_WITHIN
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_INDETERMINATE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUTURE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FOCUS_VISIBLE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_USER_INVALID
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_VALID
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_SCOPE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_DEFAULT
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_INVALID
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_TARGET
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_OUT_OF_RANGE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_DIR
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_LANG
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_WHERE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_CHILD
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD
@ LXB_CSS_SELECTOR_PSEUDO_ELEMENT_SELECTION
@ LXB_CSS_SELECTOR_PSEUDO_ELEMENT_BACKDROP
@ LXB_CSS_SELECTOR_PSEUDO_ELEMENT_AFTER
@ LXB_CSS_SELECTOR_PSEUDO_ELEMENT_GRAMMAR_ERROR
@ LXB_CSS_SELECTOR_PSEUDO_ELEMENT_TARGET_TEXT
@ LXB_CSS_SELECTOR_PSEUDO_ELEMENT_PLACEHOLDER
@ LXB_CSS_SELECTOR_PSEUDO_ELEMENT_FIRST_LINE
@ LXB_CSS_SELECTOR_PSEUDO_ELEMENT_BEFORE
@ LXB_CSS_SELECTOR_PSEUDO_ELEMENT_INACTIVE_SELECTION
@ LXB_CSS_SELECTOR_PSEUDO_ELEMENT_SPELLING_ERROR
@ LXB_CSS_SELECTOR_PSEUDO_ELEMENT_MARKER
@ LXB_CSS_SELECTOR_PSEUDO_ELEMENT_FIRST_LETTER
void lxb_css_selector_remove(lxb_css_selector_t *selector)
void lxb_css_selector_list_destroy(lxb_css_selector_list_t *list)
void lxb_css_selector_list_destroy_chain(lxb_css_selector_list_t *list)
void lxb_css_selector_list_selectors_remove(lxb_css_selectors_t *selectors, lxb_css_selector_list_t *list)
void lxb_css_selector_destroy(lxb_css_selector_t *selector)
#define lxb_css_selector_sp_c(sp)
#define lxb_css_selector_sp_add_b(sp, num)
#define lxb_css_selector_sp_set_b(sp, num)
lxb_css_selector_combinator_t
@ LXB_CSS_SELECTOR_COMBINATOR_CELL
@ LXB_CSS_SELECTOR_COMBINATOR_CLOSE
@ LXB_CSS_SELECTOR_COMBINATOR_DESCENDANT
@ LXB_CSS_SELECTOR_COMBINATOR_SIBLING
@ LXB_CSS_SELECTOR_COMBINATOR_CHILD
@ LXB_CSS_SELECTOR_COMBINATOR_FOLLOWING
#define lxb_css_selector_sp_set_a(sp, num)
#define lxb_css_selector_sp_add_c(sp, num)
@ LXB_CSS_SELECTOR_TYPE_ELEMENT
@ LXB_CSS_SELECTOR_TYPE_PSEUDO_CLASS_FUNCTION
@ LXB_CSS_SELECTOR_TYPE_PSEUDO_CLASS
@ LXB_CSS_SELECTOR_TYPE_ATTRIBUTE
@ LXB_CSS_SELECTOR_TYPE_PSEUDO_ELEMENT_FUNCTION
@ LXB_CSS_SELECTOR_TYPE_ID
@ LXB_CSS_SELECTOR_TYPE_CLASS
@ LXB_CSS_SELECTOR_TYPE_PSEUDO_ELEMENT
@ LXB_CSS_SELECTOR_TYPE_ANY
#define lxb_css_selector_sp_add_a(sp, num)
#define lxb_css_selector_sp_b(sp)
#define LXB_CSS_SELECTOR_SP_B_MAX
#define lxb_css_selector_sp_a(sp)
#define lxb_css_selector_sp_set_c(sp, num)
#define LXB_CSS_SELECTOR_SP_C_MAX
@ LXB_CSS_SELECTOR_MODIFIER_S
@ LXB_CSS_SELECTOR_MODIFIER_I
@ LXB_CSS_SELECTOR_MATCH_PREFIX
@ LXB_CSS_SELECTOR_MATCH_SUBSTRING
@ LXB_CSS_SELECTOR_MATCH_DASH
@ LXB_CSS_SELECTOR_MATCH_SUFFIX
@ LXB_CSS_SELECTOR_MATCH_INCLUDE
@ LXB_CSS_SELECTOR_MATCH_EQUAL
void lexbor_str_clean_all(lexbor_str_t *str)
lxb_css_memory_t * memory
lxb_css_syntax_tokenizer_t * tkz
lxb_css_selectors_t * selectors
lxb_css_selector_modifier_t modifier
lxb_css_selector_match_t match
lxb_css_selector_t * last
lxb_css_selector_specificity_t specificity
lxb_css_selector_list_t * prev
lxb_css_selector_t * first
lxb_css_selector_type_t type
union lxb_css_selector::lxb_css_selector_u u
lxb_css_selector_combinator_t combinator
lxb_css_selector_list_t * list_last
lxb_css_selector_combinator_t combinator
lxb_css_selector_list_t * list
lxb_css_selector_t * parent
lxb_css_selector_combinator_t comb_default
lxb_css_syntax_token_type_t type
struct lxb_css_syntax_rule lxb_css_syntax_rule_t
unsigned int lxb_status_t
lxb_css_selector_attribute_t attribute
lxb_css_selector_pseudo_t pseudo
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)