Class FeedParser::Feed
In: lib/feedparser/feedparser.rb
lib/feedparser/html-output.rb
lib/feedparser/text-output.rb
Parent: Object
RuntimeError UnknownFeedTypeException FeedItem\n[lib/feedparser/feedparser.rb\nlib/feedparser/html-output.rb\nlib/feedparser/text-output.rb] AtomItem RSSItem SGMLParser HTML2TextParser Feed\n[lib/feedparser/feedparser.rb\nlib/feedparser/html-output.rb\nlib/feedparser/text-output.rb] lib/feedparser/feedparser.rb lib/feedparser/text-output.rb lib/feedparser/sgml-parser.rb lib/feedparser/html2text-parser.rb FeedParser dot/m_7_0.png

an RSS/Atom feed

Methods

new   parse   to_html   to_s   to_text  

Attributes

creator  [R] 
description  [R] 
encoding  [R] 
items  [R] 
link  [R] 
title  [R] 
type  [R] 
xml  [R]  REXML::Element for this feed.

Public Class methods

parse str to build a Feed

[Source]

    # File lib/feedparser/feedparser.rb, line 22
22:     def initialize(str = nil)
23:       parse(str) if str
24:     end

Public Instance methods

Determines all the fields using a string containing an XML document

[Source]

     # File lib/feedparser/feedparser.rb, line 28
 28:     def parse(str)
 29:       # Dirty hack: some feeds contain the & char. It must be changed to &
 30:       str.gsub!(/&(\s+)/, '&\1')
 31:       doc = REXML::Document.new(str)
 32:       @xml = doc.root
 33:       # get feed info
 34:       @encoding = doc.encoding
 35:       @title,@link,@description,@creator = nil
 36:       @items = []
 37:       if doc.root.elements['channel'] || doc.root.elements['rss:channel']
 38:         @type = "rss"
 39:         # We have a RSS feed!
 40:         # Title
 41:         if (e = doc.root.elements['channel/title'] ||
 42:           doc.root.elements['rss:channel/rss:title']) && e.text
 43:           @title = e.text.unescape_html.toUTF8(@encoding).rmWhiteSpace!
 44:         end
 45:         # Link
 46:         if (e = doc.root.elements['channel/link'] ||
 47:             doc.root.elements['rss:channel/rss:link']) && e.text
 48:           @link = e.text.rmWhiteSpace!
 49:         end
 50:         # Description
 51:         if (e = doc.root.elements['channel/description'] || 
 52:             doc.root.elements['rss:channel/rss:description']) && e.text
 53:           @description = e.text.toUTF8(@encoding).rmWhiteSpace!
 54:         end
 55:         # Creator
 56:         if ((e = doc.root.elements['channel/dc:creator']) && e.text) ||
 57:             ((e = doc.root.elements['channel/author'] ||
 58:             doc.root.elements['rss:channel/rss:author']) && e.text)
 59:           @creator = e.text.unescape_html.toUTF8(@encoding).rmWhiteSpace!
 60:         end
 61:         # Items
 62:         if doc.root.elements['channel/item']
 63:           query = 'channel/item'
 64:         elsif doc.root.elements['item']
 65:           query = 'item'
 66:         elsif doc.root.elements['rss:channel/rss:item']
 67:           query = 'rss:channel/rss:item'
 68:         else
 69:           query = 'rss:item'
 70:         end
 71:         doc.root.each_element(query) { |e| @items << RSSItem::new(e, self) }
 72: 
 73:       elsif doc.root.elements['/feed']
 74:         # We have an ATOM feed!
 75:         @type = "atom"
 76:         # Title
 77:         if (e = doc.root.elements['/feed/title']) && e.text
 78:           @title = e.text.unescape_html.toUTF8(@encoding).rmWhiteSpace!
 79:         end
 80:         # Link
 81:         doc.root.each_element('/feed/link') do |e|
 82:           if e.attribute('type') and (
 83:               e.attribute('type').value == 'text/html' or
 84:               e.attribute('type').value == 'application/xhtml' or
 85:               e.attribute('type').value == 'application/xhtml+xml')
 86:             if (h = e.attribute('href')) && h
 87:               @link = h.value.rmWhiteSpace!
 88:             end
 89:           end
 90:         end
 91:         # Description
 92:         if e = doc.root.elements['/feed/info']
 93:           e = e.elements['div'] || e
 94:           @description = e.to_s.toUTF8(@encoding).rmWhiteSpace!
 95:         end
 96:         # Items
 97:         doc.root.each_element('/feed/entry') do |e|
 98:            @items << AtomItem::new(e, self)
 99:         end
100:       else
101:         raise UnknownFeedTypeException::new
102:       end
103:     end

[Source]

    # File lib/feedparser/html-output.rb, line 6
 6:     def to_html
 7:       s = ''
 8:       s += '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'
 9:       s += "\n"
10:       s += "<html>\n"
11:       s += "<head>\n"
12:       s += "<title>#{@title.escape_html}</title>\n"
13:       s += "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">\n"
14:       s += "</head>\n"
15:       s += "<body>\n"
16: 
17:       s += "<table border=\"1\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" borderspacing=\"0\"><tr><td>\n<table width=\"100%\" bgcolor=\"#EDEDED\" cellpadding=\"4\" cellspacing=\"2\">\n"
18:       r = ""
19:       r += "<a href=\"#{@link}\">\n" if @link
20:       if @title
21:         r += "<b>#{@title.escape_html}</b>\n"
22:       elsif @link
23:         r += "<b>#{@link.escape_html}</b>\n"
24:       else
25:         r += "<b>Unnamed feed</b>\n"
26:       end
27:       r += "</a>\n" if @link
28:       headline = "<tr><td align=\"right\"><b>%s</b></td>\n<td width=\"100%%\">%s</td></tr>"
29:       s += (headline % ["Feed title:", r])
30:       s += (headline % ["Type:", @type])
31:       s += (headline % ["Encoding:", @encoding])
32:       s += (headline % ["Creator:", @creator.escape_html]) if @creator
33:       s += "</table></td></tr></table>\n"
34: 
35:       if @description and @description !~ /\A\s*</m
36:         s += "<br/>\n"
37:       end
38:       s += "#{@description}" if @description
39: 
40:       @items.each do |i|
41:         s += "\n<hr/><!-- *********************************** -->\n"
42:         s += i.to_html
43:       end
44:       s += "\n</body></html>\n"
45:       s
46:     end

[Source]

     # File lib/feedparser/feedparser.rb, line 105
105:     def to_s
106:       s  = ''
107:       s += "Type: #{@type}\n"
108:       s += "Encoding: #{@encoding}\n"
109:       s += "Title: #{@title}\n"
110:       s += "Link: #{@link}\n"
111:       s += "Description: #{@description}\n"
112:       s += "Creator: #{@creator}\n"
113:       s += "\n"
114:       @items.each { |i| s += i.to_s }
115:       s
116:     end

[Source]

    # File lib/feedparser/text-output.rb, line 28
28:     def to_text
29:       s = ''
30:       s += "Type: #{@type}\n"
31:       s += "Encoding: #{@encoding}\n"
32:       s += "Title: #{@title}\n"
33:       s += "Link: #{@link}\n"
34:       if @description
35:         s += "Description: #{@description.html2text}\n"
36:       else
37:         s += "Description:\n"
38:       end
39:       s += "Creator: #{@creator}\n"
40:       s += "\n"
41:       @items.each do |i|
42:         s += '*' * 40 + "\n"
43:         s += i.to_text
44:       end
45:       s
46:     end

[Validate]