diff --git a/lib/oga/css/parser.y b/lib/oga/css/parser.y index c83bc09..73b36fe 100644 --- a/lib/oga/css/parser.y +++ b/lib/oga/css/parser.y @@ -122,14 +122,25 @@ rule ; pseudo_class + # :root + : pseudo_name { s(:pseudo, val[0]) } + # x:root - : path_member T_COLON T_IDENT { s(:pseudo, val[2], val[0]) } + | path_member pseudo_name { s(:pseudo, val[1], val[0]) } + + # :nth-child(2) + | pseudo_name pseudo_args { s(:pseudo, val[0], nil, val[1]) } # x:nth-child(2) - | path_member T_COLON T_IDENT T_LPAREN pseudo_arg T_RPAREN - { - s(:pseudo, val[2], val[0], val[4]) - } + | path_member pseudo_name pseudo_args { s(:pseudo, val[1], val[0], val[2]) } + ; + + pseudo_name + : T_COLON T_IDENT { val[1] } + ; + + pseudo_args + : T_LPAREN pseudo_arg T_RPAREN { val[1] } ; pseudo_arg diff --git a/spec/oga/css/parser/pseudo_classes_spec.rb b/spec/oga/css/parser/pseudo_classes_spec.rb index de90e4c..0466b0b 100644 --- a/spec/oga/css/parser/pseudo_classes_spec.rb +++ b/spec/oga/css/parser/pseudo_classes_spec.rb @@ -2,11 +2,15 @@ require 'spec_helper' describe Oga::CSS::Parser do context 'pseudo classes' do - example 'parse the :root pseudo class' do + example 'parse the x:root pseudo class' do parse_css('x:root').should == s(:pseudo, 'root', s(:test, nil, 'x')) end - example 'parse the x:nth-child pseudo class' do + example 'parse the :root pseudo class' do + parse_css(':root').should == s(:pseudo, 'root') + end + + example 'parse the x:nth-child(1) pseudo class' do parse_css('x:nth-child(1)').should == s( :pseudo, 'nth-child', @@ -15,6 +19,15 @@ describe Oga::CSS::Parser do ) end + example 'parse the :nth-child(1) pseudo class' do + parse_css(':nth-child(1)').should == s( + :pseudo, + 'nth-child', + nil, + s(:int, 1) + ) + end + example 'parse the x:nth-child(odd) pseudo class' do parse_css('x:nth-child(odd)').should == s( :pseudo,