From 073e8fbe5b573f7cf06a196b90badd28c3724ea3 Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Thu, 16 Oct 2014 00:25:31 +0200 Subject: [PATCH] Basic boilerplate for converting CSS to XPath. --- lib/oga.rb | 1 + lib/oga/css/transformer.rb | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 lib/oga/css/transformer.rb 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