rubysl-rss 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -6
- data/lib/rss/0.9.rb +20 -20
- data/lib/rss/1.0.rb +24 -24
- data/lib/rss/2.0.rb +3 -3
- data/lib/rss/atom.rb +94 -4
- data/lib/rss/content/1.0.rb +0 -1
- data/lib/rss/content/2.0.rb +0 -1
- data/lib/rss/converter.rb +22 -14
- data/lib/rss/dublincore.rb +8 -8
- data/lib/rss/dublincore/1.0.rb +0 -1
- data/lib/rss/dublincore/2.0.rb +0 -1
- data/lib/rss/dublincore/atom.rb +0 -1
- data/lib/rss/image.rb +9 -9
- data/lib/rss/maker.rb +40 -6
- data/lib/rss/maker/0.9.rb +64 -23
- data/lib/rss/maker/1.0.rb +7 -6
- data/lib/rss/maker/2.0.rb +11 -11
- data/lib/rss/maker/base.rb +118 -42
- data/lib/rss/maker/dublincore.rb +1 -4
- data/lib/rss/maker/entry.rb +3 -3
- data/lib/rss/maker/feed.rb +3 -6
- data/lib/rss/maker/image.rb +3 -3
- data/lib/rss/maker/itunes.rb +1 -1
- data/lib/rss/maker/taxonomy.rb +4 -4
- data/lib/rss/maker/trackback.rb +1 -1
- data/lib/rss/parser.rb +54 -27
- data/lib/rss/rexmlparser.rb +5 -5
- data/lib/rss/rss.rb +54 -24
- data/lib/rss/syndication.rb +3 -3
- data/lib/rss/taxonomy.rb +9 -9
- data/lib/rss/trackback.rb +18 -18
- data/lib/rss/utils.rb +2 -2
- data/lib/rss/xml-stylesheet.rb +2 -2
- data/lib/rss/xmlparser.rb +7 -7
- data/lib/rss/xmlscanner.rb +5 -5
- data/lib/rubysl/rss/rss.rb +76 -4
- data/lib/rubysl/rss/version.rb +1 -1
- data/rubysl-rss.gemspec +0 -1
- metadata +2 -16
data/lib/rss/maker/1.0.rb
CHANGED
@@ -25,13 +25,14 @@ module RSS
|
|
25
25
|
end
|
26
26
|
|
27
27
|
class Channel < ChannelBase
|
28
|
+
include SetupDefaultLanguage
|
28
29
|
|
29
30
|
def to_feed(rss)
|
30
31
|
set_default_values do
|
31
32
|
_not_set_required_variables = not_set_required_variables
|
32
33
|
if _not_set_required_variables.empty?
|
33
34
|
channel = RDF::Channel.new(@about)
|
34
|
-
|
35
|
+
setup_values(channel)
|
35
36
|
channel.dc_dates.clear
|
36
37
|
rss.channel = channel
|
37
38
|
set_parent(channel, rss)
|
@@ -60,7 +61,7 @@ module RSS
|
|
60
61
|
rss.channel.items = items
|
61
62
|
set_parent(rss.channel, items)
|
62
63
|
end
|
63
|
-
|
64
|
+
|
64
65
|
def setup_image(rss)
|
65
66
|
if @maker.image.have_required_values?
|
66
67
|
image = RDF::Channel::Image.new(@maker.image.url)
|
@@ -91,11 +92,11 @@ module RSS
|
|
91
92
|
class SkipDays < SkipDaysBase
|
92
93
|
def to_feed(*args)
|
93
94
|
end
|
94
|
-
|
95
|
+
|
95
96
|
class Day < DayBase
|
96
97
|
end
|
97
98
|
end
|
98
|
-
|
99
|
+
|
99
100
|
class SkipHours < SkipHoursBase
|
100
101
|
def to_feed(*args)
|
101
102
|
end
|
@@ -103,7 +104,7 @@ module RSS
|
|
103
104
|
class Hour < HourBase
|
104
105
|
end
|
105
106
|
end
|
106
|
-
|
107
|
+
|
107
108
|
class Cloud < CloudBase
|
108
109
|
def to_feed(*args)
|
109
110
|
end
|
@@ -403,7 +404,7 @@ module RSS
|
|
403
404
|
end
|
404
405
|
end
|
405
406
|
end
|
406
|
-
|
407
|
+
|
407
408
|
class Textinput < TextinputBase
|
408
409
|
def to_feed(rss)
|
409
410
|
if @link
|
data/lib/rss/maker/2.0.rb
CHANGED
@@ -4,9 +4,9 @@ require "rss/maker/0.9"
|
|
4
4
|
|
5
5
|
module RSS
|
6
6
|
module Maker
|
7
|
-
|
7
|
+
|
8
8
|
class RSS20 < RSS09
|
9
|
-
|
9
|
+
|
10
10
|
def initialize(feed_version="2.0")
|
11
11
|
super
|
12
12
|
end
|
@@ -17,17 +17,17 @@ module RSS
|
|
17
17
|
def required_variable_names
|
18
18
|
%w(link)
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
class SkipDays < RSS09::Channel::SkipDays
|
22
22
|
class Day < RSS09::Channel::SkipDays::Day
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
class SkipHours < RSS09::Channel::SkipHours
|
27
27
|
class Hour < RSS09::Channel::SkipHours::Hour
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
class Cloud < RSS09::Channel::Cloud
|
32
32
|
def to_feed(rss, channel)
|
33
33
|
cloud = Rss::Channel::Cloud.new
|
@@ -51,7 +51,7 @@ module RSS
|
|
51
51
|
category.to_feed(rss, channel)
|
52
52
|
end
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
class Category < RSS09::Channel::Categories::Category
|
56
56
|
def to_feed(rss, channel)
|
57
57
|
category = Rss::Channel::Category.new
|
@@ -81,14 +81,14 @@ module RSS
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
class Image < RSS09::Image
|
86
86
|
private
|
87
87
|
def required_element?
|
88
88
|
false
|
89
89
|
end
|
90
90
|
end
|
91
|
-
|
91
|
+
|
92
92
|
class Items < RSS09::Items
|
93
93
|
class Item < RSS09::Items::Item
|
94
94
|
private
|
@@ -179,7 +179,7 @@ module RSS
|
|
179
179
|
category.to_feed(rss, item)
|
180
180
|
end
|
181
181
|
end
|
182
|
-
|
182
|
+
|
183
183
|
class Category < RSS09::Items::Item::Categories::Category
|
184
184
|
def to_feed(rss, item)
|
185
185
|
category = Rss::Channel::Item::Category.new
|
@@ -212,11 +212,11 @@ module RSS
|
|
212
212
|
end
|
213
213
|
end
|
214
214
|
end
|
215
|
-
|
215
|
+
|
216
216
|
class Textinput < RSS09::Textinput
|
217
217
|
end
|
218
218
|
end
|
219
|
-
|
219
|
+
|
220
220
|
add_maker("2.0", "2.0", RSS20)
|
221
221
|
add_maker("rss2.0", "2.0", RSS20)
|
222
222
|
end
|
data/lib/rss/maker/base.rb
CHANGED
@@ -23,15 +23,17 @@ module RSS
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def inherited(subclass)
|
26
|
-
subclass.const_set(
|
27
|
-
subclass.const_set(
|
26
|
+
subclass.const_set(:OTHER_ELEMENTS, [])
|
27
|
+
subclass.const_set(:NEED_INITIALIZE_VARIABLES, [])
|
28
28
|
end
|
29
29
|
|
30
30
|
def add_other_element(variable_name)
|
31
31
|
self::OTHER_ELEMENTS << variable_name
|
32
32
|
end
|
33
33
|
|
34
|
-
def add_need_initialize_variable(variable_name, init_value=
|
34
|
+
def add_need_initialize_variable(variable_name, init_value=nil,
|
35
|
+
&init_block)
|
36
|
+
init_value ||= init_block
|
35
37
|
self::NEED_INITIALIZE_VARIABLES << [variable_name, init_value]
|
36
38
|
end
|
37
39
|
|
@@ -45,7 +47,7 @@ module RSS
|
|
45
47
|
def_delegators("@#{plural}", :push, :pop, :shift, :unshift)
|
46
48
|
def_delegators("@#{plural}", :each, :size, :empty?, :clear)
|
47
49
|
|
48
|
-
add_need_initialize_variable(plural
|
50
|
+
add_need_initialize_variable(plural) {[]}
|
49
51
|
|
50
52
|
module_eval(<<-EOC, __FILE__, __LINE__ + 1)
|
51
53
|
def new_#{name}
|
@@ -74,7 +76,9 @@ module RSS
|
|
74
76
|
def def_classed_element_without_accessor(name, class_name=nil)
|
75
77
|
class_name ||= Utils.to_class_name(name)
|
76
78
|
add_other_element(name)
|
77
|
-
add_need_initialize_variable(name
|
79
|
+
add_need_initialize_variable(name) do |object|
|
80
|
+
object.send("make_#{name}")
|
81
|
+
end
|
78
82
|
module_eval(<<-EOC, __FILE__, __LINE__ + 1)
|
79
83
|
private
|
80
84
|
def setup_#{name}(feed, current)
|
@@ -185,7 +189,19 @@ module RSS
|
|
185
189
|
private
|
186
190
|
def initialize_variables
|
187
191
|
self.class.need_initialize_variables.each do |variable_name, init_value|
|
188
|
-
|
192
|
+
if init_value.nil?
|
193
|
+
value = nil
|
194
|
+
else
|
195
|
+
if init_value.respond_to?(:call)
|
196
|
+
value = init_value.call(self)
|
197
|
+
elsif init_value.is_a?(String)
|
198
|
+
# just for backward compatibility
|
199
|
+
value = instance_eval(init_value, __FILE__, __LINE__)
|
200
|
+
else
|
201
|
+
value = init_value
|
202
|
+
end
|
203
|
+
end
|
204
|
+
instance_variable_set("@#{variable_name}", value)
|
189
205
|
end
|
190
206
|
end
|
191
207
|
|
@@ -222,7 +238,7 @@ module RSS
|
|
222
238
|
setter = "#{var}="
|
223
239
|
if target.respond_to?(setter)
|
224
240
|
value = __send__(var)
|
225
|
-
|
241
|
+
unless value.nil?
|
226
242
|
target.__send__(setter, value)
|
227
243
|
set = true
|
228
244
|
end
|
@@ -238,7 +254,8 @@ module RSS
|
|
238
254
|
|
239
255
|
def variables
|
240
256
|
self.class.need_initialize_variables.find_all do |name, init|
|
241
|
-
"nil"
|
257
|
+
# init == "nil" is just for backward compatibility
|
258
|
+
init.nil? or init == "nil"
|
242
259
|
end.collect do |name, init|
|
243
260
|
name
|
244
261
|
end
|
@@ -336,36 +353,62 @@ module RSS
|
|
336
353
|
|
337
354
|
module SetupDefaultDate
|
338
355
|
private
|
339
|
-
def _set_default_values
|
356
|
+
def _set_default_values
|
340
357
|
keep = {
|
341
358
|
:date => date,
|
342
359
|
:dc_dates => dc_dates.to_a.dup,
|
343
360
|
}
|
344
|
-
_date = date
|
361
|
+
_date = _parse_date_if_needed(date)
|
345
362
|
if _date and !dc_dates.any? {|dc_date| dc_date.value == _date}
|
346
363
|
dc_date = self.class::DublinCoreDates::DublinCoreDate.new(self)
|
347
364
|
dc_date.value = _date.dup
|
348
365
|
dc_dates.unshift(dc_date)
|
349
366
|
end
|
350
367
|
self.date ||= self.dc_date
|
351
|
-
super
|
368
|
+
super
|
352
369
|
ensure
|
353
370
|
date = keep[:date]
|
354
371
|
dc_dates.replace(keep[:dc_dates])
|
355
372
|
end
|
373
|
+
|
374
|
+
def _parse_date_if_needed(date_value)
|
375
|
+
date_value = Time.parse(date_value) if date_value.is_a?(String)
|
376
|
+
date_value
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
module SetupDefaultLanguage
|
381
|
+
private
|
382
|
+
def _set_default_values
|
383
|
+
keep = {
|
384
|
+
:dc_languages => dc_languages.to_a.dup,
|
385
|
+
}
|
386
|
+
_language = language
|
387
|
+
if _language and
|
388
|
+
!dc_languages.any? {|dc_language| dc_language.value == _language}
|
389
|
+
dc_language = self.class::DublinCoreLanguages::DublinCoreLanguage.new(self)
|
390
|
+
dc_language.value = _language.dup
|
391
|
+
dc_languages.unshift(dc_language)
|
392
|
+
end
|
393
|
+
super
|
394
|
+
ensure
|
395
|
+
dc_languages.replace(keep[:dc_languages])
|
396
|
+
end
|
356
397
|
end
|
357
398
|
|
358
399
|
class RSSBase < Base
|
359
400
|
class << self
|
360
|
-
def make(
|
361
|
-
new(
|
401
|
+
def make(*args, &block)
|
402
|
+
new(*args).make(&block)
|
362
403
|
end
|
363
404
|
end
|
364
405
|
|
365
406
|
%w(xml_stylesheets channel image items textinput).each do |element|
|
366
407
|
attr_reader element
|
367
|
-
add_need_initialize_variable(element
|
368
|
-
|
408
|
+
add_need_initialize_variable(element) do |object|
|
409
|
+
object.send("make_#{element}")
|
410
|
+
end
|
411
|
+
module_eval(<<-EOC, __FILE__, __LINE__ + 1)
|
369
412
|
private
|
370
413
|
def setup_#{element}(feed)
|
371
414
|
@#{element}.to_feed(feed)
|
@@ -376,7 +419,7 @@ module RSS
|
|
376
419
|
end
|
377
420
|
EOC
|
378
421
|
end
|
379
|
-
|
422
|
+
|
380
423
|
attr_reader :feed_version
|
381
424
|
alias_method(:rss_version, :feed_version)
|
382
425
|
attr_accessor :version, :encoding, :standalone
|
@@ -390,14 +433,10 @@ module RSS
|
|
390
433
|
@encoding = "UTF-8"
|
391
434
|
@standalone = nil
|
392
435
|
end
|
393
|
-
|
436
|
+
|
394
437
|
def make
|
395
|
-
|
396
|
-
|
397
|
-
to_feed
|
398
|
-
else
|
399
|
-
nil
|
400
|
-
end
|
438
|
+
yield(self)
|
439
|
+
to_feed
|
401
440
|
end
|
402
441
|
|
403
442
|
def to_feed
|
@@ -405,13 +444,10 @@ module RSS
|
|
405
444
|
setup_xml_stylesheets(feed)
|
406
445
|
setup_elements(feed)
|
407
446
|
setup_other_elements(feed)
|
408
|
-
|
409
|
-
|
410
|
-
else
|
411
|
-
nil
|
412
|
-
end
|
447
|
+
feed.validate
|
448
|
+
feed
|
413
449
|
end
|
414
|
-
|
450
|
+
|
415
451
|
private
|
416
452
|
remove_method :make_xml_stylesheets
|
417
453
|
def make_xml_stylesheets
|
@@ -428,7 +464,7 @@ module RSS
|
|
428
464
|
attr_accessor attribute
|
429
465
|
add_need_initialize_variable(attribute)
|
430
466
|
end
|
431
|
-
|
467
|
+
|
432
468
|
def to_feed(feed)
|
433
469
|
xss = ::RSS::XMLStyleSheet.new
|
434
470
|
guess_type_if_need(xss)
|
@@ -451,7 +487,7 @@ module RSS
|
|
451
487
|
end
|
452
488
|
end
|
453
489
|
end
|
454
|
-
|
490
|
+
|
455
491
|
class ChannelBase < Base
|
456
492
|
include SetupDefaultDate
|
457
493
|
|
@@ -472,12 +508,24 @@ module RSS
|
|
472
508
|
end
|
473
509
|
|
474
510
|
%w(id about language
|
475
|
-
managingEditor webMaster rating docs
|
476
|
-
lastBuildDate ttl).each do |element|
|
511
|
+
managingEditor webMaster rating docs ttl).each do |element|
|
477
512
|
attr_accessor element
|
478
513
|
add_need_initialize_variable(element)
|
479
514
|
end
|
480
515
|
|
516
|
+
%w(date lastBuildDate).each do |date_element|
|
517
|
+
attr_reader date_element
|
518
|
+
add_need_initialize_variable(date_element)
|
519
|
+
end
|
520
|
+
|
521
|
+
def date=(_date)
|
522
|
+
@date = _parse_date_if_needed(_date)
|
523
|
+
end
|
524
|
+
|
525
|
+
def lastBuildDate=(_date)
|
526
|
+
@lastBuildDate = _parse_date_if_needed(_date)
|
527
|
+
end
|
528
|
+
|
481
529
|
def pubDate
|
482
530
|
date
|
483
531
|
end
|
@@ -526,7 +574,7 @@ module RSS
|
|
526
574
|
end
|
527
575
|
end
|
528
576
|
end
|
529
|
-
|
577
|
+
|
530
578
|
class SkipHoursBase < Base
|
531
579
|
def_array_element("hour")
|
532
580
|
|
@@ -537,7 +585,7 @@ module RSS
|
|
537
585
|
end
|
538
586
|
end
|
539
587
|
end
|
540
|
-
|
588
|
+
|
541
589
|
class CloudBase < Base
|
542
590
|
%w(domain port path registerProcedure protocol).each do |element|
|
543
591
|
attr_accessor element
|
@@ -607,7 +655,7 @@ module RSS
|
|
607
655
|
include AtomTextConstructBase
|
608
656
|
end
|
609
657
|
end
|
610
|
-
|
658
|
+
|
611
659
|
class ImageBase < Base
|
612
660
|
%w(title url width height description).each do |element|
|
613
661
|
attr_accessor element
|
@@ -618,18 +666,18 @@ module RSS
|
|
618
666
|
@maker.channel.link
|
619
667
|
end
|
620
668
|
end
|
621
|
-
|
669
|
+
|
622
670
|
class ItemsBase < Base
|
623
671
|
def_array_element("item")
|
624
672
|
|
625
673
|
attr_accessor :do_sort, :max_size
|
626
|
-
|
674
|
+
|
627
675
|
def initialize(maker)
|
628
676
|
super
|
629
677
|
@do_sort = false
|
630
678
|
@max_size = -1
|
631
679
|
end
|
632
|
-
|
680
|
+
|
633
681
|
def normalize
|
634
682
|
if @max_size >= 0
|
635
683
|
sort_if_need[0...@max_size]
|
@@ -670,13 +718,22 @@ module RSS
|
|
670
718
|
["contributor", "name"],
|
671
719
|
].each do |name, attribute|
|
672
720
|
def_classed_elements(name, attribute)
|
673
|
-
|
721
|
+
end
|
674
722
|
|
675
|
-
%w(
|
723
|
+
%w(comments id published).each do |element|
|
676
724
|
attr_accessor element
|
677
725
|
add_need_initialize_variable(element)
|
678
726
|
end
|
679
727
|
|
728
|
+
%w(date).each do |date_element|
|
729
|
+
attr_reader date_element
|
730
|
+
add_need_initialize_variable(date_element)
|
731
|
+
end
|
732
|
+
|
733
|
+
def date=(_date)
|
734
|
+
@date = _parse_date_if_needed(_date)
|
735
|
+
end
|
736
|
+
|
680
737
|
def pubDate
|
681
738
|
date
|
682
739
|
end
|
@@ -715,6 +772,14 @@ module RSS
|
|
715
772
|
attr_accessor element
|
716
773
|
add_need_initialize_variable(element)
|
717
774
|
end
|
775
|
+
|
776
|
+
def permanent_link?
|
777
|
+
isPermaLink
|
778
|
+
end
|
779
|
+
|
780
|
+
def permanent_link=(bool)
|
781
|
+
self.isPermaLink = bool
|
782
|
+
end
|
718
783
|
end
|
719
784
|
|
720
785
|
class EnclosureBase < Base
|
@@ -725,6 +790,8 @@ module RSS
|
|
725
790
|
end
|
726
791
|
|
727
792
|
class SourceBase < Base
|
793
|
+
include SetupDefaultDate
|
794
|
+
|
728
795
|
%w(authors categories contributors generator icon
|
729
796
|
logo rights subtitle title).each do |name|
|
730
797
|
def_classed_element(name)
|
@@ -736,7 +803,7 @@ module RSS
|
|
736
803
|
def_classed_elements(name, attribute)
|
737
804
|
end
|
738
805
|
|
739
|
-
%w(id content
|
806
|
+
%w(id content).each do |element|
|
740
807
|
attr_accessor element
|
741
808
|
add_need_initialize_variable(element)
|
742
809
|
end
|
@@ -744,6 +811,15 @@ module RSS
|
|
744
811
|
alias_method(:url, :link)
|
745
812
|
alias_method(:url=, :link=)
|
746
813
|
|
814
|
+
%w(date).each do |date_element|
|
815
|
+
attr_reader date_element
|
816
|
+
add_need_initialize_variable(date_element)
|
817
|
+
end
|
818
|
+
|
819
|
+
def date=(_date)
|
820
|
+
@date = _parse_date_if_needed(_date)
|
821
|
+
end
|
822
|
+
|
747
823
|
def updated
|
748
824
|
date
|
749
825
|
end
|