diff options
author | kou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-04-05 06:42:03 +0000 |
---|---|---|
committer | kou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-04-05 06:42:03 +0000 |
commit | d12dff187a86d0f21ad1628472cd797505ddeabe (patch) | |
tree | 006f7ea1d0995dfc481a63601cc5e19a58d5baba /lib/rss/maker | |
parent | 5ddcd35cf12613969b27c06cf3ca1b57ce68a3f0 (diff) | |
download | ruby-d12dff187a86d0f21ad1628472cd797505ddeabe.tar.gz |
* lib/rss/dublincore.rb: supported multiple DublinCore items.
* lib/rss/parser.rb: added class name registry for complex model
elements. (ex. have childlen elements, have some attributes and
a child element and so on.)
* lib/rss/maker/base.rb: added default current_element implementation.
* lib/rss/maker/dublincore.rb: supported multiple DublinCore items.
* lib/rss/maker/image.rb: supproted new DublinCore API.
* lib/rss/trackback.rb (RSS::TrackBackUtils.new_with_value_if_need):
moved to RSS::Utils.
* lib/rss/utils.rb (RSS::Utils.new_with_value_if_need):
moved from RSS::TrackBackUtils.
* lib/rss/maker/image.rb: fixed invalid argument of
add_need_initialize_variable bug.
* lib/rss/maker/trackback.rb: ditto.
* lib/rss/rss.rb (Hash#merge): added for ruby 1.6.
* lib/rss/rss.rb (RSS::BaseModel.date_writer): changed to accept nil
for date value.
* test/test_dublincore.rb: added tests for plural accessor and
multiple DublinCore items.
* test/test_setup_maker_1.0.rb: fixed swapped actual and expected
values.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8252 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rss/maker')
-rw-r--r-- | lib/rss/maker/base.rb | 4 | ||||
-rw-r--r-- | lib/rss/maker/dublincore.rb | 132 | ||||
-rw-r--r-- | lib/rss/maker/image.rb | 15 | ||||
-rw-r--r-- | lib/rss/maker/trackback.rb | 2 |
4 files changed, 141 insertions, 12 deletions
diff --git a/lib/rss/maker/base.rb b/lib/rss/maker/base.rb index 0b157b1ee2..4f5e31f542 100644 --- a/lib/rss/maker/base.rb +++ b/lib/rss/maker/base.rb @@ -81,6 +81,10 @@ module RSS end end + def current_element(rss) + rss + end + def setup_values(target) set = false if have_required_values? diff --git a/lib/rss/maker/dublincore.rb b/lib/rss/maker/dublincore.rb index 3eeb269df1..4e4378436d 100644 --- a/lib/rss/maker/dublincore.rb +++ b/lib/rss/maker/dublincore.rb @@ -7,16 +7,92 @@ module RSS def self.append_features(klass) super - ::RSS::DublinCoreModel::ELEMENTS.uniq.each do |element| - klass.add_need_initialize_variable(element) - klass.add_other_element(element) - klass.__send__(:attr_accessor, element) + ::RSS::DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name| + plural_name ||= "#{name}s" + full_name = "#{RSS::DC_PREFIX}_#{name}" + full_plural_name = "#{RSS::DC_PREFIX}_#{plural_name}" + klass_name = Utils.to_class_name(name) + plural_klass_name = "DublinCore#{Utils.to_class_name(plural_name)}" + full_plural_klass_name = "self.class::#{plural_klass_name}" + full_klass_name = "#{full_plural_klass_name}::#{klass_name}" + klass.add_need_initialize_variable(full_plural_name, + "make_#{full_plural_name}") + klass.add_other_element(full_plural_name) + klass.__send__(:attr_accessor, full_plural_name) klass.module_eval(<<-EOC, __FILE__, __LINE__) - def setup_#{element}(rss, current) - if #{element} and current.respond_to?(:#{element}=) - current.#{element} = #{element} + def make_#{full_plural_name} + #{full_plural_klass_name}.new(@maker) + end + + def setup_#{full_plural_name}(rss, current) + @#{full_plural_name}.to_rss(rss, current) + end + + def #{full_name} + @#{full_plural_name}[0] and @#{full_plural_name}[0].value + end + + def #{full_name}=(new_value) + @#{full_plural_name}[0] = #{full_klass_name}.new(self) + @#{full_plural_name}[0].value = new_value + end +EOC + end + end + + ::RSS::DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name| + plural_name ||= "#{name}s" + klass_name = Utils.to_class_name(name) + plural_klass_name = "DublinCore#{Utils.to_class_name(plural_name)}" + module_eval(<<-EOC, __FILE__, __LINE__) + class #{plural_klass_name}Base + include Base + + def_array_element(#{plural_name.dump}) + + def new_#{name} + #{name} = self.class::#{klass_name}.new(self) + @#{plural_name} << #{name} + #{name} + end + + def to_rss(rss, current) + @#{plural_name}.each do |#{name}| + #{name}.to_rss(rss, current) + end + end + + class #{klass_name}Base + include Base + + attr_accessor :value + add_need_initialize_variable("value") + alias_method(:content, :value) + alias_method(:content=, :value=) + + def have_required_values? + @value + end + end + end + EOC + end + + def self.install_dublin_core(klass) + ::RSS::DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name| + plural_name ||= "#{name}s" + klass_name = Utils.to_class_name(name) + plural_klass_name = "DublinCore#{Utils.to_class_name(plural_name)}" + klass.module_eval(<<-EOC, *Utils.get_file_and_line_from_caller(1)) + class #{plural_klass_name} < #{plural_klass_name}Base + class #{klass_name} < #{klass_name}Base + def to_rss(rss, current) + if value and current.respond_to?(:dc_#{name}) + current.dc_#{name} = value + end end end + end EOC end end @@ -24,7 +100,7 @@ EOC class ChannelBase include DublinCoreModel - + undef_method(:dc_date) undef_method(:dc_date=) alias_method(:dc_date, :date) @@ -43,5 +119,45 @@ EOC end end class TextinputBase; include DublinCoreModel; end + + class RSS10 + class Channel + DublinCoreModel.install_dublin_core(self) + end + + class Image + DublinCoreModel.install_dublin_core(self) + end + + class Items + class Item + DublinCoreModel.install_dublin_core(self) + end + end + + class Textinput + DublinCoreModel.install_dublin_core(self) + end + end + + class RSS09 + class Channel + DublinCoreModel.install_dublin_core(self) + end + + class Image + DublinCoreModel.install_dublin_core(self) + end + + class Items + class Item + DublinCoreModel.install_dublin_core(self) + end + end + + class Textinput + DublinCoreModel.install_dublin_core(self) + end + end end end diff --git a/lib/rss/maker/image.rb b/lib/rss/maker/image.rb index 98d59f733c..9e3772f09c 100644 --- a/lib/rss/maker/image.rb +++ b/lib/rss/maker/image.rb @@ -30,8 +30,10 @@ EOC include Maker::DublinCoreModel attr_accessor :about, :resource, :image_width, :image_height - add_need_initialize_variable(:about, :resource) - add_need_initialize_variable(:image_width, :image_height) + add_need_initialize_variable("about") + add_need_initialize_variable("resource") + add_need_initialize_variable("image_width") + add_need_initialize_variable("image_height") alias width= image_width= alias width image_width alias height= image_height= @@ -69,7 +71,8 @@ EOC include Maker::DublinCoreModel attr_accessor :about, :image_size - add_need_initialize_variable(:about, :image_size) + add_need_initialize_variable("about") + add_need_initialize_variable("image_size") alias size image_size alias size= image_size= @@ -89,10 +92,12 @@ EOC class Items class Item class ImageItem < ImageItemBase + DublinCoreModel.install_dublin_core(self) def to_rss(rss, current) if @about item = ::RSS::ImageItemModel::Item.new(@about, @resource) setup_values(item) + setup_other_elements(item) current.image_item = item end end @@ -102,11 +107,13 @@ EOC class Channel class ImageFavicon < ImageFaviconBase + DublinCoreModel.install_dublin_core(self) def to_rss(rss, current) if @about and @image_size args = [@about, @image_size] favicon = ::RSS::ImageFaviconModel::Favicon.new(*args) setup_values(favicon) + setup_other_elements(favicon) current.image_favicon = favicon end end @@ -118,6 +125,7 @@ EOC class Items class Item class ImageItem < ImageItemBase + DublinCoreModel.install_dublin_core(self) def to_rss(*args) end end @@ -126,6 +134,7 @@ EOC class Channel class ImageFavicon < ImageFaviconBase + DublinCoreModel.install_dublin_core(self) def to_rss(*args) end end diff --git a/lib/rss/maker/trackback.rb b/lib/rss/maker/trackback.rb index ef78bf2f20..3df21924dd 100644 --- a/lib/rss/maker/trackback.rb +++ b/lib/rss/maker/trackback.rb @@ -56,7 +56,7 @@ module RSS include Base attr_accessor :value - add_need_initialize_variable(:value) + add_need_initialize_variable("value") alias_method(:resource, :value) alias_method(:resource=, :value=) |