90lxb_selectors_pseudo_class_first_of_type(
const lxb_dom_node_t *node);
96lxb_selectors_pseudo_class_last_of_type(
const lxb_dom_node_t *node);
124 if (selectors ==
NULL) {
157 if (selectors ==
NULL) {
179 while (node !=
NULL) {
181 && lxb_selectors_match(selectors, entry, selector, node))
196 if (lxb_selectors_match(selectors, entry, selector, node)) {
210 && lxb_selectors_match(selectors, entry, selector, root))
224 while (node !=
NULL) {
226 if (lxb_selectors_match(selectors, entry, selector, node)) {
245 while (node !=
NULL) {
247 lxb_selectors_match(selectors, entry, selector, node))
275 nested.
entry = entry;
282 return lxb_selectors_state_tree(selectors, root, list);
307 nested.
entry = entry;
314 status = lxb_selectors_state_run(selectors, node, list);
356 status = lxb_selectors_state_run(selectors, node, list);
374 while (node != root && node->
next ==
NULL) {
402 selectors->
state = lxb_selectors_state_find;
403 selectors->
first = entry;
408 entry = selectors->
state(selectors, entry);
410 while (entry !=
NULL);
441 switch (pseudo->
type) {
479 selectors->
state = lxb_selectors_state_pseudo_class_function;
494 selector, entry->
node);
499 selector, entry->
node);
504 selector, entry->
node);
509 selector, entry->
node);
514 selector, entry->
node);
523 return lxb_selectors_state_find_check(selectors, node, selector, entry);
593 node = entry->
node->parent;
604 node = entry->
node->prev;
619 while (node ==
NULL);
637 entry = selectors->
first;
679 base = lxb_selectors_next_node(
current);
684 pseudo = &
current->parent->last->selector->u.pseudo;
686 switch (pseudo->
type) {
689 node = lxb_selectors_state_has_relative(base, list->
first);
695 selectors->
state = lxb_selectors_state_find;
697 return lxb_selectors_state_find_check(selectors,
NULL,
705 current->return_state = lxb_selectors_state_after_find_has;
706 current->cb = lxb_selectors_cb_ok;
710 selectors->
state = lxb_selectors_state_find;
719 current->return_state = lxb_selectors_state_after_find;
720 current->cb = lxb_selectors_cb_ok;
724 selectors->
state = lxb_selectors_state_find;
731 current->return_state = lxb_selectors_state_after_find;
732 current->cb = lxb_selectors_cb_not;
736 selectors->
state = lxb_selectors_state_find;
746 current->return_state = lxb_selectors_state_after_nth_child;
747 current->cb = lxb_selectors_cb_ok;
753 selectors->
state = lxb_selectors_state_find;
777 selectors->
state = lxb_selectors_state_find;
779 return lxb_selectors_state_find_check(selectors,
NULL,
788 switch (
main->parent->last->combinator) {
811 while (node !=
NULL) {
843 while (node !=
NULL) {
848 while (node !=root && node->
next ==
NULL) {
876 selectors->
state = lxb_selectors_state_find;
878 return lxb_selectors_state_find_check(selectors, node,
879 parent->selector, parent);
936 selectors->
state = lxb_selectors_state_find;
945 selectors->
state = lxb_selectors_state_find;
947 return lxb_selectors_state_find_check(selectors,
NULL,
948 parent->selector, parent);
968 selectors->
state = lxb_selectors_state_find;
970 return lxb_selectors_state_find_check(selectors, node,
971 parent->selector, parent);
976 switch (
current->parent->last->combinator) {
1014 selectors->
state = lxb_selectors_state_find;
1016 return lxb_selectors_state_find_check(selectors, node,
1017 parent->selector, parent);
1021 selectors->
state = lxb_selectors_state_find;
1038 selector =
current->parent->last->selector;
1046 else if (
current->root == node) {
1054 while (node !=
NULL) {
1065 while (node !=
NULL) {
1080 selectors->
state = lxb_selectors_state_find;
1087 found = lxb_selectors_anb_calc(pseudo->
data,
current->index);
1092 selectors->
state = lxb_selectors_state_find;
1097 return lxb_selectors_state_find_check(selectors, node,
1098 parent->selector, parent);
1107 switch (selector->
type) {
1112 return lxb_selectors_match_element(selector, node, entry);
1115 return lxb_selectors_match_id(selector, node);
1127 &selector->
name,
true);
1130 return lxb_selectors_match_attribute(selector, node, entry);
1133 return lxb_selectors_pseudo_class(selector, node);
1136 return lxb_selectors_pseudo_class_function(selector, node);
1139 return lxb_selectors_pseudo_element(selector, node);
1157 if (entry->
id == 0) {
1183 src = &selector->
name;
1195 if (target->length < src->
length) {
1262 if (entry->
id == 0) {
1265 if (attr_data ==
NULL) {
1273 if (dom_attr ==
NULL) {
1277 trg = dom_attr->
value;
1285 trg = &lxb_blank_str;
1290 switch (
attr->match) {
1305 return lxb_selectors_match_class(trg, src, ins);
1391 static const lxb_char_t checkbox[] =
"checkbox";
1392 static const size_t checkbox_length =
sizeof(checkbox) /
sizeof(
lxb_char_t) - 1;
1395 static const size_t radio_length =
sizeof(radio) /
sizeof(
lxb_char_t) - 1;
1397 switch (pseudo->
type) {
1437 else if(str->
length == 5) {
1471 return lxb_selectors_pseudo_class_disabled(node);
1477 while (node !=
NULL) {
1486 while (node != root && node->
next ==
NULL) {
1501 return !lxb_selectors_pseudo_class_disabled(node);
1504 return lxb_selectors_pseudo_class_first_child(node);
1507 return lxb_selectors_pseudo_class_first_of_type(node);
1541 return lxb_selectors_pseudo_class_last_child(node);
1544 return lxb_selectors_pseudo_class_last_of_type(node);
1562 return lxb_selectors_pseudo_class_first_child(node)
1563 && lxb_selectors_pseudo_class_last_child(node);
1566 return lxb_selectors_pseudo_class_first_of_type(node)
1567 && lxb_selectors_pseudo_class_last_of_type(node);
1599 return !lxb_selectors_pseudo_class_read_write(node);
1602 return lxb_selectors_pseudo_class_read_write(node);
1654 switch (pseudo->
type) {
1660 while (node !=
NULL) {
1671 while (node !=
NULL) {
1682 return lxb_selectors_anb_calc(pseudo->
data, index);
1690 while (node !=
NULL) {
1692 && node->
ns == base->
ns)
1701 while (node !=
NULL) {
1703 && node->
ns == base->
ns)
1712 return lxb_selectors_anb_calc(pseudo->
data, index);
1731 switch (pseudo->
type) {
1771 while (node !=
NULL) {
1785lxb_selectors_pseudo_class_first_child(
const lxb_dom_node_t *node)
1789 while (node !=
NULL) {
1803lxb_selectors_pseudo_class_first_of_type(
const lxb_dom_node_t *node)
1810 && node->
ns == root->
ns)
1826 while (node !=
NULL) {
1840lxb_selectors_pseudo_class_last_of_type(
const lxb_dom_node_t *node)
1847 && node->
ns == root->
ns)
1872 return !lxb_selectors_pseudo_class_disabled(node);
1883 if (anb->
anb.
a == 0) {
1884 if (anb->
anb.
b >= 0 && (
size_t) anb->
anb.
b == index) {
1889 num = ((double) index - (double) anb->
anb.
b) / (
double) anb->
anb.
a;
1891 if (num >= 0.0f && (num - trunc(num)) == 0.0f) {
1903 *((
bool *) ctx) =
true;
1911 *((
bool *) ctx) =
false;
@ LXB_DOM_ATTR_PLACEHOLDER
@ LXB_STATUS_ERROR_INCOMPLETE_OBJECT
@ LXB_STATUS_ERROR_MEMORY_ALLOCATION
struct lxb_css_selector lxb_css_selector_t
struct lxb_css_selector_list lxb_css_selector_list_t
void * lexbor_dobject_calloc(lexbor_dobject_t *dobject)
lxb_status_t lexbor_dobject_init(lexbor_dobject_t *dobject, size_t chunk_size, size_t struct_size)
void lexbor_dobject_clean(lexbor_dobject_t *dobject)
lexbor_dobject_t * lexbor_dobject_destroy(lexbor_dobject_t *dobject, bool destroy_self)
lexbor_dobject_t * lexbor_dobject_create(void)
#define lxb_dom_interface_element(obj)
struct lxb_dom_node lxb_dom_node_t
struct lxb_dom_attr lxb_dom_attr_t
struct lxb_dom_element lxb_dom_element_t
@ LXB_DOM_NODE_TYPE_DOCUMENT
@ LXB_DOM_NODE_TYPE_ELEMENT
int main(int argc, char **argv)
const lxb_dom_attr_data_t * lxb_dom_attr_data_by_local_name(lexbor_hash_t *hash, const lxb_char_t *name, size_t length)
lxb_dom_node_t * lxb_dom_document_root(lxb_dom_document_t *document)
lxb_dom_attr_t * lxb_dom_element_attr_by_id(lxb_dom_element_t *element, lxb_dom_attr_id_t attr_id)
bool lxb_dom_node_is_empty(const lxb_dom_node_t *root)
LXB_API void * lexbor_free(void *dst)
LXB_API void * lexbor_calloc(size_t num, size_t size)
unsigned const char * end
unsigned const char * pos
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_IN_RANGE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_ACTIVE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_PAST
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_ENABLED
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_ANY_LINK
@ 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_ROOT
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_LINK
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_VISITED
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_READ_ONLY
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FOCUS_WITHIN
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FOCUS
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_INDETERMINATE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUTURE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FIRST_CHILD
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FOCUS_VISIBLE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_LAST_OF_TYPE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_USER_INVALID
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_VALID
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_OPTIONAL
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_SCOPE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_DISABLED
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_EMPTY
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_DEFAULT
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_READ_WRITE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_PLACEHOLDER_SHOWN
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_ONLY_OF_TYPE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FIRST_OF_TYPE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_INVALID
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_CHECKED
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_BLANK
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_REQUIRED
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_ONLY_CHILD
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_HOVER
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_TARGET
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_OUT_OF_RANGE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_LAST_CHILD
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_COL
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_IS
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_DIR
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_HAS
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NTH_COL
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_CURRENT
@ 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_OF_TYPE
@ LXB_CSS_SELECTOR_PSEUDO_CLASS_FUNCTION_NOT
@ 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
uint32_t lxb_css_selector_specificity_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
@ 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
@ 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
lxb_status_t lxb_selectors_find(lxb_selectors_t *selectors, const xmlNode *root, const lxb_css_selector_list_t *list, lxb_selectors_cb_f cb, void *ctx)
void lxb_selectors_destroy(lxb_selectors_t *selectors)
lxb_inline const xmlNode * lxb_selectors_close(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry, const lxb_css_selector_t *selector, const xmlNode *node)
lxb_status_t lxb_selectors_init(lxb_selectors_t *selectors)
lxb_inline const xmlNode * lxb_selectors_sibling(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry, const lxb_css_selector_t *selector, const xmlNode *node)
lxb_status_t lxb_selectors_match_node(lxb_selectors_t *selectors, const xmlNode *node, const lxb_css_selector_list_t *list, lxb_selectors_cb_f cb, void *ctx)
void lxb_selectors_clean(lxb_selectors_t *selectors)
lxb_inline const xmlNode * lxb_selectors_child(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry, const lxb_css_selector_t *selector, const xmlNode *root)
lxb_inline const xmlNode * lxb_selectors_following(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry, const lxb_css_selector_t *selector, const xmlNode *node)
lxb_inline const xmlNode * lxb_selectors_descendant(lxb_selectors_t *selectors, lxb_selectors_entry_t *entry, const lxb_css_selector_t *selector, const xmlNode *node)
struct lxb_selectors_entry lxb_selectors_entry_t
struct lxb_selectors lxb_selectors_t
struct lxb_selectors_nested lxb_selectors_nested_t
lxb_inline void lxb_selectors_opt_set(lxb_selectors_t *selectors, lxb_selectors_opt_t opt)
lxb_inline const lxb_css_selector_list_t * lxb_selectors_selector(const lxb_selectors_t *selectors)
@ LXB_SELECTORS_OPT_DEFAULT
@ LXB_SELECTORS_OPT_MATCH_FIRST
@ LXB_SELECTORS_OPT_MATCH_ROOT
lxb_status_t(* lxb_selectors_cb_f)(const xmlNode *node, lxb_css_selector_specificity_t spec, void *ctx)
lxb_status_t lxb_selectors_find_reverse(lxb_selectors_t *selectors, lxb_dom_node_t *root, lxb_css_selector_list_t *list, lxb_selectors_cb_f cb, void *ctx)
void lxb_selectors_opt_set_noi(lxb_selectors_t *selectors, lxb_selectors_opt_t opt)
lxb_selectors_t * lxb_selectors_create(void)
const lxb_css_selector_list_t * lxb_selectors_selector_noi(const lxb_selectors_t *selectors)
bool lexbor_str_data_ncmp_contain(const lxb_char_t *where, size_t where_size, const lxb_char_t *what, size_t what_size)
bool lexbor_str_data_ncasecmp(const lxb_char_t *first, const lxb_char_t *sec, size_t size)
bool lexbor_str_data_ncmp(const lxb_char_t *first, const lxb_char_t *sec, size_t size)
bool lexbor_str_data_ncasecmp_contain(const lxb_char_t *where, size_t where_size, const lxb_char_t *what, size_t what_size)
lxb_css_selector_list_t * of
lxb_css_selector_list_t * next
lxb_css_selector_t * last
lxb_css_selector_specificity_t specificity
lxb_css_selector_t * first
lxb_css_selector_type_t type
lxb_css_selector_t * prev
lxb_css_selector_list_t * list
union lxb_css_selector::lxb_css_selector_u u
lxb_css_selector_combinator_t combinator
lxb_dom_attr_id_t attr_id
lxb_dom_attr_t * attr_class
lxb_dom_node_t * first_child
lxb_dom_document_t * owner_document
lxb_selectors_entry_t * following
lxb_selectors_entry_t * prev
lxb_selectors_nested_t * nested
lxb_selectors_adapted_id id
const lxb_css_selector_t * selector
lxb_selectors_entry_t * next
lxb_css_selector_combinator_t combinator
lxb_selectors_state_cb_f return_state
lxb_selectors_nested_t * parent
lxb_selectors_entry_t * entry
lxb_selectors_entry_t * last
lxb_selectors_state_cb_f state
lxb_selectors_opt_t options
lexbor_dobject_t * nested
lxb_selectors_entry_t * first
lxb_selectors_nested_t * current
lxb_inline lxb_tag_id_t lxb_tag_id_by_name(lexbor_hash_t *hash, const lxb_char_t *name, size_t len)
unsigned int lxb_status_t
lxb_css_selector_attribute_t attribute
lxb_css_selector_pseudo_t pseudo
#define lexbor_utils_whitespace(onechar, action, logic)