Class: Goldendocx::Parts::Documents

Inherits:
Object
  • Object
show all
Includes:
HasAssociations
Defined in:
lib/goldendocx/parts/documents.rb

Constant Summary collapse

XML_PATH =
'word/'
RELATIONSHIPS_XML_PATH =
'word/_rels/document.xml.rels'

Constants included from HasAssociations

HasAssociations::Options

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from HasAssociations

#read_associations, #read_relationships, #relationships, #write_relationships

Constructor Details

#initializeDocuments

Returns a new instance of Documents.



33
34
35
36
37
38
39
40
41
42
# File 'lib/goldendocx/parts/documents.rb', line 33

def initialize
  associations.each do |association, options|
    association_class = options.class_name.constantize
    instance_variable_set("@#{association}", association_class.new)
    add_relationship association_class::TYPE, association_class::XML_PATH.gsub(XML_PATH, '') unless options.isolate
  end

  @medias = []
  @media_amount = 0
end

Instance Attribute Details

#chartsObject (readonly)

document.xml



12
13
14
# File 'lib/goldendocx/parts/documents.rb', line 12

def charts
  @charts
end

#documentObject (readonly)

document.xml



12
13
14
# File 'lib/goldendocx/parts/documents.rb', line 12

def document
  @document
end

#media_amountObject

Entries amount in directory media/ for generating relationship id



16
17
18
# File 'lib/goldendocx/parts/documents.rb', line 16

def media_amount
  @media_amount
end

#mediasObject (readonly)

document.xml



12
13
14
# File 'lib/goldendocx/parts/documents.rb', line 12

def medias
  @medias
end

Class Method Details

.read_from(docx_file) ⇒ Object



24
25
26
27
28
29
30
# File 'lib/goldendocx/parts/documents.rb', line 24

def read_from(docx_file)
  parts = Goldendocx::Parts::Documents.new
  parts.read_relationships(docx_file)
  parts.read_associations(docx_file)
  parts.media_amount = docx_file.entries.count { |entry| entry.name.start_with?('word/media/') }
  parts
end

Instance Method Details

#add_image_media(image_data, _options = {}) ⇒ Object



88
89
90
91
92
93
94
95
96
# File 'lib/goldendocx/parts/documents.rb', line 88

def add_image_media(image_data, _options = {})
  extension = 'png'
  # Add to media
  @media_amount += 1
  image_name = "image#{media_amount}.#{extension}"
  Goldendocx::Parts::Media.new(image_name, image_data).tap do |media|
    medias << media
  end
end

#add_style(fragment) ⇒ Object



111
112
113
# File 'lib/goldendocx/parts/documents.rb', line 111

def add_style(fragment)
  styles.add_style(fragment)
end

#create_chart(chart_type, width, height) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/goldendocx/parts/documents.rb', line 98

def create_chart(chart_type, width, height)
  document.body.ensure_chart_type(chart_type)

  chart_id = document.body.charts.size + 1

  relationship_id = add_relationship(
    Goldendocx::Charts::RELATIONSHIP_TYPE,
    format(Goldendocx::Charts::RELATIONSHIP_NAME_PATTERN, id: chart_id)
  )

  document.body.create_chart(chart_type, chart_id, relationship_id, width:, height:)
end

#create_embed_image(image_data, options = {}) ⇒ Object



81
82
83
84
85
86
# File 'lib/goldendocx/parts/documents.rb', line 81

def create_embed_image(image_data, options = {})
  image_media = add_image_media(image_data, options)
  relationship_id = add_relationship(image_media.type, image_media.target)

  document.body.create_embed_image(relationship_id, options)
end

#create_image(image_data, options = {}) ⇒ Object



74
75
76
77
78
79
# File 'lib/goldendocx/parts/documents.rb', line 74

def create_image(image_data, options = {})
  image_media = add_image_media(image_data, options)
  relationship_id = add_relationship(image_media.type, image_media.target)

  document.body.create_image(relationship_id, options)
end

#create_table(options = {}) ⇒ Object



65
66
67
68
69
70
71
72
# File 'lib/goldendocx/parts/documents.rb', line 65

def create_table(options = {})
  table = document.body.create_table(options)

  style = styles.find_table_style(options[:style])
  table.style = style.id if style

  table
end

#create_text(text, options = {}) ⇒ Object



56
57
58
59
60
61
62
63
# File 'lib/goldendocx/parts/documents.rb', line 56

def create_text(text, options = {})
  paragraph = document.body.create_text(text, options)

  style = styles.find_text_style(options[:style])
  paragraph.style = style.id if style

  paragraph
end

#write_stream(zos) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
# File 'lib/goldendocx/parts/documents.rb', line 44

def write_stream(zos)
  write_relationships(zos)

  associations.each_key do |association|
    send(association).write_to(zos)
  end

  document.write_to(zos)
  medias.each { |media| media.write_to(zos) }
  document.body.charts.each { |chart| chart.write_to(zos) }
end