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