Class: FeedYamlizer::FeedListener

Inherits:
Object
  • Object
show all
Includes:
REXML::StreamListener
Defined in:
lib/feed_yamlizer/feed_listener.rb

Constant Summary collapse

FEED_TITLE_TAGS =
%w[ feed/title rss/channel/title rdf:RDF/channel/title ]
%w[ rss/channel/link rdf:RDF/channel/link ]
ITEM_START_TAGS =
%w[ feed/entry rss/channel/item rdf:RDF/item ]
ITEM_TITLE_TAGS =
%w[ feed/entry/title rss/channel/item/title rdf:RDF/item/title ]
ITEM_AUTHOR_TAGS =
%w[ feed/entry/author/name rss/channel/item/author rdf:RDF/item/dc:creator ]
ITEM_GUID_TAGS =
%w[ feed/entry/id rss/channel/item/guid rdf:RDF/item/guid ]
ITEM_PUB_DATE_TAGS =
%w[ feed/entry/published feed/entry/created feed/entry/modified feed/entry/updated rss/channel/item/pubDate rdf:RDF/item/dc:date ]
%w[ feed/entry/feedburner:origLink rss/channel/item/link rdf:RDF/item/link ]
ITEM_SUMMARY_TAGS =
%w[ feed/entry/summary rss/channel/item/description rdf:RDF/item/description ]
ITEM_CONTENT_TAGS =
[ %r{feed/entry/content}, %r{rss/channel/item/content}, %r{rss/channel/item/content:encoded},  %r{rss/item/content}, %r{rdf:RDF/item/content} ]

Instance Method Summary collapse

Constructor Details

#initializeFeedListener

Returns a new instance of FeedListener.



26
27
28
29
# File 'lib/feed_yamlizer/feed_listener.rb', line 26

def initialize
  @nested_tags = []
  @x = {:items => []}
end

Instance Method Details

#encode(string) ⇒ Object

encoding method TODO



112
113
114
# File 'lib/feed_yamlizer/feed_listener.rb', line 112

def encode(string)
  string
end

#pathObject



106
107
108
# File 'lib/feed_yamlizer/feed_listener.rb', line 106

def path
  @nested_tags.join('/')
end

#resultObject



31
32
33
# File 'lib/feed_yamlizer/feed_listener.rb', line 31

def result
  @x
end

#tag_end(name) ⇒ Object



55
56
57
58
59
60
61
62
63
# File 'lib/feed_yamlizer/feed_listener.rb', line 55

def tag_end(name)
  case path
  when *ITEM_START_TAGS
    @current_item[:link] ||= (@current_item[:links] || []).detect {|x| x !~ /\.(jpg|png|gif)$/}
    @x[:items] << @current_item
    @current_item = nil
  end
  @nested_tags.pop
end

#tag_start(name, attrs) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/feed_yamlizer/feed_listener.rb', line 35

def tag_start(name, attrs)
  @nested_tags.push name
  case path
  when 'feed/link'
    @x[:link] ||= encode attrs['href']
  when *ITEM_START_TAGS
    @current_item = {}
  when 'feed/entry/link'
    if (attrs['rel'] != 'replies') && (attrs['rel'] == 'alternate' || attrs['type'] == 'text/html')
      (@current_item[:links] ||= []) << encode(attrs['href'])
    end
  when /enclosure$/
    @current_item[:enclosure] ||= encode(attrs['url'])
  when /itunes:image$/
    if @current_item
      @current_item[:podcast_image] ||= encode(attrs['href'])
    end
  end
end

#text(text) ⇒ Object Also known as: cdata



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/feed_yamlizer/feed_listener.rb', line 65

def text(text)
  case path
  when *FEED_TITLE_TAGS
    @x[:title] = encode text.strip
  when *FEED_LINK_TAGS 
    @x[:link] ||= encode text.strip
  when *ITEM_TITLE_TAGS 
    @current_item[:title] = encode(text.strip)
  when *ITEM_AUTHOR_TAGS 
    @current_item[:author] = encode(text.strip)
  when *ITEM_GUID_TAGS 
    @current_item[:guid] = encode(text)
  when *ITEM_PUB_DATE_TAGS
    @current_item[:pub_date] = DateTime.parse(encode(text))
  when *ITEM_LINK_TAGS 
    @current_item[:link] ||= encode(text)
    (@current_item[:links] ||= []) << encode(text)
  when *ITEM_SUMMARY_TAGS 
    if @current_item[:summary] 
      @current_item[:summary] << encode(text)
    else
      @current_item[:summary] = encode(text)
    end
  when *ITEM_CONTENT_TAGS
    if @current_item[:content] 
      @current_item[:content]  << encode(text)
    else
      @current_item[:content] = encode(text)
    end
  end
end

#xmldecl(decl, encoding, extra) ⇒ Object



98
99
100
101
102
103
104
# File 'lib/feed_yamlizer/feed_listener.rb', line 98

def xmldecl(decl, encoding, extra)
  if encoding 
    @x[:xml_encoding] = encoding.downcase
  else
    @x[:xml_encoding] = "UTF-8"
  end
end