aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/css.cc26
-rw-r--r--src/css.hh2
2 files changed, 28 insertions, 0 deletions
diff --git a/src/css.cc b/src/css.cc
index 77cd12a3..d13baefe 100644
--- a/src/css.cc
+++ b/src/css.cc
@@ -130,6 +130,15 @@ void CssSelector::addSimpleSelector (Combinator c) {
cs->selector = new CssSimpleSelector ();
}
+int CssSelector::specificity () {
+ int spec = 0;
+
+ for (int i = 0; i < selectorList->size (); i++)
+ spec += selectorList->getRef (i)->selector->specificity ();
+
+ return spec;
+}
+
void CssSelector::print () {
for (int i = 0; i < selectorList->size (); i++) {
selectorList->getRef (i)->selector->print ();
@@ -180,6 +189,23 @@ bool CssSimpleSelector::match (const DoctreeNode *n) {
return true;
}
+int CssSimpleSelector::specificity () {
+ int spec = 0;
+
+ if (id)
+ spec++;
+ spec <<= 10;
+ if (klass)
+ spec++;
+ if (pseudo)
+ spec++;
+ spec <<= 10;
+ if (element != ELEMENT_ANY)
+ spec++;
+
+ return spec;
+}
+
void CssSimpleSelector::print () {
fprintf (stderr, "Element %d, class %s, pseudo %s, id %s ",
element, klass, pseudo, id);
diff --git a/src/css.hh b/src/css.hh
index 87f8f902..0b8018af 100644
--- a/src/css.hh
+++ b/src/css.hh
@@ -223,6 +223,7 @@ class CssSimpleSelector {
CssSimpleSelector ();
~CssSimpleSelector ();
bool match (const DoctreeNode *node);
+ int specificity ();
void print ();
};
@@ -257,6 +258,7 @@ class CssSelector {
};
inline int size () { return selectorList->size (); };
bool match (Doctree *dt, const DoctreeNode *node);
+ int specificity ();
void print ();
inline void ref () { refCount++; }
inline void unref () { if(--refCount == 0) delete this; }