Skip to content

Commit

Permalink
Oga handler: better implementation through SAX interface
Browse files Browse the repository at this point in the history
  • Loading branch information
krasnoukhov committed Sep 16, 2014
1 parent 3ffdbdf commit 69d3252
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 35 deletions.
2 changes: 1 addition & 1 deletion Gemfile
Expand Up @@ -11,5 +11,5 @@ group :development, :test do
gem 'activerecord', '~> 4.1'
gem 'nokogiri', '~> 1.6'
gem 'ox', '>= 2.1.2', platforms: [:mri, :rbx]
gem 'oga'
gem 'oga', github: 'YorickPeterse/oga'
end
47 changes: 15 additions & 32 deletions lib/sax-machine/handlers/sax_oga_handler.rb
Expand Up @@ -2,47 +2,30 @@
require 'oga'

module SAXMachine
class SAXOgaHandler < Oga::XML::PullParser
class SAXOgaHandler
include SAXAbstractHandler

def initialize(document, data, on_error, _)
super(data)

_initialize(document, on_error, _)
def initialize(*args)
_initialize(*args)
@node_names = []
end

def on_text(text)
_characters(text)

return
end

def on_cdata(text)
_characters(text)

return
end

def on_element(*args)
super

_start_element(@node.name, @node.attributes.map { |a| [a.name, a.value] })

return
def on_element(namespace, name, attrs)
full_name = namespace ? [namespace, name].join(":") : name
@node_names << full_name
_start_element(full_name, attrs.map { |a| [a.name, a.value] })
end

def after_element(*args)
element = nesting.pop

_end_element(element)

return
_end_element(@node_names.pop)
end

def on_error(type, value, stack)
_error("#{type} #{value} #{stack}")

return
def on_error(*args)
_error(args.join(" "))
end

alias_method :on_text, :_characters
alias_method :on_cdata, :_characters
alias_method :error, :_error
end
end
6 changes: 4 additions & 2 deletions lib/sax-machine/sax_document.rb
Expand Up @@ -19,8 +19,10 @@ def parse(xml_text, on_error = nil, on_warning = nil)
}
)
when :oga
handler = SAXOgaHandler.new(self, xml_text, on_error, on_warning)
handler.parse {}
Oga.sax_parse_xml(
SAXOgaHandler.new(self, on_error, on_warning),
xml_text
)
else
handler = SAXNokogiriHandler.new(self, on_error, on_warning)
parser = Nokogiri::XML::SAX::Parser.new(handler)
Expand Down

0 comments on commit 69d3252

Please sign in to comment.