lib/caracal/document.rb in caracal-1.0.2 vs lib/caracal/document.rb in caracal-1.0.3
- old
+ new
@@ -7,19 +7,21 @@
require 'caracal/core/list_styles'
require 'caracal/core/lists'
require 'caracal/core/page_breaks'
require 'caracal/core/page_numbers'
require 'caracal/core/page_settings'
+require 'caracal/core/custom_properties'
require 'caracal/core/relationships'
require 'caracal/core/rules'
require 'caracal/core/styles'
require 'caracal/core/tables'
require 'caracal/core/text'
require 'caracal/renderers/app_renderer'
require 'caracal/renderers/content_types_renderer'
require 'caracal/renderers/core_renderer'
+require 'caracal/renderers/custom_renderer'
require 'caracal/renderers/document_renderer'
require 'caracal/renderers/fonts_renderer'
require 'caracal/renderers/footer_renderer'
require 'caracal/renderers/numbering_renderer'
require 'caracal/renderers/package_relationships_renderer'
@@ -28,217 +30,226 @@
require 'caracal/renderers/styles_renderer'
module Caracal
class Document
-
+
#-------------------------------------------------------------
# Configuration
#-------------------------------------------------------------
-
+
# mixins (order is important)
include Caracal::Core::FileName
-
+ include Caracal::Core::CustomProperties
+
include Caracal::Core::Relationships
include Caracal::Core::Fonts
include Caracal::Core::PageSettings
include Caracal::Core::PageNumbers
include Caracal::Core::Styles
include Caracal::Core::ListStyles
-
+
include Caracal::Core::Images
include Caracal::Core::Lists
include Caracal::Core::PageBreaks
include Caracal::Core::Rules
include Caracal::Core::Tables
include Caracal::Core::Text
-
-
+
+
#-------------------------------------------------------------
# Public Class Methods
#-------------------------------------------------------------
-
+
#============ OUTPUT ====================================
-
+
# This method renders a new Word document and returns it as a
# a string.
#
def self.render(f_name = nil, &block)
docx = new(f_name, &block)
buffer = docx.render
-
+
buffer.rewind
buffer.sysread
end
-
+
# This method renders a new Word document and saves it to the
# file system.
#
def self.save(f_name = nil, &block)
docx = new(f_name, &block)
buffer = docx.render
-
+
File.open("./#{ docx.name }", 'w') { |f| f.write(buffer.string) }
end
-
-
-
+
+
+
#-------------------------------------------------------------
# Public Instance Methods
#-------------------------------------------------------------
-
+
# This method instantiates a new word document.
#
def initialize(name = nil, &block)
file_name(name)
-
- page_size
+
+ page_size
page_margins top: 1440, bottom: 1440, left: 1440, right: 1440
page_numbers
-
+
[:relationship, :font, :style, :list_style].each do |method|
collection = self.class.send("default_#{ method }s")
collection.each do |item|
send(method, item)
end
end
-
+
if block_given?
(block.arity < 1) ? instance_eval(&block) : block[self]
end
end
-
-
+
+
#============ GETTERS ===================================
-
- # This method returns an array of models which constitute the
+
+ # This method returns an array of models which constitute the
# set of instructions for producing the document content.
#
def contents
@contents ||= []
end
-
-
+
+
#============ RENDERING =================================
-
- # This method renders the word document instance into
+
+ # This method renders the word document instance into
# a string buffer. Order is important!
#
def render
buffer = ::Zip::OutputStream.write_buffer do |zip|
render_package_relationships(zip)
render_content_types(zip)
render_app(zip)
render_core(zip)
+ render_custom(zip)
render_fonts(zip)
render_footer(zip)
render_settings(zip)
render_styles(zip)
render_document(zip)
render_relationships(zip) # Must go here: Depends on document renderer
render_media(zip) # Must go here: Depends on document renderer
render_numbering(zip) # Must go here: Depends on document renderer
end
end
-
-
-
+
+
+
#-------------------------------------------------------------
# Private Instance Methods
#-------------------------------------------------------------
private
-
+
#============ RENDERERS =====================================
-
+
def render_app(zip)
content = ::Caracal::Renderers::AppRenderer.render(self)
-
+
zip.put_next_entry('docProps/app.xml')
zip.write(content)
end
-
+
def render_content_types(zip)
content = ::Caracal::Renderers::ContentTypesRenderer.render(self)
-
+
zip.put_next_entry('[Content_Types].xml')
zip.write(content)
end
-
+
def render_core(zip)
content = ::Caracal::Renderers::CoreRenderer.render(self)
-
+
zip.put_next_entry('docProps/core.xml')
zip.write(content)
end
-
+
+ def render_custom(zip)
+ content = ::Caracal::Renderers::CustomRenderer.render(self)
+
+ zip.put_next_entry('docProps/custom.xml')
+ zip.write(content)
+ end
+
def render_document(zip)
content = ::Caracal::Renderers::DocumentRenderer.render(self)
-
+
zip.put_next_entry('word/document.xml')
zip.write(content)
end
-
+
def render_fonts(zip)
content = ::Caracal::Renderers::FontsRenderer.render(self)
-
+
zip.put_next_entry('word/fontTable.xml')
zip.write(content)
end
-
+
def render_footer(zip)
content = ::Caracal::Renderers::FooterRenderer.render(self)
-
+
zip.put_next_entry('word/footer1.xml')
zip.write(content)
end
-
+
def render_media(zip)
images = relationships.select { |r| r.relationship_type == :image }
images.each do |rel|
if rel.relationship_data.to_s.size > 0
content = rel.relationship_data
else
content = open(rel.relationship_target).read
end
-
+
zip.put_next_entry("word/#{ rel.formatted_target }")
zip.write(content)
end
end
-
+
def render_numbering(zip)
content = ::Caracal::Renderers::NumberingRenderer.render(self)
-
+
zip.put_next_entry('word/numbering.xml')
zip.write(content)
end
-
+
def render_package_relationships(zip)
content = ::Caracal::Renderers::PackageRelationshipsRenderer.render(self)
-
+
zip.put_next_entry('_rels/.rels')
zip.write(content)
end
-
+
def render_relationships(zip)
content = ::Caracal::Renderers::RelationshipsRenderer.render(self)
-
+
zip.put_next_entry('word/_rels/document.xml.rels')
zip.write(content)
end
-
+
def render_settings(zip)
content = ::Caracal::Renderers::SettingsRenderer.render(self)
-
+
zip.put_next_entry('word/settings.xml')
zip.write(content)
end
-
+
def render_styles(zip)
content = ::Caracal::Renderers::StylesRenderer.render(self)
-
+
zip.put_next_entry('word/styles.xml')
zip.write(content)
end
-
+
end
end