Last active
December 29, 2015 15:29
-
-
Save cielavenir/7691221 to your computer and use it in GitHub Desktop.
MultiSAX minimalistic
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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