diff options
author | kou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-12-08 12:58:36 +0000 |
---|---|---|
committer | kou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-12-08 12:58:36 +0000 |
commit | bcf72db844b54492aca33b068711992bd73caccf (patch) | |
tree | a54da3329420c04614c460c3b45388951a790aa2 /lib/rss/maker/base.rb | |
parent | 67c5b057e692b39c801aea811c6b75b40c4b8c22 (diff) |
* lib/rss, test/rss, sample/rss: backported from CVS HEAD.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7509 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rss/maker/base.rb')
-rw-r--r-- | lib/rss/maker/base.rb | 260 |
1 files changed, 176 insertions, 84 deletions
diff --git a/lib/rss/maker/base.rb b/lib/rss/maker/base.rb index 21222351f2..93f668beff 100644 --- a/lib/rss/maker/base.rb +++ b/lib/rss/maker/base.rb @@ -38,13 +38,24 @@ module RSS OTHER_ELEMENTS end - def self.add_need_initialize_variable(variable_name) - const_get("NEED_INITIALIZE_VARIABLES") << variable_name + def self.add_need_initialize_variable(variable_name, init_value="nil") + const_get("NEED_INITIALIZE_VARIABLES") << [variable_name, init_value] end def self.need_initialize_variables NEED_INITIALIZE_VARIABLES end + + def self.def_array_element(name) + include Enumerable + extend Forwardable + + def_delegators("@\#{name}", :<<, :[], :[]=, :first, :last) + def_delegators("@\#{name}", :push, :pop, :shift, :unshift) + def_delegators("@\#{name}", :each) + + add_need_initialize_variable(name, "[]") + end EOC end @@ -59,8 +70,8 @@ module RSS private def initialize_variables - self.class.need_initialize_variables.each do |variable_name| - instance_eval("@#{variable_name} = nil", __FILE__, __LINE__) + self.class.need_initialize_variables.each do |variable_name, init_value| + instance_eval("@#{variable_name} = #{init_value}", __FILE__, __LINE__) end end @@ -88,7 +99,28 @@ module RSS end def variables - self.class.need_initialize_variables + self.class.need_initialize_variables.find_all do |name, init| + "nil" == init + end.collect do |name, init| + name + end + end + + def variable_is_set? + variables.find {|var| !__send__(var).nil?} + end + + def not_set_required_variables + required_variable_names.find_all do |var| + __send__(var).nil? + end + end + + def required_variables_are_set? + required_variable_names.each do |var| + return false if __send__(var).nil? + end + true end end @@ -102,9 +134,22 @@ module RSS end end - attr_reader :rss_version, :xml_stylesheets - attr_reader :channel, :image, :items, :textinput + %w(xml_stylesheets channel image items textinput).each do |element| + attr_reader element + add_need_initialize_variable(element, "make_#{element}") + module_eval(<<-EOC, __FILE__, __LINE__) + private + def setup_#{element}(rss) + @#{element}.to_rss(rss) + end + + def make_#{element} + self.class::#{element[0,1].upcase}#{element[1..-1]}.new(self) + end +EOC + end + attr_reader :rss_version attr_accessor :version, :encoding, :standalone def initialize(rss_version) @@ -113,63 +158,45 @@ module RSS @version = "1.0" @encoding = "UTF-8" @standalone = nil - @xml_stylesheets = make_xml_stylesheets - @channel = make_channel - @image = make_image - @items = make_items - @textinput = make_textinput end - def make(&block) - block.call(self) if block - to_rss + def make + if block_given? + yield(self) + to_rss + else + nil + end end + def to_rss + rss = make_rss + setup_xml_stylesheets(rss) + setup_elements(rss) + setup_other_elements(rss) + if rss.channel + rss + else + nil + end + end + def current_element(rss) rss end private + remove_method :make_xml_stylesheets def make_xml_stylesheets XMLStyleSheets.new(self) end - def make_channel - self.class::Channel.new(self) - end - - def make_image - self.class::Image.new(self) - end - - def make_items - self.class::Items.new(self) - end - - def make_textinput - self.class::Textinput.new(self) - end - - def setup_xml_stylesheets(rss) - @xml_stylesheets.to_rss(rss) - end - end class XMLStyleSheets include Base - include Enumerable - extend Forwardable - - def_delegators(:@xml_stylesheets, :<<, :[], :[]=, :first, :last) - def_delegators(:@xml_stylesheets, :push, :pop, :shift, :unshift) - def_delegators(:@xml_stylesheets, :each) - - def initialize(maker) - super - @xml_stylesheets = [] - end + def_array_element("xml_stylesheets") def to_rss(rss) @xml_stylesheets.each do |xss| @@ -217,12 +244,25 @@ module RSS class ChannelBase include Base - attr_reader :cloud + %w(cloud categories skipDays skipHours).each do |element| + attr_reader element + add_other_element(element) + add_need_initialize_variable(element, "make_#{element}") + module_eval(<<-EOC, __FILE__, __LINE__) + private + def setup_#{element}(rss, current) + @#{element}.to_rss(rss, current) + end + + def make_#{element} + self.class::#{element[0,1].upcase}#{element[1..-1]}.new(@maker) + end +EOC + end %w(about title link description language copyright - managingEditor webMaster rating docs skipDays - skipHours date lastBuildDate category generator ttl - ).each do |element| + managingEditor webMaster rating docs date + lastBuildDate generator ttl).each do |element| attr_accessor element add_need_initialize_variable(element) end @@ -230,18 +270,68 @@ module RSS alias_method(:pubDate, :date) alias_method(:pubDate=, :date=) - def initialize(maker) - super - @cloud = make_cloud - end - def current_element(rss) rss.channel end - private - def make_cloud - self.class::Cloud.new(@maker) + class SkipDaysBase + include Base + + def_array_element("days") + + def new_day + day = self.class::Day.new(@maker) + @days << day + day + end + + def current_element(rss) + rss.channel.skipDays + end + + class DayBase + include Base + + %w(content).each do |element| + attr_accessor element + add_need_initialize_variable(element) + end + + def current_element(rss) + rss.channel.skipDays.last + end + + end + end + + class SkipHoursBase + include Base + + def_array_element("hours") + + def new_hour + hour = self.class::Hour.new(@maker) + @hours << hour + hour + end + + def current_element(rss) + rss.channel.skipHours + end + + class HourBase + include Base + + %w(content).each do |element| + attr_accessor element + add_need_initialize_variable(element) + end + + def current_element(rss) + rss.channel.skipHours.last + end + + end end class CloudBase @@ -257,6 +347,27 @@ module RSS end end + + class CategoriesBase + include Base + + def_array_element("categories") + + def new_category + category = self.class::Category.new(@maker) + @categories << category + category + end + + class CategoryBase + include Base + + %w(domain content).each do |element| + attr_accessor element + add_need_initialize_variable(element) + end + end + end end class ImageBase @@ -279,23 +390,18 @@ module RSS class ItemsBase include Base - include Enumerable - extend Forwardable - - def_delegators(:@items, :<<, :[], :[]=, :first, :last) - def_delegators(:@items, :push, :pop, :shift, :unshift) - def_delegators(:@items, :each) + def_array_element("items") - attr_accessor :do_sort + attr_accessor :do_sort, :max_size def initialize(maker) super - @items = [] @do_sort = false + @max_size = -1 end def normalize - sort_if_need + sort_if_need[0..@max_size] end def current_element(rss) @@ -326,9 +432,10 @@ module RSS class ItemBase include Base - %w(guid enclosure source category).each do |element| + %w(guid enclosure source categories).each do |element| attr_reader element add_other_element(element) + add_need_initialize_variable(element, "make_#{element}") module_eval(<<-EOC, __FILE__, __LINE__) private def setup_#{element}(rss, current) @@ -349,14 +456,6 @@ EOC alias_method(:pubDate, :date) alias_method(:pubDate=, :date=) - def initialize(maker) - super - @guid = make_guid - @enclosure = make_enclosure - @source = make_source - @category = make_category - end - def <=>(other) if @date and other.date @date <=> other.date @@ -400,14 +499,7 @@ EOC end end - class CategoryBase - include Base - - %w(domain content).each do |element| - attr_accessor element - add_need_initialize_variable(element) - end - end + CategoriesBase = ChannelBase::CategoriesBase end end |