From 4ea236159365de19fd77dab0f63db055de124f99 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sat, 14 Feb 2009 14:12:14 +0000 Subject: Parse media type list in @import rule svn path=/trunk/libcss/; revision=6490 --- src/parse/language.c | 56 +++++++++++++++++++++++++++++++++++++++++++------ src/parse/propstrings.h | 16 ++++++++++++++ 2 files changed, 66 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/parse/language.c b/src/parse/language.c index 8d20d62..a187379 100644 --- a/src/parse/language.c +++ b/src/parse/language.c @@ -409,6 +409,7 @@ css_error handleStartAtRule(css_language *c, const parserutils_vector *vector) if (c->state != HAD_RULE) { css_rule *rule; css_stylesheet *import; + css_media_type media = 0; css_error error; /* any0 = (STRING | URI) ws @@ -421,8 +422,54 @@ css_error handleStartAtRule(css_language *c, const parserutils_vector *vector) consumeWhitespace(vector, &ctx); - /** \todo Media list */ - if (parserutils_vector_peek(vector, ctx) != NULL) { + /* Parse media list */ + token = parserutils_vector_iterate(vector, &ctx); + + while (token != NULL) { + if (token->type != CSS_TOKEN_IDENT) + return CSS_INVALID; + + if (token->ilower == c->strings[AURAL]) { + media |= CSS_MEDIA_AURAL; + } else if (token->ilower == + c->strings[BRAILLE]) { + media |= CSS_MEDIA_BRAILLE; + } else if (token->ilower == + c->strings[EMBOSSED]) { + media |= CSS_MEDIA_EMBOSSED; + } else if (token->ilower == + c->strings[HANDHELD]) { + media |= CSS_MEDIA_HANDHELD; + } else if (token->ilower == + c->strings[PRINT]) { + media |= CSS_MEDIA_PRINT; + } else if (token->ilower == + c->strings[PROJECTION]) { + media |= CSS_MEDIA_PROJECTION; + } else if (token->ilower == + c->strings[SCREEN]) { + media |= CSS_MEDIA_SCREEN; + } else if (token->ilower == + c->strings[SPEECH]) { + media |= CSS_MEDIA_SPEECH; + } else if (token->ilower == c->strings[TTY]) { + media |= CSS_MEDIA_TTY; + } else if (token->ilower == c->strings[TV]) { + media |= CSS_MEDIA_TV; + } else if (token->ilower == c->strings[ALL]) { + media |= CSS_MEDIA_ALL; + } else + return CSS_INVALID; + + consumeWhitespace(vector, &ctx); + + token = parserutils_vector_iterate(vector, + &ctx); + if (token != NULL && tokenIsChar(token, ',') == + false) + return CSS_INVALID; + + consumeWhitespace(vector, &ctx); } error = css_stylesheet_rule_create(c->sheet, @@ -436,11 +483,8 @@ css_error handleStartAtRule(css_language *c, const parserutils_vector *vector) url[uri->idata->len] = '\0'; /* Create imported sheet */ - /** \todo Replace CSS_MEDIA_ALL with the result of - * parsing the media list */ error = css_stylesheet_create(c->sheet->level, NULL, - url, NULL, c->sheet->origin, - CSS_MEDIA_ALL, + url, NULL, c->sheet->origin, media, c->sheet->import, c->sheet->import_pw, c->alloc, c->pw, &import); if (error != CSS_OK) { diff --git a/src/parse/propstrings.h b/src/parse/propstrings.h index 2fa3d31..10c394a 100644 --- a/src/parse/propstrings.h +++ b/src/parse/propstrings.h @@ -17,6 +17,10 @@ enum { /* At-rules */ CHARSET, IMPORT, MEDIA, PAGE, + /* Media types */ + AURAL, BRAILLE, EMBOSSED, HANDHELD, PRINT, PROJECTION, + SCREEN, SPEECH, TTY, TV, ALL, + /* Pseudo classes */ FIRST_CHILD, LINK, VISITED, HOVER, ACTIVE, FOCUS, LANG, /* LEFT, RIGHT, -- already in properties */ FIRST, @@ -93,6 +97,18 @@ static struct { { "media", SLEN("media") }, { "page", SLEN("page") }, + { "aural", SLEN("aural") }, + { "braille", SLEN("braille") }, + { "embossed", SLEN("embossed") }, + { "handheld", SLEN("handheld") }, + { "print", SLEN("print") }, + { "projection", SLEN("projection") }, + { "screen", SLEN("screen") }, + { "speech", SLEN("speech") }, + { "tty", SLEN("tty") }, + { "tv", SLEN("tv") }, + { "all", SLEN("all") }, + { "first-child", SLEN("first-child") }, { "link", SLEN("link") }, { "visited", SLEN("visited") }, -- cgit v1.2.3