From c5911904de7f412b67bafc8fa9bb57a0dbe6a881 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 25 Jan 2009 18:59:53 +0000 Subject: Beginnings of specificity. Note that we store the specificity on each simple selector. Thus the total specificity for a combinator chain is obtained by summing the specificity of each chain member. TODO: distinguish between pseudo classes and elements. svn path=/trunk/libcss/; revision=6267 --- src/stylesheet.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'src/stylesheet.c') diff --git a/src/stylesheet.c b/src/stylesheet.c index c8eb2e7..34439ec 100644 --- a/src/stylesheet.c +++ b/src/stylesheet.c @@ -395,8 +395,12 @@ css_error css_stylesheet_selector_create(css_stylesheet *sheet, sel->data.name = name; sel->data.value = NULL; - /** \todo specificity */ - sel->specificity = 0; + /* Initial specificity -- 1 for an element, 0 for universal */ + if (name->len != 1 || name->data[0] != '*') + sel->specificity = CSS_SPECIFICITY_D; + else + sel->specificity = 0; + sel->data.comb = CSS_COMBINATOR_NONE; *selector = sel; @@ -493,6 +497,28 @@ css_error css_stylesheet_selector_append_specific(css_stylesheet *sheet, (*parent) = temp; + /* Update parent's specificity */ + switch (detail->type) { + case CSS_SELECTOR_CLASS: + case CSS_SELECTOR_ATTRIBUTE: + case CSS_SELECTOR_ATTRIBUTE_EQUAL: + case CSS_SELECTOR_ATTRIBUTE_DASHMATCH: + case CSS_SELECTOR_ATTRIBUTE_INCLUDES: + (*parent)->specificity += CSS_SPECIFICITY_C; + break; + case CSS_SELECTOR_ID: + (*parent)->specificity += CSS_SPECIFICITY_B; + break; + case CSS_SELECTOR_PSEUDO: + /** \todo distinguish between pseudo classes and elements */ + /* Assume pseudo class for now */ + (*parent)->specificity += CSS_SPECIFICITY_C; + break; + case CSS_SELECTOR_ELEMENT: + (*parent)->specificity += CSS_SPECIFICITY_D; + break; + } + return CSS_OK; } -- cgit v1.2.3