ruby_docx_beta 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +41 -0
- data/Rakefile +1 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/files/equation.docx +0 -0
- data/files/equation/[Content_Types].xml +1 -0
- data/files/equation/_rels/.rels +1 -0
- data/files/equation/docProps/app.xml +1 -0
- data/files/equation/docProps/core.xml +1 -0
- data/files/equation/word/_rels/document.xml.rels +1 -0
- data/files/equation/word/document.xml +6424 -0
- data/files/equation/word/fontTable.xml +1 -0
- data/files/equation/word/footer1.xml +1 -0
- data/files/equation/word/header1.xml +1 -0
- data/files/equation/word/media/image1.png +0 -0
- data/files/equation/word/media/image10.png +0 -0
- data/files/equation/word/media/image11.png +0 -0
- data/files/equation/word/media/image12.png +0 -0
- data/files/equation/word/media/image13.png +0 -0
- data/files/equation/word/media/image14.png +0 -0
- data/files/equation/word/media/image15.png +0 -0
- data/files/equation/word/media/image16.png +0 -0
- data/files/equation/word/media/image17.png +0 -0
- data/files/equation/word/media/image18.png +0 -0
- data/files/equation/word/media/image19.png +0 -0
- data/files/equation/word/media/image2.png +0 -0
- data/files/equation/word/media/image20.png +0 -0
- data/files/equation/word/media/image21.png +0 -0
- data/files/equation/word/media/image22.png +0 -0
- data/files/equation/word/media/image23.png +0 -0
- data/files/equation/word/media/image24.png +0 -0
- data/files/equation/word/media/image25.png +0 -0
- data/files/equation/word/media/image26.png +0 -0
- data/files/equation/word/media/image27.png +0 -0
- data/files/equation/word/media/image28.png +0 -0
- data/files/equation/word/media/image29.png +0 -0
- data/files/equation/word/media/image3.png +0 -0
- data/files/equation/word/media/image30.png +0 -0
- data/files/equation/word/media/image31.png +0 -0
- data/files/equation/word/media/image32.png +0 -0
- data/files/equation/word/media/image33.png +0 -0
- data/files/equation/word/media/image34.png +0 -0
- data/files/equation/word/media/image35.png +0 -0
- data/files/equation/word/media/image36.png +0 -0
- data/files/equation/word/media/image37.png +0 -0
- data/files/equation/word/media/image38.png +0 -0
- data/files/equation/word/media/image39.png +0 -0
- data/files/equation/word/media/image4.png +0 -0
- data/files/equation/word/media/image40.png +0 -0
- data/files/equation/word/media/image41.png +0 -0
- data/files/equation/word/media/image42.png +0 -0
- data/files/equation/word/media/image43.png +0 -0
- data/files/equation/word/media/image44.png +0 -0
- data/files/equation/word/media/image45.png +0 -0
- data/files/equation/word/media/image46.png +0 -0
- data/files/equation/word/media/image47.png +0 -0
- data/files/equation/word/media/image48.png +0 -0
- data/files/equation/word/media/image49.png +0 -0
- data/files/equation/word/media/image5.png +0 -0
- data/files/equation/word/media/image50.png +0 -0
- data/files/equation/word/media/image51.png +0 -0
- data/files/equation/word/media/image52.png +0 -0
- data/files/equation/word/media/image53.png +0 -0
- data/files/equation/word/media/image54.png +0 -0
- data/files/equation/word/media/image55.png +0 -0
- data/files/equation/word/media/image56.png +0 -0
- data/files/equation/word/media/image57.png +0 -0
- data/files/equation/word/media/image58.png +0 -0
- data/files/equation/word/media/image59.png +0 -0
- data/files/equation/word/media/image6.png +0 -0
- data/files/equation/word/media/image60.png +0 -0
- data/files/equation/word/media/image61.png +0 -0
- data/files/equation/word/media/image62.png +0 -0
- data/files/equation/word/media/image63.png +0 -0
- data/files/equation/word/media/image7.png +0 -0
- data/files/equation/word/media/image8.png +0 -0
- data/files/equation/word/media/image9.png +0 -0
- data/files/equation/word/numbering.xml +1 -0
- data/files/equation/word/settings.xml +1 -0
- data/files/equation/word/styles.xml +1 -0
- data/files/equation/word/theme/theme1.xml +1 -0
- data/files/table/[Content_Types].xml +2 -0
- data/files/table/_rels/.rels +2 -0
- data/files/table/docProps/app.xml +2 -0
- data/files/table/docProps/core.xml +2 -0
- data/files/table/word/_rels/document.xml.rels +2 -0
- data/files/table/word/document.xml +1145 -0
- data/files/table/word/fontTable.xml +2 -0
- data/files/table/word/settings.xml +2 -0
- data/files/table/word/styles.xml +2 -0
- data/files/table/word/theme/theme1.xml +2 -0
- data/files/table/word/webSettings.xml +2 -0
- data/files/test.docx +0 -0
- data/files/test/[Content_Types].xml +2 -0
- data/files/test/_rels/.rels +2 -0
- data/files/test/docProps/app.xml +2 -0
- data/files/test/docProps/core.xml +2 -0
- data/files/test/docProps/custom.xml +2 -0
- data/files/test/word/_rels/document.xml.rels +2 -0
- data/files/test/word/_rels/settings.xml.rels +2 -0
- data/files/test/word/document.xml +5592 -0
- data/files/test/word/embeddings/oleObject1.bin +0 -0
- data/files/test/word/embeddings/oleObject10.bin +0 -0
- data/files/test/word/embeddings/oleObject11.bin +0 -0
- data/files/test/word/embeddings/oleObject12.bin +0 -0
- data/files/test/word/embeddings/oleObject13.bin +0 -0
- data/files/test/word/embeddings/oleObject14.bin +0 -0
- data/files/test/word/embeddings/oleObject15.bin +0 -0
- data/files/test/word/embeddings/oleObject16.bin +0 -0
- data/files/test/word/embeddings/oleObject17.bin +0 -0
- data/files/test/word/embeddings/oleObject18.bin +0 -0
- data/files/test/word/embeddings/oleObject19.bin +0 -0
- data/files/test/word/embeddings/oleObject2.bin +0 -0
- data/files/test/word/embeddings/oleObject20.bin +0 -0
- data/files/test/word/embeddings/oleObject21.bin +0 -0
- data/files/test/word/embeddings/oleObject22.bin +0 -0
- data/files/test/word/embeddings/oleObject23.bin +0 -0
- data/files/test/word/embeddings/oleObject24.bin +0 -0
- data/files/test/word/embeddings/oleObject25.bin +0 -0
- data/files/test/word/embeddings/oleObject26.bin +0 -0
- data/files/test/word/embeddings/oleObject27.bin +0 -0
- data/files/test/word/embeddings/oleObject28.bin +0 -0
- data/files/test/word/embeddings/oleObject29.bin +0 -0
- data/files/test/word/embeddings/oleObject3.bin +0 -0
- data/files/test/word/embeddings/oleObject30.bin +0 -0
- data/files/test/word/embeddings/oleObject31.bin +0 -0
- data/files/test/word/embeddings/oleObject32.bin +0 -0
- data/files/test/word/embeddings/oleObject33.bin +0 -0
- data/files/test/word/embeddings/oleObject34.bin +0 -0
- data/files/test/word/embeddings/oleObject35.bin +0 -0
- data/files/test/word/embeddings/oleObject36.bin +0 -0
- data/files/test/word/embeddings/oleObject37.bin +0 -0
- data/files/test/word/embeddings/oleObject38.bin +0 -0
- data/files/test/word/embeddings/oleObject39.bin +0 -0
- data/files/test/word/embeddings/oleObject4.bin +0 -0
- data/files/test/word/embeddings/oleObject40.bin +0 -0
- data/files/test/word/embeddings/oleObject41.bin +0 -0
- data/files/test/word/embeddings/oleObject42.bin +0 -0
- data/files/test/word/embeddings/oleObject43.bin +0 -0
- data/files/test/word/embeddings/oleObject44.bin +0 -0
- data/files/test/word/embeddings/oleObject45.bin +0 -0
- data/files/test/word/embeddings/oleObject46.bin +0 -0
- data/files/test/word/embeddings/oleObject47.bin +0 -0
- data/files/test/word/embeddings/oleObject48.bin +0 -0
- data/files/test/word/embeddings/oleObject49.bin +0 -0
- data/files/test/word/embeddings/oleObject5.bin +0 -0
- data/files/test/word/embeddings/oleObject50.bin +0 -0
- data/files/test/word/embeddings/oleObject51.bin +0 -0
- data/files/test/word/embeddings/oleObject52.bin +0 -0
- data/files/test/word/embeddings/oleObject53.bin +0 -0
- data/files/test/word/embeddings/oleObject54.bin +0 -0
- data/files/test/word/embeddings/oleObject55.bin +0 -0
- data/files/test/word/embeddings/oleObject56.bin +0 -0
- data/files/test/word/embeddings/oleObject57.bin +0 -0
- data/files/test/word/embeddings/oleObject58.bin +0 -0
- data/files/test/word/embeddings/oleObject59.bin +0 -0
- data/files/test/word/embeddings/oleObject6.bin +0 -0
- data/files/test/word/embeddings/oleObject60.bin +0 -0
- data/files/test/word/embeddings/oleObject61.bin +0 -0
- data/files/test/word/embeddings/oleObject62.bin +0 -0
- data/files/test/word/embeddings/oleObject7.bin +0 -0
- data/files/test/word/embeddings/oleObject8.bin +0 -0
- data/files/test/word/embeddings/oleObject9.bin +0 -0
- data/files/test/word/endnotes.xml +2 -0
- data/files/test/word/fontTable.xml +2 -0
- data/files/test/word/footer1.xml +2 -0
- data/files/test/word/footnotes.xml +2 -0
- data/files/test/word/glossary/_rels/document.xml.rels +2 -0
- data/files/test/word/glossary/document.xml +2 -0
- data/files/test/word/glossary/fontTable.xml +2 -0
- data/files/test/word/glossary/settings.xml +2 -0
- data/files/test/word/glossary/styles.xml +2 -0
- data/files/test/word/glossary/webSettings.xml +2 -0
- data/files/test/word/header1.xml +2 -0
- data/files/test/word/header2.xml +2 -0
- data/files/test/word/media/image1.wmf +0 -0
- data/files/test/word/media/image10.wmf +0 -0
- data/files/test/word/media/image11.wmf +0 -0
- data/files/test/word/media/image12.wmf +0 -0
- data/files/test/word/media/image13.wmf +0 -0
- data/files/test/word/media/image14.wmf +0 -0
- data/files/test/word/media/image15.wmf +0 -0
- data/files/test/word/media/image16.wmf +0 -0
- data/files/test/word/media/image17.wmf +0 -0
- data/files/test/word/media/image18.wmf +0 -0
- data/files/test/word/media/image19.wmf +0 -0
- data/files/test/word/media/image2.wmf +0 -0
- data/files/test/word/media/image20.wmf +0 -0
- data/files/test/word/media/image21.wmf +0 -0
- data/files/test/word/media/image22.wmf +0 -0
- data/files/test/word/media/image23.wmf +0 -0
- data/files/test/word/media/image24.wmf +0 -0
- data/files/test/word/media/image25.wmf +0 -0
- data/files/test/word/media/image26.wmf +0 -0
- data/files/test/word/media/image27.wmf +0 -0
- data/files/test/word/media/image28.wmf +0 -0
- data/files/test/word/media/image29.wmf +0 -0
- data/files/test/word/media/image3.wmf +0 -0
- data/files/test/word/media/image30.wmf +0 -0
- data/files/test/word/media/image31.wmf +0 -0
- data/files/test/word/media/image32.wmf +0 -0
- data/files/test/word/media/image33.wmf +0 -0
- data/files/test/word/media/image34.wmf +0 -0
- data/files/test/word/media/image35.wmf +0 -0
- data/files/test/word/media/image36.wmf +0 -0
- data/files/test/word/media/image37.wmf +0 -0
- data/files/test/word/media/image38.wmf +0 -0
- data/files/test/word/media/image39.wmf +0 -0
- data/files/test/word/media/image4.wmf +0 -0
- data/files/test/word/media/image40.wmf +0 -0
- data/files/test/word/media/image41.wmf +0 -0
- data/files/test/word/media/image42.wmf +0 -0
- data/files/test/word/media/image43.wmf +0 -0
- data/files/test/word/media/image44.wmf +0 -0
- data/files/test/word/media/image45.wmf +0 -0
- data/files/test/word/media/image46.wmf +0 -0
- data/files/test/word/media/image47.wmf +0 -0
- data/files/test/word/media/image48.wmf +0 -0
- data/files/test/word/media/image49.wmf +0 -0
- data/files/test/word/media/image5.wmf +0 -0
- data/files/test/word/media/image50.wmf +0 -0
- data/files/test/word/media/image51.wmf +0 -0
- data/files/test/word/media/image52.wmf +0 -0
- data/files/test/word/media/image53.wmf +0 -0
- data/files/test/word/media/image54.wmf +0 -0
- data/files/test/word/media/image55.wmf +0 -0
- data/files/test/word/media/image56.wmf +0 -0
- data/files/test/word/media/image6.wmf +0 -0
- data/files/test/word/media/image7.wmf +0 -0
- data/files/test/word/media/image8.wmf +0 -0
- data/files/test/word/media/image9.wmf +0 -0
- data/files/test/word/numbering.xml +2 -0
- data/files/test/word/settings.xml +2 -0
- data/files/test/word/styles.xml +2 -0
- data/files/test/word/theme/theme1.xml +2 -0
- data/files/test/word/webSettings.xml +2 -0
- data/files/test_image.docx +0 -0
- data/files/test_table.docx +0 -0
- data/lib/ruby_docx.rb +10 -0
- data/lib/ruby_docx/document.rb +109 -0
- data/lib/ruby_docx/elements.rb +54 -0
- data/lib/ruby_docx/elements/bookmark.rb +42 -0
- data/lib/ruby_docx/elements/break_line.rb +13 -0
- data/lib/ruby_docx/elements/drawing.rb +76 -0
- data/lib/ruby_docx/elements/element.rb +53 -0
- data/lib/ruby_docx/elements/equation.rb +51 -0
- data/lib/ruby_docx/elements/image.rb +76 -0
- data/lib/ruby_docx/elements/link.rb +51 -0
- data/lib/ruby_docx/elements/ole_object.rb +89 -0
- data/lib/ruby_docx/elements/paragraph.rb +17 -0
- data/lib/ruby_docx/elements/style.rb +101 -0
- data/lib/ruby_docx/elements/table.rb +51 -0
- data/lib/ruby_docx/elements/table_cell.rb +26 -0
- data/lib/ruby_docx/elements/table_column.rb +24 -0
- data/lib/ruby_docx/elements/table_row.rb +41 -0
- data/lib/ruby_docx/elements/table_style.rb +101 -0
- data/lib/ruby_docx/elements/text.rb +31 -0
- data/lib/ruby_docx/elements/text_run.rb +15 -0
- data/lib/ruby_docx/html.rb +55 -0
- data/lib/ruby_docx/htmls.rb +32 -0
- data/lib/ruby_docx/htmls/html_break_line.rb +9 -0
- data/lib/ruby_docx/htmls/html_element.rb +7 -0
- data/lib/ruby_docx/htmls/html_equation.rb +6 -0
- data/lib/ruby_docx/htmls/html_image.rb +6 -0
- data/lib/ruby_docx/htmls/html_link.rb +6 -0
- data/lib/ruby_docx/htmls/html_paragraph.rb +9 -0
- data/lib/ruby_docx/htmls/html_table.rb +6 -0
- data/lib/ruby_docx/htmls/html_table_cell.rb +6 -0
- data/lib/ruby_docx/htmls/html_table_header.rb +6 -0
- data/lib/ruby_docx/htmls/html_table_row.rb +6 -0
- data/lib/ruby_docx/htmls/html_text.rb +9 -0
- data/lib/ruby_docx/relation.rb +18 -0
- data/lib/ruby_docx/version.rb +3 -0
- data/ruby_docx.gemspec +41 -0
- data/template.docx +0 -0
- data/template/[Content_Types].xml +2 -0
- data/template/_rels/.rels +2 -0
- data/template/docProps/app.xml +2 -0
- data/template/docProps/core.xml +2 -0
- data/template/word/_rels/document.xml.rels +2 -0
- data/template/word/document.xml +2 -0
- data/template/word/fontTable.xml +2 -0
- data/template/word/settings.xml +2 -0
- data/template/word/styles.xml +2 -0
- data/template/word/theme/theme1.xml +2 -0
- data/template/word/webSettings.xml +2 -0
- metadata +475 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
module RubyDocx::Elements
|
2
|
+
class Paragraph < Element
|
3
|
+
|
4
|
+
def to_s
|
5
|
+
"#{self.elements.map(&:to_s).join}"
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_html
|
9
|
+
if self.elements.size <= 0
|
10
|
+
"<p> </p>"
|
11
|
+
else
|
12
|
+
"<p>#{self.elements.map(&:to_html).join}</p>"
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module RubyDocx::Elements
|
2
|
+
class Style < Element
|
3
|
+
# attr_reader :font_name, :font_size, :color, :text_align, :fonts
|
4
|
+
|
5
|
+
def to_s
|
6
|
+
arry = []
|
7
|
+
if font_size
|
8
|
+
arry << "font-size: #{font_size}pt"
|
9
|
+
end
|
10
|
+
|
11
|
+
if fonts
|
12
|
+
arry << "font-family: #{fonts.join(",")}"
|
13
|
+
end
|
14
|
+
|
15
|
+
if color
|
16
|
+
arry << "color: #{color}"
|
17
|
+
end
|
18
|
+
|
19
|
+
arry.join(";")
|
20
|
+
end
|
21
|
+
|
22
|
+
def bold?
|
23
|
+
false
|
24
|
+
end
|
25
|
+
|
26
|
+
def align
|
27
|
+
ele = @node.xpath(".//w:jc").last
|
28
|
+
|
29
|
+
if ele
|
30
|
+
v = ele.attributes["val"].value.to_s
|
31
|
+
if v == "start"
|
32
|
+
"left"
|
33
|
+
elsif v == "end"
|
34
|
+
"right"
|
35
|
+
elsif v == "center"
|
36
|
+
"center"
|
37
|
+
end
|
38
|
+
else
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def font_size
|
44
|
+
ele = @node.xpath(".//w:sz").last
|
45
|
+
|
46
|
+
if ele
|
47
|
+
v = ele.attributes["val"].value
|
48
|
+
v.to_i/2
|
49
|
+
else
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
def color
|
56
|
+
ele = @node.xpath(".//w:color").last
|
57
|
+
|
58
|
+
if ele
|
59
|
+
v = ele.attributes["val"].value
|
60
|
+
if v.to_s == "auto"
|
61
|
+
nil
|
62
|
+
else
|
63
|
+
v
|
64
|
+
end
|
65
|
+
else
|
66
|
+
nil
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def font_name
|
71
|
+
ele = @node.xpath(".//w:rFonts").last
|
72
|
+
|
73
|
+
if ele
|
74
|
+
ascii = ele.attributes["ascii"]
|
75
|
+
cs = ele.attributes["cs"]
|
76
|
+
hAnsi = ele.attributes["hAnsi"]
|
77
|
+
|
78
|
+
ascii.value
|
79
|
+
else
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
def fonts
|
86
|
+
ele = @node.xpath(".//w:rFonts").last
|
87
|
+
|
88
|
+
if ele
|
89
|
+
ascii = ele.attributes["ascii"]
|
90
|
+
cs = ele.attributes["cs"]
|
91
|
+
hAnsi = ele.attributes["hAnsi"]
|
92
|
+
|
93
|
+
[ascii.value, cs.value, hAnsi.value].uniq
|
94
|
+
else
|
95
|
+
nil
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module RubyDocx::Elements
|
2
|
+
class Table < Element
|
3
|
+
|
4
|
+
def to_s
|
5
|
+
s = "\n"
|
6
|
+
self.trs.map do |tr|
|
7
|
+
tr.cells.map do |cell|
|
8
|
+
s += "#{cell.to_s}\t"
|
9
|
+
end
|
10
|
+
|
11
|
+
s += "\n"
|
12
|
+
end
|
13
|
+
|
14
|
+
s += "\n"
|
15
|
+
|
16
|
+
s
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_html
|
20
|
+
s = "<table>"
|
21
|
+
|
22
|
+
self.trs.each_with_index do |tr, i|
|
23
|
+
if self.grid
|
24
|
+
w = self.grid.width_of(i).to_i
|
25
|
+
end
|
26
|
+
|
27
|
+
s += "<tr>"
|
28
|
+
|
29
|
+
tr.cells.map do |cell|
|
30
|
+
if w.to_i > 0
|
31
|
+
s += "<td style='width: #{(w/100.0).round(2)}%'>#{cell.to_html}</td>"
|
32
|
+
else
|
33
|
+
s += "<td>#{cell.to_html}</td>"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
s += "</tr>"
|
38
|
+
end
|
39
|
+
|
40
|
+
s += "</table>"
|
41
|
+
|
42
|
+
s
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def trs
|
47
|
+
self.elements
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module RubyDocx::Elements
|
2
|
+
class TableCell < Element
|
3
|
+
|
4
|
+
def to_s
|
5
|
+
self.elements.map(&:to_s).join
|
6
|
+
end
|
7
|
+
|
8
|
+
def inner_html
|
9
|
+
"#{self.elements.map(&:to_html).join}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_html
|
13
|
+
w = 0
|
14
|
+
if self.style
|
15
|
+
w = self.style.width.to_i
|
16
|
+
end
|
17
|
+
|
18
|
+
if w > 0
|
19
|
+
"<td style='width: #{(w/100.0).round(2)}%'>#{self.elements.map(&:to_html).join}</td>"
|
20
|
+
else
|
21
|
+
"<td>#{self.elements.map(&:to_html).join}</td>"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module RubyDocx::Elements
|
2
|
+
class TableColumn < Element
|
3
|
+
|
4
|
+
def col_num
|
5
|
+
self.node.children.size
|
6
|
+
end
|
7
|
+
|
8
|
+
def widths
|
9
|
+
a = []
|
10
|
+
self.node.xpath(".//w:gridCol").map do |elem|
|
11
|
+
w = elem.attributes["w"].value.to_i
|
12
|
+
|
13
|
+
a << w
|
14
|
+
end
|
15
|
+
|
16
|
+
a
|
17
|
+
end
|
18
|
+
|
19
|
+
def width_of(num)
|
20
|
+
self.widths[num].to_i
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module RubyDocx::Elements
|
2
|
+
class TableRow < Element
|
3
|
+
|
4
|
+
def cells
|
5
|
+
self.elements
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_s
|
9
|
+
s = ""
|
10
|
+
|
11
|
+
self.cells.map do |cell|
|
12
|
+
s += "#{cell.to_s}\t"
|
13
|
+
end
|
14
|
+
|
15
|
+
s += "\n"
|
16
|
+
|
17
|
+
s
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_html
|
21
|
+
w = 0
|
22
|
+
if self.style
|
23
|
+
w = self.style.width.to_i
|
24
|
+
end
|
25
|
+
|
26
|
+
s = "<tr>"
|
27
|
+
self.cells.map do |cell|
|
28
|
+
if w.to_i > 0
|
29
|
+
s += "<td style='width: #{(w/100.0).round(2)}%'>#{cell.inner_html}</td>"
|
30
|
+
else
|
31
|
+
s += "<td>#{cell.inner_html}</td>"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
s += "</tr>"
|
36
|
+
|
37
|
+
s
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module RubyDocx::Elements
|
2
|
+
class TableStyle < Element
|
3
|
+
# attr_reader :font_name, :font_size, :color, :text_align, :fonts
|
4
|
+
|
5
|
+
def to_s
|
6
|
+
arry = []
|
7
|
+
if font_size
|
8
|
+
arry << "font-size: #{font_size}pt"
|
9
|
+
end
|
10
|
+
|
11
|
+
if fonts
|
12
|
+
arry << "font-family: #{fonts.join(",")}"
|
13
|
+
end
|
14
|
+
|
15
|
+
if color
|
16
|
+
arry << "color: #{color}"
|
17
|
+
end
|
18
|
+
|
19
|
+
arry.join(";")
|
20
|
+
end
|
21
|
+
|
22
|
+
def align
|
23
|
+
ele = @node.xpath(".//w:jc").last
|
24
|
+
|
25
|
+
if ele
|
26
|
+
v = ele.attributes["val"].value.to_s
|
27
|
+
if v == "start"
|
28
|
+
"left"
|
29
|
+
elsif v == "end"
|
30
|
+
"right"
|
31
|
+
elsif v == "center"
|
32
|
+
"center"
|
33
|
+
end
|
34
|
+
else
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def bold?
|
40
|
+
false
|
41
|
+
end
|
42
|
+
|
43
|
+
def font_size
|
44
|
+
ele = @node.xpath(".//w:sz").last
|
45
|
+
|
46
|
+
if ele
|
47
|
+
v = ele.attributes["val"].value
|
48
|
+
v.to_i/2
|
49
|
+
else
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
def color
|
56
|
+
ele = @node.xpath(".//w:color").last
|
57
|
+
|
58
|
+
if ele
|
59
|
+
v = ele.attributes["val"].value
|
60
|
+
if v.to_s == "auto"
|
61
|
+
nil
|
62
|
+
else
|
63
|
+
v
|
64
|
+
end
|
65
|
+
else
|
66
|
+
nil
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def font_name
|
71
|
+
ele = @node.xpath(".//w:rFonts").last
|
72
|
+
|
73
|
+
if ele
|
74
|
+
ascii = ele.attributes["ascii"]
|
75
|
+
cs = ele.attributes["cs"]
|
76
|
+
hAnsi = ele.attributes["hAnsi"]
|
77
|
+
|
78
|
+
ascii.value
|
79
|
+
else
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
def fonts
|
86
|
+
ele = @node.xpath(".//w:rFonts").last
|
87
|
+
|
88
|
+
if ele
|
89
|
+
ascii = ele.attributes["ascii"]
|
90
|
+
cs = ele.attributes["cs"]
|
91
|
+
hAnsi = ele.attributes["hAnsi"]
|
92
|
+
|
93
|
+
[ascii.value, cs.value, hAnsi.value].uniq
|
94
|
+
else
|
95
|
+
nil
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RubyDocx::Elements
|
2
|
+
class Text < Element
|
3
|
+
attr_reader :font_name, :font_size, :color
|
4
|
+
attr_accessor :content
|
5
|
+
|
6
|
+
def element
|
7
|
+
@element ||= @node.children.first
|
8
|
+
end
|
9
|
+
|
10
|
+
def content
|
11
|
+
@content ||= self.element.to_s
|
12
|
+
end
|
13
|
+
|
14
|
+
def content=(txt)
|
15
|
+
@content = txt
|
16
|
+
|
17
|
+
self.element.content = txt
|
18
|
+
|
19
|
+
@content
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
self.content.to_s
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_html
|
27
|
+
"#{self.content.gsub(/ /, " ")}"
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module RubyDocx::Elements
|
2
|
+
class TextRun < Element
|
3
|
+
attr_reader :font_name, :font_size, :color
|
4
|
+
attr_accessor :content
|
5
|
+
|
6
|
+
def to_s
|
7
|
+
self.elements.map(&:to_s).join(" ")
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_html
|
11
|
+
"<span>#{self.elements.map(&:to_html).join}</span>"
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'zip'
|
3
|
+
|
4
|
+
require "ruby_docx/elements"
|
5
|
+
require "ruby_docx/relation"
|
6
|
+
|
7
|
+
module RubyDocx
|
8
|
+
|
9
|
+
class Html
|
10
|
+
# attr_reader :xml, :doc, :zip, :styles, :styles_xml, :rels
|
11
|
+
attr_reader :doc, :html_str, :zip, :xml_doc, :xml
|
12
|
+
|
13
|
+
def self.open_path(path)
|
14
|
+
self.new(File.read(path))
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.parse(html_str)
|
18
|
+
self.new(html_str)
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(html_str)
|
22
|
+
@html_str = html_str
|
23
|
+
@doc = Nokogiri::HTML(@html_str)
|
24
|
+
|
25
|
+
@zip = Zip::File.open("template.docx")
|
26
|
+
|
27
|
+
@xml = @zip.read('word/document.xml')
|
28
|
+
@xml_doc = Nokogiri::XML(@xml)
|
29
|
+
|
30
|
+
# @path = path
|
31
|
+
# @zip = Zip::File.open(path)
|
32
|
+
|
33
|
+
# rels_xml = @zip.read('word/_rels/document.xml.rels')
|
34
|
+
# @rels = Nokogiri::XML(rels_xml)
|
35
|
+
# @rels.remove_namespaces!
|
36
|
+
# @doc = Nokogiri::XML(@xml)
|
37
|
+
# @styles_xml = @zip.read('word/styles.xml')
|
38
|
+
# @styles = Nokogiri::XML(@styles_xml)
|
39
|
+
end
|
40
|
+
|
41
|
+
def save(path)
|
42
|
+
Zip::OutputStream.open(path) do |out|
|
43
|
+
@zip.each do |entry|
|
44
|
+
out.put_next_entry(entry.name)
|
45
|
+
|
46
|
+
unless entry.name =~ /\/$/
|
47
|
+
out.write(@zip.read(entry.name))
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|