rubysl-rss 1.0.0

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 (55) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.travis.yml +8 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +25 -0
  6. data/README.md +29 -0
  7. data/Rakefile +1 -0
  8. data/lib/rss.rb +1 -0
  9. data/lib/rss/0.9.rb +428 -0
  10. data/lib/rss/1.0.rb +452 -0
  11. data/lib/rss/2.0.rb +111 -0
  12. data/lib/rss/atom.rb +749 -0
  13. data/lib/rss/content.rb +31 -0
  14. data/lib/rss/content/1.0.rb +10 -0
  15. data/lib/rss/content/2.0.rb +12 -0
  16. data/lib/rss/converter.rb +162 -0
  17. data/lib/rss/dublincore.rb +161 -0
  18. data/lib/rss/dublincore/1.0.rb +13 -0
  19. data/lib/rss/dublincore/2.0.rb +13 -0
  20. data/lib/rss/dublincore/atom.rb +17 -0
  21. data/lib/rss/image.rb +193 -0
  22. data/lib/rss/itunes.rb +410 -0
  23. data/lib/rss/maker.rb +44 -0
  24. data/lib/rss/maker/0.9.rb +467 -0
  25. data/lib/rss/maker/1.0.rb +434 -0
  26. data/lib/rss/maker/2.0.rb +223 -0
  27. data/lib/rss/maker/atom.rb +172 -0
  28. data/lib/rss/maker/base.rb +868 -0
  29. data/lib/rss/maker/content.rb +21 -0
  30. data/lib/rss/maker/dublincore.rb +124 -0
  31. data/lib/rss/maker/entry.rb +163 -0
  32. data/lib/rss/maker/feed.rb +429 -0
  33. data/lib/rss/maker/image.rb +111 -0
  34. data/lib/rss/maker/itunes.rb +242 -0
  35. data/lib/rss/maker/slash.rb +33 -0
  36. data/lib/rss/maker/syndication.rb +18 -0
  37. data/lib/rss/maker/taxonomy.rb +118 -0
  38. data/lib/rss/maker/trackback.rb +61 -0
  39. data/lib/rss/parser.rb +541 -0
  40. data/lib/rss/rexmlparser.rb +54 -0
  41. data/lib/rss/rss.rb +1312 -0
  42. data/lib/rss/slash.rb +49 -0
  43. data/lib/rss/syndication.rb +67 -0
  44. data/lib/rss/taxonomy.rb +145 -0
  45. data/lib/rss/trackback.rb +288 -0
  46. data/lib/rss/utils.rb +111 -0
  47. data/lib/rss/xml-stylesheet.rb +105 -0
  48. data/lib/rss/xml.rb +71 -0
  49. data/lib/rss/xmlparser.rb +93 -0
  50. data/lib/rss/xmlscanner.rb +121 -0
  51. data/lib/rubysl/rss.rb +2 -0
  52. data/lib/rubysl/rss/rss.rb +19 -0
  53. data/lib/rubysl/rss/version.rb +5 -0
  54. data/rubysl-rss.gemspec +23 -0
  55. metadata +153 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d3eb93259d4e044e8483e641f7ffb1061f89eb98
4
+ data.tar.gz: 4b9d868c45af61dc53c8c1dec751933637003b07
5
+ SHA512:
6
+ metadata.gz: ba15661cec3b9b3825a555cd6604aab81a8b0b2067be5b334146e93255821f62ea8603afd2de34d4b7662fa81a9a6405d4b27579540dbce67c1e2d1c59de3142
7
+ data.tar.gz: c746088480be967b5d4e8491a796af8d8fdbba08563c412634b753afbb1ba608e1b4a088636f045437a9fbd3338fd230e78adaed49e30fd7605808e253d4ac76
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ before_install:
3
+ - gem update --system
4
+ - gem --version
5
+ - gem install rubysl-bundler
6
+ script: bundle exec mspec spec
7
+ rvm:
8
+ - rbx-nightly-18mode
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rubysl-rss.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ Copyright (c) 2013, Brian Shirai
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+ 2. Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ 3. Neither the name of the library nor the names of its contributors may be
13
+ used to endorse or promote products derived from this software without
14
+ specific prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY DIRECT,
20
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
25
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,29 @@
1
+ # Rubysl::Rss
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'rubysl-rss'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install rubysl-rss
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1 @@
1
+ require "rubysl/rss"
@@ -0,0 +1,428 @@
1
+ require "rss/parser"
2
+
3
+ module RSS
4
+
5
+ module RSS09
6
+ NSPOOL = {}
7
+ ELEMENTS = []
8
+
9
+ def self.append_features(klass)
10
+ super
11
+
12
+ klass.install_must_call_validator('', "")
13
+ end
14
+ end
15
+
16
+ class Rss < Element
17
+
18
+ include RSS09
19
+ include RootElementMixin
20
+
21
+ %w(channel).each do |name|
22
+ install_have_child_element(name, "", nil)
23
+ end
24
+
25
+ attr_writer :feed_version
26
+ alias_method(:rss_version, :feed_version)
27
+ alias_method(:rss_version=, :feed_version=)
28
+
29
+ def initialize(feed_version, version=nil, encoding=nil, standalone=nil)
30
+ super
31
+ @feed_type = "rss"
32
+ end
33
+
34
+ def items
35
+ if @channel
36
+ @channel.items
37
+ else
38
+ []
39
+ end
40
+ end
41
+
42
+ def image
43
+ if @channel
44
+ @channel.image
45
+ else
46
+ nil
47
+ end
48
+ end
49
+
50
+ def textinput
51
+ if @channel
52
+ @channel.textInput
53
+ else
54
+ nil
55
+ end
56
+ end
57
+
58
+ def setup_maker_elements(maker)
59
+ super
60
+ items.each do |item|
61
+ item.setup_maker(maker.items)
62
+ end
63
+ image.setup_maker(maker) if image
64
+ textinput.setup_maker(maker) if textinput
65
+ end
66
+
67
+ private
68
+ def _attrs
69
+ [
70
+ ["version", true, "feed_version"],
71
+ ]
72
+ end
73
+
74
+ class Channel < Element
75
+
76
+ include RSS09
77
+
78
+ [
79
+ ["title", nil, :text],
80
+ ["link", nil, :text],
81
+ ["description", nil, :text],
82
+ ["language", nil, :text],
83
+ ["copyright", "?", :text],
84
+ ["managingEditor", "?", :text],
85
+ ["webMaster", "?", :text],
86
+ ["rating", "?", :text],
87
+ ["pubDate", "?", :date, :rfc822],
88
+ ["lastBuildDate", "?", :date, :rfc822],
89
+ ["docs", "?", :text],
90
+ ["cloud", "?", :have_attribute],
91
+ ["skipDays", "?", :have_child],
92
+ ["skipHours", "?", :have_child],
93
+ ["image", nil, :have_child],
94
+ ["item", "*", :have_children],
95
+ ["textInput", "?", :have_child],
96
+ ].each do |name, occurs, type, *args|
97
+ __send__("install_#{type}_element", name, "", occurs, name, *args)
98
+ end
99
+ alias date pubDate
100
+ alias date= pubDate=
101
+
102
+ private
103
+ def maker_target(maker)
104
+ maker.channel
105
+ end
106
+
107
+ def setup_maker_elements(channel)
108
+ super
109
+ [
110
+ [skipDays, "day"],
111
+ [skipHours, "hour"],
112
+ ].each do |skip, key|
113
+ if skip
114
+ skip.__send__("#{key}s").each do |val|
115
+ target_skips = channel.__send__("skip#{key.capitalize}s")
116
+ new_target = target_skips.__send__("new_#{key}")
117
+ new_target.content = val.content
118
+ end
119
+ end
120
+ end
121
+ end
122
+
123
+ def not_need_to_call_setup_maker_variables
124
+ %w(image textInput)
125
+ end
126
+
127
+ class SkipDays < Element
128
+ include RSS09
129
+
130
+ [
131
+ ["day", "*"]
132
+ ].each do |name, occurs|
133
+ install_have_children_element(name, "", occurs)
134
+ end
135
+
136
+ class Day < Element
137
+ include RSS09
138
+
139
+ content_setup
140
+
141
+ def initialize(*args)
142
+ if Utils.element_initialize_arguments?(args)
143
+ super
144
+ else
145
+ super()
146
+ self.content = args[0]
147
+ end
148
+ end
149
+
150
+ end
151
+
152
+ end
153
+
154
+ class SkipHours < Element
155
+ include RSS09
156
+
157
+ [
158
+ ["hour", "*"]
159
+ ].each do |name, occurs|
160
+ install_have_children_element(name, "", occurs)
161
+ end
162
+
163
+ class Hour < Element
164
+ include RSS09
165
+
166
+ content_setup(:integer)
167
+
168
+ def initialize(*args)
169
+ if Utils.element_initialize_arguments?(args)
170
+ super
171
+ else
172
+ super()
173
+ self.content = args[0]
174
+ end
175
+ end
176
+ end
177
+
178
+ end
179
+
180
+ class Image < Element
181
+
182
+ include RSS09
183
+
184
+ %w(url title link).each do |name|
185
+ install_text_element(name, "", nil)
186
+ end
187
+ [
188
+ ["width", :integer],
189
+ ["height", :integer],
190
+ ["description"],
191
+ ].each do |name, type|
192
+ install_text_element(name, "", "?", name, type)
193
+ end
194
+
195
+ def initialize(*args)
196
+ if Utils.element_initialize_arguments?(args)
197
+ super
198
+ else
199
+ super()
200
+ self.url = args[0]
201
+ self.title = args[1]
202
+ self.link = args[2]
203
+ self.width = args[3]
204
+ self.height = args[4]
205
+ self.description = args[5]
206
+ end
207
+ end
208
+
209
+ private
210
+ def maker_target(maker)
211
+ maker.image
212
+ end
213
+ end
214
+
215
+ class Cloud < Element
216
+
217
+ include RSS09
218
+
219
+ [
220
+ ["domain", "", true],
221
+ ["port", "", true, :integer],
222
+ ["path", "", true],
223
+ ["registerProcedure", "", true],
224
+ ["protocol", "", true],
225
+ ].each do |name, uri, required, type|
226
+ install_get_attribute(name, uri, required, type)
227
+ end
228
+
229
+ def initialize(*args)
230
+ if Utils.element_initialize_arguments?(args)
231
+ super
232
+ else
233
+ super()
234
+ self.domain = args[0]
235
+ self.port = args[1]
236
+ self.path = args[2]
237
+ self.registerProcedure = args[3]
238
+ self.protocol = args[4]
239
+ end
240
+ end
241
+ end
242
+
243
+ class Item < Element
244
+
245
+ include RSS09
246
+
247
+ [
248
+ ["title", '?', :text],
249
+ ["link", '?', :text],
250
+ ["description", '?', :text],
251
+ ["category", '*', :have_children, "categories"],
252
+ ["source", '?', :have_child],
253
+ ["enclosure", '?', :have_child],
254
+ ].each do |tag, occurs, type, *args|
255
+ __send__("install_#{type}_element", tag, "", occurs, tag, *args)
256
+ end
257
+
258
+ private
259
+ def maker_target(items)
260
+ if items.respond_to?("items")
261
+ # For backward compatibility
262
+ items = items.items
263
+ end
264
+ items.new_item
265
+ end
266
+
267
+ def setup_maker_element(item)
268
+ super
269
+ @enclosure.setup_maker(item) if @enclosure
270
+ @source.setup_maker(item) if @source
271
+ end
272
+
273
+ class Source < Element
274
+
275
+ include RSS09
276
+
277
+ [
278
+ ["url", "", true]
279
+ ].each do |name, uri, required|
280
+ install_get_attribute(name, uri, required)
281
+ end
282
+
283
+ content_setup
284
+
285
+ def initialize(*args)
286
+ if Utils.element_initialize_arguments?(args)
287
+ super
288
+ else
289
+ super()
290
+ self.url = args[0]
291
+ self.content = args[1]
292
+ end
293
+ end
294
+
295
+ private
296
+ def maker_target(item)
297
+ item.source
298
+ end
299
+
300
+ def setup_maker_attributes(source)
301
+ source.url = url
302
+ source.content = content
303
+ end
304
+ end
305
+
306
+ class Enclosure < Element
307
+
308
+ include RSS09
309
+
310
+ [
311
+ ["url", "", true],
312
+ ["length", "", true, :integer],
313
+ ["type", "", true],
314
+ ].each do |name, uri, required, type|
315
+ install_get_attribute(name, uri, required, type)
316
+ end
317
+
318
+ def initialize(*args)
319
+ if Utils.element_initialize_arguments?(args)
320
+ super
321
+ else
322
+ super()
323
+ self.url = args[0]
324
+ self.length = args[1]
325
+ self.type = args[2]
326
+ end
327
+ end
328
+
329
+ private
330
+ def maker_target(item)
331
+ item.enclosure
332
+ end
333
+
334
+ def setup_maker_attributes(enclosure)
335
+ enclosure.url = url
336
+ enclosure.length = length
337
+ enclosure.type = type
338
+ end
339
+ end
340
+
341
+ class Category < Element
342
+
343
+ include RSS09
344
+
345
+ [
346
+ ["domain", "", false]
347
+ ].each do |name, uri, required|
348
+ install_get_attribute(name, uri, required)
349
+ end
350
+
351
+ content_setup
352
+
353
+ def initialize(*args)
354
+ if Utils.element_initialize_arguments?(args)
355
+ super
356
+ else
357
+ super()
358
+ self.domain = args[0]
359
+ self.content = args[1]
360
+ end
361
+ end
362
+
363
+ private
364
+ def maker_target(item)
365
+ item.new_category
366
+ end
367
+
368
+ def setup_maker_attributes(category)
369
+ category.domain = domain
370
+ category.content = content
371
+ end
372
+
373
+ end
374
+
375
+ end
376
+
377
+ class TextInput < Element
378
+
379
+ include RSS09
380
+
381
+ %w(title description name link).each do |name|
382
+ install_text_element(name, "", nil)
383
+ end
384
+
385
+ def initialize(*args)
386
+ if Utils.element_initialize_arguments?(args)
387
+ super
388
+ else
389
+ super()
390
+ self.title = args[0]
391
+ self.description = args[1]
392
+ self.name = args[2]
393
+ self.link = args[3]
394
+ end
395
+ end
396
+
397
+ private
398
+ def maker_target(maker)
399
+ maker.textinput
400
+ end
401
+ end
402
+
403
+ end
404
+
405
+ end
406
+
407
+ RSS09::ELEMENTS.each do |name|
408
+ BaseListener.install_get_text_element("", name, name)
409
+ end
410
+
411
+ module ListenerMixin
412
+ private
413
+ def initial_start_rss(tag_name, prefix, attrs, ns)
414
+ check_ns(tag_name, prefix, ns, "")
415
+
416
+ @rss = Rss.new(attrs['version'], @version, @encoding, @standalone)
417
+ @rss.do_validate = @do_validate
418
+ @rss.xml_stylesheets = @xml_stylesheets
419
+ @last_element = @rss
420
+ pr = Proc.new do |text, tags|
421
+ @rss.validate_for_stream(tags, @ignore_unknown_element) if @do_validate
422
+ end
423
+ @proc_stack.push(pr)
424
+ end
425
+
426
+ end
427
+
428
+ end