summaryrefslogtreecommitdiff
path: root/src/parse/css21.c
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2008-10-18 15:20:19 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2008-10-18 15:20:19 +0000
commitc2d6c66c89118cd9f32343ece82cb43e8687c7aa (patch)
tree3db2419b5026e87492fbfa7656b3f922f042ee3f /src/parse/css21.c
parent71c08ab16507d3d8a961fbc9c40da8f2788fac00 (diff)
downloadlibcss-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.c117
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;
}