FeedNormalizer::RubyRssParser

Public Class Methods

parse(xml, loose) click to toggle source
    # File lib/parsers/rss.rb, line 28
28:     def self.parse(xml, loose)
29:       begin
30:         rss = parser.parse(xml)
31:       rescue Exception => e
32:         #puts "Parser #{parser} failed because #{e.message.gsub("\n",', ')}"
33:         return nil
34:       end
35: 
36:       # check for channel to make sure we're only dealing with RSS.
37:       rss && rss.respond_to?(:channel) ? package(rss, loose) : nil
38:     end
parser() click to toggle source
    # File lib/parsers/rss.rb, line 24
24:     def self.parser
25:       RSS::Parser
26:     end
priority() click to toggle source

Fairly high priority; a fast and strict parser.

    # File lib/parsers/rss.rb, line 41
41:     def self.priority
42:       100
43:     end

Protected Class Methods

package(rss, loose) click to toggle source
    # File lib/parsers/rss.rb, line 47
47:     def self.package(rss, loose)
48:       feed = Feed.new(self)
49: 
50:       # channel elements
51:       feed_mapping = {
52:         :generator => :generator,
53:         :title => :title,
54:         :urls => :link,
55:         :description => :description,
56:         :copyright => :copyright,
57:         :authors => :managingEditor,
58:         :last_updated => [:lastBuildDate, :pubDate, :dc_date],
59:         :id => :guid,
60:         :ttl => :ttl
61:       }
62: 
63:       # make two passes, to catch all possible root elements
64:       map_functions!(feed_mapping, rss, feed)
65:       map_functions!(feed_mapping, rss.channel, feed)
66: 
67:       # custom channel elements
68:       feed.image = rss.image ? rss.image.url : nil
69:       feed.skip_hours = skip(rss, :skipHours)
70:       feed.skip_days = skip(rss, :skipDays)
71: 
72:       # item elements
73:       item_mapping = {
74:         :date_published => [:pubDate, :dc_date],
75:         :urls => :link,
76:         :enclosures => :enclosure,
77:         :description => :description,
78:         :content => [:content_encoded, :description],
79:         :title => :title,
80:         :authors => [:author, :dc_creator],
81:         :last_updated => [:pubDate, :dc_date] # This is effectively an alias for date_published for this parser.
82:       }
83: 
84:       rss.items.each do |rss_item|
85:         feed_entry = Entry.new
86:         map_functions!(item_mapping, rss_item, feed_entry)
87: 
88:         # custom item elements
89:         feed_entry.id = rss_item.guid.content if rss_item.respond_to?(:guid) && rss_item.guid
90:         feed_entry.copyright = rss.copyright if rss_item.respond_to? :copyright
91:         feed_entry.categories = loose ?
92:                                   rss_item.categories.collect{|c|c.content} :
93:                                   [rss_item.categories.first.content] rescue []
94: 
95:         feed.entries << feed_entry
96:       end
97: 
98:       feed
99:     end
skip(parser, attribute) click to toggle source
     # File lib/parsers/rss.rb, line 101
101:     def self.skip(parser, attribute)
102:       case attribute
103:         when :skipHours then attributes = :hours
104:         when :skipDays then attributes = :days
105:       end
106:       channel = parser.channel
107: 
108:       return nil unless channel.respond_to?(attribute) && a = channel.send(attribute)
109:       a.send(attributes).collect{|e| e.content}
110:     end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.