OSDN Git Service

ruby-1.9.1-rc1
[splhack/AndroidRuby.git] / lib / ruby-1.9.1-rc1 / lib / rss / dublincore.rb
1 require "rss/rss"
2
3 module RSS
4   DC_PREFIX = 'dc'
5   DC_URI = "http://purl.org/dc/elements/1.1/"
6
7   module BaseDublinCoreModel
8     def append_features(klass)
9       super
10
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}
24
25           def #{full_name}
26             @#{full_name}.first and @#{full_name}.first.value
27           end
28           
29           def #{full_name}=(new_value)
30             @#{full_name}[0] = Utils.new_with_value_if_need(#{klass_name}, new_value)
31           end
32           alias set_#{full_name} #{full_name}=
33         EOC
34       end
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=
38
39           def date=(value)
40             self.date_without_#{DC_PREFIX}_date = value
41             self.#{DC_PREFIX}_date = value
42           end
43         else
44           alias date #{DC_PREFIX}_date
45           alias date= #{DC_PREFIX}_date=
46         end
47
48         # For backward compatibility
49         alias #{DC_PREFIX}_rightses #{DC_PREFIX}_rights_list
50       EOC
51     end
52   end
53   
54   module DublinCoreModel
55
56     extend BaseModel
57     extend BaseDublinCoreModel
58
59     TEXT_ELEMENTS = {
60       "title" => nil,
61       "description" => nil,
62       "creator" => nil,
63       "subject" => nil,
64       "publisher" => nil,
65       "contributor" => nil,
66       "type" => nil,
67       "format" => nil,
68       "identifier" => nil,
69       "source" => nil,
70       "language" => nil,
71       "relation" => nil,
72       "coverage" => nil,
73       "rights" => "rights_list"
74     }
75
76     DATE_ELEMENTS = {
77       "date" => "w3cdtf",
78     }
79     
80     ELEMENT_NAME_INFOS = DublinCoreModel::TEXT_ELEMENTS.to_a
81     DublinCoreModel::DATE_ELEMENTS.each do |name, |
82       ELEMENT_NAME_INFOS << [name, nil]
83     end
84     
85     ELEMENTS = TEXT_ELEMENTS.keys + DATE_ELEMENTS.keys
86
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
90           include RSS10
91           
92           content_setup
93
94           class << self
95             def required_prefix
96               DC_PREFIX
97             end
98         
99             def required_uri
100               DC_URI
101             end
102           end
103
104           @tag_name = #{name.dump}
105
106           alias_method(:value, :content)
107           alias_method(:value=, :content=)
108           
109           def initialize(*args)
110             if Utils.element_initialize_arguments?(args)
111               super
112             else
113               super()
114               self.content = args[0]
115             end
116           end
117       
118           def full_name
119             tag_name_with_prefix(DC_PREFIX)
120           end
121
122           def maker_target(target)
123             target.new_#{name}
124           end
125
126           def setup_maker_attributes(#{name})
127             #{name}.content = content
128           end
129         end
130       EOC
131     end
132
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=)
139
140           date_writer("content", #{type.dump}, #{tag_name.dump})
141
142           alias_method(:value=, :content=)
143         end
144       EOC
145     end
146   end
147
148   # For backward compatibility
149   DublincoreModel = DublinCoreModel
150
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}")
154   end
155
156   DublinCoreModel::ELEMENTS.collect! {|name| "#{DC_PREFIX}_#{name}"}
157 end
158
159 require 'rss/dublincore/1.0'
160 require 'rss/dublincore/2.0'
161 require 'rss/dublincore/atom'