From 2dd148539d94cf582fafa03c77ef4f5c1ef5a045 Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Sun, 5 Oct 2014 09:32:21 +0200 Subject: [PATCH] Parsing of CSS predicates. This adds support for parsing expressions such as "foo[class]". --- lib/oga/css/parser.y | 7 ++++++- spec/oga/css/parser/predicates_spec.rb | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 spec/oga/css/parser/predicates_spec.rb diff --git a/lib/oga/css/parser.y b/lib/oga/css/parser.y index 29a40cf..2db64bd 100644 --- a/lib/oga/css/parser.y +++ b/lib/oga/css/parser.y @@ -30,7 +30,8 @@ rule ; node_test - : node_name { s(:test, *val[0]) } + : node_name { s(:test, *val[0]) } + | node_name predicate { s(:test, *val[0], val[1]) } ; node_name @@ -43,6 +44,10 @@ rule # |foo | T_PIPE T_IDENT { [nil, val[1]] } ; + + predicate + : T_LBRACK expression T_RBRACK { val[1] } + ; end ---- inner diff --git a/spec/oga/css/parser/predicates_spec.rb b/spec/oga/css/parser/predicates_spec.rb new file mode 100644 index 0000000..fa01c97 --- /dev/null +++ b/spec/oga/css/parser/predicates_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +describe Oga::CSS::Parser do + context 'predicates' do + example 'parse a predicate' do + parse_css('foo[bar]').should == s(:test, nil, 'foo', s(:test, nil, 'bar')) + end + + example 'parse a node test followed by a node test with a predicate' do + parse_css('foo bar[baz]').should == s( + :path, + s(:test, nil, 'foo'), + s(:test, nil, 'bar', s(:test, nil, 'baz')) + ) + end + end +end