module RubyXL::RelationshipSupport
def self.included(klass)
def self.included(klass) klass.class_variable_set(:@@ooxml_relationships, {}) klass.extend RubyXL::RelationshipSupport::ClassMehods end
def attach_relationship(rid, rf)
def attach_relationship(rid, rf) relationships = self.class.class_variable_get(:@@ooxml_relationships) klass = rf.class if relationships.has_key?(klass) then accessor = relationships[klass] case accessor when NilClass then # Relationship is known, but we don't have a special accessor for it, store as generic store_relationship(rf) when false then # Do nothing, the code will perform attaching on its own else container = self.send(accessor) if container.is_a?(Array) then container << rf else self.send("#{accessor}=", rf) end end else store_relationship(rf, :unknown) end end
def collect_related_objects
def collect_related_objects res = related_objects.compact # Avoid tainting +related_objects+ array res.concat(generic_storage) if generic_storage if relationship_container then relationship_container.owner = self res << relationship_container end related = [] res.each { |obj| next if obj.respond_to?(:empty?) && obj.empty? related << obj related.concat(obj.collect_related_objects) if obj.respond_to?(:collect_related_objects) } related end
def load_relationships(dir_path, base_file_name)
def load_relationships(dir_path, base_file_name) self.relationship_container = RubyXL::OOXMLRelationshipsFile.load_relationship_file(dir_path, base_file_name) return if relationship_container.nil? relationship_container.load_related_files(dir_path, base_file_name).each_pair { |rid, related_file| attach_relationship(rid, related_file) if related_file } end
def related_objects # Override this method
def related_objects # Override this method [] end
def store_relationship(related_file, unknown = false)
def store_relationship(related_file, unknown = false) self.generic_storage ||= [] if unknown && !RubyXL.class_variable_get(:@@suppress_warnings) then puts "WARNING: #{self.class} is not aware how to process #{related_file.class}" end self.generic_storage << related_file end