lib/webgen/sourcehandler/metainfo.rb in gettalong-webgen-0.5.5.20081001 vs lib/webgen/sourcehandler/metainfo.rb in gettalong-webgen-0.5.5.20081010

- old
+ new

@@ -1,9 +1,7 @@ require 'pathname' require 'yaml' -require 'webgen/sourcehandler/base' -require 'webgen/websiteaccess' module Webgen::SourceHandler # Handles meta information files which provide meta information for other files. class Metainfo @@ -17,33 +15,33 @@ def initialize website.blackboard.add_listener(:node_meta_info_changed?, method(:node_meta_info_changed?)) website.blackboard.add_listener(:before_node_created, method(:before_node_created)) website.blackboard.add_listener(:before_node_deleted, method(:before_node_deleted)) website.blackboard.add_listener(:after_node_created, method(:after_node_created)) - self.nodes ||= Set.new + self.nodes ||= [] end # Create a meta info node from +parent+ and +path+. def create_node(parent, path) page = page_from_path(path) super(parent, path) do |node| [[:mi_paths, 'paths'], [:mi_alcn, 'alcn']].each do |mi_key, block_name| node.node_info[mi_key] = {} YAML::load(page.blocks[block_name].content).each do |key, value| key = Pathname.new(key =~ /^\// ? key : File.join(parent.absolute_lcn, key)).cleanpath.to_s - key.chomp('/') unless key == '/' node.node_info[mi_key][key] = value end if page.blocks.has_key?(block_name) end - website.cache[[:sh_metainfo_node_mi, node.absolute_lcn]] = { + + mark_all_matched_dirty(node, :no_old_data) + + website.cache.permanent[[:sh_metainfo_node_mi, node.absolute_lcn]] = { :mi_paths => node.node_info[:mi_paths], :mi_alcn => node.node_info[:mi_alcn] } - mark_all_matched_dirty(node) - - self.nodes << node + self.nodes << node unless self.nodes.include?(node) self.nodes = self.nodes.sort_by {|n| n.absolute_lcn} end end def nodes #:nodoc: @@ -57,31 +55,33 @@ ####### private ####### # Return +true+ if any meta information for +node+ provided by +mi_node+ has changed. - def meta_info_changed?(mi_node, node, use_cache = true) - use_cache = false if !website.cache.old_data[[:sh_metainfo_node_mi, mi_node.absolute_lcn]] - cached = website.cache[[:sh_metainfo_node_mi, mi_node.absolute_lcn]] - path = website.blackboard.invoke(:source_paths)[node.node_info[:src]] - (mi_node.node_info[:mi_paths].any? {|pattern, mi| path =~ pattern && (!use_cache || mi != cached[:mi_paths][pattern])} || - mi_node.node_info[:mi_alcn].any? {|pattern, mi| node =~ pattern && (!use_cache || mi != cached[:mi_alcn][pattern])}) + def meta_info_changed?(mi_node, node, option = nil) + cached = website.cache.permanent[[:sh_metainfo_node_mi, mi_node.absolute_lcn]] + (mi_node.node_info[:mi_paths].any? do |pattern, mi| + Webgen::Path.match(node.node_info[:creation_path], pattern) && + (option == :force || (!cached && option == :no_old_data) || mi != cached[:mi_paths][pattern]) + end || mi_node.node_info[:mi_alcn].any? do |pattern, mi| + node =~ pattern && (option == :force || (!cached && option == :no_old_data) || mi != cached[:mi_alcn][pattern]) + end) end # Mark all nodes that are matched by a path or an alcn specifcation in the meta info node +node+ # as dirty. - def mark_all_matched_dirty(node, use_cache = true) + def mark_all_matched_dirty(node, option = nil) node.tree.node_access[:alcn].each do |path, n| - n.dirty_meta_info = true if meta_info_changed?(node, n, use_cache) + n.flag(:dirty_meta_info) if meta_info_changed?(node, n, option) end end # Update the meta info of matched path before a node is created. def before_node_created(parent, path) self.nodes.each do |node| node.node_info[:mi_paths].each do |pattern, mi| - path.meta_info.update(mi) if path =~ pattern + path.meta_info.update(mi) if Webgen::Path.match(path, pattern) end end end # Update the meta information of a matched alcn after the node has been created. @@ -94,22 +94,22 @@ end # Check if the +node+ has meta information from any meta info node and if so, if the meta info # node in question has changed. def node_meta_info_changed?(node) - return if self.nodes.include?(node) self.nodes.each do |n| - if n.created && meta_info_changed?(n, node) - node.dirty_meta_info = true + if n.flagged(:created) && meta_info_changed?(n, node) + node.flag(:dirty_meta_info) return end end end # Delete the meta info node +node+ from the internal array. def before_node_deleted(node) return unless node.node_info[:processor] == self.class.name - mark_all_matched_dirty(node, false) if !website.blackboard.invoke(:source_paths).include?(node.node_info[:src]) + mark_all_matched_dirty(node, :force) + website.cache.permanent.delete([:sh_metainfo_node_mi, node.absolute_lcn]) self.nodes.delete(node) end end