diff options
author | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2009-07-11 16:40:35 +0200 |
---|---|---|
committer | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2009-07-11 16:40:35 +0200 |
commit | b2e341a63d6b2d5e458aa3511b66ca43e040da8f (patch) | |
tree | 31567056180eb47ad60cae4c466443acfadffa42 | |
parent | 3c9d42d1fbfe6dc6c74360faec48c09e8449506f (diff) |
make CssSimpleSelector members private
-rw-r--r-- | src/css.cc | 35 | ||||
-rw-r--r-- | src/css.hh | 18 | ||||
-rw-r--r-- | src/cssparser.cc | 23 |
3 files changed, 54 insertions, 22 deletions
@@ -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; } } @@ -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, |