summaryrefslogtreecommitdiff
path: root/css/parser.y
diff options
context:
space:
mode:
authorJames Bursa <james@netsurf-browser.org>2003-10-17 17:39:29 +0000
committerJames Bursa <james@netsurf-browser.org>2003-10-17 17:39:29 +0000
commit13d6923b5e6edf727e00484ae05c22dbfa8e1c7c (patch)
treea1bd69e7d3ea415158426fd04fb50d22a655dc1b /css/parser.y
parenta808d816ee7dd66d154caed89cff5734f9ecbba8 (diff)
downloadnetsurf-13d6923b5e6edf727e00484ae05c22dbfa8e1c7c.tar.gz
netsurf-13d6923b5e6edf727e00484ae05c22dbfa8e1c7c.tar.bz2
[project @ 2003-10-17 17:39:29 by bursa]
Implement :link, ignore stylesheets with syntax errors, parse pseudo classes. svn path=/import/netsurf/; revision=367
Diffstat (limited to 'css/parser.y')
-rw-r--r--css/parser.y29
1 files changed, 18 insertions, 11 deletions
diff --git a/css/parser.y b/css/parser.y
index 0d72a44d7..9fc1d398d 100644
--- a/css/parser.y
+++ b/css/parser.y
@@ -106,28 +106,30 @@ detail_list(A) ::= LBRAC IDENT(B) EQUALS IDENT(C) RBRAC detail_list(D).
detail_list(A) ::= LBRAC IDENT(B) EQUALS STRING(C) RBRAC detail_list(D).
{ A = css_new_node(CSS_NODE_ATTRIB_EQ, B, 0, 0); A->data2 = css_unquote(C);
A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
-detail_list(A) ::= LBRAC IDENT(B) EQUALS NUMBER(C) RBRAC detail_list(D).
- { A = css_new_node(CSS_NODE_ATTRIB_EQ, B, 0, 0); A->data2 = C;
- A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
detail_list(A) ::= LBRAC IDENT(B) INCLUDES IDENT(C) RBRAC detail_list(D).
{ A = css_new_node(CSS_NODE_ATTRIB_INC, B, 0, 0); A->data2 = C;
A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
detail_list(A) ::= LBRAC IDENT(B) INCLUDES STRING(C) RBRAC detail_list(D).
{ A = css_new_node(CSS_NODE_ATTRIB_INC, B, 0, 0); A->data2 = css_unquote(C);
A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
-detail_list(A) ::= LBRAC IDENT(B) INCLUDES NUMBER(C) RBRAC detail_list(D).
- { A = css_new_node(CSS_NODE_ATTRIB_INC, B, 0, 0); A->data2 = C;
- A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
detail_list(A) ::= LBRAC IDENT(B) DASHMATCH IDENT(C) RBRAC detail_list(D).
{ A = css_new_node(CSS_NODE_ATTRIB_DM, B, 0, 0); A->data2 = C;
A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
detail_list(A) ::= LBRAC IDENT(B) DASHMATCH STRING(C) RBRAC detail_list(D).
{ A = css_new_node(CSS_NODE_ATTRIB_DM, B, 0, 0); A->data2 = css_unquote(C);
A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
-detail_list(A) ::= LBRAC IDENT(B) DASHMATCH NUMBER(C) RBRAC detail_list(D).
- { A = css_new_node(CSS_NODE_ATTRIB_DM, B, 0, 0); A->data2 = C;
- A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; }
-/* TODO: pseudo */
+detail_list(A) ::= COLON IDENT(B) detail_list(C).
+ { if (strcasecmp(B, "link") == 0) {
+ A = css_new_node(CSS_NODE_ATTRIB, xstrdup("href"), 0, 0);
+ A->specificity = 0x100 + (C ? C->specificity : 0); A->next = C;
+ free(B);
+ } else {
+ A = css_new_node(CSS_NODE_PSEUDO, B, 0, 0);
+ A->specificity = 0x100 + (C ? C->specificity : 0); A->next = C;
+ } }
+detail_list(A) ::= COLON FUNCTION(B) IDENT RPAREN detail_list(C).
+ { A = css_new_node(CSS_NODE_PSEUDO, B, 0, 0);
+ A->specificity = 0x100 + (C ? C->specificity : 0); A->next = C; }
declaration_list(A) ::= .
{ A = 0; }
@@ -187,6 +189,8 @@ any(A) ::= COLON.
{ A = css_new_node(CSS_NODE_COLON, 0, 0, 0); }
any(A) ::= COMMA.
{ A = css_new_node(CSS_NODE_COMMA, 0, 0, 0); }
+any(A) ::= DOT.
+ { A = css_new_node(CSS_NODE_DOT, 0, 0, 0); }
any(A) ::= PLUS.
{ A = css_new_node(CSS_NODE_PLUS, 0, 0, 0); }
any(A) ::= GT.
@@ -233,7 +237,10 @@ any(A) ::= LBRAC any_list(B) RBRAC.
%destructor any_list_1 { css_free_node($$); }
%destructor any { css_free_node($$); }
-%left COMMA GT HASH LBRAC PLUS.
+%left COLON COMMA GT HASH LBRAC PLUS.
+%left DOT.
%left EMPTYIDENT.
%left IDENT.
%left LBRACE.
+
+%syntax_error { param->syntax_error = true; }