ruby_docx_beta 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (292) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/CODE_OF_CONDUCT.md +13 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +41 -0
  7. data/Rakefile +1 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +7 -0
  10. data/files/equation.docx +0 -0
  11. data/files/equation/[Content_Types].xml +1 -0
  12. data/files/equation/_rels/.rels +1 -0
  13. data/files/equation/docProps/app.xml +1 -0
  14. data/files/equation/docProps/core.xml +1 -0
  15. data/files/equation/word/_rels/document.xml.rels +1 -0
  16. data/files/equation/word/document.xml +6424 -0
  17. data/files/equation/word/fontTable.xml +1 -0
  18. data/files/equation/word/footer1.xml +1 -0
  19. data/files/equation/word/header1.xml +1 -0
  20. data/files/equation/word/media/image1.png +0 -0
  21. data/files/equation/word/media/image10.png +0 -0
  22. data/files/equation/word/media/image11.png +0 -0
  23. data/files/equation/word/media/image12.png +0 -0
  24. data/files/equation/word/media/image13.png +0 -0
  25. data/files/equation/word/media/image14.png +0 -0
  26. data/files/equation/word/media/image15.png +0 -0
  27. data/files/equation/word/media/image16.png +0 -0
  28. data/files/equation/word/media/image17.png +0 -0
  29. data/files/equation/word/media/image18.png +0 -0
  30. data/files/equation/word/media/image19.png +0 -0
  31. data/files/equation/word/media/image2.png +0 -0
  32. data/files/equation/word/media/image20.png +0 -0
  33. data/files/equation/word/media/image21.png +0 -0
  34. data/files/equation/word/media/image22.png +0 -0
  35. data/files/equation/word/media/image23.png +0 -0
  36. data/files/equation/word/media/image24.png +0 -0
  37. data/files/equation/word/media/image25.png +0 -0
  38. data/files/equation/word/media/image26.png +0 -0
  39. data/files/equation/word/media/image27.png +0 -0
  40. data/files/equation/word/media/image28.png +0 -0
  41. data/files/equation/word/media/image29.png +0 -0
  42. data/files/equation/word/media/image3.png +0 -0
  43. data/files/equation/word/media/image30.png +0 -0
  44. data/files/equation/word/media/image31.png +0 -0
  45. data/files/equation/word/media/image32.png +0 -0
  46. data/files/equation/word/media/image33.png +0 -0
  47. data/files/equation/word/media/image34.png +0 -0
  48. data/files/equation/word/media/image35.png +0 -0
  49. data/files/equation/word/media/image36.png +0 -0
  50. data/files/equation/word/media/image37.png +0 -0
  51. data/files/equation/word/media/image38.png +0 -0
  52. data/files/equation/word/media/image39.png +0 -0
  53. data/files/equation/word/media/image4.png +0 -0
  54. data/files/equation/word/media/image40.png +0 -0
  55. data/files/equation/word/media/image41.png +0 -0
  56. data/files/equation/word/media/image42.png +0 -0
  57. data/files/equation/word/media/image43.png +0 -0
  58. data/files/equation/word/media/image44.png +0 -0
  59. data/files/equation/word/media/image45.png +0 -0
  60. data/files/equation/word/media/image46.png +0 -0
  61. data/files/equation/word/media/image47.png +0 -0
  62. data/files/equation/word/media/image48.png +0 -0
  63. data/files/equation/word/media/image49.png +0 -0
  64. data/files/equation/word/media/image5.png +0 -0
  65. data/files/equation/word/media/image50.png +0 -0
  66. data/files/equation/word/media/image51.png +0 -0
  67. data/files/equation/word/media/image52.png +0 -0
  68. data/files/equation/word/media/image53.png +0 -0
  69. data/files/equation/word/media/image54.png +0 -0
  70. data/files/equation/word/media/image55.png +0 -0
  71. data/files/equation/word/media/image56.png +0 -0
  72. data/files/equation/word/media/image57.png +0 -0
  73. data/files/equation/word/media/image58.png +0 -0
  74. data/files/equation/word/media/image59.png +0 -0
  75. data/files/equation/word/media/image6.png +0 -0
  76. data/files/equation/word/media/image60.png +0 -0
  77. data/files/equation/word/media/image61.png +0 -0
  78. data/files/equation/word/media/image62.png +0 -0
  79. data/files/equation/word/media/image63.png +0 -0
  80. data/files/equation/word/media/image7.png +0 -0
  81. data/files/equation/word/media/image8.png +0 -0
  82. data/files/equation/word/media/image9.png +0 -0
  83. data/files/equation/word/numbering.xml +1 -0
  84. data/files/equation/word/settings.xml +1 -0
  85. data/files/equation/word/styles.xml +1 -0
  86. data/files/equation/word/theme/theme1.xml +1 -0
  87. data/files/table/[Content_Types].xml +2 -0
  88. data/files/table/_rels/.rels +2 -0
  89. data/files/table/docProps/app.xml +2 -0
  90. data/files/table/docProps/core.xml +2 -0
  91. data/files/table/word/_rels/document.xml.rels +2 -0
  92. data/files/table/word/document.xml +1145 -0
  93. data/files/table/word/fontTable.xml +2 -0
  94. data/files/table/word/settings.xml +2 -0
  95. data/files/table/word/styles.xml +2 -0
  96. data/files/table/word/theme/theme1.xml +2 -0
  97. data/files/table/word/webSettings.xml +2 -0
  98. data/files/test.docx +0 -0
  99. data/files/test/[Content_Types].xml +2 -0
  100. data/files/test/_rels/.rels +2 -0
  101. data/files/test/docProps/app.xml +2 -0
  102. data/files/test/docProps/core.xml +2 -0
  103. data/files/test/docProps/custom.xml +2 -0
  104. data/files/test/word/_rels/document.xml.rels +2 -0
  105. data/files/test/word/_rels/settings.xml.rels +2 -0
  106. data/files/test/word/document.xml +5592 -0
  107. data/files/test/word/embeddings/oleObject1.bin +0 -0
  108. data/files/test/word/embeddings/oleObject10.bin +0 -0
  109. data/files/test/word/embeddings/oleObject11.bin +0 -0
  110. data/files/test/word/embeddings/oleObject12.bin +0 -0
  111. data/files/test/word/embeddings/oleObject13.bin +0 -0
  112. data/files/test/word/embeddings/oleObject14.bin +0 -0
  113. data/files/test/word/embeddings/oleObject15.bin +0 -0
  114. data/files/test/word/embeddings/oleObject16.bin +0 -0
  115. data/files/test/word/embeddings/oleObject17.bin +0 -0
  116. data/files/test/word/embeddings/oleObject18.bin +0 -0
  117. data/files/test/word/embeddings/oleObject19.bin +0 -0
  118. data/files/test/word/embeddings/oleObject2.bin +0 -0
  119. data/files/test/word/embeddings/oleObject20.bin +0 -0
  120. data/files/test/word/embeddings/oleObject21.bin +0 -0
  121. data/files/test/word/embeddings/oleObject22.bin +0 -0
  122. data/files/test/word/embeddings/oleObject23.bin +0 -0
  123. data/files/test/word/embeddings/oleObject24.bin +0 -0
  124. data/files/test/word/embeddings/oleObject25.bin +0 -0
  125. data/files/test/word/embeddings/oleObject26.bin +0 -0
  126. data/files/test/word/embeddings/oleObject27.bin +0 -0
  127. data/files/test/word/embeddings/oleObject28.bin +0 -0
  128. data/files/test/word/embeddings/oleObject29.bin +0 -0
  129. data/files/test/word/embeddings/oleObject3.bin +0 -0
  130. data/files/test/word/embeddings/oleObject30.bin +0 -0
  131. data/files/test/word/embeddings/oleObject31.bin +0 -0
  132. data/files/test/word/embeddings/oleObject32.bin +0 -0
  133. data/files/test/word/embeddings/oleObject33.bin +0 -0
  134. data/files/test/word/embeddings/oleObject34.bin +0 -0
  135. data/files/test/word/embeddings/oleObject35.bin +0 -0
  136. data/files/test/word/embeddings/oleObject36.bin +0 -0
  137. data/files/test/word/embeddings/oleObject37.bin +0 -0
  138. data/files/test/word/embeddings/oleObject38.bin +0 -0
  139. data/files/test/word/embeddings/oleObject39.bin +0 -0
  140. data/files/test/word/embeddings/oleObject4.bin +0 -0
  141. data/files/test/word/embeddings/oleObject40.bin +0 -0
  142. data/files/test/word/embeddings/oleObject41.bin +0 -0
  143. data/files/test/word/embeddings/oleObject42.bin +0 -0
  144. data/files/test/word/embeddings/oleObject43.bin +0 -0
  145. data/files/test/word/embeddings/oleObject44.bin +0 -0
  146. data/files/test/word/embeddings/oleObject45.bin +0 -0
  147. data/files/test/word/embeddings/oleObject46.bin +0 -0
  148. data/files/test/word/embeddings/oleObject47.bin +0 -0
  149. data/files/test/word/embeddings/oleObject48.bin +0 -0
  150. data/files/test/word/embeddings/oleObject49.bin +0 -0
  151. data/files/test/word/embeddings/oleObject5.bin +0 -0
  152. data/files/test/word/embeddings/oleObject50.bin +0 -0
  153. data/files/test/word/embeddings/oleObject51.bin +0 -0
  154. data/files/test/word/embeddings/oleObject52.bin +0 -0
  155. data/files/test/word/embeddings/oleObject53.bin +0 -0
  156. data/files/test/word/embeddings/oleObject54.bin +0 -0
  157. data/files/test/word/embeddings/oleObject55.bin +0 -0
  158. data/files/test/word/embeddings/oleObject56.bin +0 -0
  159. data/files/test/word/embeddings/oleObject57.bin +0 -0
  160. data/files/test/word/embeddings/oleObject58.bin +0 -0
  161. data/files/test/word/embeddings/oleObject59.bin +0 -0
  162. data/files/test/word/embeddings/oleObject6.bin +0 -0
  163. data/files/test/word/embeddings/oleObject60.bin +0 -0
  164. data/files/test/word/embeddings/oleObject61.bin +0 -0
  165. data/files/test/word/embeddings/oleObject62.bin +0 -0
  166. data/files/test/word/embeddings/oleObject7.bin +0 -0
  167. data/files/test/word/embeddings/oleObject8.bin +0 -0
  168. data/files/test/word/embeddings/oleObject9.bin +0 -0
  169. data/files/test/word/endnotes.xml +2 -0
  170. data/files/test/word/fontTable.xml +2 -0
  171. data/files/test/word/footer1.xml +2 -0
  172. data/files/test/word/footnotes.xml +2 -0
  173. data/files/test/word/glossary/_rels/document.xml.rels +2 -0
  174. data/files/test/word/glossary/document.xml +2 -0
  175. data/files/test/word/glossary/fontTable.xml +2 -0
  176. data/files/test/word/glossary/settings.xml +2 -0
  177. data/files/test/word/glossary/styles.xml +2 -0
  178. data/files/test/word/glossary/webSettings.xml +2 -0
  179. data/files/test/word/header1.xml +2 -0
  180. data/files/test/word/header2.xml +2 -0
  181. data/files/test/word/media/image1.wmf +0 -0
  182. data/files/test/word/media/image10.wmf +0 -0
  183. data/files/test/word/media/image11.wmf +0 -0
  184. data/files/test/word/media/image12.wmf +0 -0
  185. data/files/test/word/media/image13.wmf +0 -0
  186. data/files/test/word/media/image14.wmf +0 -0
  187. data/files/test/word/media/image15.wmf +0 -0
  188. data/files/test/word/media/image16.wmf +0 -0
  189. data/files/test/word/media/image17.wmf +0 -0
  190. data/files/test/word/media/image18.wmf +0 -0
  191. data/files/test/word/media/image19.wmf +0 -0
  192. data/files/test/word/media/image2.wmf +0 -0
  193. data/files/test/word/media/image20.wmf +0 -0
  194. data/files/test/word/media/image21.wmf +0 -0
  195. data/files/test/word/media/image22.wmf +0 -0
  196. data/files/test/word/media/image23.wmf +0 -0
  197. data/files/test/word/media/image24.wmf +0 -0
  198. data/files/test/word/media/image25.wmf +0 -0
  199. data/files/test/word/media/image26.wmf +0 -0
  200. data/files/test/word/media/image27.wmf +0 -0
  201. data/files/test/word/media/image28.wmf +0 -0
  202. data/files/test/word/media/image29.wmf +0 -0
  203. data/files/test/word/media/image3.wmf +0 -0
  204. data/files/test/word/media/image30.wmf +0 -0
  205. data/files/test/word/media/image31.wmf +0 -0
  206. data/files/test/word/media/image32.wmf +0 -0
  207. data/files/test/word/media/image33.wmf +0 -0
  208. data/files/test/word/media/image34.wmf +0 -0
  209. data/files/test/word/media/image35.wmf +0 -0
  210. data/files/test/word/media/image36.wmf +0 -0
  211. data/files/test/word/media/image37.wmf +0 -0
  212. data/files/test/word/media/image38.wmf +0 -0
  213. data/files/test/word/media/image39.wmf +0 -0
  214. data/files/test/word/media/image4.wmf +0 -0
  215. data/files/test/word/media/image40.wmf +0 -0
  216. data/files/test/word/media/image41.wmf +0 -0
  217. data/files/test/word/media/image42.wmf +0 -0
  218. data/files/test/word/media/image43.wmf +0 -0
  219. data/files/test/word/media/image44.wmf +0 -0
  220. data/files/test/word/media/image45.wmf +0 -0
  221. data/files/test/word/media/image46.wmf +0 -0
  222. data/files/test/word/media/image47.wmf +0 -0
  223. data/files/test/word/media/image48.wmf +0 -0
  224. data/files/test/word/media/image49.wmf +0 -0
  225. data/files/test/word/media/image5.wmf +0 -0
  226. data/files/test/word/media/image50.wmf +0 -0
  227. data/files/test/word/media/image51.wmf +0 -0
  228. data/files/test/word/media/image52.wmf +0 -0
  229. data/files/test/word/media/image53.wmf +0 -0
  230. data/files/test/word/media/image54.wmf +0 -0
  231. data/files/test/word/media/image55.wmf +0 -0
  232. data/files/test/word/media/image56.wmf +0 -0
  233. data/files/test/word/media/image6.wmf +0 -0
  234. data/files/test/word/media/image7.wmf +0 -0
  235. data/files/test/word/media/image8.wmf +0 -0
  236. data/files/test/word/media/image9.wmf +0 -0
  237. data/files/test/word/numbering.xml +2 -0
  238. data/files/test/word/settings.xml +2 -0
  239. data/files/test/word/styles.xml +2 -0
  240. data/files/test/word/theme/theme1.xml +2 -0
  241. data/files/test/word/webSettings.xml +2 -0
  242. data/files/test_image.docx +0 -0
  243. data/files/test_table.docx +0 -0
  244. data/lib/ruby_docx.rb +10 -0
  245. data/lib/ruby_docx/document.rb +109 -0
  246. data/lib/ruby_docx/elements.rb +54 -0
  247. data/lib/ruby_docx/elements/bookmark.rb +42 -0
  248. data/lib/ruby_docx/elements/break_line.rb +13 -0
  249. data/lib/ruby_docx/elements/drawing.rb +76 -0
  250. data/lib/ruby_docx/elements/element.rb +53 -0
  251. data/lib/ruby_docx/elements/equation.rb +51 -0
  252. data/lib/ruby_docx/elements/image.rb +76 -0
  253. data/lib/ruby_docx/elements/link.rb +51 -0
  254. data/lib/ruby_docx/elements/ole_object.rb +89 -0
  255. data/lib/ruby_docx/elements/paragraph.rb +17 -0
  256. data/lib/ruby_docx/elements/style.rb +101 -0
  257. data/lib/ruby_docx/elements/table.rb +51 -0
  258. data/lib/ruby_docx/elements/table_cell.rb +26 -0
  259. data/lib/ruby_docx/elements/table_column.rb +24 -0
  260. data/lib/ruby_docx/elements/table_row.rb +41 -0
  261. data/lib/ruby_docx/elements/table_style.rb +101 -0
  262. data/lib/ruby_docx/elements/text.rb +31 -0
  263. data/lib/ruby_docx/elements/text_run.rb +15 -0
  264. data/lib/ruby_docx/html.rb +55 -0
  265. data/lib/ruby_docx/htmls.rb +32 -0
  266. data/lib/ruby_docx/htmls/html_break_line.rb +9 -0
  267. data/lib/ruby_docx/htmls/html_element.rb +7 -0
  268. data/lib/ruby_docx/htmls/html_equation.rb +6 -0
  269. data/lib/ruby_docx/htmls/html_image.rb +6 -0
  270. data/lib/ruby_docx/htmls/html_link.rb +6 -0
  271. data/lib/ruby_docx/htmls/html_paragraph.rb +9 -0
  272. data/lib/ruby_docx/htmls/html_table.rb +6 -0
  273. data/lib/ruby_docx/htmls/html_table_cell.rb +6 -0
  274. data/lib/ruby_docx/htmls/html_table_header.rb +6 -0
  275. data/lib/ruby_docx/htmls/html_table_row.rb +6 -0
  276. data/lib/ruby_docx/htmls/html_text.rb +9 -0
  277. data/lib/ruby_docx/relation.rb +18 -0
  278. data/lib/ruby_docx/version.rb +3 -0
  279. data/ruby_docx.gemspec +41 -0
  280. data/template.docx +0 -0
  281. data/template/[Content_Types].xml +2 -0
  282. data/template/_rels/.rels +2 -0
  283. data/template/docProps/app.xml +2 -0
  284. data/template/docProps/core.xml +2 -0
  285. data/template/word/_rels/document.xml.rels +2 -0
  286. data/template/word/document.xml +2 -0
  287. data/template/word/fontTable.xml +2 -0
  288. data/template/word/settings.xml +2 -0
  289. data/template/word/styles.xml +2 -0
  290. data/template/word/theme/theme1.xml +2 -0
  291. data/template/word/webSettings.xml +2 -0
  292. 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>&nbsp;</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(/ /, "&nbsp;")}"
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