Skip to content

Instantly share code, notes, and snippets.

@cielavenir
Last active December 29, 2015 15:29
Show Gist options
  • Save cielavenir/7691221 to your computer and use it in GitHub Desktop.
Save cielavenir/7691221 to your computer and use it in GitHub Desktop.
MultiSAX minimalistic
# MultiSAX: Ruby Gem to handle multiple SAX libraries
# https://github.com/cielavenir/multisax
module MultiSAX # minimal version
class SAX
@parser=nil
def open(*list)
list=[:libxml,:rexmlstream,:rexmlsax2] if list.size==0
list.each{|e_module|
case e_module
when :libxml
begin
require 'rubygems'
require 'libxml'
rescue LoadError;next end
@parser=e_module;break
when :rexmlstream
require 'rexml/document'
require 'rexml/parsers/streamparser'
require 'rexml/streamlistener'
@parser=e_module;break
when :rexmlsax2
require 'rexml/document'
require 'rexml/parsers/sax2parser'
require 'rexml/sax2listener'
@parser=e_module;break
end
}
@parser
end
def reset() @parser=nil;@saxmodule=nil end
def parse(source,listener)
open if !@parser
case @parser
when :libxml
listener.instance_eval{
extend LibXML::XML::SaxParser::Callbacks
alias :on_start_element :sax_tag_start
alias :on_end_element :sax_tag_end
alias :on_cdata_block :sax_cdata
alias :on_characters :sax_text
alias :on_comment :sax_comment
}
when :rexmlstream
listener.instance_eval{
extend REXML::StreamListener
alias :tag_start :sax_tag_start
alias :tag_end :sax_tag_end
alias :cdata :sax_cdata
alias :text :sax_text
alias :comment :sax_comment
}
when :rexmlsax2
listener.instance_eval{
extend REXML::SAX2Listener
def start_element(uri,tag,qname,attrs) sax_tag_start(qname,attrs) end
def end_element(uri,tag,qname) sax_tag_end(qname) end
alias :cdata :sax_cdata
alias :characters :sax_text
alias :comment :sax_comment
}
end
if source.is_a?(String)
case @parser
when :libxml then parser=LibXML::XML::SaxParser.string(source);parser.callbacks=listener;parser.parse
when :rexmlstream then REXML::Parsers::StreamParser.new(source,listener).parse
when :rexmlsax2 then parser=REXML::Parsers::SAX2Parser.new(source);parser.listen(listener);parser.parse
end
else
case @parser
when :libxml then parser=LibXML::XML::SaxParser.io(source);parser.callbacks=listener;parser.parse
when :rexmlstream then REXML::Parsers::StreamParser.new(source,listener).parse
when :rexmlsax2 then parser=REXML::Parsers::SAX2Parser.new(source);parser.listen(listener);parser.parse
end
end
listener
end
end
Sax=SAX.new
module Callbacks
def sax_tag_start(tag,attrs) end
def sax_tag_end(tag) end
def sax_comment(text) end
def sax_cdata(text) end
def sax_text(text) end
end
end
# MultiSAX: Ruby Gem to handle multiple SAX libraries
# https://github.com/cielavenir/multisax
module MultiSAX # minimal version
class SAX
@parser=nil
def open(*list)
list=[:libxml,:rexmlstream] if list.size==0
list.each{|e_module|
case e_module
when :libxml
begin
require 'rubygems'
require 'libxml'
rescue LoadError;next end
@parser=e_module;break
when :rexmlstream
require 'rexml/document'
require 'rexml/parsers/streamparser'
require 'rexml/streamlistener'
@parser=e_module;break
end
}
@parser
end
def reset() @parser=nil;@saxmodule=nil end
def parse(source,listener)
open if !@parser
case @parser
when :libxml
listener.instance_eval{
extend LibXML::XML::SaxParser::Callbacks
alias :on_start_element :sax_tag_start
alias :on_end_element :sax_tag_end
alias :on_cdata_block :sax_cdata
alias :on_characters :sax_text
alias :on_comment :sax_comment
}
when :rexmlstream
listener.instance_eval{
extend REXML::StreamListener
alias :tag_start :sax_tag_start
alias :tag_end :sax_tag_end
alias :cdata :sax_cdata
alias :text :sax_text
alias :comment :sax_comment
}
end
if source.is_a?(String)
case @parser
when :libxml then parser=LibXML::XML::SaxParser.string(source);parser.callbacks=listener;parser.parse
when :rexmlstream then REXML::Parsers::StreamParser.new(source,listener).parse
end
else
case @parser
when :libxml then parser=LibXML::XML::SaxParser.io(source);parser.callbacks=listener;parser.parse
when :rexmlstream then REXML::Parsers::StreamParser.new(source,listener).parse
end
end
listener
end
end
Sax=SAX.new
module Callbacks
def sax_tag_start(tag,attrs) end
def sax_tag_end(tag) end
def sax_comment(text) end
def sax_cdata(text) end
def sax_text(text) end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment