aboutsummaryrefslogtreecommitdiff
path: root/src/css.cc
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2008-11-30 15:37:15 +0100
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2008-11-30 15:37:15 +0100
commitd8696fd1573d5c0ddeed513a829438f973c6347d (patch)
tree683b7ad3f9880a136311b57f2d687ae202bceb90 /src/css.cc
parenta3b7a1089c51316d86cb1f765297b1ecc6d5b352 (diff)
make CssSelector a list of CssSimpleSelector objects
Diffstat (limited to 'src/css.cc')
-rw-r--r--src/css.cc65
1 files changed, 58 insertions, 7 deletions
diff --git a/src/css.cc b/src/css.cc
index 38b6a2eb..3e20677f 100644
--- a/src/css.cc
+++ b/src/css.cc
@@ -48,16 +48,67 @@ void CssPropertyList::print () {
CssSelector::CssSelector (int element, const char *klass,
const char *pseudo, const char *id) {
refCount = 0;
- this->element = element;
- this->klass = klass;
- this->pseudo = pseudo;
- this->id = id;
+ combinator = NULL;
+ simpleSelector = new lout::misc::SimpleVector <CssSimpleSelector> (1);
+ simpleSelector->increase ();
+ top ()->element = element;
+ top ()->klass = klass;
+ top ()->pseudo = pseudo;
+ top ()->id = id;
};
-/** \todo implement all selection option CSS offers */
bool CssSelector::match (Doctree *docTree) {
- const DoctreeNode *n = docTree-> top ();
+ CssSimpleSelector *sel;
+ Combinator comb;
+ const DoctreeNode *node = docTree->top ();
+ assert (simpleSelector->size () > 0);
+ assert ((combinator == NULL && simpleSelector->size () == 1) ||
+ combinator->size () == simpleSelector->size () - 1);
+
+ sel = simpleSelector->getRef (simpleSelector->size () - 1);
+
+ if (! sel->match (node))
+ return false;
+
+ for (int i = simpleSelector->size () - 2; i > 0; i--) {
+ sel = simpleSelector->getRef (i);
+ comb = combinator->get (i);
+ node = docTree->parent (node);
+
+ if (node == NULL)
+ return false;
+
+ switch (comb) {
+ case DESCENDENT:
+ if (!sel->match (node))
+ return false;
+ break;
+ default:
+ return false; // \todo implement other combinators
+ }
+ }
+
+ return true;
+}
+
+void CssSelector::print () {
+ for (int i = 0; i < simpleSelector->size () - 1; i++) {
+ simpleSelector->getRef (i)->print ();
+ switch (combinator->get (i)) {
+ case DESCENDENT:
+ fprintf (stderr, " ");
+ break;
+ default:
+ fprintf (stderr, "?");
+ break;
+ }
+ }
+
+ top ()->print ();
+}
+
+bool CssSimpleSelector::match (const DoctreeNode *n) {
if (element >= 0 && element != n->element)
return false;
if (klass != NULL &&
@@ -72,7 +123,7 @@ bool CssSelector::match (Doctree *docTree) {
return true;
}
-void CssSelector::print () {
+void CssSimpleSelector::print () {
fprintf (stderr, "Element %d, class %s, pseudo %s, id %s\n",
element, klass, pseudo, id);
}