1 | require 'rss/dublincore'
|
---|
2 | require 'rss/maker/1.0'
|
---|
3 |
|
---|
4 | module RSS
|
---|
5 | module Maker
|
---|
6 | module DublinCoreModel
|
---|
7 | def self.append_features(klass)
|
---|
8 | super
|
---|
9 |
|
---|
10 | ::RSS::DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name|
|
---|
11 | plural_name ||= "#{name}s"
|
---|
12 | full_name = "#{RSS::DC_PREFIX}_#{name}"
|
---|
13 | full_plural_name = "#{RSS::DC_PREFIX}_#{plural_name}"
|
---|
14 | klass_name = Utils.to_class_name(name)
|
---|
15 | plural_klass_name = "DublinCore#{Utils.to_class_name(plural_name)}"
|
---|
16 | full_plural_klass_name = "self.class::#{plural_klass_name}"
|
---|
17 | full_klass_name = "#{full_plural_klass_name}::#{klass_name}"
|
---|
18 | klass.add_need_initialize_variable(full_plural_name,
|
---|
19 | "make_#{full_plural_name}")
|
---|
20 | klass.add_other_element(full_plural_name)
|
---|
21 | klass.module_eval(<<-EOC, __FILE__, __LINE__+1)
|
---|
22 | attr_accessor :#{full_plural_name}
|
---|
23 | def make_#{full_plural_name}
|
---|
24 | #{full_plural_klass_name}.new(@maker)
|
---|
25 | end
|
---|
26 |
|
---|
27 | def setup_#{full_plural_name}(rss, current)
|
---|
28 | @#{full_plural_name}.to_rss(rss, current)
|
---|
29 | end
|
---|
30 |
|
---|
31 | def #{full_name}
|
---|
32 | @#{full_plural_name}[0] and @#{full_plural_name}[0].value
|
---|
33 | end
|
---|
34 |
|
---|
35 | def #{full_name}=(new_value)
|
---|
36 | @#{full_plural_name}[0] = #{full_klass_name}.new(self)
|
---|
37 | @#{full_plural_name}[0].value = new_value
|
---|
38 | end
|
---|
39 | EOC
|
---|
40 | end
|
---|
41 | end
|
---|
42 |
|
---|
43 | ::RSS::DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name|
|
---|
44 | plural_name ||= "#{name}s"
|
---|
45 | klass_name = Utils.to_class_name(name)
|
---|
46 | plural_klass_name = "DublinCore#{Utils.to_class_name(plural_name)}"
|
---|
47 | module_eval(<<-EOC, __FILE__, __LINE__)
|
---|
48 | class #{plural_klass_name}Base
|
---|
49 | include Base
|
---|
50 |
|
---|
51 | def_array_element(#{plural_name.dump})
|
---|
52 |
|
---|
53 | def new_#{name}
|
---|
54 | #{name} = self.class::#{klass_name}.new(self)
|
---|
55 | @#{plural_name} << #{name}
|
---|
56 | if block_given?
|
---|
57 | yield #{name}
|
---|
58 | else
|
---|
59 | #{name}
|
---|
60 | end
|
---|
61 | end
|
---|
62 |
|
---|
63 | def to_rss(rss, current)
|
---|
64 | @#{plural_name}.each do |#{name}|
|
---|
65 | #{name}.to_rss(rss, current)
|
---|
66 | end
|
---|
67 | end
|
---|
68 |
|
---|
69 | class #{klass_name}Base
|
---|
70 | include Base
|
---|
71 |
|
---|
72 | attr_accessor :value
|
---|
73 | add_need_initialize_variable("value")
|
---|
74 | alias_method(:content, :value)
|
---|
75 | alias_method(:content=, :value=)
|
---|
76 |
|
---|
77 | def have_required_values?
|
---|
78 | @value
|
---|
79 | end
|
---|
80 | end
|
---|
81 | end
|
---|
82 | EOC
|
---|
83 | end
|
---|
84 |
|
---|
85 | def self.install_dublin_core(klass)
|
---|
86 | ::RSS::DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name|
|
---|
87 | plural_name ||= "#{name}s"
|
---|
88 | klass_name = Utils.to_class_name(name)
|
---|
89 | plural_klass_name = "DublinCore#{Utils.to_class_name(plural_name)}"
|
---|
90 | full_klass_name = "DublinCore#{klass_name}"
|
---|
91 | klass.module_eval(<<-EOC, *Utils.get_file_and_line_from_caller(1))
|
---|
92 | class #{plural_klass_name} < #{plural_klass_name}Base
|
---|
93 | class #{klass_name} < #{klass_name}Base
|
---|
94 | def to_rss(rss, current)
|
---|
95 | if value and current.respond_to?(:dc_#{name})
|
---|
96 | new_item = current.class::#{full_klass_name}.new(value)
|
---|
97 | current.dc_#{plural_name} << new_item
|
---|
98 | end
|
---|
99 | end
|
---|
100 | end
|
---|
101 | end
|
---|
102 | EOC
|
---|
103 | end
|
---|
104 | end
|
---|
105 | end
|
---|
106 |
|
---|
107 | class ChannelBase
|
---|
108 | include DublinCoreModel
|
---|
109 |
|
---|
110 | remove_method(:date)
|
---|
111 | remove_method(:date=)
|
---|
112 | alias_method(:date, :dc_date)
|
---|
113 | alias_method(:date=, :dc_date=)
|
---|
114 | end
|
---|
115 |
|
---|
116 | class ImageBase; include DublinCoreModel; end
|
---|
117 | class ItemsBase
|
---|
118 | class ItemBase
|
---|
119 | include DublinCoreModel
|
---|
120 |
|
---|
121 | remove_method(:date)
|
---|
122 | remove_method(:date=)
|
---|
123 | alias_method(:date, :dc_date)
|
---|
124 | alias_method(:date=, :dc_date=)
|
---|
125 | end
|
---|
126 | end
|
---|
127 | class TextinputBase; include DublinCoreModel; end
|
---|
128 |
|
---|
129 | class RSS10
|
---|
130 | class Channel
|
---|
131 | DublinCoreModel.install_dublin_core(self)
|
---|
132 | end
|
---|
133 |
|
---|
134 | class Image
|
---|
135 | DublinCoreModel.install_dublin_core(self)
|
---|
136 | end
|
---|
137 |
|
---|
138 | class Items
|
---|
139 | class Item
|
---|
140 | DublinCoreModel.install_dublin_core(self)
|
---|
141 | end
|
---|
142 | end
|
---|
143 |
|
---|
144 | class Textinput
|
---|
145 | DublinCoreModel.install_dublin_core(self)
|
---|
146 | end
|
---|
147 | end
|
---|
148 |
|
---|
149 | class RSS09
|
---|
150 | class Channel
|
---|
151 | DublinCoreModel.install_dublin_core(self)
|
---|
152 | end
|
---|
153 |
|
---|
154 | class Image
|
---|
155 | DublinCoreModel.install_dublin_core(self)
|
---|
156 | end
|
---|
157 |
|
---|
158 | class Items
|
---|
159 | class Item
|
---|
160 | DublinCoreModel.install_dublin_core(self)
|
---|
161 | end
|
---|
162 | end
|
---|
163 |
|
---|
164 | class Textinput
|
---|
165 | DublinCoreModel.install_dublin_core(self)
|
---|
166 | end
|
---|
167 | end
|
---|
168 | end
|
---|
169 | end
|
---|