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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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