diff options
author | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2008-11-30 22:40:22 +0100 |
---|---|---|
committer | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2008-11-30 22:40:22 +0100 |
commit | ad43591f7b4f6734ba275444f0090f2f0caa0467 (patch) | |
tree | ec4e5e0d487327bc419a72e5697eb3750325c4c7 | |
parent | a39d434e6169c62624ad24ad600e1ac62d6fb2ff (diff) |
factor out Css_parse_simple_selector()
-rw-r--r-- | src/css.cc | 6 | ||||
-rw-r--r-- | src/css.hh | 12 | ||||
-rw-r--r-- | src/cssparser.cc | 28 |
3 files changed, 30 insertions, 16 deletions
@@ -109,7 +109,7 @@ void CssSelector::print () { } bool CssSimpleSelector::match (const DoctreeNode *n) { - if (element >= 0 && element != n->element) + if (element != ELEMENT_ANY && element != n->element) return false; if (klass != NULL && (n->klass == NULL || strcasecmp (klass, n->klass) != 0)) @@ -227,8 +227,8 @@ void CssContext::addRule (CssRule *rule, CssPrimaryOrder order) { sheet[order]->addRule (rule); -// fprintf(stderr, "Adding Rule (%d)\n", order); -// rule->print (); + fprintf(stderr, "Adding Rule (%d)\n", order); + rule->print (); } void CssContext::buildUserAgentStyle () { @@ -195,6 +195,11 @@ class CssPropertyList : public lout::misc::SimpleVector <CssProperty> { class CssSimpleSelector { public: + enum { + ELEMENT_NONE = -1, + ELEMENT_ANY = -2, + }; + int element; const char *klass, *pseudo, *id; @@ -220,9 +225,12 @@ class CssSelector { lout::misc::SimpleVector <Combinator> *combinator; public: - CssSelector (int element = -1, const char *klass = NULL, + CssSelector (int element = CssSimpleSelector::ELEMENT_ANY, + const char *klass = NULL, const char *pseudo = NULL, const char *id = NULL); - void addSimpleSelector (Combinator c, int element = -1, const char *klass = NULL, + void addSimpleSelector (Combinator c, + int element = CssSimpleSelector::ELEMENT_ANY, + const char *klass = NULL, const char *pseudo = NULL, const char *id = NULL); inline CssSimpleSelector *top () { return simpleSelector->getRef (simpleSelector->size () - 1); diff --git a/src/cssparser.cc b/src/cssparser.cc index 2edee0c6..06fa91ad 100644 --- a/src/cssparser.cc +++ b/src/cssparser.cc @@ -922,15 +922,15 @@ static void Css_parse_declaration(CssParser * parser, Css_next_token(parser); } -static CssSelector *Css_parse_selector(CssParser * parser) { - CssSelector *selector = new CssSelector (); +static void Css_parse_simple_selector(CssParser * parser, + CssSimpleSelector *selector) { const char *p, **pp; if (parser->ttype == CSS_TK_SYMBOL) { - selector->top ()->element = a_Html_tag_index(parser->tval); + selector->element = a_Html_tag_index(parser->tval); Css_next_token(parser); } else if (parser->ttype == CSS_TK_CHAR && parser->tval[0] == '*') { - selector->top ()->element = CssSimpleSelector::ELEMENT_ANY; + selector->element = CssSimpleSelector::ELEMENT_ANY; Css_next_token(parser); } @@ -939,13 +939,13 @@ static CssSelector *Css_parse_selector(CssParser * parser) { if (parser->ttype == CSS_TK_CHAR) { switch (parser->tval[0]) { case '#': - pp = &selector->top ()->id; + pp = &selector->id; break; case '.': - pp = &selector->top ()->klass; + pp = &selector->klass; break; case ':': - pp = &selector->top ()->pseudo; + pp = &selector->pseudo; break; } } @@ -964,8 +964,8 @@ static CssSelector *Css_parse_selector(CssParser * parser) { p = strchr(parser->tval, '.'); if (*pp == NULL) *pp = dStrndup(parser->tval, p - parser->tval); - if (selector->top ()->klass == NULL) - selector->top ()->klass = dStrdup(p + 1); + if (selector->klass == NULL) + selector->klass = dStrdup(p + 1); Css_next_token(parser); } } @@ -978,8 +978,14 @@ static CssSelector *Css_parse_selector(CssParser * parser) { Css_next_token(parser); DEBUG_MSG(DEBUG_PARSE_LEVEL, "end of selector (%s, %s, %s, %d)\n", - selector->top ()->id, selector->top ()->klass, - selector->top ()->pseudo, selector->top ()->element); + selector->id, selector->klass, + selector->pseudo, selector->element); +} + +static CssSelector *Css_parse_selector(CssParser * parser) { + CssSelector *selector = new CssSelector (); + + Css_parse_simple_selector (parser, selector->top ()); return selector; } |