From 43b8d99a4caba7fe0557117c4cd9ae4554b8a79e Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Tue, 10 Feb 2009 00:39:18 +0000 Subject: Distinguish between pseudo classes and pseudo elements svn path=/trunk/libcss/; revision=6406 --- src/parse/language.c | 24 ++++++++++++++++++++++-- src/parse/propstrings.h | 23 ++++++++++++++++++++++- src/select/select.c | 7 +++++-- src/stylesheet.c | 7 ++----- src/stylesheet.h | 3 ++- 5 files changed, 53 insertions(+), 11 deletions(-) (limited to 'src') 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") }, diff --git a/src/select/select.c b/src/select/select.c index f6ff8c3..8e620ea 100644 --- a/src/select/select.c +++ b/src/select/select.c @@ -645,8 +645,11 @@ css_error match_detail(css_select_ctx *ctx, void *node, detail->name->data, detail->name->len, match); break; - case CSS_SELECTOR_PSEUDO: - /** \todo pseudo classes/elements */ + case CSS_SELECTOR_PSEUDO_CLASS: + /** \todo pseudo classes */ + break; + case CSS_SELECTOR_PSEUDO_ELEMENT: + /** \todo pseudo elements */ break; case CSS_SELECTOR_ATTRIBUTE: error = state->handler->node_has_attribute(state->pw, node, diff --git a/src/stylesheet.c b/src/stylesheet.c index 7c055e1..a9413cc 100644 --- a/src/stylesheet.c +++ b/src/stylesheet.c @@ -526,6 +526,7 @@ css_error css_stylesheet_selector_append_specific(css_stylesheet *sheet, /* Update parent's specificity */ switch (detail->type) { case CSS_SELECTOR_CLASS: + case CSS_SELECTOR_PSEUDO_CLASS: case CSS_SELECTOR_ATTRIBUTE: case CSS_SELECTOR_ATTRIBUTE_EQUAL: case CSS_SELECTOR_ATTRIBUTE_DASHMATCH: @@ -535,11 +536,7 @@ css_error css_stylesheet_selector_append_specific(css_stylesheet *sheet, case CSS_SELECTOR_ID: (*parent)->specificity += CSS_SPECIFICITY_B; break; - case CSS_SELECTOR_PSEUDO: - /** \todo distinguish between pseudo classes and elements */ - /* Assume pseudo class for now */ - (*parent)->specificity += CSS_SPECIFICITY_C; - break; + case CSS_SELECTOR_PSEUDO_ELEMENT: case CSS_SELECTOR_ELEMENT: (*parent)->specificity += CSS_SPECIFICITY_D; break; diff --git a/src/stylesheet.h b/src/stylesheet.h index c154e1a..fc74198 100644 --- a/src/stylesheet.h +++ b/src/stylesheet.h @@ -34,7 +34,8 @@ typedef enum css_selector_type { CSS_SELECTOR_ELEMENT, CSS_SELECTOR_CLASS, CSS_SELECTOR_ID, - CSS_SELECTOR_PSEUDO, + CSS_SELECTOR_PSEUDO_CLASS, + CSS_SELECTOR_PSEUDO_ELEMENT, CSS_SELECTOR_ATTRIBUTE, CSS_SELECTOR_ATTRIBUTE_EQUAL, CSS_SELECTOR_ATTRIBUTE_DASHMATCH, -- cgit v1.2.3