diff options
author | James Bursa <james@netsurf-browser.org> | 2003-09-28 17:37:43 +0000 |
---|---|---|
committer | James Bursa <james@netsurf-browser.org> | 2003-09-28 17:37:43 +0000 |
commit | fd7078b1ad470c3de96d32c3699eb862259df990 (patch) | |
tree | 96d323b56e836932538eb5f3710045efa1b93874 /css/parser.y | |
parent | c48e0ce8dc0ac13b31c143be21b1ccc9a92d921d (diff) | |
download | netsurf-fd7078b1ad470c3de96d32c3699eb862259df990.tar.gz netsurf-fd7078b1ad470c3de96d32c3699eb862259df990.tar.bz2 |
[project @ 2003-09-28 17:37:43 by bursa]
Implement CSS specificity and fix bugs.
svn path=/import/netsurf/; revision=329
Diffstat (limited to 'css/parser.y')
-rw-r--r-- | css/parser.y | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/css/parser.y b/css/parser.y index 0e2ff02ab..75706eb16 100644 --- a/css/parser.y +++ b/css/parser.y @@ -70,7 +70,8 @@ selector_list(A) ::= selector_list(B) COMMA selector(C). selector(A) ::= simple_selector(B). { A = B; } selector(A) ::= selector(B) combinator(C) simple_selector(D). - { D->right = B; D->comb = C; A = D; } + { D->right = B; D->comb = C; A = D; + A->specificity += B->specificity; } combinator(A) ::= . { A = COMB_ANCESTOR; } @@ -80,7 +81,8 @@ combinator(A) ::= GT. { A = COMB_PARENT; } simple_selector(A) ::= element_name(B) detail_list(C). - { A = css_new_node(NODE_SELECTOR, B, C, 0); } + { A = css_new_node(NODE_SELECTOR, B, C, 0); + A->specificity = (B ? 1 : 0) + (C ? C->specificity : 0); } element_name(A) ::= . { A = 0; } @@ -90,23 +92,32 @@ element_name(A) ::= IDENT(B). detail_list(A) ::= . { A = 0; } detail_list(A) ::= HASH(B) detail_list(C). - { A = css_new_node(NODE_ID, B, 0, 0); A->next = C; } + { A = css_new_node(NODE_ID, B, 0, 0); + A->specificity = 0x10000 + (C ? C->specificity : 0); A->next = C; } detail_list(A) ::= DOT IDENT(B) detail_list(C). - { A = css_new_node(NODE_CLASS, B, 0, 0); A->next = C; } + { A = css_new_node(NODE_CLASS, B, 0, 0); + A->specificity = 0x100 + (C ? C->specificity : 0); A->next = C; } detail_list(A) ::= LBRAC IDENT(B) RBRAC detail_list(C). - { A = css_new_node(NODE_ATTRIB, B, 0, 0); A->next = C; } + { A = css_new_node(NODE_ATTRIB, B, 0, 0); + A->specificity = 0x100 + (C ? C->specificity : 0); A->next = C; } detail_list(A) ::= LBRAC IDENT(B) EQUALS IDENT(C) RBRAC detail_list(D). - { A = css_new_node(NODE_ATTRIB_EQ, B, 0, 0); A->data2 = C; A->next = D; } + { A = css_new_node(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) EQUALS STRING(C) RBRAC detail_list(D). - { A = css_new_node(NODE_ATTRIB_EQ, B, 0, 0); A->data2 = C; A->next = D; } + { A = css_new_node(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) INCLUDES IDENT(C) RBRAC detail_list(D). - { A = css_new_node(NODE_ATTRIB_INC, B, 0, 0); A->data2 = C; A->next = D; } + { A = css_new_node(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(NODE_ATTRIB_INC, B, 0, 0); A->data2 = C; A->next = D; } + { A = css_new_node(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) DASHMATCH IDENT(C) RBRAC detail_list(D). - { A = css_new_node(NODE_ATTRIB_DM, B, 0, 0); A->data2 = C; A->next = D; } + { A = css_new_node(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(NODE_ATTRIB_DM, B, 0, 0); A->data2 = C; A->next = D; } + { A = css_new_node(NODE_ATTRIB_DM, B, 0, 0); A->data2 = css_unquote(C); + A->specificity = 0x100 + (D ? D->specificity : 0); A->next = D; } /* TODO: pseudo */ declaration_list(A) ::= . @@ -148,7 +159,7 @@ any(A) ::= PERCENTAGE(B). any(A) ::= DIMENSION(B). { A = css_new_node(NODE_DIMENSION, B, 0, 0); } any(A) ::= STRING(B). - { A = css_new_node(NODE_STRING, B, 0, 0); } + { A = css_new_node(NODE_STRING, css_unquote(B), 0, 0); } any(A) ::= DELIM(B). { A = css_new_node(NODE_DELIM, B, 0, 0); } any(A) ::= URI(B). |