ruby_docx_beta 0.1.0

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.
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