aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2009-07-11 10:54:22 +0200
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2009-07-11 10:54:22 +0200
commit92951c2618b06624bba093362fb74562a892c967 (patch)
tree32779e270274158ceda1d375e921153a88b8abcb
parent4371343a54b4aa3ee7db3061f6dc6326601598ea (diff)
support multiple classes per doctree node
-rw-r--r--src/css.cc36
-rw-r--r--src/doctree.hh4
-rw-r--r--src/styleengine.cc11
3 files changed, 38 insertions, 13 deletions
diff --git a/src/css.cc b/src/css.cc
index 4031acfe..2846fe5b 100644
--- a/src/css.cc
+++ b/src/css.cc
@@ -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);