source: extensions/gsdl-video/trunk/installed/cmdline/lib/ruby/1.8/rss/dublincore.rb@ 18425

Last change on this file since 18425 was 18425, checked in by davidb, 15 years ago

Video extension to Greenstone

File size: 4.0 KB
Line 
1require "rss/1.0"
2
3module RSS
4
5 DC_PREFIX = 'dc'
6 DC_URI = "http://purl.org/dc/elements/1.1/"
7
8 RDF.install_ns(DC_PREFIX, DC_URI)
9
10 module BaseDublinCoreModel
11 def append_features(klass)
12 super
13
14 return if klass.instance_of?(Module)
15 DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name|
16 plural = plural_name || "#{name}s"
17 full_name = "#{DC_PREFIX}_#{name}"
18 full_plural_name = "#{DC_PREFIX}_#{plural}"
19 klass_name = "DublinCore#{Utils.to_class_name(name)}"
20 klass.install_must_call_validator(DC_PREFIX, DC_URI)
21 klass.install_have_children_element(name, DC_URI, "*",
22 full_name, full_plural_name)
23 klass.module_eval(<<-EOC, *get_file_and_line_from_caller(0))
24 remove_method :#{full_name}
25 remove_method :#{full_name}=
26 remove_method :set_#{full_name}
27
28 def #{full_name}
29 @#{full_name}.first and @#{full_name}.first.value
30 end
31
32 def #{full_name}=(new_value)
33 @#{full_name}[0] = Utils.new_with_value_if_need(#{klass_name}, new_value)
34 end
35 alias set_#{full_name} #{full_name}=
36 EOC
37 end
38 klass.module_eval(<<-EOC, *get_file_and_line_from_caller(0))
39 alias date #{DC_PREFIX}_date
40 alias date= #{DC_PREFIX}_date=
41 EOC
42 end
43 end
44
45 module DublinCoreModel
46
47 extend BaseModel
48 extend BaseDublinCoreModel
49
50 TEXT_ELEMENTS = {
51 "title" => nil,
52 "description" => nil,
53 "creator" => nil,
54 "subject" => nil,
55 "publisher" => nil,
56 "contributor" => nil,
57 "type" => nil,
58 "format" => nil,
59 "identifier" => nil,
60 "source" => nil,
61 "language" => nil,
62 "relation" => nil,
63 "coverage" => nil,
64 "rights" => "rightses" # FIXME
65 }
66
67 DATE_ELEMENTS = {
68 "date" => "w3cdtf",
69 }
70
71 ELEMENT_NAME_INFOS = DublinCoreModel::TEXT_ELEMENTS.to_a
72 DublinCoreModel::DATE_ELEMENTS.each do |name, |
73 ELEMENT_NAME_INFOS << [name, nil]
74 end
75
76 ELEMENTS = TEXT_ELEMENTS.keys + DATE_ELEMENTS.keys
77
78 ELEMENTS.each do |name, plural_name|
79 module_eval(<<-EOC, *get_file_and_line_from_caller(0))
80 class DublinCore#{Utils.to_class_name(name)} < Element
81 include RSS10
82
83 content_setup
84
85 class << self
86 def required_prefix
87 DC_PREFIX
88 end
89
90 def required_uri
91 DC_URI
92 end
93 end
94
95 @tag_name = #{name.dump}
96
97 alias_method(:value, :content)
98 alias_method(:value=, :content=)
99
100 def initialize(*args)
101 if Utils.element_initialize_arguments?(args)
102 super
103 else
104 super()
105 self.content = args[0]
106 end
107 end
108
109 def full_name
110 tag_name_with_prefix(DC_PREFIX)
111 end
112
113 def maker_target(target)
114 target.new_#{name}
115 end
116
117 def setup_maker_attributes(#{name})
118 #{name}.content = content
119 end
120 end
121 EOC
122 end
123
124 DATE_ELEMENTS.each do |name, type|
125 module_eval(<<-EOC, *get_file_and_line_from_caller(0))
126 class DublinCore#{Utils.to_class_name(name)} < Element
127 remove_method(:content=)
128 remove_method(:value=)
129
130 date_writer("content", #{type.dump}, #{name.dump})
131
132 alias_method(:value=, :content=)
133 end
134 EOC
135 end
136 end
137
138 # For backward compatibility
139 DublincoreModel = DublinCoreModel
140
141 class RDF
142 class Channel; include DublinCoreModel; end
143 class Image; include DublinCoreModel; end
144 class Item; include DublinCoreModel; end
145 class Textinput; include DublinCoreModel; end
146 end
147
148 DublinCoreModel::ELEMENTS.each do |name|
149 class_name = Utils.to_class_name(name)
150 BaseListener.install_class_name(DC_URI, name, "DublinCore#{class_name}")
151 end
152
153 DublinCoreModel::ELEMENTS.collect! {|name| "#{DC_PREFIX}_#{name}"}
154end
Note: See TracBrowser for help on using the repository browser.