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,54 @@
1
+ require "ruby_docx/elements/element"
2
+ require "ruby_docx/elements/equation"
3
+ require "ruby_docx/elements/image"
4
+ require "ruby_docx/elements/drawing"
5
+ require "ruby_docx/elements/ole_object"
6
+ require "ruby_docx/elements/style"
7
+ require "ruby_docx/elements/table_style"
8
+ require "ruby_docx/elements/table_row"
9
+ require "ruby_docx/elements/table_column"
10
+ require "ruby_docx/elements/table_cell"
11
+ require "ruby_docx/elements/table"
12
+
13
+ require "ruby_docx/elements/text"
14
+ require "ruby_docx/elements/text_run"
15
+ require "ruby_docx/elements/link"
16
+ require "ruby_docx/elements/bookmark"
17
+ require "ruby_docx/elements/paragraph"
18
+ require "ruby_docx/elements/break_line"
19
+
20
+ module RubyDocx::Elements
21
+
22
+ class Parser
23
+ ELEMENTS_ALIAS = {
24
+ "pPr" => RubyDocx::Elements::Style,
25
+ "rPr" => RubyDocx::Elements::Style,
26
+ "tblPr" => RubyDocx::Elements::TableStyle,
27
+ "tcPr" => RubyDocx::Elements::TableStyle,
28
+ "pict" => RubyDocx::Elements::Image,
29
+ "drawing" => RubyDocx::Elements::Drawing,
30
+ "p" => RubyDocx::Elements::Paragraph,
31
+ "r" => RubyDocx::Elements::TextRun,
32
+ "t" => RubyDocx::Elements::Text,
33
+ "hyperlink" => RubyDocx::Elements::Link,
34
+ "bookmarkStart" => RubyDocx::Elements::Bookmark,
35
+ "tbl" => RubyDocx::Elements::Table,
36
+ "tr" => RubyDocx::Elements::TableRow,
37
+ "tc" => RubyDocx::Elements::TableCell,
38
+ "tblGrid" => RubyDocx::Elements::TableColumn,
39
+ "object" => RubyDocx::Elements::OleObject,
40
+ # "bookmarkEnd" => RubyDocx::Elements::Link,
41
+ "br" => RubyDocx::Elements::BreakLine,
42
+ "oMathPara" => RubyDocx::Elements::Equation,
43
+ }
44
+
45
+ def self.parse_by_name(doc, c_node)
46
+ if ELEMENTS_ALIAS.keys.index(c_node.name.to_s)
47
+ ELEMENTS_ALIAS[c_node.name.to_s].new(doc, c_node)
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
54
+ end
@@ -0,0 +1,42 @@
1
+ module RubyDocx::Elements
2
+ class Bookmark < Element
3
+ attr_reader :anchor
4
+
5
+ def element
6
+ @element ||= @node.children.first
7
+ end
8
+
9
+ def anchor
10
+ return @anchor if @anchor
11
+ return "" if @node.attributes["name"].to_s.size <= 0
12
+
13
+ name = @node.attributes["name"].value.to_s
14
+
15
+ if name == "_GoBack"
16
+ nil
17
+ else
18
+ @anchor = name
19
+ end
20
+ end
21
+
22
+ def anchor=(an)
23
+ @anchor = an
24
+ end
25
+
26
+ def replace(an)
27
+ self.anchor = an
28
+ end
29
+
30
+ def to_html
31
+ if self.anchor
32
+ "<span name=\"#{self.anchor}\"></span>"
33
+ else
34
+ ""
35
+ end
36
+ end
37
+
38
+ def to_s
39
+ ""
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,13 @@
1
+ module RubyDocx::Elements
2
+ class BreakLine < Element
3
+
4
+ def to_html
5
+ "<br>"
6
+ end
7
+
8
+ def to_s
9
+ "\n"
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,76 @@
1
+ require 'mimemagic'
2
+ require "base64"
3
+
4
+ module RubyDocx::Elements
5
+ class Drawing < Element
6
+ attr_accessor :path, :zip, :link
7
+ attr_reader :width, :height
8
+
9
+ def data
10
+ if self.path
11
+ @zip.read("word/#{@path}")
12
+ else
13
+
14
+ end
15
+
16
+ end
17
+
18
+ def relation_id
19
+ element = @node.xpath(".//pic:blipFill/a:blip", "a" => "http://schemas.openxmlformats.org/drawingml/2006/main", "pic" => "http://schemas.openxmlformats.org/drawingml/2006/picture").first
20
+ if element && element.attributes.keys.index("embed")
21
+ element.attributes["embed"].value
22
+ else
23
+ nil
24
+ end
25
+ end
26
+
27
+ def replace(lnk)
28
+ @link = lnk
29
+ end
30
+
31
+ def style
32
+ element = @node.xpath(".//v:shape").first
33
+
34
+ if element && element.attributes.keys.index("style")
35
+ element.attributes["style"].value
36
+ else
37
+ nil
38
+ end
39
+ end
40
+
41
+ def title
42
+ element = @node.xpath(".//v:imagedata").first
43
+ if element && element.attributes.keys.index("title")
44
+ element.attributes["title"].value
45
+ else
46
+ nil
47
+ end
48
+ end
49
+
50
+ def mime
51
+ MimeMagic.by_magic(self.data).type
52
+ end
53
+
54
+ def base64_data
55
+ "data:#{self.mime};base64,#{Base64.strict_encode64(self.data)}"
56
+ end
57
+
58
+ def to_html
59
+ if @link.to_s.size > 0
60
+ "<img src='#{@link}' alt=\"#{self.title}\" style=\"#{self.style}\" />"
61
+ else
62
+ "<img src='#{self.base64_data}' alt=\"#{self.title}\" style=\"#{self.style}\" />"
63
+ end
64
+
65
+ end
66
+
67
+ def save(path)
68
+ if @zip && @path
69
+ file = File.new(path, "wb")
70
+ file.write(self.data)
71
+ file.close
72
+ end
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,53 @@
1
+
2
+ module RubyDocx::Elements
3
+ class Element
4
+
5
+ attr_reader :node, :doc, :style, :grid
6
+
7
+
8
+ def initialize(doc, node)
9
+ @node = node
10
+ @doc = doc
11
+
12
+ if self.node.name.to_s == "pict"
13
+ @doc.setup_image(self)
14
+ elsif self.node.name.to_s == "drawing"
15
+ @doc.setup_drawing(self)
16
+ elsif self.node.name.to_s == "object"
17
+ @doc.setup_object(self)
18
+ end
19
+
20
+ self.parse_elements
21
+ end
22
+
23
+ def to_s
24
+ @node.to_s
25
+ end
26
+
27
+ def to_xml
28
+ @node.to_s
29
+ end
30
+
31
+ def elements
32
+ @elements ||= @node.children.map do |c_node|
33
+ v = RubyDocx::Elements::Parser.parse_by_name(@doc, c_node)
34
+
35
+ if ["pPr", "rPr", "tblPr", "tcPr"].index(c_node.name.to_s)
36
+ @style = v
37
+ nil
38
+ elsif ["tblGrid"].index(c_node.name.to_s)
39
+ @grid = v
40
+ nil
41
+ else
42
+ v
43
+ end
44
+ end.compact
45
+ end
46
+
47
+ alias :parse_elements :elements
48
+
49
+ def inspect
50
+ "#<#{self.class} @node=#{@node.name}>"
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,51 @@
1
+ require 'texmath'
2
+ require 'calculus'
3
+
4
+ module RubyDocx::Elements
5
+ class Equation < Element
6
+
7
+ def to_omml
8
+ ele = @node.xpath(".//m:oMath").first
9
+ ele.to_s
10
+ end
11
+
12
+ def to_latex
13
+ TeXMath.convert("#{self.to_omml}", :from => :omml, :to => :tex)
14
+ end
15
+
16
+ def to_mathml
17
+ TeXMath.convert("#{self.to_omml}", :from => :omml, :to => :mathml)
18
+ end
19
+
20
+
21
+ def replace_with_mathml(txt)
22
+ end
23
+
24
+ def replace_with_latex(txt)
25
+ end
26
+
27
+ def to_png
28
+ @path ||= Calculus::Expression.new("#{self.to_latex}", :parse => false).to_png
29
+ File.read(@path)
30
+ end
31
+
32
+ def base64_data
33
+ "data:image/png;base64,#{Base64.strict_encode64(self.to_png)}"
34
+ end
35
+
36
+ def save(path)
37
+ file = File.new(path, "wb")
38
+ file.write(self.to_png)
39
+ file.close
40
+ end
41
+
42
+ def to_html
43
+ "<img src='#{self.base64_data}' data-latex=\"#{self.to_latex}\" style='height: 13px;' />"
44
+ end
45
+
46
+ def to_s
47
+ self.to_latex.to_s
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,76 @@
1
+ require 'mimemagic'
2
+ require "base64"
3
+
4
+ module RubyDocx::Elements
5
+ class Image < Element
6
+ attr_accessor :path, :zip, :link
7
+ attr_reader :width, :height
8
+
9
+ def data
10
+ if self.path
11
+ @zip.read("word/#{@path}")
12
+ else
13
+
14
+ end
15
+
16
+ end
17
+
18
+ def relation_id
19
+ element = @node.xpath(".//v:imagedata").first
20
+ if element && element.attributes.keys.index("id")
21
+ element.attributes["id"].value
22
+ else
23
+ nil
24
+ end
25
+ end
26
+
27
+ def replace(lnk)
28
+ @link = lnk
29
+ end
30
+
31
+ def style
32
+ element = @node.xpath(".//v:shape").first
33
+
34
+ if element && element.attributes.keys.index("style")
35
+ element.attributes["style"].value
36
+ else
37
+ nil
38
+ end
39
+ end
40
+
41
+ def title
42
+ element = @node.xpath(".//v:imagedata").first
43
+ if element && element.attributes.keys.index("title")
44
+ element.attributes["title"].value
45
+ else
46
+ nil
47
+ end
48
+ end
49
+
50
+ def mime
51
+ MimeMagic.by_magic(self.data).type
52
+ end
53
+
54
+ def base64_data
55
+ "data:#{self.mime};base64,#{Base64.strict_encode64(self.data)}"
56
+ end
57
+
58
+ def to_html
59
+ if @link.to_s.size > 0
60
+ "<img src='#{@link}' alt=\"#{self.title}\" style=\"#{self.style}\" />"
61
+ else
62
+ "<img src='#{self.base64_data}' alt=\"#{self.title}\" style=\"#{self.style}\" />"
63
+ end
64
+
65
+ end
66
+
67
+ def save(path)
68
+ if @zip && @path
69
+ file = File.new(path, "wb")
70
+ file.write(self.data)
71
+ file.close
72
+ end
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,51 @@
1
+ module RubyDocx::Elements
2
+ class Link < Element
3
+ attr_reader :href, :content, :html_content
4
+
5
+ def element
6
+ @element ||= @node.children.first
7
+ end
8
+
9
+ def href
10
+ @href ||= @node.attributes["anchor"].value.to_s
11
+ end
12
+
13
+ def href=(an)
14
+ @href = an
15
+ end
16
+
17
+ def content
18
+ @content ||= self.elements.map(&:to_s).join("")
19
+ end
20
+
21
+ def content=(txt)
22
+ @content = txt
23
+ end
24
+
25
+ def html_content
26
+ @html_content ||= self.elements.map(&:to_html).join("")
27
+ end
28
+
29
+ def html_content=(html)
30
+ @html_content = html
31
+ end
32
+
33
+ def replace(url)
34
+ self.href = url
35
+ end
36
+
37
+ def to_html
38
+ if !self.href
39
+ "#{self.html_content}"
40
+ elsif self.href.to_s =~ /^http/
41
+ "<a href=\"#{self.href}\">#{self.html_content}</a>"
42
+ else
43
+ "<a href=\"##{self.href}\">#{self.html_content}</a>"
44
+ end
45
+ end
46
+
47
+ def to_s
48
+ self.content.to_s
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,89 @@
1
+ require 'texmath'
2
+ require 'calculus'
3
+ require 'mathtype'
4
+ require 'mathtype_to_mathml'
5
+
6
+ module Mathtype
7
+ class Converter
8
+ def initialize(equation)
9
+ ole = Ole::Storage.open(equation)
10
+ eq = ole.file.read("Equation Native")[28..-1]
11
+
12
+ data = Mathtype::Equation.read(eq).snapshot
13
+ @builder = Nokogiri::XML::Builder.new do |xml|
14
+ @xml = xml
15
+ xml.root do
16
+ process(object: data)
17
+ end
18
+ end
19
+ end
20
+
21
+ end
22
+ end
23
+
24
+ module RubyDocx::Elements
25
+ class OleObject < Element
26
+ attr_accessor :path, :zip, :link
27
+ attr_accessor :image_path
28
+
29
+ def style
30
+ element = @node.xpath(".//v:shape").first
31
+ if element && element.attributes.keys.index("style")
32
+ element.attributes["style"].value
33
+ else
34
+ nil
35
+ end
36
+ end
37
+
38
+ def relation_id
39
+ element = @node.xpath(".//o:OLEObject").first
40
+ if element && element.attributes.keys.index("id")
41
+ element.attributes["id"].value
42
+ else
43
+ nil
44
+ end
45
+ end
46
+
47
+ def to_mathml
48
+ io = StringIO.new(@zip.read("word/" + @path))
49
+ # xml = Mathtype::Converter.new(io)
50
+ # # puts xml.to_xml
51
+ # xml.to_xml
52
+
53
+ mathml = MathTypeToMathML::Converter.new(io).convert
54
+ end
55
+
56
+ def to_latex
57
+ TeXMath.convert("#{self.to_mathml}", :from => :mathml, :to => :tex)
58
+ end
59
+
60
+ def to_png
61
+ @image_path ||= Calculus::Expression.new("#{self.to_latex}", :parse => false).to_png
62
+ File.read(@image_path)
63
+ end
64
+
65
+ def base64_data
66
+ "data:image/png;base64,#{Base64.strict_encode64(self.to_png)}"
67
+ end
68
+
69
+ def save(path)
70
+ file = File.new(path, "wb")
71
+ file.write(self.to_png)
72
+ file.close
73
+ end
74
+
75
+ def to_html
76
+ if self.style
77
+ "<img src='#{self.base64_data}' data-latex=\"#{self.to_latex}\" style='#{self.style}' />"
78
+ else
79
+ "<img src='#{self.base64_data}' data-latex=\"#{self.to_latex}\" style='height: 13px;' />"
80
+ end
81
+
82
+ end
83
+
84
+ def to_s
85
+ self.to_latex.to_s
86
+ end
87
+
88
+ end
89
+ end