docxify 0.0.7 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +20 -20
- data/lib/docxify/document.rb +19 -9
- data/lib/docxify/element/page_break.rb +0 -1
- data/lib/docxify/element/page_layout.rb +34 -0
- data/lib/docxify/version.rb +1 -1
- data/lib/docxify.rb +1 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c43501f65a265d3e8ce49ae0c5081d425c838465e31392b8e17c66c5d32214f9
|
4
|
+
data.tar.gz: efff6888d11c6ba8d9984150c0589d57e960b0e04fdc3daa79a2a458517b0fdd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8dae5642665518f3c8be12d9a3d16a54ab626e3601b0b1073583f5c6f67cc80e31215e045f9ce593e520db7e35349d55363fee1f4713be4bb8eb7a704081780
|
7
|
+
data.tar.gz: 2d6aca43dba5dbe008f58e83a7bac426d6edb43aac83ba9812dc3eb1ab9bbe9218d128f88d6dfbd78fafaef38f8be32b1a97a47ba1519d13f4c86b81417c62c7
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -41,26 +41,26 @@ gem install docxify
|
|
41
41
|
|
42
42
|
@docx.add_page_break
|
43
43
|
|
44
|
-
@docx.
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
44
|
+
@docx.page_layout width: DocXify::A4_PORTRAIT_HEIGHT, height: DocXify::A4_PORTRAIT_WIDTH, orientation: :landscape
|
45
|
+
|
46
|
+
rows = []
|
47
|
+
rows << [
|
48
|
+
DocXify::Element::TableCell.new("<b>Header 1</b>"),
|
49
|
+
DocXify::Element::TableCell.new("<b>Header 2</b>")
|
50
|
+
DocXify::Element::TableCell.new("<b>Header 3</b>")
|
51
|
+
DocXify::Element::TableCell.new("<b>Header 4</b>", width_cm: 10)
|
52
|
+
]
|
53
|
+
rows << [
|
54
|
+
DocXify::Element::TableCell.new("Content 1", valign: :center, align: :left, nowrap: true, colspan: 3),
|
55
|
+
DocXify::Element::TableCell.new("Rowspan <b>here</b>", rowspan: true) # merges until a "nil" cell
|
56
|
+
]
|
57
|
+
rows << [
|
58
|
+
DocXify::Element::TableCell.new("Secondary 1")
|
59
|
+
DocXify::Element::TableCell.new("Secondary 2")
|
60
|
+
DocXify::Element::TableCell.new("Secondary 3")
|
61
|
+
DocXify::Element::TableCell.new(nil) # Word requires that there's an empty cell merged with the previous rowspan
|
62
|
+
]
|
63
|
+
container.add_table rows
|
64
64
|
|
65
65
|
docx_binary_data = @docx.render
|
66
66
|
# or
|
data/lib/docxify/document.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module DocXify
|
2
2
|
class Document
|
3
|
-
attr_accessor :font, :size, :color, :background
|
3
|
+
attr_accessor :font, :size, :color, :background, :margins, :page_layout
|
4
4
|
attr_reader :content, :relationships, :width
|
5
5
|
|
6
6
|
def initialize(options = {})
|
@@ -8,11 +8,12 @@ module DocXify
|
|
8
8
|
@relationships = []
|
9
9
|
@width = options[:width] || A4_PORTRAIT_WIDTH
|
10
10
|
@height = options[:height] || A4_PORTRAIT_HEIGHT
|
11
|
+
@orientation = options[:orientation] || :portrait
|
11
12
|
@font = options[:font] || "Times New Roman"
|
12
13
|
@size = options[:size] || 12
|
13
14
|
@color = options[:color] || 12
|
14
15
|
@background = options[:background] if options[:background]
|
15
|
-
@margins = { top: 2, bottom: 2, left: 2, right: 2 }
|
16
|
+
@margins = { top: 2, bottom: 2, left: 2, right: 2 }.merge(options[:margins] || {})
|
16
17
|
end
|
17
18
|
|
18
19
|
def default_styling(options = {})
|
@@ -41,17 +42,21 @@ module DocXify
|
|
41
42
|
<w:body>
|
42
43
|
XML
|
43
44
|
|
45
|
+
# See the note in DocXify::Element::PageLayout for why it's not just handled the same as any other element
|
46
|
+
@page_layout = DocXify::Element::PageLayout.new(width: @width, height: @height, orientation: @orientatation, document: self)
|
47
|
+
|
44
48
|
@content.each do |element|
|
45
|
-
|
49
|
+
if element.is_a?(DocXify::Element::PageLayout)
|
50
|
+
xml << @page_layout.to_s
|
51
|
+
@page_layout = element
|
52
|
+
else
|
53
|
+
xml << element.to_s(container)
|
54
|
+
end
|
46
55
|
end
|
47
56
|
|
57
|
+
xml << @page_layout.to_s
|
58
|
+
|
48
59
|
xml << <<~XML
|
49
|
-
<w:sectPr >
|
50
|
-
<w:pgSz w:h="#{@height}" w:w="#{@width}"/>
|
51
|
-
<w:pgMar w:bottom="#{DocXify.cm2dxa @margins[:bottom]}" w:footer="708" w:gutter="0" w:header="708" w:left="#{DocXify.cm2dxa @margins[:left]}" w:right="#{DocXify.cm2dxa @margins[:right]}" w:top="#{DocXify.cm2dxa @margins[:top]}"/>
|
52
|
-
<w:cols w:space="708"/>
|
53
|
-
<w:docGrid w:linePitch="360"/>
|
54
|
-
</w:sectPr>
|
55
60
|
</w:body>
|
56
61
|
</w:document>
|
57
62
|
XML
|
@@ -82,6 +87,11 @@ module DocXify
|
|
82
87
|
add DocXify::Element::PageBreak.new
|
83
88
|
end
|
84
89
|
|
90
|
+
def add_page_layout(options = {})
|
91
|
+
options[:document] = self
|
92
|
+
add DocXify::Element::PageLayout.new(options)
|
93
|
+
end
|
94
|
+
|
85
95
|
def add_divider
|
86
96
|
add DocXify::Element::Divider.new
|
87
97
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Word PageLayouts are a weird concept; instead of a wrapping element or a
|
2
|
+
# "this applies to content from here on down", it's applied retrospectively
|
3
|
+
# to the content that came before it.
|
4
|
+
module DocXify
|
5
|
+
module Element
|
6
|
+
class PageLayout < Base
|
7
|
+
attr_accessor :width, :height, :orientation
|
8
|
+
|
9
|
+
def initialize(options = {})
|
10
|
+
super()
|
11
|
+
@document = options[:document]
|
12
|
+
@margins = @document.margins
|
13
|
+
@width = options[:width] || @document&.width || DocXify::A4_PORTRAIT_WIDTH
|
14
|
+
@height = options[:height] || @document&.height || DocXify::A4_PORTRAIT_HEIGHT
|
15
|
+
@orientation = options[:orientation] || :portrait
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s(_container = nil)
|
19
|
+
<<~XML
|
20
|
+
<w:p>
|
21
|
+
<w:pPr>
|
22
|
+
<w:sectPr>
|
23
|
+
<w:pgSz w:w="#{@width}" w:h="#{@height}" w:orient="#{@orientation}"/>
|
24
|
+
<w:pgMar w:bottom="#{DocXify.cm2dxa @margins[:bottom]}" w:footer="708" w:gutter="0" w:header="708" w:left="#{DocXify.cm2dxa @margins[:left]}" w:right="#{DocXify.cm2dxa @margins[:right]}" w:top="#{DocXify.cm2dxa @margins[:top]}"/>
|
25
|
+
<w:cols w:space="708"/>
|
26
|
+
<w:docGrid w:linePitch="360"/>
|
27
|
+
</w:sectPr>
|
28
|
+
</w:pPr>
|
29
|
+
</w:p>
|
30
|
+
XML
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/docxify/version.rb
CHANGED
data/lib/docxify.rb
CHANGED
@@ -8,6 +8,7 @@ require_relative "docxify/element/divider"
|
|
8
8
|
require_relative "docxify/element/file"
|
9
9
|
require_relative "docxify/element/image"
|
10
10
|
require_relative "docxify/element/page_break"
|
11
|
+
require_relative "docxify/element/page_layout"
|
11
12
|
require_relative "docxify/element/paragraph"
|
12
13
|
require_relative "docxify/element/table"
|
13
14
|
require_relative "docxify/element/table_cell"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docxify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Jeffries
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -46,6 +46,7 @@ files:
|
|
46
46
|
- lib/docxify/element/file.rb
|
47
47
|
- lib/docxify/element/image.rb
|
48
48
|
- lib/docxify/element/page_break.rb
|
49
|
+
- lib/docxify/element/page_layout.rb
|
49
50
|
- lib/docxify/element/paragraph.rb
|
50
51
|
- lib/docxify/element/table.rb
|
51
52
|
- lib/docxify/element/table_cell.rb
|
@@ -74,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
75
|
- !ruby/object:Gem::Version
|
75
76
|
version: '0'
|
76
77
|
requirements: []
|
77
|
-
rubygems_version: 3.5.
|
78
|
+
rubygems_version: 3.5.17
|
78
79
|
signing_key:
|
79
80
|
specification_version: 4
|
80
81
|
summary: DocXify is a gem to help you generate Word documents from Ruby.
|