ruby_docx_beta 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +41 -0
- data/Rakefile +1 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/files/equation.docx +0 -0
- data/files/equation/[Content_Types].xml +1 -0
- data/files/equation/_rels/.rels +1 -0
- data/files/equation/docProps/app.xml +1 -0
- data/files/equation/docProps/core.xml +1 -0
- data/files/equation/word/_rels/document.xml.rels +1 -0
- data/files/equation/word/document.xml +6424 -0
- data/files/equation/word/fontTable.xml +1 -0
- data/files/equation/word/footer1.xml +1 -0
- data/files/equation/word/header1.xml +1 -0
- data/files/equation/word/media/image1.png +0 -0
- data/files/equation/word/media/image10.png +0 -0
- data/files/equation/word/media/image11.png +0 -0
- data/files/equation/word/media/image12.png +0 -0
- data/files/equation/word/media/image13.png +0 -0
- data/files/equation/word/media/image14.png +0 -0
- data/files/equation/word/media/image15.png +0 -0
- data/files/equation/word/media/image16.png +0 -0
- data/files/equation/word/media/image17.png +0 -0
- data/files/equation/word/media/image18.png +0 -0
- data/files/equation/word/media/image19.png +0 -0
- data/files/equation/word/media/image2.png +0 -0
- data/files/equation/word/media/image20.png +0 -0
- data/files/equation/word/media/image21.png +0 -0
- data/files/equation/word/media/image22.png +0 -0
- data/files/equation/word/media/image23.png +0 -0
- data/files/equation/word/media/image24.png +0 -0
- data/files/equation/word/media/image25.png +0 -0
- data/files/equation/word/media/image26.png +0 -0
- data/files/equation/word/media/image27.png +0 -0
- data/files/equation/word/media/image28.png +0 -0
- data/files/equation/word/media/image29.png +0 -0
- data/files/equation/word/media/image3.png +0 -0
- data/files/equation/word/media/image30.png +0 -0
- data/files/equation/word/media/image31.png +0 -0
- data/files/equation/word/media/image32.png +0 -0
- data/files/equation/word/media/image33.png +0 -0
- data/files/equation/word/media/image34.png +0 -0
- data/files/equation/word/media/image35.png +0 -0
- data/files/equation/word/media/image36.png +0 -0
- data/files/equation/word/media/image37.png +0 -0
- data/files/equation/word/media/image38.png +0 -0
- data/files/equation/word/media/image39.png +0 -0
- data/files/equation/word/media/image4.png +0 -0
- data/files/equation/word/media/image40.png +0 -0
- data/files/equation/word/media/image41.png +0 -0
- data/files/equation/word/media/image42.png +0 -0
- data/files/equation/word/media/image43.png +0 -0
- data/files/equation/word/media/image44.png +0 -0
- data/files/equation/word/media/image45.png +0 -0
- data/files/equation/word/media/image46.png +0 -0
- data/files/equation/word/media/image47.png +0 -0
- data/files/equation/word/media/image48.png +0 -0
- data/files/equation/word/media/image49.png +0 -0
- data/files/equation/word/media/image5.png +0 -0
- data/files/equation/word/media/image50.png +0 -0
- data/files/equation/word/media/image51.png +0 -0
- data/files/equation/word/media/image52.png +0 -0
- data/files/equation/word/media/image53.png +0 -0
- data/files/equation/word/media/image54.png +0 -0
- data/files/equation/word/media/image55.png +0 -0
- data/files/equation/word/media/image56.png +0 -0
- data/files/equation/word/media/image57.png +0 -0
- data/files/equation/word/media/image58.png +0 -0
- data/files/equation/word/media/image59.png +0 -0
- data/files/equation/word/media/image6.png +0 -0
- data/files/equation/word/media/image60.png +0 -0
- data/files/equation/word/media/image61.png +0 -0
- data/files/equation/word/media/image62.png +0 -0
- data/files/equation/word/media/image63.png +0 -0
- data/files/equation/word/media/image7.png +0 -0
- data/files/equation/word/media/image8.png +0 -0
- data/files/equation/word/media/image9.png +0 -0
- data/files/equation/word/numbering.xml +1 -0
- data/files/equation/word/settings.xml +1 -0
- data/files/equation/word/styles.xml +1 -0
- data/files/equation/word/theme/theme1.xml +1 -0
- data/files/table/[Content_Types].xml +2 -0
- data/files/table/_rels/.rels +2 -0
- data/files/table/docProps/app.xml +2 -0
- data/files/table/docProps/core.xml +2 -0
- data/files/table/word/_rels/document.xml.rels +2 -0
- data/files/table/word/document.xml +1145 -0
- data/files/table/word/fontTable.xml +2 -0
- data/files/table/word/settings.xml +2 -0
- data/files/table/word/styles.xml +2 -0
- data/files/table/word/theme/theme1.xml +2 -0
- data/files/table/word/webSettings.xml +2 -0
- data/files/test.docx +0 -0
- data/files/test/[Content_Types].xml +2 -0
- data/files/test/_rels/.rels +2 -0
- data/files/test/docProps/app.xml +2 -0
- data/files/test/docProps/core.xml +2 -0
- data/files/test/docProps/custom.xml +2 -0
- data/files/test/word/_rels/document.xml.rels +2 -0
- data/files/test/word/_rels/settings.xml.rels +2 -0
- data/files/test/word/document.xml +5592 -0
- data/files/test/word/embeddings/oleObject1.bin +0 -0
- data/files/test/word/embeddings/oleObject10.bin +0 -0
- data/files/test/word/embeddings/oleObject11.bin +0 -0
- data/files/test/word/embeddings/oleObject12.bin +0 -0
- data/files/test/word/embeddings/oleObject13.bin +0 -0
- data/files/test/word/embeddings/oleObject14.bin +0 -0
- data/files/test/word/embeddings/oleObject15.bin +0 -0
- data/files/test/word/embeddings/oleObject16.bin +0 -0
- data/files/test/word/embeddings/oleObject17.bin +0 -0
- data/files/test/word/embeddings/oleObject18.bin +0 -0
- data/files/test/word/embeddings/oleObject19.bin +0 -0
- data/files/test/word/embeddings/oleObject2.bin +0 -0
- data/files/test/word/embeddings/oleObject20.bin +0 -0
- data/files/test/word/embeddings/oleObject21.bin +0 -0
- data/files/test/word/embeddings/oleObject22.bin +0 -0
- data/files/test/word/embeddings/oleObject23.bin +0 -0
- data/files/test/word/embeddings/oleObject24.bin +0 -0
- data/files/test/word/embeddings/oleObject25.bin +0 -0
- data/files/test/word/embeddings/oleObject26.bin +0 -0
- data/files/test/word/embeddings/oleObject27.bin +0 -0
- data/files/test/word/embeddings/oleObject28.bin +0 -0
- data/files/test/word/embeddings/oleObject29.bin +0 -0
- data/files/test/word/embeddings/oleObject3.bin +0 -0
- data/files/test/word/embeddings/oleObject30.bin +0 -0
- data/files/test/word/embeddings/oleObject31.bin +0 -0
- data/files/test/word/embeddings/oleObject32.bin +0 -0
- data/files/test/word/embeddings/oleObject33.bin +0 -0
- data/files/test/word/embeddings/oleObject34.bin +0 -0
- data/files/test/word/embeddings/oleObject35.bin +0 -0
- data/files/test/word/embeddings/oleObject36.bin +0 -0
- data/files/test/word/embeddings/oleObject37.bin +0 -0
- data/files/test/word/embeddings/oleObject38.bin +0 -0
- data/files/test/word/embeddings/oleObject39.bin +0 -0
- data/files/test/word/embeddings/oleObject4.bin +0 -0
- data/files/test/word/embeddings/oleObject40.bin +0 -0
- data/files/test/word/embeddings/oleObject41.bin +0 -0
- data/files/test/word/embeddings/oleObject42.bin +0 -0
- data/files/test/word/embeddings/oleObject43.bin +0 -0
- data/files/test/word/embeddings/oleObject44.bin +0 -0
- data/files/test/word/embeddings/oleObject45.bin +0 -0
- data/files/test/word/embeddings/oleObject46.bin +0 -0
- data/files/test/word/embeddings/oleObject47.bin +0 -0
- data/files/test/word/embeddings/oleObject48.bin +0 -0
- data/files/test/word/embeddings/oleObject49.bin +0 -0
- data/files/test/word/embeddings/oleObject5.bin +0 -0
- data/files/test/word/embeddings/oleObject50.bin +0 -0
- data/files/test/word/embeddings/oleObject51.bin +0 -0
- data/files/test/word/embeddings/oleObject52.bin +0 -0
- data/files/test/word/embeddings/oleObject53.bin +0 -0
- data/files/test/word/embeddings/oleObject54.bin +0 -0
- data/files/test/word/embeddings/oleObject55.bin +0 -0
- data/files/test/word/embeddings/oleObject56.bin +0 -0
- data/files/test/word/embeddings/oleObject57.bin +0 -0
- data/files/test/word/embeddings/oleObject58.bin +0 -0
- data/files/test/word/embeddings/oleObject59.bin +0 -0
- data/files/test/word/embeddings/oleObject6.bin +0 -0
- data/files/test/word/embeddings/oleObject60.bin +0 -0
- data/files/test/word/embeddings/oleObject61.bin +0 -0
- data/files/test/word/embeddings/oleObject62.bin +0 -0
- data/files/test/word/embeddings/oleObject7.bin +0 -0
- data/files/test/word/embeddings/oleObject8.bin +0 -0
- data/files/test/word/embeddings/oleObject9.bin +0 -0
- data/files/test/word/endnotes.xml +2 -0
- data/files/test/word/fontTable.xml +2 -0
- data/files/test/word/footer1.xml +2 -0
- data/files/test/word/footnotes.xml +2 -0
- data/files/test/word/glossary/_rels/document.xml.rels +2 -0
- data/files/test/word/glossary/document.xml +2 -0
- data/files/test/word/glossary/fontTable.xml +2 -0
- data/files/test/word/glossary/settings.xml +2 -0
- data/files/test/word/glossary/styles.xml +2 -0
- data/files/test/word/glossary/webSettings.xml +2 -0
- data/files/test/word/header1.xml +2 -0
- data/files/test/word/header2.xml +2 -0
- data/files/test/word/media/image1.wmf +0 -0
- data/files/test/word/media/image10.wmf +0 -0
- data/files/test/word/media/image11.wmf +0 -0
- data/files/test/word/media/image12.wmf +0 -0
- data/files/test/word/media/image13.wmf +0 -0
- data/files/test/word/media/image14.wmf +0 -0
- data/files/test/word/media/image15.wmf +0 -0
- data/files/test/word/media/image16.wmf +0 -0
- data/files/test/word/media/image17.wmf +0 -0
- data/files/test/word/media/image18.wmf +0 -0
- data/files/test/word/media/image19.wmf +0 -0
- data/files/test/word/media/image2.wmf +0 -0
- data/files/test/word/media/image20.wmf +0 -0
- data/files/test/word/media/image21.wmf +0 -0
- data/files/test/word/media/image22.wmf +0 -0
- data/files/test/word/media/image23.wmf +0 -0
- data/files/test/word/media/image24.wmf +0 -0
- data/files/test/word/media/image25.wmf +0 -0
- data/files/test/word/media/image26.wmf +0 -0
- data/files/test/word/media/image27.wmf +0 -0
- data/files/test/word/media/image28.wmf +0 -0
- data/files/test/word/media/image29.wmf +0 -0
- data/files/test/word/media/image3.wmf +0 -0
- data/files/test/word/media/image30.wmf +0 -0
- data/files/test/word/media/image31.wmf +0 -0
- data/files/test/word/media/image32.wmf +0 -0
- data/files/test/word/media/image33.wmf +0 -0
- data/files/test/word/media/image34.wmf +0 -0
- data/files/test/word/media/image35.wmf +0 -0
- data/files/test/word/media/image36.wmf +0 -0
- data/files/test/word/media/image37.wmf +0 -0
- data/files/test/word/media/image38.wmf +0 -0
- data/files/test/word/media/image39.wmf +0 -0
- data/files/test/word/media/image4.wmf +0 -0
- data/files/test/word/media/image40.wmf +0 -0
- data/files/test/word/media/image41.wmf +0 -0
- data/files/test/word/media/image42.wmf +0 -0
- data/files/test/word/media/image43.wmf +0 -0
- data/files/test/word/media/image44.wmf +0 -0
- data/files/test/word/media/image45.wmf +0 -0
- data/files/test/word/media/image46.wmf +0 -0
- data/files/test/word/media/image47.wmf +0 -0
- data/files/test/word/media/image48.wmf +0 -0
- data/files/test/word/media/image49.wmf +0 -0
- data/files/test/word/media/image5.wmf +0 -0
- data/files/test/word/media/image50.wmf +0 -0
- data/files/test/word/media/image51.wmf +0 -0
- data/files/test/word/media/image52.wmf +0 -0
- data/files/test/word/media/image53.wmf +0 -0
- data/files/test/word/media/image54.wmf +0 -0
- data/files/test/word/media/image55.wmf +0 -0
- data/files/test/word/media/image56.wmf +0 -0
- data/files/test/word/media/image6.wmf +0 -0
- data/files/test/word/media/image7.wmf +0 -0
- data/files/test/word/media/image8.wmf +0 -0
- data/files/test/word/media/image9.wmf +0 -0
- data/files/test/word/numbering.xml +2 -0
- data/files/test/word/settings.xml +2 -0
- data/files/test/word/styles.xml +2 -0
- data/files/test/word/theme/theme1.xml +2 -0
- data/files/test/word/webSettings.xml +2 -0
- data/files/test_image.docx +0 -0
- data/files/test_table.docx +0 -0
- data/lib/ruby_docx.rb +10 -0
- data/lib/ruby_docx/document.rb +109 -0
- data/lib/ruby_docx/elements.rb +54 -0
- data/lib/ruby_docx/elements/bookmark.rb +42 -0
- data/lib/ruby_docx/elements/break_line.rb +13 -0
- data/lib/ruby_docx/elements/drawing.rb +76 -0
- data/lib/ruby_docx/elements/element.rb +53 -0
- data/lib/ruby_docx/elements/equation.rb +51 -0
- data/lib/ruby_docx/elements/image.rb +76 -0
- data/lib/ruby_docx/elements/link.rb +51 -0
- data/lib/ruby_docx/elements/ole_object.rb +89 -0
- data/lib/ruby_docx/elements/paragraph.rb +17 -0
- data/lib/ruby_docx/elements/style.rb +101 -0
- data/lib/ruby_docx/elements/table.rb +51 -0
- data/lib/ruby_docx/elements/table_cell.rb +26 -0
- data/lib/ruby_docx/elements/table_column.rb +24 -0
- data/lib/ruby_docx/elements/table_row.rb +41 -0
- data/lib/ruby_docx/elements/table_style.rb +101 -0
- data/lib/ruby_docx/elements/text.rb +31 -0
- data/lib/ruby_docx/elements/text_run.rb +15 -0
- data/lib/ruby_docx/html.rb +55 -0
- data/lib/ruby_docx/htmls.rb +32 -0
- data/lib/ruby_docx/htmls/html_break_line.rb +9 -0
- data/lib/ruby_docx/htmls/html_element.rb +7 -0
- data/lib/ruby_docx/htmls/html_equation.rb +6 -0
- data/lib/ruby_docx/htmls/html_image.rb +6 -0
- data/lib/ruby_docx/htmls/html_link.rb +6 -0
- data/lib/ruby_docx/htmls/html_paragraph.rb +9 -0
- data/lib/ruby_docx/htmls/html_table.rb +6 -0
- data/lib/ruby_docx/htmls/html_table_cell.rb +6 -0
- data/lib/ruby_docx/htmls/html_table_header.rb +6 -0
- data/lib/ruby_docx/htmls/html_table_row.rb +6 -0
- data/lib/ruby_docx/htmls/html_text.rb +9 -0
- data/lib/ruby_docx/relation.rb +18 -0
- data/lib/ruby_docx/version.rb +3 -0
- data/ruby_docx.gemspec +41 -0
- data/template.docx +0 -0
- data/template/[Content_Types].xml +2 -0
- data/template/_rels/.rels +2 -0
- data/template/docProps/app.xml +2 -0
- data/template/docProps/core.xml +2 -0
- data/template/word/_rels/document.xml.rels +2 -0
- data/template/word/document.xml +2 -0
- data/template/word/fontTable.xml +2 -0
- data/template/word/settings.xml +2 -0
- data/template/word/styles.xml +2 -0
- data/template/word/theme/theme1.xml +2 -0
- data/template/word/webSettings.xml +2 -0
- metadata +475 -0
@@ -0,0 +1,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,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
|