diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/rss/atom.rb | 1 | ||||
-rw-r--r-- | lib/rss/maker/base.rb | 46 | ||||
-rw-r--r-- | lib/rss/maker/itunes.rb | 2 | ||||
-rw-r--r-- | lib/rss/parser.rb | 30 | ||||
-rw-r--r-- | lib/rss/rss.rb | 5 |
5 files changed, 53 insertions, 31 deletions
diff --git a/lib/rss/atom.rb b/lib/rss/atom.rb index 7cba934feb..10282a8743 100644 --- a/lib/rss/atom.rb +++ b/lib/rss/atom.rb @@ -1,4 +1,3 @@ -require 'base64' require 'rss/parser' module RSS diff --git a/lib/rss/maker/base.rb b/lib/rss/maker/base.rb index 56bf04657e..2262a764ec 100644 --- a/lib/rss/maker/base.rb +++ b/lib/rss/maker/base.rb @@ -31,7 +31,9 @@ module RSS self::OTHER_ELEMENTS << variable_name end - def add_need_initialize_variable(variable_name, init_value="nil") + def add_need_initialize_variable(variable_name, init_value=nil, + &init_block) + init_value ||= init_block self::NEED_INITIALIZE_VARIABLES << [variable_name, init_value] end @@ -45,7 +47,7 @@ module RSS def_delegators("@#{plural}", :push, :pop, :shift, :unshift) def_delegators("@#{plural}", :each, :size, :empty?, :clear) - add_need_initialize_variable(plural, "[]") + add_need_initialize_variable(plural) {[]} module_eval(<<-EOC, __FILE__, __LINE__ + 1) def new_#{name} @@ -74,7 +76,9 @@ module RSS def def_classed_element_without_accessor(name, class_name=nil) class_name ||= Utils.to_class_name(name) add_other_element(name) - add_need_initialize_variable(name, "make_#{name}") + add_need_initialize_variable(name) do |object| + object.send("make_#{name}") + end module_eval(<<-EOC, __FILE__, __LINE__ + 1) private def setup_#{name}(feed, current) @@ -185,7 +189,19 @@ module RSS private def initialize_variables self.class.need_initialize_variables.each do |variable_name, init_value| - instance_eval("@#{variable_name} = #{init_value}", __FILE__, __LINE__) + if init_value.nil? + value = nil + else + if init_value.respond_to?(:call) + value = init_value.call(self) + elsif init_value.is_a?(String) + # just for backward compatibility + value = instance_eval(init_value, __FILE__, __LINE__) + else + value = init_value + end + end + instance_variable_set("@#{variable_name}", value) end end @@ -238,7 +254,8 @@ module RSS def variables self.class.need_initialize_variables.find_all do |name, init| - "nil" == init + # init == "nil" is just for backward compatibility + init.nil? or init == "nil" end.collect do |name, init| name end @@ -364,7 +381,9 @@ module RSS %w(xml_stylesheets channel image items textinput).each do |element| attr_reader element - add_need_initialize_variable(element, "make_#{element}") + add_need_initialize_variable(element) do |object| + object.send("make_#{element}") + end module_eval(<<-EOC, __FILE__, __LINE__) private def setup_#{element}(feed) @@ -392,12 +411,8 @@ module RSS end def make - if block_given? - yield(self) - to_feed - else - nil - end + yield(self) + to_feed end def to_feed @@ -405,11 +420,8 @@ module RSS setup_xml_stylesheets(feed) setup_elements(feed) setup_other_elements(feed) - if feed.valid? - feed - else - nil - end + feed.validate + feed end private diff --git a/lib/rss/maker/itunes.rb b/lib/rss/maker/itunes.rb index 7c5049129d..8b7420da3c 100644 --- a/lib/rss/maker/itunes.rb +++ b/lib/rss/maker/itunes.rb @@ -176,7 +176,7 @@ module RSS %w(hour minute second).each do |name| attr_reader(name) - add_need_initialize_variable(name, '0') + add_need_initialize_variable(name, 0) end def content=(content) diff --git a/lib/rss/parser.rb b/lib/rss/parser.rb index 9e4919223c..9b28f0fa8a 100644 --- a/lib/rss/parser.rb +++ b/lib/rss/parser.rb @@ -34,8 +34,8 @@ module RSS class NotValidXMLParser < Error def initialize(parser) super("#{parser} is not an available XML parser. " << - "Available XML parser"<< - (AVAILABLE_PARSERS.size > 1 ? "s are ": " is ") << + "Available XML parser" << + (AVAILABLE_PARSERS.size > 1 ? "s are " : " is ") << "#{AVAILABLE_PARSERS.inspect}.") end end @@ -113,7 +113,7 @@ module RSS source.is_a?(String) and /</ =~ source end - # Attempt to convert rss to a URI, but just return it if + # Attempt to convert rss to a URI, but just return it if # there's a ::URI::Error def to_uri(rss) return rss if rss.is_a?(::URI::Generic) @@ -220,9 +220,7 @@ module RSS name = (@@class_names[uri] || {})[tag_name] return name if name - tag_name = tag_name.gsub(/[_\-]([a-z]?)/) do - $1.upcase - end + tag_name = tag_name.gsub(/[_\-]([a-z]?)/) {$1.upcase} tag_name[0, 1].upcase + tag_name[1..-1] end @@ -389,9 +387,7 @@ module RSS def start_else_element(local, prefix, attrs, ns) class_name = self.class.class_name(_ns(ns, prefix), local) current_class = @last_element.class - if class_name and - (current_class.const_defined?(class_name) or - current_class.constants.include?(class_name)) + if known_class?(current_class, class_name) next_class = current_class.const_get(class_name) start_have_something_element(local, prefix, attrs, ns, next_class) else @@ -407,6 +403,20 @@ module RSS end end + if Module.method(:const_defined?).arity == -1 + def known_class?(target_class, class_name) + class_name and + (target_class.const_defined?(class_name, false) or + target_class.constants.include?(class_name.to_sym)) + end + else + def known_class?(target_class, class_name) + class_name and + (target_class.const_defined?(class_name) or + target_class.constants.include?(class_name)) + end + end + NAMESPLIT = /^(?:([\w:][-\w\d.]*):)?([\w:][-\w\d.]*)/ def split_name(name) name =~ NAMESPLIT @@ -504,7 +514,7 @@ module RSS else if klass.have_content? if @last_element.need_base64_encode? - text = Base64.decode64(text.lstrip) + text = text.lstrip.unpack("m").first end @last_element.content = text end diff --git a/lib/rss/rss.rb b/lib/rss/rss.rb index 5aa4a2cedd..4b943ec55b 100644 --- a/lib/rss/rss.rb +++ b/lib/rss/rss.rb @@ -45,6 +45,7 @@ class Time end end + require "English" require "rss/utils" require "rss/converter" @@ -52,7 +53,7 @@ require "rss/xml-stylesheet" module RSS - VERSION = "0.2.4" + VERSION = "0.2.5" URI = "http://purl.org/rss/1.0/" @@ -1200,7 +1201,7 @@ EOC __send__(self.class.xml_getter).to_s else _content = content - _content = Base64.encode64(_content) if need_base64_encode? + _content = [_content].pack("m").delete("\n") if need_base64_encode? h(_content) end end |