rss 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +6 -0
  4. data/Gemfile +6 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +88 -0
  7. data/Rakefile +10 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +8 -0
  10. data/lib/rss.rb +92 -0
  11. data/lib/rss/0.9.rb +462 -0
  12. data/lib/rss/1.0.rb +485 -0
  13. data/lib/rss/2.0.rb +143 -0
  14. data/lib/rss/atom.rb +1025 -0
  15. data/lib/rss/content.rb +34 -0
  16. data/lib/rss/content/1.0.rb +10 -0
  17. data/lib/rss/content/2.0.rb +12 -0
  18. data/lib/rss/converter.rb +171 -0
  19. data/lib/rss/dublincore.rb +164 -0
  20. data/lib/rss/dublincore/1.0.rb +13 -0
  21. data/lib/rss/dublincore/2.0.rb +13 -0
  22. data/lib/rss/dublincore/atom.rb +17 -0
  23. data/lib/rss/image.rb +198 -0
  24. data/lib/rss/itunes.rb +413 -0
  25. data/lib/rss/maker.rb +79 -0
  26. data/lib/rss/maker/0.9.rb +509 -0
  27. data/lib/rss/maker/1.0.rb +436 -0
  28. data/lib/rss/maker/2.0.rb +224 -0
  29. data/lib/rss/maker/atom.rb +173 -0
  30. data/lib/rss/maker/base.rb +945 -0
  31. data/lib/rss/maker/content.rb +22 -0
  32. data/lib/rss/maker/dublincore.rb +122 -0
  33. data/lib/rss/maker/entry.rb +164 -0
  34. data/lib/rss/maker/feed.rb +427 -0
  35. data/lib/rss/maker/image.rb +112 -0
  36. data/lib/rss/maker/itunes.rb +243 -0
  37. data/lib/rss/maker/slash.rb +34 -0
  38. data/lib/rss/maker/syndication.rb +19 -0
  39. data/lib/rss/maker/taxonomy.rb +119 -0
  40. data/lib/rss/maker/trackback.rb +62 -0
  41. data/lib/rss/parser.rb +589 -0
  42. data/lib/rss/rexmlparser.rb +50 -0
  43. data/lib/rss/rss.rb +1346 -0
  44. data/lib/rss/slash.rb +52 -0
  45. data/lib/rss/syndication.rb +69 -0
  46. data/lib/rss/taxonomy.rb +148 -0
  47. data/lib/rss/trackback.rb +291 -0
  48. data/lib/rss/utils.rb +200 -0
  49. data/lib/rss/xml-stylesheet.rb +106 -0
  50. data/lib/rss/xml.rb +72 -0
  51. data/lib/rss/xmlparser.rb +95 -0
  52. data/lib/rss/xmlscanner.rb +122 -0
  53. data/rss.gemspec +38 -0
  54. metadata +138 -0
@@ -0,0 +1,173 @@
1
+ # frozen_string_literal: false
2
+ require_relative "../atom"
3
+
4
+ require_relative "base"
5
+
6
+ module RSS
7
+ module Maker
8
+ module AtomPersons
9
+ module_function
10
+ def def_atom_persons(klass, name, maker_name, plural=nil)
11
+ plural ||= "#{name}s"
12
+ klass_name = Utils.to_class_name(name)
13
+ plural_klass_name = Utils.to_class_name(plural)
14
+
15
+ klass.class_eval(<<-EOC, __FILE__, __LINE__ + 1)
16
+ class #{plural_klass_name} < #{plural_klass_name}Base
17
+ class #{klass_name} < #{klass_name}Base
18
+ def to_feed(feed, current)
19
+ #{name} = feed.class::#{klass_name}.new
20
+ set = setup_values(#{name})
21
+ unless set
22
+ raise NotSetError.new(#{maker_name.dump},
23
+ not_set_required_variables)
24
+ end
25
+ current.#{plural} << #{name}
26
+ set_parent(#{name}, current)
27
+ setup_other_elements(#{name})
28
+ end
29
+
30
+ private
31
+ def required_variable_names
32
+ %w(name)
33
+ end
34
+ end
35
+ end
36
+ EOC
37
+ end
38
+ end
39
+
40
+ module AtomTextConstruct
41
+ class << self
42
+ def def_atom_text_construct(klass, name, maker_name, klass_name=nil,
43
+ atom_klass_name=nil)
44
+ klass_name ||= Utils.to_class_name(name)
45
+ atom_klass_name ||= Utils.to_class_name(name)
46
+
47
+ klass.class_eval(<<-EOC, __FILE__, __LINE__ + 1)
48
+ class #{klass_name} < #{klass_name}Base
49
+ include #{self.name}
50
+ def to_feed(feed, current)
51
+ #{name} = current.class::#{atom_klass_name}.new
52
+ if setup_values(#{name})
53
+ current.#{name} = #{name}
54
+ set_parent(#{name}, current)
55
+ setup_other_elements(feed)
56
+ elsif variable_is_set?
57
+ raise NotSetError.new(#{maker_name.dump},
58
+ not_set_required_variables)
59
+ end
60
+ end
61
+ end
62
+ EOC
63
+ end
64
+ end
65
+
66
+ private
67
+ def required_variable_names
68
+ if type == "xhtml"
69
+ %w(xml_content)
70
+ else
71
+ %w(content)
72
+ end
73
+ end
74
+
75
+ def variables
76
+ if type == "xhtml"
77
+ super + %w(xhtml)
78
+ else
79
+ super
80
+ end
81
+ end
82
+ end
83
+
84
+ module AtomCategory
85
+ def to_feed(feed, current)
86
+ category = feed.class::Category.new
87
+ set = setup_values(category)
88
+ if set
89
+ current.categories << category
90
+ set_parent(category, current)
91
+ setup_other_elements(feed)
92
+ else
93
+ raise NotSetError.new(self.class.not_set_name,
94
+ not_set_required_variables)
95
+ end
96
+ end
97
+
98
+ private
99
+ def required_variable_names
100
+ %w(term)
101
+ end
102
+
103
+ def variables
104
+ super + ["term", "scheme"]
105
+ end
106
+ end
107
+
108
+ module AtomLink
109
+ def to_feed(feed, current)
110
+ link = feed.class::Link.new
111
+ set = setup_values(link)
112
+ if set
113
+ current.links << link
114
+ set_parent(link, current)
115
+ setup_other_elements(feed)
116
+ else
117
+ raise NotSetError.new(self.class.not_set_name,
118
+ not_set_required_variables)
119
+ end
120
+ end
121
+
122
+ private
123
+ def required_variable_names
124
+ %w(href)
125
+ end
126
+ end
127
+
128
+ module AtomGenerator
129
+ def to_feed(feed, current)
130
+ generator = current.class::Generator.new
131
+ if setup_values(generator)
132
+ current.generator = generator
133
+ set_parent(generator, current)
134
+ setup_other_elements(feed)
135
+ elsif variable_is_set?
136
+ raise NotSetError.new(self.class.not_set_name,
137
+ not_set_required_variables)
138
+ end
139
+ end
140
+
141
+ private
142
+ def required_variable_names
143
+ %w(content)
144
+ end
145
+ end
146
+
147
+ module AtomLogo
148
+ def to_feed(feed, current)
149
+ logo = current.class::Logo.new
150
+ class << logo
151
+ alias_method(:uri=, :content=)
152
+ end
153
+ set = setup_values(logo)
154
+ class << logo
155
+ remove_method(:uri=)
156
+ end
157
+ if set
158
+ current.logo = logo
159
+ set_parent(logo, current)
160
+ setup_other_elements(feed)
161
+ elsif variable_is_set?
162
+ raise NotSetError.new(self.class.not_set_name,
163
+ not_set_required_variables)
164
+ end
165
+ end
166
+
167
+ private
168
+ def required_variable_names
169
+ %w(uri)
170
+ end
171
+ end
172
+ end
173
+ end
@@ -0,0 +1,945 @@
1
+ # frozen_string_literal: false
2
+ require 'forwardable'
3
+
4
+ require_relative '../rss'
5
+
6
+ module RSS
7
+ module Maker
8
+ class Base
9
+ extend Utils::InheritedReader
10
+
11
+ OTHER_ELEMENTS = []
12
+ NEED_INITIALIZE_VARIABLES = []
13
+
14
+ class << self
15
+ def other_elements
16
+ inherited_array_reader("OTHER_ELEMENTS")
17
+ end
18
+ def need_initialize_variables
19
+ inherited_array_reader("NEED_INITIALIZE_VARIABLES")
20
+ end
21
+
22
+ def inherited_base
23
+ ::RSS::Maker::Base
24
+ end
25
+
26
+ def inherited(subclass)
27
+ subclass.const_set(:OTHER_ELEMENTS, [])
28
+ subclass.const_set(:NEED_INITIALIZE_VARIABLES, [])
29
+ end
30
+
31
+ def add_other_element(variable_name)
32
+ self::OTHER_ELEMENTS << variable_name
33
+ end
34
+
35
+ def add_need_initialize_variable(variable_name, init_value=nil,
36
+ &init_block)
37
+ init_value ||= init_block
38
+ self::NEED_INITIALIZE_VARIABLES << [variable_name, init_value]
39
+ end
40
+
41
+ def def_array_element(name, plural=nil, klass_name=nil)
42
+ include Enumerable
43
+ extend Forwardable
44
+
45
+ plural ||= "#{name}s"
46
+ klass_name ||= Utils.to_class_name(name)
47
+ def_delegators("@#{plural}", :<<, :[], :[]=, :first, :last)
48
+ def_delegators("@#{plural}", :push, :pop, :shift, :unshift)
49
+ def_delegators("@#{plural}", :each, :size, :empty?, :clear)
50
+
51
+ add_need_initialize_variable(plural) {[]}
52
+
53
+ module_eval(<<-EOC, __FILE__, __LINE__ + 1)
54
+ def new_#{name}
55
+ #{name} = self.class::#{klass_name}.new(@maker)
56
+ @#{plural} << #{name}
57
+ if block_given?
58
+ yield #{name}
59
+ else
60
+ #{name}
61
+ end
62
+ end
63
+ alias new_child new_#{name}
64
+
65
+ def to_feed(*args)
66
+ @#{plural}.each do |#{name}|
67
+ #{name}.to_feed(*args)
68
+ end
69
+ end
70
+
71
+ def replace(elements)
72
+ @#{plural}.replace(elements.to_a)
73
+ end
74
+ EOC
75
+ end
76
+
77
+ def def_classed_element_without_accessor(name, class_name=nil)
78
+ class_name ||= Utils.to_class_name(name)
79
+ add_other_element(name)
80
+ add_need_initialize_variable(name) do |object|
81
+ object.send("make_#{name}")
82
+ end
83
+ module_eval(<<-EOC, __FILE__, __LINE__ + 1)
84
+ private
85
+ def setup_#{name}(feed, current)
86
+ @#{name}.to_feed(feed, current)
87
+ end
88
+
89
+ def make_#{name}
90
+ self.class::#{class_name}.new(@maker)
91
+ end
92
+ EOC
93
+ end
94
+
95
+ def def_classed_element(name, class_name=nil, attribute_name=nil)
96
+ def_classed_element_without_accessor(name, class_name)
97
+ if attribute_name
98
+ module_eval(<<-EOC, __FILE__, __LINE__ + 1)
99
+ def #{name}
100
+ if block_given?
101
+ yield(@#{name})
102
+ else
103
+ @#{name}.#{attribute_name}
104
+ end
105
+ end
106
+
107
+ def #{name}=(new_value)
108
+ @#{name}.#{attribute_name} = new_value
109
+ end
110
+ EOC
111
+ else
112
+ attr_reader name
113
+ end
114
+ end
115
+
116
+ def def_classed_elements(name, attribute, plural_class_name=nil,
117
+ plural_name=nil, new_name=nil)
118
+ plural_name ||= "#{name}s"
119
+ new_name ||= name
120
+ def_classed_element(plural_name, plural_class_name)
121
+ local_variable_name = "_#{name}"
122
+ new_value_variable_name = "new_value"
123
+ additional_setup_code = nil
124
+ if block_given?
125
+ additional_setup_code = yield(local_variable_name,
126
+ new_value_variable_name)
127
+ end
128
+ module_eval(<<-EOC, __FILE__, __LINE__ + 1)
129
+ def #{name}
130
+ #{local_variable_name} = #{plural_name}.first
131
+ #{local_variable_name} ? #{local_variable_name}.#{attribute} : nil
132
+ end
133
+
134
+ def #{name}=(#{new_value_variable_name})
135
+ #{local_variable_name} =
136
+ #{plural_name}.first || #{plural_name}.new_#{new_name}
137
+ #{additional_setup_code}
138
+ #{local_variable_name}.#{attribute} = #{new_value_variable_name}
139
+ end
140
+ EOC
141
+ end
142
+
143
+ def def_other_element(name)
144
+ attr_accessor name
145
+ def_other_element_without_accessor(name)
146
+ end
147
+
148
+ def def_other_element_without_accessor(name)
149
+ add_need_initialize_variable(name)
150
+ add_other_element(name)
151
+ module_eval(<<-EOC, __FILE__, __LINE__ + 1)
152
+ def setup_#{name}(feed, current)
153
+ if !@#{name}.nil? and current.respond_to?(:#{name}=)
154
+ current.#{name} = @#{name}
155
+ end
156
+ end
157
+ EOC
158
+ end
159
+
160
+ def def_csv_element(name, type=nil)
161
+ def_other_element_without_accessor(name)
162
+ attr_reader(name)
163
+ converter = ""
164
+ if type == :integer
165
+ converter = "{|v| Integer(v)}"
166
+ end
167
+ module_eval(<<-EOC, __FILE__, __LINE__ + 1)
168
+ def #{name}=(value)
169
+ @#{name} = Utils::CSV.parse(value)#{converter}
170
+ end
171
+ EOC
172
+ end
173
+ end
174
+
175
+ attr_reader :maker
176
+ def initialize(maker)
177
+ @maker = maker
178
+ @default_values_are_set = false
179
+ initialize_variables
180
+ end
181
+
182
+ def have_required_values?
183
+ not_set_required_variables.empty?
184
+ end
185
+
186
+ def variable_is_set?
187
+ variables.any? {|var| not __send__(var).nil?}
188
+ end
189
+
190
+ private
191
+ def initialize_variables
192
+ self.class.need_initialize_variables.each do |variable_name, init_value|
193
+ if init_value.nil?
194
+ value = nil
195
+ else
196
+ if init_value.respond_to?(:call)
197
+ value = init_value.call(self)
198
+ elsif init_value.is_a?(String)
199
+ # just for backward compatibility
200
+ value = instance_eval(init_value, __FILE__, __LINE__)
201
+ else
202
+ value = init_value
203
+ end
204
+ end
205
+ instance_variable_set("@#{variable_name}", value)
206
+ end
207
+ end
208
+
209
+ def setup_other_elements(feed, current=nil)
210
+ current ||= current_element(feed)
211
+ self.class.other_elements.each do |element|
212
+ __send__("setup_#{element}", feed, current)
213
+ end
214
+ end
215
+
216
+ def current_element(feed)
217
+ feed
218
+ end
219
+
220
+ def set_default_values(&block)
221
+ return yield if @default_values_are_set
222
+
223
+ begin
224
+ @default_values_are_set = true
225
+ _set_default_values(&block)
226
+ ensure
227
+ @default_values_are_set = false
228
+ end
229
+ end
230
+
231
+ def _set_default_values(&block)
232
+ yield
233
+ end
234
+
235
+ def setup_values(target)
236
+ set = false
237
+ if have_required_values?
238
+ variables.each do |var|
239
+ setter = "#{var}="
240
+ if target.respond_to?(setter)
241
+ value = __send__(var)
242
+ unless value.nil?
243
+ target.__send__(setter, value)
244
+ set = true
245
+ end
246
+ end
247
+ end
248
+ end
249
+ set
250
+ end
251
+
252
+ def set_parent(target, parent)
253
+ target.parent = parent if target.class.need_parent?
254
+ end
255
+
256
+ def variables
257
+ self.class.need_initialize_variables.find_all do |name, init|
258
+ # init == "nil" is just for backward compatibility
259
+ init.nil? or init == "nil"
260
+ end.collect do |name, init|
261
+ name
262
+ end
263
+ end
264
+
265
+ def not_set_required_variables
266
+ required_variable_names.find_all do |var|
267
+ __send__(var).nil?
268
+ end
269
+ end
270
+
271
+ def required_variables_are_set?
272
+ required_variable_names.each do |var|
273
+ return false if __send__(var).nil?
274
+ end
275
+ true
276
+ end
277
+ end
278
+
279
+ module AtomPersonConstructBase
280
+ def self.append_features(klass)
281
+ super
282
+
283
+ klass.class_eval(<<-EOC, __FILE__, __LINE__ + 1)
284
+ %w(name uri email).each do |element|
285
+ attr_accessor element
286
+ add_need_initialize_variable(element)
287
+ end
288
+ EOC
289
+ end
290
+ end
291
+
292
+ module AtomTextConstructBase
293
+ module EnsureXMLContent
294
+ class << self
295
+ def included(base)
296
+ super
297
+ base.class_eval do
298
+ %w(type content xml_content).each do |element|
299
+ attr_reader element
300
+ attr_writer element if element != "xml_content"
301
+ add_need_initialize_variable(element)
302
+ end
303
+
304
+ alias_method(:xhtml, :xml_content)
305
+ end
306
+ end
307
+ end
308
+
309
+ def ensure_xml_content(content)
310
+ xhtml_uri = ::RSS::Atom::XHTML_URI
311
+ unless content.is_a?(RSS::XML::Element) and
312
+ ["div", xhtml_uri] == [content.name, content.uri]
313
+ children = content
314
+ children = [children] unless content.is_a?(Array)
315
+ children = set_xhtml_uri_as_default_uri(children)
316
+ content = RSS::XML::Element.new("div", nil, xhtml_uri,
317
+ {"xmlns" => xhtml_uri},
318
+ children)
319
+ end
320
+ content
321
+ end
322
+
323
+ def xml_content=(content)
324
+ @xml_content = ensure_xml_content(content)
325
+ end
326
+
327
+ def xhtml=(content)
328
+ self.xml_content = content
329
+ end
330
+
331
+ private
332
+ def set_xhtml_uri_as_default_uri(children)
333
+ children.collect do |child|
334
+ if child.is_a?(RSS::XML::Element) and
335
+ child.prefix.nil? and child.uri.nil?
336
+ RSS::XML::Element.new(child.name, nil, ::RSS::Atom::XHTML_URI,
337
+ child.attributes.dup,
338
+ set_xhtml_uri_as_default_uri(child.children))
339
+ else
340
+ child
341
+ end
342
+ end
343
+ end
344
+ end
345
+
346
+ def self.append_features(klass)
347
+ super
348
+
349
+ klass.class_eval do
350
+ include EnsureXMLContent
351
+ end
352
+ end
353
+ end
354
+
355
+ module SetupDefaultDate
356
+ private
357
+ def _set_default_values
358
+ keep = {
359
+ :date => date,
360
+ :dc_dates => dc_dates.to_a.dup,
361
+ }
362
+ _date = _parse_date_if_needed(date)
363
+ if _date and !dc_dates.any? {|dc_date| dc_date.value == _date}
364
+ dc_date = self.class::DublinCoreDates::DublinCoreDate.new(self)
365
+ dc_date.value = _date.dup
366
+ dc_dates.unshift(dc_date)
367
+ end
368
+ self.date ||= self.dc_date
369
+ super
370
+ ensure
371
+ self.date = keep[:date]
372
+ dc_dates.replace(keep[:dc_dates])
373
+ end
374
+
375
+ def _parse_date_if_needed(date_value)
376
+ date_value = Time.parse(date_value) if date_value.is_a?(String)
377
+ date_value
378
+ end
379
+ end
380
+
381
+ module SetupDefaultLanguage
382
+ private
383
+ def _set_default_values
384
+ keep = {
385
+ :dc_languages => dc_languages.to_a.dup,
386
+ }
387
+ _language = language
388
+ if _language and
389
+ !dc_languages.any? {|dc_language| dc_language.value == _language}
390
+ dc_language = self.class::DublinCoreLanguages::DublinCoreLanguage.new(self)
391
+ dc_language.value = _language.dup
392
+ dc_languages.unshift(dc_language)
393
+ end
394
+ super
395
+ ensure
396
+ dc_languages.replace(keep[:dc_languages])
397
+ end
398
+ end
399
+
400
+ class RSSBase < Base
401
+ class << self
402
+ def make(*args, &block)
403
+ new(*args).make(&block)
404
+ end
405
+ end
406
+
407
+ %w(xml_stylesheets channel image items textinput).each do |element|
408
+ attr_reader element
409
+ add_need_initialize_variable(element) do |object|
410
+ object.send("make_#{element}")
411
+ end
412
+ module_eval(<<-EOC, __FILE__, __LINE__ + 1)
413
+ private
414
+ def setup_#{element}(feed)
415
+ @#{element}.to_feed(feed)
416
+ end
417
+
418
+ def make_#{element}
419
+ self.class::#{Utils.to_class_name(element)}.new(self)
420
+ end
421
+ EOC
422
+ end
423
+
424
+ attr_reader :feed_version
425
+ alias_method(:rss_version, :feed_version)
426
+ attr_accessor :version, :encoding, :standalone
427
+
428
+ def initialize(feed_version)
429
+ super(self)
430
+ @feed_type = nil
431
+ @feed_subtype = nil
432
+ @feed_version = feed_version
433
+ @version = "1.0"
434
+ @encoding = "UTF-8"
435
+ @standalone = nil
436
+ end
437
+
438
+ def make
439
+ yield(self)
440
+ to_feed
441
+ end
442
+
443
+ def to_feed
444
+ feed = make_feed
445
+ setup_xml_stylesheets(feed)
446
+ setup_elements(feed)
447
+ setup_other_elements(feed)
448
+ feed.validate
449
+ feed
450
+ end
451
+
452
+ private
453
+ remove_method :make_xml_stylesheets
454
+ def make_xml_stylesheets
455
+ XMLStyleSheets.new(self)
456
+ end
457
+ end
458
+
459
+ class XMLStyleSheets < Base
460
+ def_array_element("xml_stylesheet", nil, "XMLStyleSheet")
461
+
462
+ class XMLStyleSheet < Base
463
+
464
+ ::RSS::XMLStyleSheet::ATTRIBUTES.each do |attribute|
465
+ attr_accessor attribute
466
+ add_need_initialize_variable(attribute)
467
+ end
468
+
469
+ def to_feed(feed)
470
+ xss = ::RSS::XMLStyleSheet.new
471
+ guess_type_if_need(xss)
472
+ set = setup_values(xss)
473
+ if set
474
+ feed.xml_stylesheets << xss
475
+ end
476
+ end
477
+
478
+ private
479
+ def guess_type_if_need(xss)
480
+ if @type.nil?
481
+ xss.href = @href
482
+ @type = xss.type
483
+ end
484
+ end
485
+
486
+ def required_variable_names
487
+ %w(href type)
488
+ end
489
+ end
490
+ end
491
+
492
+ class ChannelBase < Base
493
+ include SetupDefaultDate
494
+
495
+ %w(cloud categories skipDays skipHours).each do |name|
496
+ def_classed_element(name)
497
+ end
498
+
499
+ %w(generator copyright description title).each do |name|
500
+ def_classed_element(name, nil, "content")
501
+ end
502
+
503
+ [
504
+ ["link", "href", Proc.new {|target,| "#{target}.href = 'self'"}],
505
+ ["author", "name"],
506
+ ["contributor", "name"],
507
+ ].each do |name, attribute, additional_setup_maker|
508
+ def_classed_elements(name, attribute, &additional_setup_maker)
509
+ end
510
+
511
+ %w(id about language
512
+ managingEditor webMaster rating docs ttl).each do |element|
513
+ attr_accessor element
514
+ add_need_initialize_variable(element)
515
+ end
516
+
517
+ %w(date lastBuildDate).each do |date_element|
518
+ attr_reader date_element
519
+ add_need_initialize_variable(date_element)
520
+ end
521
+
522
+ def date=(_date)
523
+ @date = _parse_date_if_needed(_date)
524
+ end
525
+
526
+ def lastBuildDate=(_date)
527
+ @lastBuildDate = _parse_date_if_needed(_date)
528
+ end
529
+
530
+ def pubDate
531
+ date
532
+ end
533
+
534
+ def pubDate=(date)
535
+ self.date = date
536
+ end
537
+
538
+ def updated
539
+ date
540
+ end
541
+
542
+ def updated=(date)
543
+ self.date = date
544
+ end
545
+
546
+ alias_method(:rights, :copyright)
547
+ alias_method(:rights=, :copyright=)
548
+
549
+ alias_method(:subtitle, :description)
550
+ alias_method(:subtitle=, :description=)
551
+
552
+ def icon
553
+ image_favicon.about
554
+ end
555
+
556
+ def icon=(url)
557
+ image_favicon.about = url
558
+ end
559
+
560
+ def logo
561
+ maker.image.url
562
+ end
563
+
564
+ def logo=(url)
565
+ maker.image.url = url
566
+ end
567
+
568
+ class SkipDaysBase < Base
569
+ def_array_element("day")
570
+
571
+ class DayBase < Base
572
+ %w(content).each do |element|
573
+ attr_accessor element
574
+ add_need_initialize_variable(element)
575
+ end
576
+ end
577
+ end
578
+
579
+ class SkipHoursBase < Base
580
+ def_array_element("hour")
581
+
582
+ class HourBase < Base
583
+ %w(content).each do |element|
584
+ attr_accessor element
585
+ add_need_initialize_variable(element)
586
+ end
587
+ end
588
+ end
589
+
590
+ class CloudBase < Base
591
+ %w(domain port path registerProcedure protocol).each do |element|
592
+ attr_accessor element
593
+ add_need_initialize_variable(element)
594
+ end
595
+ end
596
+
597
+ class CategoriesBase < Base
598
+ def_array_element("category", "categories")
599
+
600
+ class CategoryBase < Base
601
+ %w(domain content label).each do |element|
602
+ attr_accessor element
603
+ add_need_initialize_variable(element)
604
+ end
605
+
606
+ alias_method(:term, :domain)
607
+ alias_method(:term=, :domain=)
608
+ alias_method(:scheme, :content)
609
+ alias_method(:scheme=, :content=)
610
+ end
611
+ end
612
+
613
+ class LinksBase < Base
614
+ def_array_element("link")
615
+
616
+ class LinkBase < Base
617
+ %w(href rel type hreflang title length).each do |element|
618
+ attr_accessor element
619
+ add_need_initialize_variable(element)
620
+ end
621
+ end
622
+ end
623
+
624
+ class AuthorsBase < Base
625
+ def_array_element("author")
626
+
627
+ class AuthorBase < Base
628
+ include AtomPersonConstructBase
629
+ end
630
+ end
631
+
632
+ class ContributorsBase < Base
633
+ def_array_element("contributor")
634
+
635
+ class ContributorBase < Base
636
+ include AtomPersonConstructBase
637
+ end
638
+ end
639
+
640
+ class GeneratorBase < Base
641
+ %w(uri version content).each do |element|
642
+ attr_accessor element
643
+ add_need_initialize_variable(element)
644
+ end
645
+ end
646
+
647
+ class CopyrightBase < Base
648
+ include AtomTextConstructBase
649
+ end
650
+
651
+ class DescriptionBase < Base
652
+ include AtomTextConstructBase
653
+ end
654
+
655
+ class TitleBase < Base
656
+ include AtomTextConstructBase
657
+ end
658
+ end
659
+
660
+ class ImageBase < Base
661
+ %w(title url width height description).each do |element|
662
+ attr_accessor element
663
+ add_need_initialize_variable(element)
664
+ end
665
+
666
+ def link
667
+ @maker.channel.link
668
+ end
669
+ end
670
+
671
+ class ItemsBase < Base
672
+ def_array_element("item")
673
+
674
+ attr_accessor :do_sort, :max_size
675
+
676
+ def initialize(maker)
677
+ super
678
+ @do_sort = false
679
+ @max_size = -1
680
+ end
681
+
682
+ def normalize
683
+ if @max_size >= 0
684
+ sort_if_need[0...@max_size]
685
+ else
686
+ sort_if_need[0..@max_size]
687
+ end
688
+ end
689
+
690
+ private
691
+ def sort_if_need
692
+ if @do_sort.respond_to?(:call)
693
+ @items.sort do |x, y|
694
+ @do_sort.call(x, y)
695
+ end
696
+ elsif @do_sort
697
+ @items.sort do |x, y|
698
+ y <=> x
699
+ end
700
+ else
701
+ @items
702
+ end
703
+ end
704
+
705
+ class ItemBase < Base
706
+ include SetupDefaultDate
707
+
708
+ %w(guid enclosure source categories content).each do |name|
709
+ def_classed_element(name)
710
+ end
711
+
712
+ %w(rights description title).each do |name|
713
+ def_classed_element(name, nil, "content")
714
+ end
715
+
716
+ [
717
+ ["author", "name"],
718
+ ["link", "href", Proc.new {|target,| "#{target}.href = 'alternate'"}],
719
+ ["contributor", "name"],
720
+ ].each do |name, attribute|
721
+ def_classed_elements(name, attribute)
722
+ end
723
+
724
+ %w(comments id published).each do |element|
725
+ attr_accessor element
726
+ add_need_initialize_variable(element)
727
+ end
728
+
729
+ %w(date).each do |date_element|
730
+ attr_reader date_element
731
+ add_need_initialize_variable(date_element)
732
+ end
733
+
734
+ def date=(_date)
735
+ @date = _parse_date_if_needed(_date)
736
+ end
737
+
738
+ def pubDate
739
+ date
740
+ end
741
+
742
+ def pubDate=(date)
743
+ self.date = date
744
+ end
745
+
746
+ def updated
747
+ date
748
+ end
749
+
750
+ def updated=(date)
751
+ self.date = date
752
+ end
753
+
754
+ alias_method(:summary, :description)
755
+ alias_method(:summary=, :description=)
756
+
757
+ def <=>(other)
758
+ _date = date || dc_date
759
+ _other_date = other.date || other.dc_date
760
+ if _date and _other_date
761
+ _date <=> _other_date
762
+ elsif _date
763
+ 1
764
+ elsif _other_date
765
+ -1
766
+ else
767
+ 0
768
+ end
769
+ end
770
+
771
+ class GuidBase < Base
772
+ %w(isPermaLink content).each do |element|
773
+ attr_accessor element
774
+ add_need_initialize_variable(element)
775
+ end
776
+
777
+ def permanent_link?
778
+ isPermaLink
779
+ end
780
+
781
+ def permanent_link=(bool)
782
+ self.isPermaLink = bool
783
+ end
784
+ end
785
+
786
+ class EnclosureBase < Base
787
+ %w(url length type).each do |element|
788
+ attr_accessor element
789
+ add_need_initialize_variable(element)
790
+ end
791
+ end
792
+
793
+ class SourceBase < Base
794
+ include SetupDefaultDate
795
+
796
+ %w(authors categories contributors generator icon
797
+ logo rights subtitle title).each do |name|
798
+ def_classed_element(name)
799
+ end
800
+
801
+ [
802
+ ["link", "href"],
803
+ ].each do |name, attribute|
804
+ def_classed_elements(name, attribute)
805
+ end
806
+
807
+ %w(id content).each do |element|
808
+ attr_accessor element
809
+ add_need_initialize_variable(element)
810
+ end
811
+
812
+ alias_method(:url, :link)
813
+ alias_method(:url=, :link=)
814
+
815
+ %w(date).each do |date_element|
816
+ attr_reader date_element
817
+ add_need_initialize_variable(date_element)
818
+ end
819
+
820
+ def date=(_date)
821
+ @date = _parse_date_if_needed(_date)
822
+ end
823
+
824
+ def updated
825
+ date
826
+ end
827
+
828
+ def updated=(date)
829
+ self.date = date
830
+ end
831
+
832
+ private
833
+ AuthorsBase = ChannelBase::AuthorsBase
834
+ CategoriesBase = ChannelBase::CategoriesBase
835
+ ContributorsBase = ChannelBase::ContributorsBase
836
+ GeneratorBase = ChannelBase::GeneratorBase
837
+
838
+ class IconBase < Base
839
+ %w(url).each do |element|
840
+ attr_accessor element
841
+ add_need_initialize_variable(element)
842
+ end
843
+ end
844
+
845
+ LinksBase = ChannelBase::LinksBase
846
+
847
+ class LogoBase < Base
848
+ %w(uri).each do |element|
849
+ attr_accessor element
850
+ add_need_initialize_variable(element)
851
+ end
852
+ end
853
+
854
+ class RightsBase < Base
855
+ include AtomTextConstructBase
856
+ end
857
+
858
+ class SubtitleBase < Base
859
+ include AtomTextConstructBase
860
+ end
861
+
862
+ class TitleBase < Base
863
+ include AtomTextConstructBase
864
+ end
865
+ end
866
+
867
+ CategoriesBase = ChannelBase::CategoriesBase
868
+ AuthorsBase = ChannelBase::AuthorsBase
869
+ LinksBase = ChannelBase::LinksBase
870
+ ContributorsBase = ChannelBase::ContributorsBase
871
+
872
+ class RightsBase < Base
873
+ include AtomTextConstructBase
874
+ end
875
+
876
+ class DescriptionBase < Base
877
+ include AtomTextConstructBase
878
+ end
879
+
880
+ class ContentBase < Base
881
+ include AtomTextConstructBase::EnsureXMLContent
882
+
883
+ %w(src).each do |element|
884
+ attr_accessor(element)
885
+ add_need_initialize_variable(element)
886
+ end
887
+
888
+ def xml_content=(content)
889
+ content = ensure_xml_content(content) if inline_xhtml?
890
+ @xml_content = content
891
+ end
892
+
893
+ alias_method(:xml, :xml_content)
894
+ alias_method(:xml=, :xml_content=)
895
+
896
+ def inline_text?
897
+ [nil, "text", "html"].include?(@type)
898
+ end
899
+
900
+ def inline_html?
901
+ @type == "html"
902
+ end
903
+
904
+ def inline_xhtml?
905
+ @type == "xhtml"
906
+ end
907
+
908
+ def inline_other?
909
+ !out_of_line? and ![nil, "text", "html", "xhtml"].include?(@type)
910
+ end
911
+
912
+ def inline_other_text?
913
+ return false if @type.nil? or out_of_line?
914
+ /\Atext\//i.match(@type) ? true : false
915
+ end
916
+
917
+ def inline_other_xml?
918
+ return false if @type.nil? or out_of_line?
919
+ /[\+\/]xml\z/i.match(@type) ? true : false
920
+ end
921
+
922
+ def inline_other_base64?
923
+ return false if @type.nil? or out_of_line?
924
+ @type.include?("/") and !inline_other_text? and !inline_other_xml?
925
+ end
926
+
927
+ def out_of_line?
928
+ not @src.nil? and @content.nil?
929
+ end
930
+ end
931
+
932
+ class TitleBase < Base
933
+ include AtomTextConstructBase
934
+ end
935
+ end
936
+ end
937
+
938
+ class TextinputBase < Base
939
+ %w(title description name link).each do |element|
940
+ attr_accessor element
941
+ add_need_initialize_variable(element)
942
+ end
943
+ end
944
+ end
945
+ end