diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/css.cc | 26 | ||||
-rw-r--r-- | src/css.hh | 2 |
2 files changed, 28 insertions, 0 deletions
@@ -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); @@ -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; } |