diff options
author | John Mark Bell <jmb@netsurf-browser.org> | 2009-02-10 00:39:18 +0000 |
---|---|---|
committer | John Mark Bell <jmb@netsurf-browser.org> | 2009-02-10 00:39:18 +0000 |
commit | 43b8d99a4caba7fe0557117c4cd9ae4554b8a79e (patch) | |
tree | ba2652fb45e789984e73e12c0ec9db14a5960b27 /src/parse | |
parent | 7d50c0354fbcf7d4721f19bdf88286b56484eddb (diff) | |
download | libcss-43b8d99a4caba7fe0557117c4cd9ae4554b8a79e.tar.gz libcss-43b8d99a4caba7fe0557117c4cd9ae4554b8a79e.tar.bz2 |
Distinguish between pseudo classes and pseudo elements
svn path=/trunk/libcss/; revision=6406
Diffstat (limited to 'src/parse')
-rw-r--r-- | src/parse/language.c | 24 | ||||
-rw-r--r-- | src/parse/propstrings.h | 23 |
2 files changed, 44 insertions, 3 deletions
diff --git a/src/parse/language.c b/src/parse/language.c index 97b9f66..364192a 100644 --- a/src/parse/language.c +++ b/src/parse/language.c @@ -694,6 +694,7 @@ css_error parsePseudo(css_language *c, const parserutils_vector *vector, int *ctx, css_selector_detail *specific) { const css_token *token, *name, *value = NULL; + css_selector_type type; /* pseudo -> ':' [ IDENT | FUNCTION ws IDENT? ws ')' ] */ @@ -725,9 +726,28 @@ css_error parsePseudo(css_language *c, const parserutils_vector *vector, return CSS_INVALID; } + if (name->ilower == c->strings[FIRST_CHILD] || + name->ilower == c->strings[LINK] || + name->ilower == c->strings[VISITED] || + name->ilower == c->strings[HOVER] || + name->ilower == c->strings[ACTIVE] || + name->ilower == c->strings[FOCUS] || + name->ilower == c->strings[LANG] || + name->ilower == c->strings[LEFT] || + name->ilower == c->strings[RIGHT] || + name->ilower == c->strings[FIRST]) + type = CSS_SELECTOR_PSEUDO_CLASS; + else if (name->ilower == c->strings[FIRST_LINE] || + name->ilower == c->strings[FIRST_LETTER] || + name->ilower == c->strings[BEFORE] || + name->ilower == c->strings[AFTER]) + type = CSS_SELECTOR_PSEUDO_ELEMENT; + else + return CSS_INVALID; + return css_stylesheet_selector_detail_init(c->sheet, - CSS_SELECTOR_PSEUDO, name->idata, - value != NULL ? value->idata : NULL, specific); + type, name->idata, value != NULL ? value->idata : NULL, + specific); } css_error parseSpecific(css_language *c, diff --git a/src/parse/propstrings.h b/src/parse/propstrings.h index 3ad2735..2fa3d31 100644 --- a/src/parse/propstrings.h +++ b/src/parse/propstrings.h @@ -17,6 +17,13 @@ enum { /* At-rules */ CHARSET, IMPORT, MEDIA, PAGE, + /* Pseudo classes */ + FIRST_CHILD, LINK, VISITED, HOVER, ACTIVE, FOCUS, LANG, + /* LEFT, RIGHT, -- already in properties */ FIRST, + + /* Pseudo elements */ + FIRST_LINE, FIRST_LETTER, BEFORE, AFTER, + /* Properties */ FIRST_PROP, @@ -29,7 +36,7 @@ enum { BORDER_TOP_WIDTH, BOTTOM, CAPTION_SIDE, CLEAR, CLIP, COLOR, CONTENT, COUNTER_INCREMENT, COUNTER_RESET, CUE_AFTER, CUE_BEFORE, CURSOR, DIRECTION, DISPLAY, ELEVATION, EMPTY_CELLS, FLOAT, FONT_FAMILY, - FONT_SIZE, FONT_STYLE, FONT_VARIANT, FONT_WEIGHT, HEIGHT, LEFT, + FONT_SIZE, FONT_STYLE, FONT_VARIANT, FONT_WEIGHT, HEIGHT, LEFT, LETTER_SPACING, LINE_HEIGHT, LIST_STYLE_IMAGE, LIST_STYLE_POSITION, LIST_STYLE_TYPE, MARGIN_BOTTOM, MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP, MAX_HEIGHT, MAX_WIDTH, MIN_HEIGHT, MIN_WIDTH, ORPHANS, OUTLINE_COLOR, @@ -86,6 +93,20 @@ static struct { { "media", SLEN("media") }, { "page", SLEN("page") }, + { "first-child", SLEN("first-child") }, + { "link", SLEN("link") }, + { "visited", SLEN("visited") }, + { "hover", SLEN("hover") }, + { "active", SLEN("active") }, + { "focus", SLEN("focus") }, + { "lang", SLEN("lang") }, + { "first", SLEN("first") }, + + { "first-line", SLEN("first-line") }, + { "first-letter", SLEN("first-letter") }, + { "before", SLEN("before") }, + { "after", SLEN("after") }, + { "azimuth", SLEN("azimuth") }, { "background-attachment", SLEN("background-attachment") }, { "background-color", SLEN("background-color") }, |