diff options
author | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2008-11-30 18:26:49 +0100 |
---|---|---|
committer | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2008-11-30 18:26:49 +0100 |
commit | a39d434e6169c62624ad24ad600e1ac62d6fb2ff (patch) | |
tree | 5315c2758ace09825e25a99cd8e9c5d9c5c810f6 | |
parent | 8ecece7b09f61f4d39334ca66639f3ae865cf48e (diff) |
factor out Css_parse_selector()
-rw-r--r-- | src/cssparser.cc | 119 |
1 files changed, 61 insertions, 58 deletions
diff --git a/src/cssparser.cc b/src/cssparser.cc index 3578f56c..2edee0c6 100644 --- a/src/cssparser.cc +++ b/src/cssparser.cc @@ -922,78 +922,81 @@ static void Css_parse_declaration(CssParser * parser, Css_next_token(parser); } -static void Css_parse_ruleset(CssParser * parser) -{ - lout::misc::SimpleVector < CssSelector * >*list; - CssPropertyList *props, *importantProps; - CssSelector *selector; +static CssSelector *Css_parse_selector(CssParser * parser) { + CssSelector *selector = new CssSelector (); const char *p, **pp; - list = new lout::misc::SimpleVector < CssSelector * >(1); - - while (true) { - selector = new CssSelector(); - selector->ref(); - - if (parser->ttype == CSS_TK_SYMBOL) { - selector->top ()->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; - Css_next_token(parser); - } + if (parser->ttype == CSS_TK_SYMBOL) { + selector->top ()->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; + Css_next_token(parser); + } - do { - pp = NULL; - if (parser->ttype == CSS_TK_CHAR) { - switch (parser->tval[0]) { - case '#': - pp = &selector->top ()->id; - break; - case '.': - pp = &selector->top ()->klass; - break; + do { + pp = NULL; + if (parser->ttype == CSS_TK_CHAR) { + switch (parser->tval[0]) { + case '#': + pp = &selector->top ()->id; + break; + case '.': + pp = &selector->top ()->klass; + break; case ':': - pp = &selector->top ()->pseudo; - break; - } + pp = &selector->top ()->pseudo; + break; } + } - if (pp) { - Css_next_token(parser); - if (parser->ttype == CSS_TK_SYMBOL || - parser->ttype == CSS_TK_DECINT) { + if (pp) { + Css_next_token(parser); + if (parser->ttype == CSS_TK_SYMBOL || + parser->ttype == CSS_TK_DECINT) { if (*pp == NULL) *pp = dStrdup(parser->tval); Css_next_token(parser); - } else if (parser->ttype == CSS_TK_FLOAT) { - /* In this case, we are actually interested in three tokens: - * number, '.', number. Instead, we have a decimal fraction, - * which we split up again. */ - 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); - Css_next_token(parser); - } + } else if (parser->ttype == CSS_TK_FLOAT) { + /* In this case, we are actually interested in three tokens: + * number, '.', number. Instead, we have a decimal fraction, + * which we split up again. */ + 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); + Css_next_token(parser); } - } while (pp); + } + } while (pp); - /* Skip all tokens which may "belong" to this selector. */ - while (!(parser->ttype == CSS_TK_END || - (parser->ttype == CSS_TK_CHAR && - (parser->tval[0] == ',' || parser->tval[0] == '{')))) - Css_next_token(parser); + /* Skip all tokens which may "belong" to this selector. */ + while (!(parser->ttype == CSS_TK_END || + (parser->ttype == CSS_TK_CHAR && + (parser->tval[0] == ',' || parser->tval[0] == '{')))) + Css_next_token(parser); - if (selector) - 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); - else - DEBUG_MSG(DEBUG_PARSE_LEVEL, "not a %s\n", "selector"); + 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); + + return selector; +} + +static void Css_parse_ruleset(CssParser * parser) +{ + lout::misc::SimpleVector < CssSelector * >*list; + CssPropertyList *props, *importantProps; + CssSelector *selector; + + list = new lout::misc::SimpleVector < CssSelector * >(1); + + while (true) { + selector = Css_parse_selector(parser); if (selector) { + selector->ref(); list->increase(); list->set(list->size() - 1, selector); } |