diff --git a/lib/oga.rb b/lib/oga.rb index a8e940f..106542c 100644 --- a/lib/oga.rb +++ b/lib/oga.rb @@ -50,3 +50,4 @@ require_relative 'oga/xpath/evaluator' require_relative 'oga/css/lexer' require_relative 'oga/css/parser' +require_relative 'oga/css/transformer' diff --git a/lib/oga/css/transformer.rb b/lib/oga/css/transformer.rb new file mode 100644 index 0000000..3675cc6 --- /dev/null +++ b/lib/oga/css/transformer.rb @@ -0,0 +1,30 @@ +module Oga + module CSS + ## + # Transforms an CSS AST into a corresponding XPath AST. + # + class Transformer < AST::Processor + def on_class(node) + name, test = node.to_a + + unless test + test = s(:test, nil, '*') + end + + predicate = s( + :eq, + s(:axis, 'attribute', s(:test, nil, 'class')), + s(:string, name) + ) + + return s(:axis, 'child', test.updated(nil, test.children + [predicate])) + end + + private + + def s(type, *children) + return AST::Node.new(type, children) + end + end # Transformer + end # CSS +end # Oga