From d12dff187a86d0f21ad1628472cd797505ddeabe Mon Sep 17 00:00:00 2001 From: kou Date: Tue, 5 Apr 2005 06:42:03 +0000 Subject: * 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 --- lib/rss/dublincore.rb | 141 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 118 insertions(+), 23 deletions(-) (limited to 'lib/rss/dublincore.rb') diff --git a/lib/rss/dublincore.rb b/lib/rss/dublincore.rb index d460828da7..1a1e1776c7 100644 --- a/lib/rss/dublincore.rb +++ b/lib/rss/dublincore.rb @@ -7,41 +7,135 @@ module RSS RDF.install_ns(DC_PREFIX, DC_URI) + module BaseDublinCoreModel + def append_features(klass) + super + + return if klass.instance_of?(Module) + DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name| + plural = plural_name || "#{name}s" + full_name = "#{DC_PREFIX}_#{name}" + full_plural_name = "#{DC_PREFIX}_#{plural}" + klass_name = "DublinCore#{Utils.to_class_name(name)}" + klass.module_eval(<<-EOC, *get_file_and_line_from_caller(0)) + install_have_children_element(#{full_name.dump}, + #{full_plural_name.dump}) + + remove_method :#{full_name} + remove_method :#{full_name}= + remove_method :set_#{full_name} + + def #{full_name} + @#{full_name}.first and @#{full_name}.first.value + end + + def #{full_name}=(new_value) + @#{full_name}[0] = Utils.new_with_value_if_need(#{klass_name}, new_value) + end + alias set_#{full_name} #{full_name}= + EOC + end + klass.module_eval(<<-EOC, *get_file_and_line_from_caller(0)) + alias date #{DC_PREFIX}_date + alias date= #{DC_PREFIX}_date= + EOC + end + end + module DublinCoreModel extend BaseModel + extend BaseDublinCoreModel - ELEMENTS = [] + TEXT_ELEMENTS = { + "title" => nil, + "description" => nil, + "creator" => nil, + "subject" => nil, + "publisher" => nil, + "contributor" => nil, + "type" => nil, + "format" => nil, + "identifier" => nil, + "source" => nil, + "language" => nil, + "relation" => nil, + "coverage" => nil, + "rights" => "rightses" # FIXME + } - def self.append_features(klass) - super + DATE_ELEMENTS = { + "date" => "w3cdtf", + } + + ELEMENT_NAME_INFOS = DublinCoreModel::TEXT_ELEMENTS.to_a + DublinCoreModel::DATE_ELEMENTS.each do |name, | + ELEMENT_NAME_INFOS << [name, nil] + end + + ELEMENTS = TEXT_ELEMENTS.keys + DATE_ELEMENTS.keys + + ELEMENTS.each do |x, plural_name| + module_eval(<<-EOC, *get_file_and_line_from_caller(0)) + class DublinCore#{Utils.to_class_name(x)} < Element + include RSS10 + + content_setup + + class << self + def required_prefix + DC_PREFIX + end + + def required_uri + DC_URI + end + end + + @tag_name = #{x.dump} + + alias_method(:value, :content) + alias_method(:value=, :content=) + + def initialize(content=nil) + super() + self.content = content + end - klass.module_eval(<<-EOC, *get_file_and_line_from_caller(1)) - %w(title description creator subject publisher - contributor type format identifier source - language relation coverage rights).each do |x| - install_text_element("\#{DC_PREFIX}_\#{x}") - end + def full_name + tag_name_with_prefix(DC_PREFIX) + end + + def maker_target(target) + target.new_#{x} + end - %w(date).each do |x| - install_date_element("\#{DC_PREFIX}_\#{x}", 'w3cdtf', x) + def setup_maker_attributes(#{x}) + #{x}.content = content + end end - alias date #{DC_PREFIX}_date - alias date= #{DC_PREFIX}_date= EOC end - def dc_validate(tags) - counter = {} - ELEMENTS.each do |x| - counter[x] = 0 - end + DATE_ELEMENTS.each do |name, type| + module_eval(<<-EOC, *get_file_and_line_from_caller(0)) + class DublinCore#{Utils.to_class_name(name)} < Element + undef_method(:content=) + undef_method(:value=) + date_writer("content", #{type.dump}, #{name.dump}) + + alias_method(:value=, :content=) + end + EOC + end + + def dc_validate(tags) tags.each do |tag| key = "#{DC_PREFIX}_#{tag}" - raise UnknownTagError.new(tag, DC_URI) unless counter.has_key?(key) - counter[key] += 1 - raise TooMuchTagError.new(tag, tag_name) if counter[key] > 1 + unless DublinCoreModel::ELEMENTS.include?(key) + raise UnknownTagError.new(tag, DC_URI) + end end end @@ -57,9 +151,10 @@ module RSS class Textinput; include DublinCoreModel; end end - prefix_size = DC_PREFIX.size + 1 DublinCoreModel::ELEMENTS.each do |x| - BaseListener.install_get_text_element(DC_URI, x[prefix_size..-1], "#{x}=") + class_name = Utils.to_class_name(x) + BaseListener.install_class_name(DC_URI, x, "DublinCore#{class_name}") end + DublinCoreModel::ELEMENTS.collect! {|x| "#{DC_PREFIX}_#{x}"} end -- cgit v1.2.3