1require "rss/0.9"
2
3require "rss/maker/base"
4
5module RSS
6  module Maker
7
8    class RSS09 < RSSBase
9
10      def initialize(feed_version)
11        super
12        @feed_type = "rss"
13      end
14
15      private
16      def make_feed
17        Rss.new(@feed_version, @version, @encoding, @standalone)
18      end
19
20      def setup_elements(rss)
21        setup_channel(rss)
22      end
23
24      class Channel < ChannelBase
25        def to_feed(rss)
26          channel = Rss::Channel.new
27          setup_values(channel)
28          _not_set_required_variables = not_set_required_variables
29          if _not_set_required_variables.empty?
30            rss.channel = channel
31            set_parent(channel, rss)
32            setup_items(rss)
33            setup_image(rss)
34            setup_textinput(rss)
35            setup_other_elements(rss, channel)
36            rss
37          else
38            raise NotSetError.new("maker.channel", _not_set_required_variables)
39          end
40        end
41
42        private
43        def setup_items(rss)
44          @maker.items.to_feed(rss)
45        end
46
47        def setup_image(rss)
48          @maker.image.to_feed(rss)
49        end
50
51        def setup_textinput(rss)
52          @maker.textinput.to_feed(rss)
53        end
54
55        def variables
56          super + ["pubDate"]
57        end
58
59        def required_variable_names
60          %w(link language)
61        end
62
63        def not_set_required_variables
64          vars = super
65          vars << "description" unless description {|d| d.have_required_values?}
66          vars << "title" unless title {|t| t.have_required_values?}
67          vars
68        end
69
70        class SkipDays < SkipDaysBase
71          def to_feed(rss, channel)
72            unless @days.empty?
73              skipDays = Rss::Channel::SkipDays.new
74              channel.skipDays = skipDays
75              set_parent(skipDays, channel)
76              @days.each do |day|
77                day.to_feed(rss, skipDays.days)
78              end
79            end
80          end
81
82          class Day < DayBase
83            def to_feed(rss, days)
84              day = Rss::Channel::SkipDays::Day.new
85              set = setup_values(day)
86              if set
87                days << day
88                set_parent(day, days)
89                setup_other_elements(rss, day)
90              end
91            end
92
93            private
94            def required_variable_names
95              %w(content)
96            end
97          end
98        end
99
100        class SkipHours < SkipHoursBase
101          def to_feed(rss, channel)
102            unless @hours.empty?
103              skipHours = Rss::Channel::SkipHours.new
104              channel.skipHours = skipHours
105              set_parent(skipHours, channel)
106              @hours.each do |hour|
107                hour.to_feed(rss, skipHours.hours)
108              end
109            end
110          end
111
112          class Hour < HourBase
113            def to_feed(rss, hours)
114              hour = Rss::Channel::SkipHours::Hour.new
115              set = setup_values(hour)
116              if set
117                hours << hour
118                set_parent(hour, hours)
119                setup_other_elements(rss, hour)
120              end
121            end
122
123            private
124            def required_variable_names
125              %w(content)
126            end
127          end
128        end
129
130        class Cloud < CloudBase
131          def to_feed(*args)
132          end
133        end
134
135        class Categories < CategoriesBase
136          def to_feed(*args)
137          end
138
139          class Category < CategoryBase
140          end
141        end
142
143        class Links < LinksBase
144          def to_feed(rss, channel)
145            return if @links.empty?
146            @links.first.to_feed(rss, channel)
147          end
148
149          class Link < LinkBase
150            def to_feed(rss, channel)
151              if have_required_values?
152                channel.link = href
153              else
154                raise NotSetError.new("maker.channel.link",
155                                      not_set_required_variables)
156              end
157            end
158
159            private
160            def required_variable_names
161              %w(href)
162            end
163          end
164        end
165
166        class Authors < AuthorsBase
167          def to_feed(rss, channel)
168          end
169
170          class Author < AuthorBase
171            def to_feed(rss, channel)
172            end
173          end
174        end
175
176        class Contributors < ContributorsBase
177          def to_feed(rss, channel)
178          end
179
180          class Contributor < ContributorBase
181          end
182        end
183
184        class Generator < GeneratorBase
185          def to_feed(rss, channel)
186          end
187        end
188
189        class Copyright < CopyrightBase
190          def to_feed(rss, channel)
191            channel.copyright = content if have_required_values?
192          end
193
194          private
195          def required_variable_names
196            %w(content)
197          end
198        end
199
200        class Description < DescriptionBase
201          def to_feed(rss, channel)
202            channel.description = content if have_required_values?
203          end
204
205          private
206          def required_variable_names
207            %w(content)
208          end
209        end
210
211        class Title < TitleBase
212          def to_feed(rss, channel)
213            channel.title = content if have_required_values?
214          end
215
216          private
217          def required_variable_names
218            %w(content)
219          end
220        end
221      end
222
223      class Image < ImageBase
224        def to_feed(rss)
225          image = Rss::Channel::Image.new
226          set = setup_values(image)
227          if set
228            image.link = link
229            rss.channel.image = image
230            set_parent(image, rss.channel)
231            setup_other_elements(rss, image)
232          elsif required_element?
233            raise NotSetError.new("maker.image", not_set_required_variables)
234          end
235        end
236
237        private
238        def required_variable_names
239          %w(url title link)
240        end
241
242        def required_element?
243          true
244        end
245      end
246
247      class Items < ItemsBase
248        def to_feed(rss)
249          if rss.channel
250            normalize.each do |item|
251              item.to_feed(rss)
252            end
253            setup_other_elements(rss, rss.items)
254          end
255        end
256
257        class Item < ItemBase
258          def to_feed(rss)
259            item = Rss::Channel::Item.new
260            setup_values(item)
261            _not_set_required_variables = not_set_required_variables
262            if _not_set_required_variables.empty?
263              rss.items << item
264              set_parent(item, rss.channel)
265              setup_other_elements(rss, item)
266            elsif variable_is_set?
267              raise NotSetError.new("maker.items", _not_set_required_variables)
268            end
269          end
270
271          private
272          def required_variable_names
273            []
274          end
275
276          def not_set_required_variables
277            vars = super
278            if @maker.feed_version == "0.91"
279              vars << "title" unless title {|t| t.have_required_values?}
280              vars << "link" unless link {|l| l.have_required_values?}
281            end
282            vars
283          end
284
285          class Guid < GuidBase
286            def to_feed(*args)
287            end
288          end
289
290          class Enclosure < EnclosureBase
291            def to_feed(*args)
292            end
293          end
294
295          class Source < SourceBase
296            def to_feed(*args)
297            end
298
299            class Authors < AuthorsBase
300              def to_feed(*args)
301              end
302
303              class Author < AuthorBase
304              end
305            end
306
307            class Categories < CategoriesBase
308              def to_feed(*args)
309              end
310
311              class Category < CategoryBase
312              end
313            end
314
315            class Contributors < ContributorsBase
316              def to_feed(*args)
317              end
318
319              class Contributor < ContributorBase
320              end
321            end
322
323            class Generator < GeneratorBase
324              def to_feed(*args)
325              end
326            end
327
328            class Icon < IconBase
329              def to_feed(*args)
330              end
331            end
332
333            class Links < LinksBase
334              def to_feed(*args)
335              end
336
337              class Link < LinkBase
338              end
339            end
340
341            class Logo < LogoBase
342              def to_feed(*args)
343              end
344            end
345
346            class Rights < RightsBase
347              def to_feed(*args)
348              end
349            end
350
351            class Subtitle < SubtitleBase
352              def to_feed(*args)
353              end
354            end
355
356            class Title < TitleBase
357              def to_feed(*args)
358              end
359            end
360          end
361
362          class Categories < CategoriesBase
363            def to_feed(*args)
364            end
365
366            class Category < CategoryBase
367            end
368          end
369
370          class Authors < AuthorsBase
371            def to_feed(*args)
372            end
373
374            class Author < AuthorBase
375            end
376          end
377
378          class Links < LinksBase
379            def to_feed(rss, item)
380              return if @links.empty?
381              @links.first.to_feed(rss, item)
382            end
383
384            class Link < LinkBase
385              def to_feed(rss, item)
386                if have_required_values?
387                  item.link = href
388                else
389                  raise NotSetError.new("maker.link",
390                                        not_set_required_variables)
391                end
392              end
393
394              private
395              def required_variable_names
396                %w(href)
397              end
398            end
399          end
400
401          class Contributors < ContributorsBase
402            def to_feed(rss, item)
403            end
404
405            class Contributor < ContributorBase
406            end
407          end
408
409          class Rights < RightsBase
410            def to_feed(rss, item)
411            end
412          end
413
414          class Description < DescriptionBase
415            def to_feed(rss, item)
416              item.description = content if have_required_values?
417            end
418
419            private
420            def required_variable_names
421              %w(content)
422            end
423          end
424
425          class Content < ContentBase
426            def to_feed(rss, item)
427            end
428          end
429
430          class Title < TitleBase
431            def to_feed(rss, item)
432              item.title = content if have_required_values?
433            end
434
435            private
436            def required_variable_names
437              %w(content)
438            end
439          end
440        end
441      end
442
443      class Textinput < TextinputBase
444        def to_feed(rss)
445          textInput = Rss::Channel::TextInput.new
446          set = setup_values(textInput)
447          if set
448            rss.channel.textInput = textInput
449            set_parent(textInput, rss.channel)
450            setup_other_elements(rss, textInput)
451          end
452        end
453
454        private
455        def required_variable_names
456          %w(title description name link)
457        end
458      end
459    end
460
461    class RSS091 < RSS09
462      def initialize(feed_version="0.91")
463        super
464      end
465
466      class Channel < RSS09::Channel
467      end
468
469      class Items < RSS09::Items
470        class Item < RSS09::Items::Item
471        end
472      end
473
474      class Image < RSS09::Image
475      end
476
477      class Textinput < RSS09::Textinput
478      end
479    end
480
481    class RSS092 < RSS09
482      def initialize(feed_version="0.92")
483        super
484      end
485
486      class Channel < RSS09::Channel
487      end
488
489      class Items < RSS09::Items
490        class Item < RSS09::Items::Item
491        end
492      end
493
494      class Image < RSS09::Image
495      end
496
497      class Textinput < RSS09::Textinput
498      end
499    end
500
501    add_maker("0.9", "0.92", RSS092)
502    add_maker("0.91", "0.91", RSS091)
503    add_maker("0.92", "0.92", RSS092)
504    add_maker("rss0.9", "0.92", RSS092)
505    add_maker("rss0.91", "0.91", RSS091)
506    add_maker("rss0.92", "0.92", RSS092)
507  end
508end
509