summaryrefslogtreecommitdiff
path: root/src/stylesheet.c
diff options
context:
space:
mode:
authorMichael Drake <michael.drake@codethink.co.uk>2018-08-01 15:38:49 +0100
committerMichael Drake <michael.drake@codethink.co.uk>2019-03-10 13:42:03 +0000
commit3342c8e3bafba86ff1154db940891a3405cb1c30 (patch)
treefb1b24398bbe01ee4932aecf86acfa1efa644d41 /src/stylesheet.c
parent9eea40513329fbd10d494f5a2d29664847043c4c (diff)
downloadlibcss-3342c8e3bafba86ff1154db940891a3405cb1c30.tar.gz
libcss-3342c8e3bafba86ff1154db940891a3405cb1c30.tar.bz2
HACKS for testing Media Queries parsing.
Top level stylesheets need to have their media query passed in. So we need a way to parse standalone media queries. This was hacked together to explore doing that. However, it encounteded an issue where it seems the parseAtRule() function in src/parse/parse.c doesn't handle the full grammar for media queries.
Diffstat (limited to 'src/stylesheet.c')
-rw-r--r--src/stylesheet.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/stylesheet.c b/src/stylesheet.c
index 22c7681..934954c 100644
--- a/src/stylesheet.c
+++ b/src/stylesheet.c
@@ -113,6 +113,113 @@ css_error css__stylesheet_string_get(css_stylesheet *sheet,
return CSS_OK;
}
+static css_error css_parse_media_query_handle_event(css_parser_event type,
+ const parserutils_vector *tokens, void *pw)
+{
+ int idx = 0;
+ css_error err;
+ css_mq_query *media;
+ const css_token *tok;
+ lwc_string **strings = pw;
+
+ printf("mq event type: %i\n", type);
+
+ /* Skip @media */
+ tok = parserutils_vector_iterate(tokens, &idx);
+ assert(tok->type == CSS_TOKEN_ATKEYWORD);
+ UNUSED(tok);
+
+ /* Skip whitespace */
+ tok = parserutils_vector_iterate(tokens, &idx);
+ assert(tok->type == CSS_TOKEN_S);
+ UNUSED(tok);
+
+ printf(" Tokens:\n");
+ while ((tok = parserutils_vector_iterate(tokens, &idx)) != NULL) {
+ if (tok->idata != NULL) {
+ printf(" - (%i) %s\n",
+ tok->type,
+ lwc_string_data(tok->idata));
+ } else {
+ printf(" - (%i)\n", tok->type);
+ }
+ }
+ idx = 2;
+
+ err = css__mq_parse_media_list(strings, tokens, &idx, &media);
+ if (err != CSS_OK) {
+ printf("Error parsing mq\n");
+ return CSS_OK;
+ }
+
+ printf("PARSED MQ!!!!!!!\n");
+ css__mq_query_destroy(media);
+
+ return CSS_OK;
+}
+
+static css_error css_parse_media_query(lwc_string **strings,
+ const uint8_t *mq, size_t len)
+{
+ css_error err;
+ css_parser *parser;
+ css_parser_optparams params_quirks = {
+ .quirks = false,
+ };
+ css_parser_optparams params_handler = {
+ .event_handler = {
+ .handler = css_parse_media_query_handle_event,
+ .pw = strings,
+ },
+ };
+
+ err = css__parser_create_for_media_query(NULL,
+ CSS_CHARSET_DEFAULT, &parser);
+ if (err != CSS_OK) {
+ return err;
+ }
+
+ err = css__parser_setopt(parser, CSS_PARSER_QUIRKS,
+ &params_quirks);
+ if (err != CSS_OK) {
+ css__parser_destroy(parser);
+ return err;
+ }
+
+ err = css__parser_setopt(parser, CSS_PARSER_EVENT_HANDLER,
+ &params_handler);
+ if (err != CSS_OK) {
+ css__parser_destroy(parser);
+ return err;
+ }
+
+ printf("try parsing a mq\n");
+ err = css__parser_parse_chunk(parser,
+ (const uint8_t *)"@media ",
+ strlen("@media "));
+ if (err != CSS_OK && err != CSS_NEEDDATA) {
+ css__parser_destroy(parser);
+ return err;
+ }
+
+ err = css__parser_parse_chunk(parser, mq, len);
+ if (err != CSS_OK && err != CSS_NEEDDATA) {
+ css__parser_destroy(parser);
+ return err;
+ }
+
+ err = css__parser_completed(parser);
+ if (err != CSS_OK) {
+ css__parser_destroy(parser);
+ return err;
+ }
+
+ css__parser_destroy(parser);
+
+ return CSS_OK;
+}
+
+
/**
* Create a stylesheet
*
@@ -144,6 +251,9 @@ css_error css_stylesheet_create(const css_stylesheet_params *params,
free(sheet);
return error;
}
+css_parse_media_query(sheet->propstrings,
+ (const uint8_t *)"screen and (min-width: 30em)",
+ strlen("screen and (min-width: 30em)"));
sheet->inline_style = params->inline_style;