lib/webgen/sourcehandler/feed.rb in gettalong-webgen-0.5.8.20090507 vs lib/webgen/sourcehandler/feed.rb in gettalong-webgen-0.5.9.20090620

- old
+ new

@@ -13,22 +13,22 @@ def initialize # :nodoc: website.blackboard.add_listener(:node_changed?, method(:node_changed?)) end - # Create atom and/or rss feed files from +parent+ and +path+. - def create_node(parent, path) + # Create atom and/or rss feed files from +path+. + def create_node(path) page = page_from_path(path) - path.meta_info['link'] ||= parent.absolute_lcn + path.meta_info['link'] ||= path.parent_path if MANDATORY_INFOS.any? {|t| path.meta_info[t].nil?} raise "One of #{MANDATORY_INFOS.join('/')} information missing for feed <#{path}>" end create_feed_node = lambda do |type| path.ext = type - super(parent, path) do |node| + super(path) do |node| node.node_info[:feed] = page node.node_info[:feed_type] = type end end @@ -39,77 +39,51 @@ nodes end # Return the rendered feed represented by +node+. def content(node) - website.cache[[:sourcehandler_feed, node.node_info[:src]]] = feed_entries(node).map {|n| n.absolute_lcn} + website.cache[[:sourcehandler_feed, node.node_info[:src]]] = feed_entries(node).map {|n| n.alcn} + block_name = node.node_info[:feed_type] + '_template' if node.node_info[:feed].blocks.has_key?(block_name) - node.node_info[:feed].blocks[block_name]. - render(Webgen::Context.new(:chain => [node])).content + node.node_info[:feed].blocks[block_name].render(Webgen::Context.new(:chain => [node])).content else - feed = (website.cache.volatile[:sourcehandler_feed] ||= {})[node.node_info[:src]] ||= build_feed_for(node) - feed.build_xml(node.node_info[:feed_type], (node.node_info[:feed_type] == 'rss' ? node['rss_version'] || 2.0 : nil)) + chain = [node.resolve("/templates/#{node.node_info[:feed_type]}_feed.template"), node] + node.node_info[:used_nodes] << chain.first.alcn + chain.first.node_info[:page].blocks['content'].render(Webgen::Context.new(:chain => chain)).content end end - # Helper method for returning the entries for the feed node +node+. + # Return the entries for the feed +node+. def feed_entries(node) nr_items = (node['number_of_entries'].to_i == 0 ? 10 : node['number_of_entries'].to_i) - patterns = [node['entries']].flatten.map {|pat| Webgen::Common.absolute_path(pat, node.parent.absolute_lcn)} + patterns = [node['entries']].flatten.map {|pat| Webgen::Path.make_absolute(node.parent.alcn, pat)} node.tree.node_access[:alcn].values. select {|node| patterns.any? {|pat| node =~ pat} && node.node_info[:page]}. sort {|a,b| a['modified_at'] <=> b['modified_at']}[0, nr_items] end + # Return the feed link URL for the feed +node+. + def feed_link(node) + Webgen::Node.url(File.join(node['site_url'], node.tree[node['link']].path), false) + end + + # Return the content of an +entry+ of the feed +node+. + def entry_content(node, entry) + entry.node_info[:page].blocks[node['content_block_name'] || 'content'].render(Webgen::Context.new(:chain => [entry])).content + end + ####### private ####### - # Return the populated FeedTools::Feed object for +node+. - def build_feed_for(node) - require 'feed_tools' - require 'time' - - site_url = node['site_url'] - - feed = FeedTools::Feed.new - feed.title = node['title'] - feed.description = node['description'] - feed.author = node['author'] - feed.author.url = node['author_url'] - feed.base_uri = site_url - feed.link = File.join(site_url, node.tree[node['link']].path) - feed.id = feed.link - - feed.published = (node['created_at'].kind_of?(Time) ? node['created_at'] : Time.now) - feed.updated = Time.now - feed.generator = 'webgen - Webgen::SourceHandler::Feed' - - node.feed_entries.each do |entry| - item = FeedTools::FeedItem.new - item.title = entry['title'] - item.link = File.join(site_url, entry.path) - item.content = entry.node_info[:page].blocks[node['content_block_name'] || 'content'].render(Webgen::Context.new(:chain => [entry])).content - item.updated = entry['modified_at'] - item.published = entry['created_at'] if entry['created_at'].kind_of?(Time) - if entry['author'] - item.author = entry['author'] - item.author.url = entry['author_url'] - end - item.id = item.link - feed << item - end - feed - end - # Check if the any of the nodes used by this feed +node+ have changed and then mark the node as # dirty. def node_changed?(node) return if node.node_info[:processor] != self.class.name entries = node.feed_entries - node.flag(:dirty) if entries.map {|n| n.absolute_lcn } != website.cache[[:sourcehandler_feed, node.node_info[:src]]] || + node.flag(:dirty) if entries.map {|n| n.alcn } != website.cache[[:sourcehandler_feed, node.node_info[:src]]] || entries.any? {|n| n.changed?} end end