Gitweb links:

...log 
http://git.netsurf-browser.org/libcss.git/shortlog/f1d2dfec8a0ffe90171c547b912613388538f273
...commit 
http://git.netsurf-browser.org/libcss.git/commit/f1d2dfec8a0ffe90171c547b912613388538f273
...tree 
http://git.netsurf-browser.org/libcss.git/tree/f1d2dfec8a0ffe90171c547b912613388538f273

The branch, tlsa/jmb/mq has been updated
       via  f1d2dfec8a0ffe90171c547b912613388538f273 (commit)
      from  84d60a9fd17a4192924fd11040a310737e850438 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commitdiff 
http://git.netsurf-browser.org/libcss.git/commit/?id=f1d2dfec8a0ffe90171c547b912613388538f273
commit f1d2dfec8a0ffe90171c547b912613388538f273
Author: Michael Drake <[email protected]>
Commit: Michael Drake <[email protected]>

    Media Queries: Implement parsing <general-enclosed>.

diff --git a/src/parse/mq.c b/src/parse/mq.c
index 719e129..172b618 100644
--- a/src/parse/mq.c
+++ b/src/parse/mq.c
@@ -433,14 +433,118 @@ static css_error mq_parse_media_feature(css_language *c,
        return CSS_OK;
 }
 
+/*
+ * Consume any value
+ *
+ * CSS Syntax Module Level 3: 8.2
+ */
+static css_error mq_parse_consume_any_value(css_language *c,
+               const parserutils_vector *vector, int *ctx,
+               const char *until_char)
+{
+       const css_token *token;
+       css_error error;
+
+       while (true) {
+               consumeWhitespace(vector, ctx);
+
+               token = parserutils_vector_iterate(vector, ctx);
+               if (token == NULL) {
+                       return CSS_INVALID;
+               }
+
+               switch (token->type) {
+               case CSS_TOKEN_INVALID_STRING:
+                       return CSS_INVALID;
+
+               case CSS_TOKEN_CHAR:
+                       if (until_char != NULL) {
+                               if (tokenIsChar(token, *until_char)) {
+                                       /* Found matching close bracket */
+                                       return CSS_OK;
+
+                               } else if (tokenIsChar(token, ')') ||
+                                          tokenIsChar(token, ']') ||
+                                          tokenIsChar(token, '}')) {
+                                       /* Non-matching close bracket */
+                                       return CSS_INVALID;
+                               } else if (tokenIsChar(token, ';')) {
+                                       /* Non-top-level semi-colon */
+                                       return CSS_INVALID;
+                               }
+                       }
+                       if (tokenIsChar(token, '(')) {
+                               /* Need to consume until matching bracket. */
+                               error = mq_parse_consume_any_value(
+                                               c, vector, ctx, ")");
+                               if (error != CSS_OK) {
+                                       return error;
+                               }
+                       } else if (tokenIsChar(token, '[')) {
+                               /* Need to consume until matching bracket. */
+                               error = mq_parse_consume_any_value(
+                                               c, vector, ctx, "]");
+                               if (error != CSS_OK) {
+                                       return error;
+                               }
+                       } else if (tokenIsChar(token, '{')) {
+                               /* Need to consume until matching bracket. */
+                               error = mq_parse_consume_any_value(
+                                               c, vector, ctx, "}");
+                               if (error != CSS_OK) {
+                                       return error;
+                               }
+                       }
+                       break;
+
+               default:
+                       break;
+               }
+       }
+
+       return CSS_OK;
+}
+
 static css_error mq_parse_general_enclosed(css_language *c,
                const parserutils_vector *vector, int *ctx)
 {
+       const css_token *token;
+       css_error error;
+
        /* <general-enclosed> = [ <function-token> <any-value> ) ]
         *                    | ( <ident> <any-value> )
         */
 
-       /* TODO: implement */
+       token = parserutils_vector_iterate(vector, ctx);
+       if (token == NULL) {
+               return CSS_INVALID;
+       }
+
+       switch (token->type) {
+       case CSS_TOKEN_FUNCTION:
+               error = mq_parse_consume_any_value(c, vector, ctx, NULL);
+               if (error != CSS_OK) {
+                       return error;
+               }
+
+               consumeWhitespace(vector, ctx);
+
+               token = parserutils_vector_iterate(vector, ctx);
+               if (!tokenIsChar(token, ')')) {
+                       return CSS_INVALID;
+               }
+               break;
+
+       case CSS_TOKEN_IDENT:
+               error = mq_parse_consume_any_value(c, vector, ctx, NULL);
+               if (error != CSS_OK) {
+                       return error;
+               }
+               break;
+
+       default:
+               return CSS_INVALID;
+       }
 
        return CSS_OK;
 }


-----------------------------------------------------------------------

Summary of changes:
 src/parse/mq.c |  106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 105 insertions(+), 1 deletion(-)

diff --git a/src/parse/mq.c b/src/parse/mq.c
index 719e129..172b618 100644
--- a/src/parse/mq.c
+++ b/src/parse/mq.c
@@ -433,14 +433,118 @@ static css_error mq_parse_media_feature(css_language *c,
        return CSS_OK;
 }
 
+/*
+ * Consume any value
+ *
+ * CSS Syntax Module Level 3: 8.2
+ */
+static css_error mq_parse_consume_any_value(css_language *c,
+               const parserutils_vector *vector, int *ctx,
+               const char *until_char)
+{
+       const css_token *token;
+       css_error error;
+
+       while (true) {
+               consumeWhitespace(vector, ctx);
+
+               token = parserutils_vector_iterate(vector, ctx);
+               if (token == NULL) {
+                       return CSS_INVALID;
+               }
+
+               switch (token->type) {
+               case CSS_TOKEN_INVALID_STRING:
+                       return CSS_INVALID;
+
+               case CSS_TOKEN_CHAR:
+                       if (until_char != NULL) {
+                               if (tokenIsChar(token, *until_char)) {
+                                       /* Found matching close bracket */
+                                       return CSS_OK;
+
+                               } else if (tokenIsChar(token, ')') ||
+                                          tokenIsChar(token, ']') ||
+                                          tokenIsChar(token, '}')) {
+                                       /* Non-matching close bracket */
+                                       return CSS_INVALID;
+                               } else if (tokenIsChar(token, ';')) {
+                                       /* Non-top-level semi-colon */
+                                       return CSS_INVALID;
+                               }
+                       }
+                       if (tokenIsChar(token, '(')) {
+                               /* Need to consume until matching bracket. */
+                               error = mq_parse_consume_any_value(
+                                               c, vector, ctx, ")");
+                               if (error != CSS_OK) {
+                                       return error;
+                               }
+                       } else if (tokenIsChar(token, '[')) {
+                               /* Need to consume until matching bracket. */
+                               error = mq_parse_consume_any_value(
+                                               c, vector, ctx, "]");
+                               if (error != CSS_OK) {
+                                       return error;
+                               }
+                       } else if (tokenIsChar(token, '{')) {
+                               /* Need to consume until matching bracket. */
+                               error = mq_parse_consume_any_value(
+                                               c, vector, ctx, "}");
+                               if (error != CSS_OK) {
+                                       return error;
+                               }
+                       }
+                       break;
+
+               default:
+                       break;
+               }
+       }
+
+       return CSS_OK;
+}
+
 static css_error mq_parse_general_enclosed(css_language *c,
                const parserutils_vector *vector, int *ctx)
 {
+       const css_token *token;
+       css_error error;
+
        /* <general-enclosed> = [ <function-token> <any-value> ) ]
         *                    | ( <ident> <any-value> )
         */
 
-       /* TODO: implement */
+       token = parserutils_vector_iterate(vector, ctx);
+       if (token == NULL) {
+               return CSS_INVALID;
+       }
+
+       switch (token->type) {
+       case CSS_TOKEN_FUNCTION:
+               error = mq_parse_consume_any_value(c, vector, ctx, NULL);
+               if (error != CSS_OK) {
+                       return error;
+               }
+
+               consumeWhitespace(vector, ctx);
+
+               token = parserutils_vector_iterate(vector, ctx);
+               if (!tokenIsChar(token, ')')) {
+                       return CSS_INVALID;
+               }
+               break;
+
+       case CSS_TOKEN_IDENT:
+               error = mq_parse_consume_any_value(c, vector, ctx, NULL);
+               if (error != CSS_OK) {
+                       return error;
+               }
+               break;
+
+       default:
+               return CSS_INVALID;
+       }
 
        return CSS_OK;
 }


-- 
Cascading Style Sheets library

_______________________________________________
netsurf-commits mailing list
[email protected]
http://listmaster.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org

Reply via email to