Basic support for parsing CSS pseudo classes.

This currently does not yet allow chained pseudo classes, nor does it allow for
pseudos such as nth-child(2n).
This commit is contained in:
Yorick Peterse 2014-10-05 23:46:41 +02:00
parent e2b36ad9a4
commit d0a8a3b18c
2 changed files with 46 additions and 3 deletions

View File

@ -14,6 +14,7 @@ rule
path_member
: node_test
| axis
| pseudo_class
;
path_members
@ -60,6 +61,11 @@ rule
| op_members T_HYPHEN_IN op_members { s(:hyphen_in, val[0],val[2]) }
;
op_members
: node_test
| string
;
axis
# x > y
: node_test T_CHILD node_test
@ -80,14 +86,33 @@ rule
}
;
op_members
: node_test
| string
pseudo_class
# x:root
: node_test T_COLON T_IDENT { s(:pseudo, val[2], val[0]) }
# x:nth-child(2)
| node_test T_COLON T_IDENT T_LPAREN pseudo_args T_RPAREN
{
s(:pseudo, val[2], val[0], *val[4])
}
;
pseudo_args
: pseudo_args pseudo_arg { val[0] << val[1] }
| pseudo_arg { val }
;
pseudo_arg
: integer
;
string
: T_STRING { s(:string, val[0]) }
;
integer
: T_INT { s(:int, val[0].to_i) }
;
end
---- inner

View File

@ -0,0 +1,18 @@
require 'spec_helper'
describe Oga::CSS::Parser do
context 'pseudo classes' do
example 'parse the :root pseudo class' do
parse_css('x:root').should == s(:pseudo, 'root', s(:test, nil, 'x'))
end
example 'parse the :nth-child pseudo class' do
parse_css('x:nth-child(2)').should == s(
:pseudo,
'nth-child',
s(:test, nil, 'x'),
s(:int, 2)
)
end
end
end