diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2008-10-18 15:20:19 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2008-10-18 15:20:19 +0000 |
commit | c2d6c66c89118cd9f32343ece82cb43e8687c7aa (patch) | |
tree | 3db2419b5026e87492fbfa7656b3f922f042ee3f /src/parse/css21.c | |
parent | 71c08ab16507d3d8a961fbc9c40da8f2788fac00 (diff) | |
download | libcss-c2d6c66c89118cd9f32343ece82cb43e8687c7aa.tar.gz libcss-c2d6c66c89118cd9f32343ece82cb43e8687c7aa.tar.bz2 |
More work on selector list parsing
svn path=/trunk/libcss/; revision=5597
Diffstat (limited to 'src/parse/css21.c')
-rw-r--r-- | src/parse/css21.c | 117 |
1 files changed, 99 insertions, 18 deletions
diff --git a/src/parse/css21.c b/src/parse/css21.c index a1f3516..ed07b1d 100644 --- a/src/parse/css21.c +++ b/src/parse/css21.c @@ -297,18 +297,13 @@ css_error handleStartAtRule(css_css21 *c, const parserutils_vector *vector) int32_t any = 0; int32_t ctx = 0; + atkeyword = parserutils_vector_iterate(vector, &ctx); + + /* Skip whitespace */ do { any = ctx; - token = parserutils_vector_iterate(vector, &ctx); - if (token == NULL) - break; - - if (atkeyword == NULL) - atkeyword = token; - else if (token->type != CSS_TOKEN_S) - break; - } while (token != NULL); + } while (token != NULL && token->type == CSS_TOKEN_S); /* We now have an ATKEYWORD and the context for the start of any0, if * there is one */ @@ -440,18 +435,18 @@ css_error handleBlockContent(css_css21 *c, const parserutils_vector *vector) return CSS_OK; } -css_error handleSelectorList(css_css21 *c, const parserutils_vector *vector) +static bool tokenIsChar(const css_token *token, uint8_t c) { - UNUSED(c); - UNUSED(vector); + return token != NULL && token->type == CSS_TOKEN_CHAR && + token->lower.len == 1 && token->lower.ptr[0] == c; +} - /* CSS 2.1 selector syntax: - * - * selector_list -> selector [ ',' ws selector ]* - * selector -> simple_selector [ combinator simple_selector ]* - * simple_selector -> element_name [ HASH | class | attrib | pseudo ]* +static css_error parseSimpleSelector(css_css21 *c, const parserutils_vector *vector, + int *ctx, css_selector **result) +{ + + /* simple_selector -> element_name [ HASH | class | attrib | pseudo ]* * -> [ HASH | class | attrib | pseudo ]+ - * combinator -> '+' ws | '>' ws | ws1 * element_name -> IDENT | '*' * class -> '.' IDENT * attrib -> '[' ws IDENT ws [ @@ -460,6 +455,92 @@ css_error handleSelectorList(css_css21 *c, const parserutils_vector *vector) * pseudo -> ':' [ IDENT | FUNCTION ws IDENT? ws ')' ] */ + UNUSED(c); + UNUSED(vector); + UNUSED(ctx); + UNUSED(result); + + return CSS_OK; +} + +static css_error parseCombinator(css_css21 *c, const parserutils_vector *vector, + int *ctx, css_combinator *result) +{ + /* combinator -> '+' ws | '>' ws | ws1 */ + + UNUSED(c); + UNUSED(vector); + UNUSED(ctx); + UNUSED(result); + + return CSS_OK; +} + +static css_error parseSelector(css_css21 *c, const parserutils_vector *vector, + int *ctx, css_selector **result) +{ + css_error error; + const css_token *token = NULL; + css_selector *selector = NULL; + + /* selector -> simple_selector [ combinator simple_selector ]* */ + + error = parseSimpleSelector(c, vector, ctx, &selector); + if (error != CSS_OK) + return error; + *result = selector; + + do { + css_combinator comb = CSS_COMBINATOR_NONE; + css_selector *other = NULL; + + error = parseCombinator(c, vector, ctx, &comb); + if (error != CSS_OK) + return error; + + error = parseSimpleSelector(c, vector, ctx, &other); + if (error != CSS_OK) + return error; + + *result = other; + + error = css_stylesheet_selector_combine(c->sheet, + comb, selector, other); + if (error != CSS_OK) + return error; + + selector = other; + + token = parserutils_vector_peek(vector, *ctx); + } while (token != NULL && tokenIsChar(token, ',') == false); + + return CSS_OK; +} + +css_error handleSelectorList(css_css21 *c, const parserutils_vector *vector) +{ + css_error error; + const css_token *token = NULL; + css_selector *selector = NULL; + int ctx = 0; + + UNUSED(c); + UNUSED(vector); + + /* CSS 2.1 selector syntax: + * + * selector_list -> selector [ ',' ws selector ]* + */ + do { + error = parseSelector(c, vector, &ctx, &selector); + if (error != CSS_OK) + return error; + + /** \todo Finish this */ + + token = parserutils_vector_peek(vector, ctx); + } while(token != NULL); + return CSS_OK; } |