| Class | FeedParser::Feed |
| In: |
lib/feedparser/text-output.rb
lib/feedparser/feedparser.rb lib/feedparser/html-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 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
# 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
# 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
# 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