summaryrefslogtreecommitdiff
path: root/lib/rss/maker
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rss/maker')
-rw-r--r--lib/rss/maker/0.9.rb100
-rw-r--r--lib/rss/maker/1.0.rb74
-rw-r--r--lib/rss/maker/2.0.rb73
-rw-r--r--lib/rss/maker/base.rb260
-rw-r--r--lib/rss/maker/trackback.rb118
5 files changed, 467 insertions, 158 deletions
diff --git a/lib/rss/maker/0.9.rb b/lib/rss/maker/0.9.rb
index 05578082b0..b82585fb96 100644
--- a/lib/rss/maker/0.9.rb
+++ b/lib/rss/maker/0.9.rb
@@ -11,23 +11,15 @@ module RSS
super
end
- def to_rss
- rss = Rss.new(@rss_version, @version, @encoding, @standalone)
- setup_xml_stylesheets(rss)
- setup_channel(rss)
- setup_other_elements(rss)
- if rss.channel
- rss
- else
- nil
- end
- end
-
private
- def setup_channel(rss)
- @channel.to_rss(rss)
+ def make_rss
+ Rss.new(@rss_version, @version, @encoding, @standalone)
end
-
+
+ def setup_elements(rss)
+ setup_channel(rss)
+ end
+
class Channel < ChannelBase
def to_rss(rss)
@@ -44,12 +36,13 @@ module RSS
else
nil
end
+ elsif variable_is_set?
+ raise NotSetError.new("maker.channel", not_set_required_variables)
end
end
def have_required_values?
- @title and @link and @description and @language and
- @maker.image.have_required_values?
+ @title and @link and @description and @language
end
private
@@ -69,9 +62,76 @@ module RSS
super + ["pubDate"]
end
+ def required_variable_names
+ %w(title link description language)
+ 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 +190,12 @@ module RSS
end
end
- class Category < CategoryBase
+ class Categories < CategoriesBase
def to_rss(*args)
end
+
+ class Category < CategoryBase
+ end
end
end
@@ -156,5 +219,6 @@ module RSS
end
add_maker(filename_to_version(__FILE__), RSS09)
+ add_maker(filename_to_version(__FILE__) + "1", RSS09)
end
end
diff --git a/lib/rss/maker/1.0.rb b/lib/rss/maker/1.0.rb
index 894bcc0a24..e38a2f89e0 100644
--- a/lib/rss/maker/1.0.rb
+++ b/lib/rss/maker/1.0.rb
@@ -11,41 +11,22 @@ module RSS
super("1.0")
end
- def to_rss
- rss = RDF.new(@version, @encoding, @standalone)
- setup_xml_stylesheets(rss)
+ private
+ def make_rss
+ RDF.new(@version, @encoding, @standalone)
+ end
+
+ def setup_elements(rss)
setup_channel(rss)
setup_image(rss)
setup_items(rss)
setup_textinput(rss)
- setup_other_elements(rss)
- if rss.channel
- rss
- else
- nil
- end
- end
-
- private
- def setup_channel(rss)
- @channel.to_rss(rss)
- end
-
- def setup_image(rss)
- @image.to_rss(rss)
- end
-
- def setup_items(rss)
- @items.to_rss(rss)
- end
-
- def setup_textinput(rss)
- @textinput.to_rss(rss)
end
class Channel < ChannelBase
def to_rss(rss)
+ set = false
if @about
channel = RDF::Channel.new(@about)
set = setup_values(channel)
@@ -57,12 +38,16 @@ module RSS
setup_other_elements(rss)
end
end
+
+ if (!@about or !set) and variable_is_set?
+ raise NotSetError.new("maker.channel", not_set_required_variables)
+ end
end
def have_required_values?
@about and @title and @link and @description
end
-
+
private
def setup_items(rss)
items = RDF::Channel::Items.new
@@ -86,7 +71,37 @@ module RSS
end
end
+ def required_variable_names
+ %w(about title link description)
+ 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 +168,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..a958661614 100644
--- a/lib/rss/maker/2.0.rb
+++ b/lib/rss/maker/2.0.rb
@@ -13,23 +13,30 @@ 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)
+ def required_variable_names
+ %w(title link description)
end
-
+
+ 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 +46,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.categories << category
+ setup_other_elements(rss)
+ end
+ end
+
+ def have_required_values?
+ @content
+ end
+ end
+ end
+
end
class Image < RSS09::Image
@@ -102,18 +133,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.categories << 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..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
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