aboutsummaryrefslogtreecommitdiffstats
path: root/lib/rss/dublincore.rb
diff options
context:
space:
mode:
authorkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-04-05 06:42:03 +0000
committerkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-04-05 06:42:03 +0000
commitd12dff187a86d0f21ad1628472cd797505ddeabe (patch)
tree006f7ea1d0995dfc481a63601cc5e19a58d5baba /lib/rss/dublincore.rb
parent5ddcd35cf12613969b27c06cf3ca1b57ce68a3f0 (diff)
downloadruby-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/dublincore.rb')
-rw-r--r--lib/rss/dublincore.rb141
1 files changed, 118 insertions, 23 deletions
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