diff options
Diffstat (limited to 'lib/rss/maker')
-rw-r--r-- | lib/rss/maker/0.9.rb | 68 | ||||
-rw-r--r-- | lib/rss/maker/1.0.rb | 31 | ||||
-rw-r--r-- | lib/rss/maker/2.0.rb | 69 | ||||
-rw-r--r-- | lib/rss/maker/base.rb | 173 | ||||
-rw-r--r-- | lib/rss/maker/trackback.rb | 118 |
5 files changed, 377 insertions, 82 deletions
diff --git a/lib/rss/maker/0.9.rb b/lib/rss/maker/0.9.rb index 05578082b0..6f26e20f4f 100644 --- a/lib/rss/maker/0.9.rb +++ b/lib/rss/maker/0.9.rb @@ -69,9 +69,72 @@ module RSS super + ["pubDate"] end + class SkipDays < SkipDaysBase + def to_rss(rss, channel) + unless @days.empty? + skipDays = Rss::Channel::SkipDays.new + channel.skipDays = skipDays + @days.each do |day| + day.to_rss(rss, skipDays.days) + end + end + end + + class Day < DayBase + def to_rss(rss, days) + day = Rss::Channel::SkipDays::Day.new + set = setup_values(day) + if set + days << day + setup_other_elements(rss) + end + end + + def have_required_values? + @content + end + end + end + + class SkipHours < SkipHoursBase + def to_rss(rss, channel) + unless @hours.empty? + skipHours = Rss::Channel::SkipHours.new + channel.skipHours = skipHours + @hours.each do |hour| + hour.to_rss(rss, skipHours.hours) + end + end + end + + class Hour < HourBase + def to_rss(rss, hours) + hour = Rss::Channel::SkipHours::Hour.new + set = setup_values(hour) + if set + hours << hour + setup_other_elements(rss) + end + end + + def have_required_values? + @content + end + end + end + class Cloud < CloudBase + def to_rss(*args) + end end + class Categories < CategoriesBase + def to_rss(*args) + end + + class Category < CategoryBase + end + end end class Image < ImageBase @@ -130,9 +193,12 @@ module RSS end end - class Category < CategoryBase + class Categories < CategoriesBase def to_rss(*args) end + + class Category < CategoryBase + end end end diff --git a/lib/rss/maker/1.0.rb b/lib/rss/maker/1.0.rb index 894bcc0a24..ae22eb4fc4 100644 --- a/lib/rss/maker/1.0.rb +++ b/lib/rss/maker/1.0.rb @@ -86,7 +86,33 @@ module RSS end end + class SkipDays < SkipDaysBase + def to_rss(*args) + end + + class Day < DayBase + end + end + + class SkipHours < SkipHoursBase + def to_rss(*args) + end + + class Hour < HourBase + end + end + class Cloud < CloudBase + def to_rss(*args) + end + end + + class Categories < CategoriesBase + def to_rss(*args) + end + + class Category < CategoryBase + end end end @@ -153,9 +179,12 @@ module RSS end end - class Category < CategoryBase + class Categories < CategoriesBase def to_rss(*args) end + + class Category < CategoryBase + end end end end diff --git a/lib/rss/maker/2.0.rb b/lib/rss/maker/2.0.rb index 05fc46480a..8ac5e7bbb3 100644 --- a/lib/rss/maker/2.0.rb +++ b/lib/rss/maker/2.0.rb @@ -13,23 +13,26 @@ module RSS class Channel < RSS09::Channel - add_other_element("cloud") - def have_required_values? @title and @link and @description end - private - def setup_cloud(rss, current) - @maker.channel.cloud.to_rss(rss) + class SkipDays < RSS09::Channel::SkipDays + class Day < RSS09::Channel::SkipDays::Day + end end - + + class SkipHours < RSS09::Channel::SkipHours + class Hour < RSS09::Channel::SkipHours::Hour + end + end + class Cloud < RSS09::Channel::Cloud - def to_rss(rss) + def to_rss(rss, channel) cloud = Rss::Channel::Cloud.new set = setup_values(cloud) if set - rss.channel.cloud = cloud + channel.cloud = cloud setup_other_elements(rss) end end @@ -39,6 +42,30 @@ module RSS @registerProcedure and @protocol end end + + class Categories < RSS09::Channel::Categories + def to_rss(rss, channel) + @categories.each do |category| + category.to_rss(rss, channel) + end + end + + class Category < RSS09::Channel::Categories::Category + def to_rss(rss, channel) + category = Rss::Channel::Category.new + set = setup_values(category) + if set + channel.category = category + setup_other_elements(rss) + end + end + + def have_required_values? + @content + end + end + end + end class Image < RSS09::Image @@ -102,18 +129,26 @@ module RSS end end - class Category < RSS09::Items::Item::Category + class Categories < RSS09::Items::Item::Categories def to_rss(rss, item) - category = Rss::Channel::Item::Category.new - set = setup_values(category) - if set - item.category = category - setup_other_elements(rss) + @categories.each do |category| + category.to_rss(rss, item) end end - - def have_required_values? - @content + + class Category < RSS09::Items::Item::Categories::Category + def to_rss(rss, item) + category = Rss::Channel::Item::Category.new + set = setup_values(category) + if set + item.category = category + setup_other_elements(rss) + end + end + + def have_required_values? + @content + end end end end diff --git a/lib/rss/maker/base.rb b/lib/rss/maker/base.rb index 21222351f2..91eb072ec7 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,11 @@ 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 end @@ -159,17 +174,7 @@ module RSS 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 +222,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 +248,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 +325,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,18 +368,12 @@ 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 def initialize(maker) super - @items = [] @do_sort = false end @@ -326,9 +409,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 +433,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 +476,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 diff --git a/lib/rss/maker/trackback.rb b/lib/rss/maker/trackback.rb index 1ec59ab0b0..ef78bf2f20 100644 --- a/lib/rss/maker/trackback.rb +++ b/lib/rss/maker/trackback.rb @@ -1,5 +1,6 @@ require 'rss/trackback' require 'rss/maker/1.0' +require 'rss/maker/2.0' module RSS module Maker @@ -7,18 +8,65 @@ module RSS def self.append_features(klass) super - %w(ping about).each do |element| - name = "#{RSS::TRACKBACK_PREFIX}_#{element}" - klass.add_need_initialize_variable(name) - klass.add_other_element(name) - klass.__send__(:attr_accessor, name) - klass.module_eval(<<-EOC, __FILE__, __LINE__) - def setup_#{name}(rss, current) - if #{name} and current.respond_to?(:#{name}=) - current.#{name} = @#{name} if @#{name} - end + name = "#{RSS::TRACKBACK_PREFIX}_ping" + klass.add_need_initialize_variable(name) + klass.add_other_element(name) + klass.__send__(:attr_accessor, name) + klass.module_eval(<<-EOC, __FILE__, __LINE__) + def setup_#{name}(rss, current) + if #{name} and current.respond_to?(:#{name}=) + current.#{name} = #{name} end - EOC + end + EOC + + name = "#{RSS::TRACKBACK_PREFIX}_abouts" + klass.add_need_initialize_variable(name, "make_#{name}") + klass.add_other_element(name) + klass.__send__(:attr_accessor, name) + klass.module_eval(<<-EOC, __FILE__, __LINE__) + def make_#{name} + self.class::TrackBackAbouts.new(self) + end + + def setup_#{name}(rss, current) + @#{name}.to_rss(rss, current) + end + EOC + end + + class TrackBackAboutsBase + include Base + + def_array_element("abouts") + + def new_about + about = self.class::About.new(@maker) + @abouts << about + about + end + + def to_rss(rss, current) + @abouts.each do |about| + about.to_rss(rss, current) + end + end + + class AboutBase + include Base + + attr_accessor :value + add_need_initialize_variable(:value) + + alias_method(:resource, :value) + alias_method(:resource=, :value=) + alias_method(:content, :value) + alias_method(:content=, :value=) + + def have_required_values? + @value + end + end end end @@ -26,5 +74,53 @@ module RSS class ItemsBase class ItemBase; include TrackBackModel; end end + + class RSS10 + class Items + class Item + class TrackBackAbouts < TrackBackAboutsBase + class About < AboutBase + def to_rss(rss, current) + if resource + about = ::RSS::TrackBackModel10::About.new(resource) + current.trackback_abouts << about + end + end + end + end + end + end + end + + class RSS09 + class Items + class Item + class TrackBackAbouts < TrackBackAboutsBase + def to_rss(*args) + end + class About < AboutBase + end + end + end + end + end + + class RSS20 + class Items + class Item + class TrackBackAbouts < TrackBackAboutsBase + class About < AboutBase + def to_rss(rss, current) + if content + about = ::RSS::TrackBackModel20::About.new(content) + current.trackback_abouts << about + end + end + end + end + end + end + end + end end |