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