diff options
author | kou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-01-31 16:10:53 +0000 |
---|---|---|
committer | kou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-01-31 16:10:53 +0000 |
commit | 976226b5de303ed852744c0291c280d1e5fd538f (patch) | |
tree | 088915bab077d20c8928cccfca6fb0eb2cf36347 /lib/rss/parser.rb | |
parent | 35d62eb6a5f6521ed9297d99cb723a2efc85eb19 (diff) | |
download | ruby-976226b5de303ed852744c0291c280d1e5fd538f.tar.gz |
* lib/rss/parser.rb (RSS::Parser): added @@default_parser. Used
XML parser became selectable.
* test/rss/test_parser.rb: added tests for RSS::Parser.default_parser.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5594 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rss/parser.rb')
-rw-r--r-- | lib/rss/parser.rb | 85 |
1 files changed, 62 insertions, 23 deletions
diff --git a/lib/rss/parser.rb b/lib/rss/parser.rb index 39ccdfbc36..6434206ae3 100644 --- a/lib/rss/parser.rb +++ b/lib/rss/parser.rb @@ -1,3 +1,5 @@ +require "forwardable" + require "rss/rss" module RSS @@ -19,6 +21,14 @@ module RSS class XMLParserNotFound < Error def initialize super("available XML parser does not found in " << + "#{AVAILABLE_PARSER_LIBRARIES.inspect}.") + end + end + + class NotValidXMLParser < Error + def initialize(parser) + super("#{parser} is not available XML parser. " << + "available XML parser is " << "#{AVAILABLE_PARSERS.inspect}.") end end @@ -32,10 +42,49 @@ module RSS end end + class Parser + + extend Forwardable + + class << self + + @@default_parser = nil + + def default_parser + @@default_parser || AVAILABLE_PARSERS.first + end + + def default_parser=(new_value) + if AVAILABLE_PARSERS.include?(new_value) + @@default_parser = new_value + else + raise NotValidXMLParser.new(new_value) + end + end + + def parse(rss, do_validate=true, ignore_unknown_element=true, parser_class=default_parser) + parser = new(rss, parser_class) + parser.do_validate = do_validate + parser.ignore_unknown_element = ignore_unknown_element + parser.parse + end + + end + + def_delegators(:@parser, :parse, :rss, + :ignore_unknown_element, + :ignore_unknown_element=, :do_validate, + :do_validate=) + + def initialize(rss, parser_class=self.class.default_parser) + @parser = parser_class.new(rss) + end + end + class BaseParser def initialize(rss) - @listener = Listener.new + @listener = listener.new @rss = rss end @@ -66,15 +115,6 @@ module RSS @listener.rss end - class << self - def parse(rss, do_validate=true, ignore_unknown_element=true) - parser = new(rss) - parser.do_validate = do_validate - parser.ignore_unknown_element = ignore_unknown_element - parser.parse - end - end - end class BaseListener @@ -296,7 +336,7 @@ module RSS @last_element.send(setter, next_element) @last_element = next_element @proc_stack.push Proc.new { |text, tags| - p @last_element.class if $DEBUG + p(@last_element.class) if $DEBUG @last_element.content = text if klass.have_content? @last_element.validate_for_stream(tags) if @do_validate @last_element = previous @@ -305,26 +345,25 @@ module RSS end - unless const_defined? :AVAILABLE_PARSERS - AVAILABLE_PARSERS = [ - "rss/xmlparser", - "rss/xmlscanner", - "rss/rexmlparser", + unless const_defined? :AVAILABLE_PARSER_LIBRARIES + AVAILABLE_PARSER_LIBRARIES = [ + ["rss/xmlparser", :XMLParserParser], + ["rss/xmlscanner", :XMLScanParser], + ["rss/rexmlparser", :REXMLParser], ] end - loaded = false - AVAILABLE_PARSERS.each do |parser| + AVAILABLE_PARSERS = [] + + AVAILABLE_PARSER_LIBRARIES.each do |lib, parser| begin - require parser - loaded = true - break + require lib + AVAILABLE_PARSERS.push(const_get(parser)) rescue LoadError end end - unless loaded + if AVAILABLE_PARSERS.empty? raise XMLParserNotFound end end - |