1 | require "rss/1.0"
|
---|
2 |
|
---|
3 | module 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}"}
|
---|
154 | end
|
---|