diff options
author | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2009-07-11 10:54:22 +0200 |
---|---|---|
committer | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2009-07-11 10:54:22 +0200 |
commit | 92951c2618b06624bba093362fb74562a892c967 (patch) | |
tree | 32779e270274158ceda1d375e921153a88b8abcb /src/css.cc | |
parent | 4371343a54b4aa3ee7db3061f6dc6326601598ea (diff) |
support multiple classes per doctree node
Diffstat (limited to 'src/css.cc')
-rw-r--r-- | src/css.cc | 36 |
1 files changed, 27 insertions, 9 deletions
@@ -12,6 +12,7 @@ #include <stdio.h> #include "../dlib/dlib.h" #include "misc.h" +#include "msg.h" #include "html_common.hh" #include "css.hh" #include "cssparser.hh" @@ -206,14 +207,24 @@ CssSimpleSelector::~CssSimpleSelector () { bool CssSimpleSelector::match (const DoctreeNode *n) { if (element != ELEMENT_ANY && element != n->element) return false; - if (klass != NULL && - (n->klass == NULL || dStrcasecmp (klass, n->klass) != 0)) - return false; if (pseudo != NULL && (n->pseudo == NULL || dStrcasecmp (pseudo, n->pseudo) != 0)) return false; if (id != NULL && (n->id == NULL || dStrcasecmp (id, n->id) != 0)) return false; + if (klass != NULL) { + bool found = false; + if (n->klass != NULL) { + for (int i = 0; i < n->klass->size (); i++) { + if (dStrcasecmp (klass, n->klass->get(i)) == 0) { + found = true; + break; + } + } + } + if (! found) + return false; + } return true; } @@ -356,8 +367,8 @@ void CssStyleSheet::addRule (CssRule *rule) { */ void CssStyleSheet::apply (CssPropertyList *props, Doctree *docTree, const DoctreeNode *node) { - RuleList *ruleList[4]; - int numLists = 0, index[4] = {0, 0, 0, 0}; + RuleList *ruleList[32]; + int numLists = 0, index[32] = {0}; if (node->id) { lout::object::ConstString idString (node->id); @@ -368,11 +379,18 @@ void CssStyleSheet::apply (CssPropertyList *props, } if (node->klass) { - lout::object::ConstString classString (node->klass); + for (int i = 0; i < node->klass->size (); i++) { + if (i >= 16) { + MSG_WARN("Maximum number of classes per node exceeded.\n"); + break; + } - ruleList[numLists] = classTable->get (&classString); - if (ruleList[numLists]) - numLists++; + lout::object::ConstString classString (node->klass->get (i)); + + ruleList[numLists] = classTable->get (&classString); + if (ruleList[numLists]) + numLists++; + } } ruleList[numLists] = elementTable[docTree->top ()->element]; |