1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* 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
This commit is contained in:
kou 2004-12-08 12:58:36 +00:00
parent 67c5b057e6
commit bcf72db844
30 changed files with 1967 additions and 990 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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