summaryrefslogtreecommitdiff
path: root/lib/rss/dublincore.rb
diff options
context:
space:
mode:
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