| Class | FeedParser::Feed |
| In: |
lib/feedparser/feedparser.rb
lib/feedparser/html-output.rb lib/feedparser/text-output.rb |
| Parent: | Object |
| creator | [R] | |
| description | [R] | |
| encoding | [R] | |
| items | [R] | |
| link | [R] | |
| title | [R] | |
| type | [R] | |
| xml | [R] | REXML::Element for this feed. |
Determines all the fields using a string containing an XML document
# 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
# 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
# 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
# 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