From b0b572a5846a884bcd267f8b0dc638dd511e9f52 Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Fri, 14 Nov 2014 23:27:15 +0100 Subject: [PATCH] Fixed XPath AST for :last-of-type This should count following nodes, not merely the position. --- lib/oga/css/parser.y | 6 +++++- spec/oga/css/parser/pseudo_classes/last_of_type_spec.rb | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/oga/css/parser.y b/lib/oga/css/parser.y index 09e5b56..e232ee2 100644 --- a/lib/oga/css/parser.y +++ b/lib/oga/css/parser.y @@ -528,7 +528,11 @@ end # @return [AST::Node] # def on_pseudo_class_last_of_type - return s(:eq, s(:call, 'position'), s(:call, 'last')) + return s( + :eq, + s(:call, 'count', s(:axis, 'following-sibling', s(:call, 'name'))), + s(:int, 0) + ) end ## diff --git a/spec/oga/css/parser/pseudo_classes/last_of_type_spec.rb b/spec/oga/css/parser/pseudo_classes/last_of_type_spec.rb index 64f1d78..39b4b91 100644 --- a/spec/oga/css/parser/pseudo_classes/last_of_type_spec.rb +++ b/spec/oga/css/parser/pseudo_classes/last_of_type_spec.rb @@ -4,7 +4,7 @@ describe Oga::CSS::Parser do context ':last-of-type pseudo class' do example 'parse the :last-of-type pseudo class' do parse_css(':last-of-type').should == parse_xpath( - 'descendant::*[position() = last()]' + 'descendant::*[count(following-sibling::name()) = 0]' ) end end