From ec427fe2df89f27b9d96ce876de4f5e7a000800d Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Mon, 1 Dec 2008 18:16:10 +0000 Subject: Finish azimuth svn path=/trunk/libcss/; revision=5865 --- src/parse/properties.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++- src/parse/propstrings.h | 8 +++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/parse/properties.c b/src/parse/properties.c index 94cf4fa..339a3e8 100644 --- a/src/parse/properties.c +++ b/src/parse/properties.c @@ -484,7 +484,71 @@ css_error parse_azimuth(css_language *c, parserutils_vector_iterate(vector, ctx); value = AZIMUTH_RIGHTWARDS; } else if (token->type == CSS_TOKEN_IDENT) { - /** \todo the rest. behind on its own isn't defined afaics */ + parserutils_vector_iterate(vector, ctx); + + /* Now, we may have one of the other keywords or behind, + * potentially followed by behind or other keyword, + * respectively */ + if (token->ilower == c->strings[LEFT_SIDE]) { + value = AZIMUTH_LEFT_SIDE; + } else if (token->ilower == c->strings[FAR_LEFT]) { + value = AZIMUTH_FAR_LEFT; + } else if (token->ilower == c->strings[LEFT]) { + value = AZIMUTH_LEFT; + } else if (token->ilower == c->strings[CENTER-LEFT]) { + value = AZIMUTH_CENTER_LEFT; + } else if (token->ilower == c->strings[CENTER]) { + value = AZIMUTH_CENTER; + } else if (token->ilower == c->strings[CENTER-RIGHT]) { + value = AZIMUTH_CENTER_RIGHT; + } else if (token->ilower == c->strings[RIGHT]) { + value = AZIMUTH_RIGHT; + } else if (token->ilower == c->strings[FAR_RIGHT]) { + value = AZIMUTH_FAR_RIGHT; + } else if (token->ilower == c->strings[RIGHT_SIDE]) { + value = AZIMUTH_RIGHT_SIDE; + } else if (token->ilower == c->strings[BEHIND]) { + value = AZIMUTH_BEHIND; + } else { + return CSS_INVALID; + } + + consumeWhitespace(vector, ctx); + + /* Get potential following token */ + token = parserutils_vector_iterate(vector, ctx); + if (token != NULL && token->type != CSS_TOKEN_IDENT) + return CSS_INVALID; + + if (token != NULL && value == AZIMUTH_BEHIND) { + if (token->ilower == c->strings[LEFT_SIDE]) { + value |= AZIMUTH_LEFT_SIDE; + } else if (token->ilower == c->strings[FAR_LEFT]) { + value |= AZIMUTH_FAR_LEFT; + } else if (token->ilower == c->strings[LEFT]) { + value |= AZIMUTH_LEFT; + } else if (token->ilower == c->strings[CENTER-LEFT]) { + value |= AZIMUTH_CENTER_LEFT; + } else if (token->ilower == c->strings[CENTER]) { + value |= AZIMUTH_CENTER; + } else if (token->ilower == c->strings[CENTER-RIGHT]) { + value |= AZIMUTH_CENTER_RIGHT; + } else if (token->ilower == c->strings[RIGHT]) { + value |= AZIMUTH_RIGHT; + } else if (token->ilower == c->strings[FAR_RIGHT]) { + value |= AZIMUTH_FAR_RIGHT; + } else if (token->ilower == c->strings[RIGHT_SIDE]) { + value |= AZIMUTH_RIGHT_SIDE; + } else { + return CSS_INVALID; + } + } else if (token != NULL && value != AZIMUTH_BEHIND) { + if (token->ilower == c->strings[BEHIND]) { + value |= AZIMUTH_BEHIND; + } else { + return CSS_INVALID; + } + } } else { error = parse_unit_specifier(c, vector, ctx, &length, &unit); if (error != CSS_OK) diff --git a/src/parse/propstrings.h b/src/parse/propstrings.h index a0aad04..460c426 100644 --- a/src/parse/propstrings.h +++ b/src/parse/propstrings.h @@ -62,7 +62,8 @@ enum { SLOW, FAST, X_FAST, FASTER, SLOWER, CENTER, JUSTIFY, CAPITALIZE, UPPERCASE, LOWERCASE, EMBED, BIDI_OVERRIDE, BASELINE, SUB, SUPER, TEXT_TOP, MIDDLE, TEXT_BOTTOM, SILENT, X_SOFT, SOFT, LOUD, X_LOUD, - PRE, NOWRAP, PRE_WRAP, PRE_LINE, LEFTWARDS, RIGHTWARDS, + PRE, NOWRAP, PRE_WRAP, PRE_LINE, LEFTWARDS, RIGHTWARDS, LEFT_SIDE, + FAR_LEFT, FAR_RIGHT, RIGHT_SIDE, BEHIND, LAST_KNOWN }; @@ -306,6 +307,11 @@ static struct { { "pre-line", SLEN("pre-line") }, { "leftwards", SLEN("leftwards") }, { "rightwards", SLEN("rightwards") }, + { "left-side", SLEN("left-side") }, + { "far-left", SLEN("far-left") }, + { "far-right", SLEN("far-right") }, + { "right-side", SLEN("right-side") }, + { "behind", SLEN("behind") }, }; #endif -- cgit v1.2.3