diff options
-rw-r--r-- | src/css.cc | 36 | ||||
-rw-r--r-- | src/doctree.hh | 4 | ||||
-rw-r--r-- | src/styleengine.cc | 11 |
3 files changed, 38 insertions, 13 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]; diff --git a/src/doctree.hh b/src/doctree.hh index 53ae76e0..30762e44 100644 --- a/src/doctree.hh +++ b/src/doctree.hh @@ -1,12 +1,14 @@ #ifndef __DOCTREE_HH__ #define __DOCTREE_HH__ +#include "lout/misc.hh" + class DoctreeNode { public: int num; // unique ascending id int depth; int element; - const char *klass; + lout::misc::SimpleVector<char*> *klass; const char *pseudo; const char *id; }; diff --git a/src/styleengine.cc b/src/styleengine.cc index 4839931c..54d6a8f5 100644 --- a/src/styleengine.cc +++ b/src/styleengine.cc @@ -100,7 +100,9 @@ void StyleEngine::setId (const char *id) { void StyleEngine::setClass (const char *klass) { Node *n = stack->getRef (stack->size () - 1); assert (n->klass == NULL); - n->klass = dStrdup (klass); + n->klass = new lout::misc::SimpleVector<char*>(1); + n->klass->increase (); + n->klass->set (0, dStrdup (klass)); }; void StyleEngine::setStyle (const char *style) { @@ -161,8 +163,11 @@ void StyleEngine::endElement (int element) { n->wordStyle->unref (); if (n->id) dFree ((void*) n->id); - if (n->klass) - dFree ((void*) n->klass); + if (n->klass) { + for (int i = 0; i < n->klass->size (); i++) + dFree (n->klass->get(i)); + delete n->klass; + } if (n->styleAttribute) dFree ((void*) n->styleAttribute); |