summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-01-25 18:59:53 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-01-25 18:59:53 +0000
commitc5911904de7f412b67bafc8fa9bb57a0dbe6a881 (patch)
tree9746a1e5ea828e0dea5919f3c35b638e922ab3c8 /src
parentb4d0d63be81dce36b1ddc4365235036c8e9d1a3d (diff)
downloadlibcss-c5911904de7f412b67bafc8fa9bb57a0dbe6a881.tar.gz
libcss-c5911904de7f412b67bafc8fa9bb57a0dbe6a881.tar.bz2
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
Diffstat (limited to 'src')
-rw-r--r--src/stylesheet.c30
-rw-r--r--src/stylesheet.h4
2 files changed, 32 insertions, 2 deletions
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;
}
diff --git a/src/stylesheet.h b/src/stylesheet.h
index 532afc0..48b08c2 100644
--- a/src/stylesheet.h
+++ b/src/stylesheet.h
@@ -63,6 +63,10 @@ struct css_selector {
css_rule *rule; /**< Owning rule */
+#define CSS_SPECIFICITY_A 0x01000000
+#define CSS_SPECIFICITY_B 0x00010000
+#define CSS_SPECIFICITY_C 0x00000100
+#define CSS_SPECIFICITY_D 0x00000001
uint32_t specificity; /**< Specificity of selector */
css_selector_detail data; /**< Selector data */