Class FeedParser::Feed
In: lib/feedparser/html-output.rb
lib/feedparser/feedparser.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/sgml-parser.rb lib/feedparser/text-output.rb lib/feedparser/html2text-parser.rb FeedParser dot/m_6_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 23
23:     def initialize(str = nil)
24:       parse(str) if str
25:     end

Public Instance methods

Determines all the fields using a string containing an XML document

[Source]

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

[Source]

    # File lib/feedparser/html-output.rb, line 6
 6:     def to_html(localtime = true)
 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(localtime)
43:       end
44:       s += "\n</body></html>\n"
45:       s
46:     end

[Source]

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

[Source]

    # File lib/feedparser/text-output.rb, line 37
37:     def to_text(localtime = true, wrapto = false)
38:       s = ''
39:       s += "Type: #{@type}\n"
40:       s += "Encoding: #{@encoding}\n"
41:       s += "Title: #{@title}\n"
42:       s += "Link: #{@link}\n"
43:       if @description
44:         s += "Description: #{@description.html2text}\n"
45:       else
46:         s += "Description:\n"
47:       end
48:       s += "Creator: #{@creator}\n"
49:       s += "\n"
50:       @items.each do |i|
51:         s += '*' * 40 + "\n"
52:         s += i.to_text(localtime, wrapto)
53:       end
54:       s
55:     end

[Validate]