summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-02-10 00:39:18 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-02-10 00:39:18 +0000
commit43b8d99a4caba7fe0557117c4cd9ae4554b8a79e (patch)
treeba2652fb45e789984e73e12c0ec9db14a5960b27 /src
parent7d50c0354fbcf7d4721f19bdf88286b56484eddb (diff)
downloadlibcss-43b8d99a4caba7fe0557117c4cd9ae4554b8a79e.tar.gz
libcss-43b8d99a4caba7fe0557117c4cd9ae4554b8a79e.tar.bz2
Distinguish between pseudo classes and pseudo elements
svn path=/trunk/libcss/; revision=6406
Diffstat (limited to 'src')
-rw-r--r--src/parse/language.c24
-rw-r--r--src/parse/propstrings.h23
-rw-r--r--src/select/select.c7
-rw-r--r--src/stylesheet.c7
-rw-r--r--src/stylesheet.h3
5 files changed, 53 insertions, 11 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") },
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,