lib/feed_tools/feed_item.rb in feedtools-0.2.16 vs lib/feed_tools/feed_item.rb in feedtools-0.2.17
- old
+ new
@@ -125,16 +125,16 @@
# Initialize the feed object
def initialize
super
@feed = nil
@feed_data = nil
- @feed_data_type = nil
+ @feed_data_type = :xml
@xml_doc = nil
@root_node = nil
@title = nil
@id = nil
- @time = nil
+ @time = Time.now.gmtime
end
# Returns the parent feed of this feed item
def feed
return @feed
@@ -150,11 +150,39 @@
return @feed_data
end
# Sets the feed item's data.
def feed_data=(new_feed_data)
+ @time = nil
@feed_data = new_feed_data
+
+ # We need an immediate parse of the time so we don't mess up sort orders
+ unless root_node.nil?
+ repair_entities = false
+ time_node = XPath.first(root_node, "pubDate")
+ if time_node.nil?
+ time_node = XPath.first(root_node, "dc:date")
+ end
+ if time_node.nil?
+ time_node = XPath.first(root_node, "dc:date", FEED_TOOLS_NAMESPACES)
+ end
+ if time_node.nil?
+ time_node = XPath.first(root_node, "issued")
+ end
+ if time_node.nil?
+ time_node = XPath.first(root_node, "updated")
+ end
+ if time_node.nil?
+ time_node = XPath.first(root_node, "time")
+ end
+ end
+ unless time_node.nil?
+ begin
+ @time = Time.parse(time_node.inner_xml)
+ rescue
+ end
+ end
end
# Returns the feed item's data type.
def feed_data_type
return @feed_data_type
@@ -191,10 +219,13 @@
end
# Returns the root node of the feed item.
def root_node
if @root_node.nil?
+ if xml.nil?
+ return nil
+ end
@root_node = xml.root
end
return @root_node
end
@@ -367,11 +398,11 @@
end
unless @description.nil?
@description = FeedTools.sanitize_html(@description, :strip)
@description = FeedTools.unescape_entities(@description) if repair_entities
- @description = FeedTools.tidy_html(@description) unless repair_entities
+ @description = FeedTools.tidy_html(@description)
end
@description = @description.strip unless @description.nil?
@description = nil if @description == ""
end
@@ -1270,16 +1301,22 @@
time_string = "" if time_string.nil?
if time_string != ""
@time = Time.parse(time_string)
else
@time = succ_time
+ if @time.nil?
+ @time = prev_time
+ end
end
rescue
@time = succ_time
+ if @time.nil?
+ @time = prev_time
+ end
end
if @time.nil?
- @time = Time.now
+ @time = Time.now.gmtime
end
end
return @time
end
@@ -1301,20 +1338,45 @@
item_index = unsorted_items.index(self)
if item_index.nil?
return nil
end
if item_index <= 0
- return Time.now
+ return nil
end
previous_item = unsorted_items[item_index - 1]
- return previous_item.time.succ
+ return (previous_item.time + 1)
rescue
return nil
end
end
- private :succ_time
+ #private :succ_time
+ # Returns 1 second before the succeeding item's time.
+ def prev_time #:nodoc:
+ begin
+ if feed.nil?
+ return nil
+ end
+ if feed.instance_variable_get("@items").nil?
+ feed.items
+ end
+ unsorted_items = feed.instance_variable_get("@items")
+ item_index = unsorted_items.index(self)
+ if item_index.nil?
+ return nil
+ end
+ if item_index >= (unsorted_items.size - 1)
+ return nil
+ end
+ succeeding_item = unsorted_items[item_index + 1]
+ return (succeeding_item.time - 1)
+ rescue
+ return nil
+ end
+ end
+ #private :prev_time
+
# Returns the feed item updated time
def updated
if @updated.nil?
unless root_node.nil?
updated_string = XPath.first(root_node, "updated/text()").to_s
@@ -1396,14 +1458,21 @@
def tags
# TODO: support the rel="tag" microformat
# =======================================
if @tags.nil?
@tags = []
+ if root_node.nil?
+ return @tags
+ end
if @tags.nil? || @tags.size == 0
@tags = []
tag_list = XPath.match(root_node, "dc:subject/rdf:Bag/rdf:li/text()")
- if tag_list.size > 1
+ if tag_list.nil? || tag_list.size == 0
+ tag_list = XPath.match(root_node,
+ "dc:subject/rdf:Bag/rdf:li/text()", FEED_TOOLS_NAMESPACES)
+ end
+ if tag_list != nil && tag_list.size > 1
for tag in tag_list
@tags << tag.to_s.downcase.strip
end
end
end
@@ -1640,10 +1709,10 @@
elsif self.time != nil
# Not technically correct, but a heck of a lot better
# than the Time.now fall-back.
xml_builder.updated(self.time.iso8601)
else
- xml_builder.updated(Time.now.iso8601)
+ xml_builder.updated(Time.now.gmtime.iso8601)
end
unless self.published.nil?
xml_builder.published(self.published.iso8601)
end
if self.id != nil