class ODFWriter::Document

Document: create document from template

Public Class Methods

new(path = nil, zip_stream: nil, &block) click to toggle source

initialize

# File lib/odf_writer/document.rb, line 37
def initialize(path = nil, zip_stream: nil, &block)

  @template = ODFWriter::Template.new(path, :zip_stream => zip_stream)
  
  @fields           = {}
  @field_readers    = {}
  
  @texts            = {}
  @text_readers     = {}
  
  @bookmarks        = {}
  @bookmark_readers = {}
  
  @images           = {}
  @image_readers    = {}
  
  @tables           = {}
  @table_readers    = {}
  
  @sections         = {}
  @section_readers  = {}
  
  @styles           = {}
  @list_styles      = {}
  
  if block_given?
    instance_eval(&block)
  end
  
end

Public Instance Methods

add_bookmark(file, name, opts={}, &block) click to toggle source

add_bookmark

# File lib/odf_writer/document.rb, line 127
def add_bookmark(file, name, opts={}, &block)
  opts.merge!(:name => name)
  @bookmarks[file] ||= []; @bookmarks[file] << Bookmark.new(opts, &block)
end
add_bookmark_reader(file, name=nil) click to toggle source

add_bookmark_reader

# File lib/odf_writer/document.rb, line 137
def add_bookmark_reader(file, name=nil)
  @bookmark_readers[file] ||= []; @bookmark_readers[file] << BookmarkReader.new(:name => name)
end
add_field(file, name, opts={}, &block) click to toggle source

add_field

# File lib/odf_writer/document.rb, line 89
def add_field(file, name, opts={}, &block)
  opts.merge!(:name => name)
  @fields[file] ||= []; @fields[file] << Field.new(opts, &block)
end
add_field_reader(file, name=nil) click to toggle source

add_field_reader

# File lib/odf_writer/document.rb, line 99
def add_field_reader(file, name=nil)
  @field_readers[file] ||= []; @field_readers[file] << FieldReader.new(:name => name)
end
add_image(file, name, opts={}, &block) click to toggle source

add_image

# File lib/odf_writer/document.rb, line 146
def add_image(file, name, opts={}, &block)
  opts.merge!(:name => name)
  @images[file] ||= []; @images[file] << Image.new(opts, &block)
end
add_image_reader(file, name=nil) click to toggle source

add_image_reader

# File lib/odf_writer/document.rb, line 156
def add_image_reader(file, name=nil)
  @image_readers[file] ||= []; @image_readers[file] << ImageReader.new(:name => name)
end
add_list_style(root, *list_styles ) click to toggle source

add_list_style

# File lib/odf_writer/document.rb, line 216
def add_list_style(root, *list_styles )
  list_styles.each do |list_style|
    @list_styles[root] ||= []; @list_styles[root] << ListStyle.new( list_style )
  end
end
add_readers(files = ODFWriter::Template::CONTENT_FILES.keys) click to toggle source

add_readers

# File lib/odf_writer/document.rb, line 73
def add_readers(files = ODFWriter::Template::CONTENT_FILES.keys)
  files.each do |file|
    add_bookmark_reader(file)
    add_field_reader(file)
    add_text_reader(file)
    add_image_reader(file)
    add_section_reader(file)
    add_table_reader(file)
  end
end
add_section(file, name, collection, opts={}) { |section| ... } click to toggle source

add_section

# File lib/odf_writer/document.rb, line 186
def add_section(file, name, collection, opts={})
  opts.merge!(:name => name, :collection => collection)
  section = Section.new(opts)
  @sections[file] ||= []; @sections[file] << section
  yield(section)
end
add_section_reader(file, name=nil) click to toggle source

add_section_reader

# File lib/odf_writer/document.rb, line 198
def add_section_reader(file, name=nil)
  @section_readers[file] ||= []; @section_readers[file] << SectionReader.new(:name => name)
end
add_style(root, *styles ) click to toggle source

add_style

# File lib/odf_writer/document.rb, line 207
def add_style(root, *styles )
  @styles[root] ||= []; @styles[root] << Style.new( *styles )
end
add_table(file, name, collection, opts={}) { |table| ... } click to toggle source

add_table

# File lib/odf_writer/document.rb, line 165
def add_table(file, name, collection, opts={})
  opts.merge!(:name => name, :collection => collection)
  table = Table.new(opts)
  @tables[file] ||= []; @tables[file] << table
  yield(table)
end
add_table_reader(file, name=nil) click to toggle source

add_table_reader

# File lib/odf_writer/document.rb, line 177
def add_table_reader(file, name=nil)
  @table_readers[file] ||= []; @table_readers[file] << TableReader.new(:name => name)
end
add_text(file, name, opts={}, &block) click to toggle source

add_text

# File lib/odf_writer/document.rb, line 108
def add_text(file, name, opts={}, &block)
  opts.merge!(:name => name)
  @texts[file] ||= []; @texts[file] << Text.new(opts, &block)
end
add_text_reader(file, name=nil) click to toggle source

add_text_reader

# File lib/odf_writer/document.rb, line 118
def add_text_reader(file, name=nil)
  @text_readers[file] ||= []; @text_readers[file] << TextReader.new(:name => name)
end
leafs( file, doc) click to toggle source

leafs

# File lib/odf_writer/document.rb, line 241
    def leafs( file, doc)
      results={}
# requires Rails
#       results.deep_merge! @bookmark_readers[file].map { |r| r.paths(file, doc) }.inject{|m,n| m.deep_merge(n){|k, v1,v2| v1 + v2}} if @bookmark_readers[file]
#       results.deep_merge! @field_readers[file].map    { |r| r.paths(file, doc) }.inject{|m,n| m.deep_merge(n){|k, v1,v2| v1 + v2}} if @field_readers[file]
#       results.deep_merge! @text_readers[file].map     { |r| r.paths(file, doc) }.inject{|m,n| m.deep_merge(n){|k, v1,v2| v1 + v2}} if @text_readers[file]
#       results.deep_merge! @image_readers[file].map    { |r| r.paths(file, doc) }.inject{|m,n| m.deep_merge(n){|k, v1,v2| v1 + v2}} if @image_readers[file]

        results = deep_merge( results, @bookmark_readers[file].map { |r| r.paths(file, doc) }.inject{|m,n| deep_merge(m, n)} ) if @bookmark_readers[file]
        results = deep_merge( results, @field_readers[file].map    { |r| r.paths(file, doc) }.inject{|m,n| deep_merge(m, n)} ) if @field_readers[file]
        results = deep_merge( results, @text_readers[file].map     { |r| r.paths(file, doc) }.inject{|m,n| deep_merge(m, n)} ) if @text_readers[file]
        results = deep_merge( results, @image_readers[file].map    { |r| r.paths(file, doc) }.inject{|m,n| deep_merge(m, n)} ) if @image_readers[file]
      results
    end
populate(object, options={}) click to toggle source

populate

# File lib/odf_writer/document.rb, line 261
def populate(object, options={})

  file = options[:file] || :content
  coll = options[:coll] || []
  tree = options[:tree] || self.tree
  prok = options[:proc]
  list = options[:list]; list = Array(list).compact
  
  tree.each do |key, names|
    case key
    when :fields
      names.each do |name|
        add_field(file, name, :value => prok ? prok.call(object, name) : object.try(name.downcase.to_sym))
      end #def
    when :texts
      names.each do |name|
        add_text(file, name, :value => prok ? prok.call(object, name) : object.try(name.downcase.to_sym))
      end #def
    when :bookmarks
      names.each do |name|
        add_bookmark(file, name, :value => prok ? prok.call(object, name) : object.try(name.downcase.to_sym))
      end #def
    when :images
      names.each do |name|
        add_image(file, name, :value => (prok ? prok.call(object, name) : object.try(name.downcase.to_sym)))
      end #def
    when :tables
      names.each do |name, table_tree|
        if list.include?(name)
          add_table(file, name, coll, options){|table| table.populate(table_tree, options)}
        elsif object.respond_to?(name.underscore.to_sym)
          add_table(file, name, arrify(object.send(name.underscore.to_sym)), options){|table| table.populate(table_tree, options)}
        end
      end #def
    when :sections
      names.each do |name, section_tree|
        if list.include?(name)
          add_section(file, name, coll, options){|section| section.populate(section_tree, options)} if list.include?(name)
        elsif object.respond_to?(name.underscore.to_sym)
          add_section(file, name, arrify(object.send(name.underscore.to_sym)), options){|section| section.populate(section_tree, options)}
        end
      end #def
    when :files
      names.each do |file, file_tree|
        populate(object, options.merge(:file => file, :tree => file_tree))
      end
    end #case
  end #each
end
tree() click to toggle source

tree

# File lib/odf_writer/document.rb, line 227
def tree
  results = {}
  @template.content do |file, doc|
   #results.deep_merge!( leafs( file, doc)) # requires Rails
    results = deep_merge(results, leafs( file, doc))
  end
  results
end
write(dest = nil) click to toggle source

write

# File lib/odf_writer/document.rb, line 316
def write(dest = nil)

  @template.update_content do |template|
  
    template.update_files do |file, doc, manifest|
    
      @styles[file].to_a.each      { |s| s.add_style(doc) }
      @list_styles[file].to_a.each { |s| s.add_list_style(doc)  }
      
      @sections[file].to_a.each    { |s| s.replace!(doc, manifest, template)  }
      @tables[file].to_a.each      { |t| t.replace!(doc, manifest, template)  }
      
      @texts[file].to_a.each       { |t| t.replace!(doc)  }
      @fields[file].to_a.each      { |f| f.replace!(doc)  }
      
      @bookmarks[file].to_a.each   { |b| b.replace!(doc)  }
      @images[file].to_a.each      { |i| i.replace!(doc, manifest, template) }
      
      Image.unique_image_names( doc ) if @images.present?
    end
    
  end
  
  if dest
    ::File.open(dest, "wb") {|f| f.write(@template.data) }
  else
    @template.data
  end
  
end

Private Instance Methods

arrify(obj) click to toggle source
# File lib/odf_writer/document.rb, line 360
def arrify(obj)
  case obj
  when Array
    obj
  when Hash
    [obj]
  else
    obj.respond_to?(:to_a) ? obj.to_a : [obj]
  end
end
deep_merge(left, right) click to toggle source

deep_merge without using Rails

# File lib/odf_writer/document.rb, line 355
def deep_merge(left, right)
    merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : [:undefined, nil, :nil].include?(v2) ? v1 : v1 + v2 }
    left.merge(right, &merger)
end