summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/css.cc35
-rw-r--r--src/css.hh18
-rw-r--r--src/cssparser.cc23
3 files changed, 54 insertions, 22 deletions
diff --git a/src/css.cc b/src/css.cc
index 04bd8414..b5ec54a4 100644
--- a/src/css.cc
+++ b/src/css.cc
@@ -200,6 +200,25 @@ CssSimpleSelector::~CssSimpleSelector () {
dFree (pseudo);
}
+void CssSimpleSelector::setSelect (SelectType t, const char *v) {
+ switch (t) {
+ case SELECT_CLASS:
+ if (klass == NULL)
+ klass = dStrdup (v);
+ break;
+ case SELECT_PSEUDO_CLASS:
+ if (pseudo == NULL)
+ pseudo = dStrdup (v);
+ break;
+ case SELECT_ID:
+ if (id == NULL)
+ id = dStrdup (v);
+ break;
+ default:
+ break;
+ }
+}
+
/**
* \brief Return whether simple selector matches at a given node of
* the document tree.
@@ -327,8 +346,8 @@ void CssStyleSheet::addRule (CssRule *rule) {
RuleList *ruleList = NULL;
lout::object::ConstString *string;
- if (top->id) {
- string = new lout::object::ConstString (top->id);
+ if (top->getId ()) {
+ string = new lout::object::ConstString (top->getId ());
ruleList = idTable->get (string);
if (ruleList == NULL) {
ruleList = new RuleList ();
@@ -336,8 +355,8 @@ void CssStyleSheet::addRule (CssRule *rule) {
} else {
delete string;
}
- } else if (top->klass) {
- string = new lout::object::ConstString (top->klass);
+ } else if (top->getClass ()) {
+ string = new lout::object::ConstString (top->getClass ());
ruleList = classTable->get (string);
if (ruleList == NULL) {
ruleList = new RuleList;
@@ -345,16 +364,16 @@ void CssStyleSheet::addRule (CssRule *rule) {
} else {
delete string;
}
- } else if (top->element >= 0 && top->element < ntags) {
- ruleList = elementTable[top->element];
- } else if (top->element == CssSimpleSelector::ELEMENT_ANY) {
+ } else if (top->getElement () >= 0 && top->getElement () < ntags) {
+ ruleList = elementTable[top->getElement ()];
+ } else if (top->getElement () == CssSimpleSelector::ELEMENT_ANY) {
ruleList = anyTable;
}
if (ruleList) {
ruleList->insert (rule);
} else {
- assert (top->element == CssSimpleSelector::ELEMENT_NONE);
+ assert (top->getElement () == CssSimpleSelector::ELEMENT_NONE);
delete rule;
}
}
diff --git a/src/css.hh b/src/css.hh
index c6749fe2..462031e0 100644
--- a/src/css.hh
+++ b/src/css.hh
@@ -312,17 +312,31 @@ class CssPropertyList : public lout::misc::SimpleVector <CssProperty> {
};
class CssSimpleSelector {
+ private:
+ int element;
+ char *klass, *pseudo, *id;
+
public:
enum {
ELEMENT_NONE = -1,
ELEMENT_ANY = -2,
};
- int element;
- char *klass, *pseudo, *id;
+ typedef enum {
+ SELECT_NONE,
+ SELECT_CLASS,
+ SELECT_PSEUDO_CLASS,
+ SELECT_ID,
+ } SelectType;
CssSimpleSelector ();
~CssSimpleSelector ();
+ inline void setElement (int e) { element = e; };
+ void setSelect (SelectType t, const char *v);
+ inline const char *getClass () { return klass; };
+ inline const char *getPseudoClass () { return pseudo; };
+ inline const char *getId () { return id; };
+ inline int getElement () { return element; };
bool match (const DoctreeNode *node);
int specificity ();
void print ();
diff --git a/src/cssparser.cc b/src/cssparser.cc
index f235048b..2550e74e 100644
--- a/src/cssparser.cc
+++ b/src/cssparser.cc
@@ -1118,15 +1118,15 @@ void CssParser::parseDeclaration(CssPropertyList * props,
bool CssParser::parseSimpleSelector(CssSimpleSelector *selector)
{
- char **pp;
+ CssSimpleSelector::SelectType selectType;
if (ttype == CSS_TK_SYMBOL) {
- selector->element = a_Html_tag_index(tval);
+ selector->setElement (a_Html_tag_index(tval));
nextToken();
if (spaceSeparated)
return true;
} else if (ttype == CSS_TK_CHAR && tval[0] == '*') {
- selector->element = CssSimpleSelector::ELEMENT_ANY;
+ selector->setElement (CssSimpleSelector::ELEMENT_ANY);
nextToken();
if (spaceSeparated)
return true;
@@ -1140,18 +1140,18 @@ bool CssParser::parseSimpleSelector(CssSimpleSelector *selector)
}
do {
- pp = NULL;
+ selectType = CssSimpleSelector::SELECT_NONE;
if (ttype == CSS_TK_CHAR) {
switch (tval[0]) {
case '#':
- pp = &selector->id;
+ selectType = CssSimpleSelector::SELECT_ID;
break;
case '.':
- pp = &selector->klass;
+ selectType = CssSimpleSelector::SELECT_CLASS;
break;
case ':':
- pp = &selector->pseudo;
- if (*pp)
+ selectType = CssSimpleSelector::SELECT_PSEUDO_CLASS;
+ if (selector->getPseudoClass ())
// pseudo class has been set already.
// As dillo currently only supports :link and :visisted, a
// selector with more than one pseudo class will never match.
@@ -1162,14 +1162,13 @@ bool CssParser::parseSimpleSelector(CssSimpleSelector *selector)
}
}
- if (pp) {
+ if (selectType != CssSimpleSelector::SELECT_NONE) {
nextToken();
if (spaceSeparated)
return true;
if (ttype == CSS_TK_SYMBOL) {
- if (*pp == NULL)
- *pp = dStrdup(tval);
+ selector->setSelect (selectType, tval);
nextToken();
} else {
return false; // don't accept classes or id's starting with integer
@@ -1177,7 +1176,7 @@ bool CssParser::parseSimpleSelector(CssSimpleSelector *selector)
if (spaceSeparated)
return true;
}
- } while (pp);
+ } while (selectType != CssSimpleSelector::SELECT_NONE);
DEBUG_MSG(DEBUG_PARSE_LEVEL, "end of simple selector (%s, %s, %s, %d)\n",
selector->id, selector->klass,