5 DC_URI = "http://purl.org/dc/elements/1.1/"
7 module BaseDublinCoreModel
8 def append_features(klass)
11 return if klass.instance_of?(Module)
12 DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name|
13 plural = plural_name || "#{name}s"
14 full_name = "#{DC_PREFIX}_#{name}"
15 full_plural_name = "#{DC_PREFIX}_#{plural}"
16 klass_name = "DublinCore#{Utils.to_class_name(name)}"
17 klass.install_must_call_validator(DC_PREFIX, DC_URI)
18 klass.install_have_children_element(name, DC_URI, "*",
19 full_name, full_plural_name)
20 klass.module_eval(<<-EOC, *get_file_and_line_from_caller(0))
21 remove_method :#{full_name}
22 remove_method :#{full_name}=
23 remove_method :set_#{full_name}
26 @#{full_name}.first and @#{full_name}.first.value
29 def #{full_name}=(new_value)
30 @#{full_name}[0] = Utils.new_with_value_if_need(#{klass_name}, new_value)
32 alias set_#{full_name} #{full_name}=
35 klass.module_eval(<<-EOC, *get_file_and_line_from_caller(0))
36 if method_defined?(:date)
37 alias date_without_#{DC_PREFIX}_date= date=
40 self.date_without_#{DC_PREFIX}_date = value
41 self.#{DC_PREFIX}_date = value
44 alias date #{DC_PREFIX}_date
45 alias date= #{DC_PREFIX}_date=
48 # For backward compatibility
49 alias #{DC_PREFIX}_rightses #{DC_PREFIX}_rights_list
54 module DublinCoreModel
57 extend BaseDublinCoreModel
73 "rights" => "rights_list"
80 ELEMENT_NAME_INFOS = DublinCoreModel::TEXT_ELEMENTS.to_a
81 DublinCoreModel::DATE_ELEMENTS.each do |name, |
82 ELEMENT_NAME_INFOS << [name, nil]
85 ELEMENTS = TEXT_ELEMENTS.keys + DATE_ELEMENTS.keys
87 ELEMENTS.each do |name, plural_name|
88 module_eval(<<-EOC, *get_file_and_line_from_caller(0))
89 class DublinCore#{Utils.to_class_name(name)} < Element
104 @tag_name = #{name.dump}
106 alias_method(:value, :content)
107 alias_method(:value=, :content=)
109 def initialize(*args)
110 if Utils.element_initialize_arguments?(args)
114 self.content = args[0]
119 tag_name_with_prefix(DC_PREFIX)
122 def maker_target(target)
126 def setup_maker_attributes(#{name})
127 #{name}.content = content
133 DATE_ELEMENTS.each do |name, type|
134 tag_name = "#{DC_PREFIX}:#{name}"
135 module_eval(<<-EOC, *get_file_and_line_from_caller(0))
136 class DublinCore#{Utils.to_class_name(name)} < Element
137 remove_method(:content=)
138 remove_method(:value=)
140 date_writer("content", #{type.dump}, #{tag_name.dump})
142 alias_method(:value=, :content=)
148 # For backward compatibility
149 DublincoreModel = DublinCoreModel
151 DublinCoreModel::ELEMENTS.each do |name|
152 class_name = Utils.to_class_name(name)
153 BaseListener.install_class_name(DC_URI, name, "DublinCore#{class_name}")
156 DublinCoreModel::ELEMENTS.collect! {|name| "#{DC_PREFIX}_#{name}"}
159 require 'rss/dublincore/1.0'
160 require 'rss/dublincore/2.0'
161 require 'rss/dublincore/atom'