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(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 105 105: def to_s(localtime = true) 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(localtime) } 115: s 116: end
# File lib/feedparser/text-output.rb, line 30 30: def to_text(localtime = true) 31: s = '' 32: s += "Type: #{@type}\n" 33: s += "Encoding: #{@encoding}\n" 34: s += "Title: #{@title}\n" 35: s += "Link: #{@link}\n" 36: if @description 37: s += "Description: #{@description.html2text}\n" 38: else 39: s += "Description:\n" 40: end 41: s += "Creator: #{@creator}\n" 42: s += "\n" 43: @items.each do |i| 44: s += '*' * 40 + "\n" 45: s += i.to_text(localtime) 46: end 47: s 48: end