ooxml_parser 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/lib/ooxml_parser.rb +2 -0
- data/lib/ooxml_parser/common_parser/common_data/alternate_content/chart/chart.rb +3 -2
- data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/graphic/picture/docx_blip.rb +2 -1
- data/lib/ooxml_parser/common_parser/common_data/alternate_content/picture/group/old_docx_group.rb +1 -1
- data/lib/ooxml_parser/common_parser/common_data/alternate_content/picture/shape/old_docx_shape.rb +1 -1
- data/lib/ooxml_parser/common_parser/common_data/borders_properties.rb +11 -8
- data/lib/ooxml_parser/common_parser/common_data/colors/hsl_color.rb +12 -15
- data/lib/ooxml_parser/common_parser/common_data/colors/image/stretching.rb +1 -0
- data/lib/ooxml_parser/common_parser/common_data/colors/image/{fill_rectangle.rb → stretching/fill_rectangle.rb} +0 -0
- data/lib/ooxml_parser/common_parser/common_data/colors/image_fill.rb +1 -0
- data/lib/ooxml_parser/common_parser/common_data/colors/presentation_fill/gradient_color.rb +1 -2
- data/lib/ooxml_parser/common_parser/common_data/colors/presentation_fill/gradient_color/linear_gradient.rb +10 -0
- data/lib/ooxml_parser/common_parser/common_data/hyperlink.rb +6 -1
- data/lib/ooxml_parser/common_parser/common_data/ooxml_document_object.rb +29 -1
- data/lib/ooxml_parser/common_parser/common_data/paragraph.rb +1 -0
- data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_properties.rb +1 -1
- data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_run/run_properties.rb +1 -1
- data/lib/ooxml_parser/{pptx_parser/pptx_data/presentation/slide/shape/text_body → common_parser/common_data/paragraph}/text_field.rb +0 -0
- data/lib/ooxml_parser/common_parser/common_data/relationships.rb +31 -0
- data/lib/ooxml_parser/common_parser/common_data/relationships/relationship.rb +22 -0
- data/lib/ooxml_parser/common_parser/common_data/table.rb +1 -1
- data/lib/ooxml_parser/common_parser/common_data/table/properties/table_style.rb +1 -0
- data/lib/ooxml_parser/common_parser/common_data/table/properties/table_style_elements.rb +1 -1
- data/lib/ooxml_parser/common_parser/common_data/table/row/cell/cell_properties.rb +39 -96
- data/lib/ooxml_parser/common_parser/common_data/table/row/cell/merge.rb +7 -3
- data/lib/ooxml_parser/common_parser/common_data/table/row/row/table_row_properties.rb +1 -1
- data/lib/ooxml_parser/common_parser/common_data/table/table_grid.rb +1 -1
- data/lib/ooxml_parser/common_parser/common_data/table/table_properties.rb +5 -2
- data/lib/ooxml_parser/common_parser/common_data/table/table_properties/table_borders.rb +33 -0
- data/lib/ooxml_parser/common_parser/parser.rb +17 -0
- data/lib/ooxml_parser/docx_parser/docx_data/document_structure.rb +15 -26
- data/lib/ooxml_parser/docx_parser/docx_data/document_structure/document_background.rb +26 -0
- data/lib/ooxml_parser/docx_parser/docx_data/document_structure/document_properties.rb +6 -1
- data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_paragraph_run.rb +5 -5
- data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_paragraph_run/shape.rb +9 -10
- data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/frame_properties.rb +1 -1
- data/lib/ooxml_parser/docx_parser/docx_data/document_structure/page_properties/document_grid.rb +1 -1
- data/lib/ooxml_parser/docx_parser/docx_data/document_structure/page_properties/page_properties.rb +6 -13
- data/lib/ooxml_parser/docx_parser/docx_parser.rb +3 -7
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation.rb +1 -2
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/presentation_comment/presentation_comment_author.rb +2 -1
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/presentation_theme.rb +1 -1
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide.rb +13 -19
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/slide/timing/animation_effect/animation_effect.rb +2 -2
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/slide/timing/set_time_node/behavior/behavior.rb +1 -0
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/slide/timing/set_time_node/set_time_node.rb +2 -0
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/slide/timing/time_node.rb +2 -0
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/slide/timing/time_node/common_timing/condition.rb +2 -2
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/transition/transition.rb +3 -14
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/transition/{sound_action → transition}/sound_action.rb +2 -0
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/transition/{sound_action/sound → transition/sound_action}/sound.rb +1 -2
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/transition/transition_properties/transition_properties.rb +20 -0
- data/lib/ooxml_parser/pptx_parser/pptx_parser.rb +3 -7
- data/lib/ooxml_parser/version.rb +1 -1
- data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook.rb +4 -3
- data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet.rb +12 -1
- data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/xlsx_row.rb +1 -1
- data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/xlsx_row/xlsx_cell/cell_style/foreground_color.rb +2 -2
- data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/xlsx_row/xlsx_cell/cell_style/ooxml_font.rb +2 -4
- data/lib/ooxml_parser/xlsx_parser/xlsx_parser.rb +3 -7
- metadata +10 -16
- data/.overcommit.yml +0 -35
- data/Changelog.md +0 -25
- data/circle.yml +0 -3
- data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_paragraph_run/shape/offset.rb +0 -10
- data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_paragraph_run/shape/shadow.rb +0 -10
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/shape/shape_properties/extents.rb +0 -10
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/shape/shape_properties/offset.rb +0 -10
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/shape/text_body/paragraph.rb +0 -10
- data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/shapes_grouping/shapes_grouping.rb +0 -9
- data/ooxml_parser.gemspec +0 -30
|
@@ -8,10 +8,14 @@ module OoxmlParser
|
|
|
8
8
|
@value = value
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
# Parse Merge data
|
|
12
|
+
# @param [Nokogiri::XML:Element] node with Merge data
|
|
13
|
+
# @return [CellMerge] value of CellMerge
|
|
14
|
+
def self.parse(node)
|
|
12
15
|
merge = CellMerge.new
|
|
13
|
-
merge.
|
|
14
|
-
merge.
|
|
16
|
+
merge.count_of_merged_cells = node.attribute('count_rows_in_span').nil? ? nil : node.attribute('count_rows_in_span').value
|
|
17
|
+
merge.value = node.attribute('val').nil? ? nil : node.attribute('val').value.to_sym
|
|
18
|
+
merge.type = node.attribute('type').nil? ? nil : node.attribute('type').value.to_sym
|
|
15
19
|
merge
|
|
16
20
|
end
|
|
17
21
|
end
|
|
@@ -3,6 +3,7 @@ require_relative 'properties/table_cell_margin'
|
|
|
3
3
|
require_relative 'properties/table_look'
|
|
4
4
|
require_relative 'properties/table_style'
|
|
5
5
|
require_relative 'properties/table_position'
|
|
6
|
+
require_relative 'table_properties/table_borders'
|
|
6
7
|
module OoxmlParser
|
|
7
8
|
class TableProperties < OOXMLDocumentObject
|
|
8
9
|
attr_accessor :jc, :table_width, :shd, :table_borders, :table_properties, :table_positon, :table_cell_margin, :table_indent, :stretching, :table_style, :row_banding_size,
|
|
@@ -16,7 +17,7 @@ module OoxmlParser
|
|
|
16
17
|
@jc = :left
|
|
17
18
|
@shd = nil
|
|
18
19
|
@stretching = true
|
|
19
|
-
@table_borders =
|
|
20
|
+
@table_borders = TableBorders.new
|
|
20
21
|
@table_properties = nil
|
|
21
22
|
@table_width = nil
|
|
22
23
|
@grid_column = nil
|
|
@@ -30,7 +31,7 @@ module OoxmlParser
|
|
|
30
31
|
table.table_width = @table_width
|
|
31
32
|
table.shd = @shd
|
|
32
33
|
table.stretching = @stretching
|
|
33
|
-
table.table_borders = @table_borders
|
|
34
|
+
table.table_borders = @table_borders
|
|
34
35
|
table.table_properties = @table_properties
|
|
35
36
|
table.table_cell_margin = @table_cell_margin
|
|
36
37
|
table.table_indent = @table_indent
|
|
@@ -46,6 +47,8 @@ module OoxmlParser
|
|
|
46
47
|
case table_props_node_child.name
|
|
47
48
|
when 'tableStyleId'
|
|
48
49
|
table_properties.style = TableStyle.parse(style_id: table_props_node_child.text)
|
|
50
|
+
when 'tblBorders'
|
|
51
|
+
table_properties.table_borders = TableBorders.parse(table_props_node_child)
|
|
49
52
|
when 'tblStyle'
|
|
50
53
|
style = DocxParagraphRun.get_style_by_id(table_props_node_child.attribute('val').value)
|
|
51
54
|
next if style.nil?
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module OoxmlParser
|
|
2
|
+
# Class for describing Table Border Propertie
|
|
3
|
+
class TableBorders < OOXMLDocumentObject
|
|
4
|
+
# @return [BordersProperties] left border propertie
|
|
5
|
+
attr_accessor :left
|
|
6
|
+
# @return [BordersProperties] right border propertie
|
|
7
|
+
attr_accessor :right
|
|
8
|
+
# @return [BordersProperties] top border propertie
|
|
9
|
+
attr_accessor :top
|
|
10
|
+
# @return [BordersProperties] bottom border propertie
|
|
11
|
+
attr_accessor :bottom
|
|
12
|
+
|
|
13
|
+
# Parse Table Borders data
|
|
14
|
+
# @param [Nokogiri::XML:Element] node with Table Borders data
|
|
15
|
+
# @return [TableBorders] value of Table Borders data
|
|
16
|
+
def self.parse(node)
|
|
17
|
+
borders = TableBorders.new
|
|
18
|
+
node.xpath('*').each do |cell_borders_node|
|
|
19
|
+
case cell_borders_node.name
|
|
20
|
+
when 'left'
|
|
21
|
+
borders.left = BordersProperties.parse(cell_borders_node)
|
|
22
|
+
when 'top'
|
|
23
|
+
borders.top = BordersProperties.parse(cell_borders_node)
|
|
24
|
+
when 'right'
|
|
25
|
+
borders.right = BordersProperties.parse(cell_borders_node)
|
|
26
|
+
when 'bottom'
|
|
27
|
+
borders.bottom = BordersProperties.parse(cell_borders_node)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
borders
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module OoxmlParser
|
|
2
|
+
class Parser
|
|
3
|
+
# Base method to parse document of any type
|
|
4
|
+
# @param path_to_file [String] file
|
|
5
|
+
# @return [CommonDocumentStructure] structure of doc
|
|
6
|
+
def self.parse(path_to_file)
|
|
7
|
+
return nil if OOXMLDocumentObject.encrypted_file?(path_to_file)
|
|
8
|
+
path_to_zip_file = OOXMLDocumentObject.copy_file_and_rename_to_zip(path_to_file)
|
|
9
|
+
OOXMLDocumentObject.path_to_folder = path_to_zip_file.sub(File.basename(path_to_zip_file), '')
|
|
10
|
+
OOXMLDocumentObject.unzip_file(path_to_zip_file, OOXMLDocumentObject.path_to_folder)
|
|
11
|
+
model = yield
|
|
12
|
+
model.file_path = path_to_file
|
|
13
|
+
FileUtils.remove_dir(OOXMLDocumentObject.path_to_folder)
|
|
14
|
+
model
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# noinspection RubyInstanceMethodNamingConvention
|
|
2
2
|
require_relative 'document_structure/comment'
|
|
3
3
|
require_relative 'document_structure/docx_paragraph'
|
|
4
|
+
require_relative 'document_structure/document_background'
|
|
4
5
|
require_relative 'document_structure/document_properties'
|
|
5
6
|
require_relative 'document_structure/document_style'
|
|
7
|
+
require_relative 'document_structure/header_footer'
|
|
6
8
|
require_relative 'document_structure/page_properties/page_properties'
|
|
7
9
|
module OoxmlParser
|
|
8
10
|
class DocumentStructure < CommonDocumentStructure
|
|
@@ -21,6 +23,15 @@ module OoxmlParser
|
|
|
21
23
|
@document_styles = []
|
|
22
24
|
end
|
|
23
25
|
|
|
26
|
+
def ==(other)
|
|
27
|
+
@elements == other.elements &&
|
|
28
|
+
@page_properties == other.page_properties &&
|
|
29
|
+
@notes == other.notes &&
|
|
30
|
+
@background == other.background &&
|
|
31
|
+
@document_properties == other.document_properties &&
|
|
32
|
+
@comments == other.comments
|
|
33
|
+
end
|
|
34
|
+
|
|
24
35
|
def difference(other)
|
|
25
36
|
Hash.object_to_hash(self).diff(Hash.object_to_hash(other))
|
|
26
37
|
end
|
|
@@ -108,9 +119,8 @@ module OoxmlParser
|
|
|
108
119
|
!document_style_by_name(name).nil?
|
|
109
120
|
end
|
|
110
121
|
|
|
111
|
-
def self.parse
|
|
122
|
+
def self.parse
|
|
112
123
|
OOXMLDocumentObject.root_subfolder = 'word/'
|
|
113
|
-
OOXMLDocumentObject.path_to_folder = path
|
|
114
124
|
OOXMLDocumentObject.xmls_stack = []
|
|
115
125
|
OOXMLDocumentObject.namespace_prefix = 'w'
|
|
116
126
|
@comments = []
|
|
@@ -138,28 +148,7 @@ module OoxmlParser
|
|
|
138
148
|
doc = Nokogiri::XML(File.open(OOXMLDocumentObject.current_xml))
|
|
139
149
|
doc.search('//w:document').each do |document|
|
|
140
150
|
document.xpath('w:background').each do |background|
|
|
141
|
-
doc_structure.background = DocumentBackground.
|
|
142
|
-
doc_structure.background.color1 = Color.from_int16(background.attribute('color').value)
|
|
143
|
-
background.xpath('v:background').each do |second_color|
|
|
144
|
-
unless second_color.attribute('targetscreensize').nil?
|
|
145
|
-
doc_structure.background.size = second_color.attribute('targetscreensize').value.sub(',', 'x')
|
|
146
|
-
end
|
|
147
|
-
second_color.xpath('v:fill').each do |fill|
|
|
148
|
-
if !fill.attribute('color2').nil?
|
|
149
|
-
doc_structure.background.color2 = Color.from_int16(fill.attribute('color2').value.split(' ').first.delete('#'))
|
|
150
|
-
doc_structure.background.type = fill.attribute('type').value
|
|
151
|
-
elsif !fill.attribute('id').nil?
|
|
152
|
-
path_to_image = path + 'word/' + ParserDocxHelper.get_link_from_rels(fill.attribute('id').value, path)
|
|
153
|
-
image_name = File.basename(path_to_image)
|
|
154
|
-
doc_structure.background.image = path + File.basename(path) + '/' + image_name
|
|
155
|
-
unless File.exist?(doc_structure.background.image.sub(File.basename(doc_structure.background.image), ''))
|
|
156
|
-
FileUtils.mkdir(doc_structure.background.image.sub(File.basename(doc_structure.background.image), ''))
|
|
157
|
-
end
|
|
158
|
-
FileUtils.cp path_to_image, doc_structure.background.image
|
|
159
|
-
doc_structure.background.type = 'image'
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
end
|
|
151
|
+
doc_structure.background = DocumentBackground.parse(background)
|
|
163
152
|
end
|
|
164
153
|
document.xpath('w:body').each do |body|
|
|
165
154
|
body.xpath('*').each do |element|
|
|
@@ -215,10 +204,10 @@ module OoxmlParser
|
|
|
215
204
|
@default_table_properties = TableProperties.parse(table_pr_tag)
|
|
216
205
|
end
|
|
217
206
|
style.xpath('w:pPr').each do |table_paragraph_pr_tag|
|
|
218
|
-
DocxParagraph.parse_paragraph_style(table_paragraph_pr_tag,
|
|
207
|
+
DocxParagraph.parse_paragraph_style(table_paragraph_pr_tag, DocumentStructure.default_table_paragraph_style, DocumentStructure.default_table_run_style)
|
|
219
208
|
end
|
|
220
209
|
style.xpath('w:rPr').each do |table_character_pr_tag|
|
|
221
|
-
DocxParagraphRun.parse(table_character_pr_tag,
|
|
210
|
+
DocxParagraphRun.parse(table_character_pr_tag, DocumentStructure.default_table_run_style, @default_character)
|
|
222
211
|
end
|
|
223
212
|
end
|
|
224
213
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
module OoxmlParser
|
|
2
|
+
# Class for describing Document Background `w:background`
|
|
2
3
|
class DocumentBackground
|
|
3
4
|
attr_accessor :color1, :size, :color2, :image, :type
|
|
4
5
|
|
|
@@ -6,5 +7,30 @@ module OoxmlParser
|
|
|
6
7
|
@color1 = color1
|
|
7
8
|
@type = type
|
|
8
9
|
end
|
|
10
|
+
|
|
11
|
+
# Parse DocumentBackground object
|
|
12
|
+
# @param node [Nokogiri::XML:Element] node to parse
|
|
13
|
+
# @return [DocumentBackground] result of parsing
|
|
14
|
+
def self.parse(node)
|
|
15
|
+
background = DocumentBackground.new
|
|
16
|
+
background.color1 = Color.from_int16(node.attribute('color').value)
|
|
17
|
+
node.xpath('v:background').each do |second_color|
|
|
18
|
+
unless second_color.attribute('targetscreensize').nil?
|
|
19
|
+
background.size = second_color.attribute('targetscreensize').value.sub(',', 'x')
|
|
20
|
+
end
|
|
21
|
+
second_color.xpath('v:fill').each do |fill|
|
|
22
|
+
if !fill.attribute('color2').nil?
|
|
23
|
+
background.color2 = Color.from_int16(fill.attribute('color2').value.split(' ').first.delete('#'))
|
|
24
|
+
background.type = fill.attribute('type').value
|
|
25
|
+
elsif !fill.attribute('id').nil?
|
|
26
|
+
path_to_media_file = OOXMLDocumentObject.get_link_from_rels(fill.attribute('id').value)
|
|
27
|
+
path_to_image = OOXMLDocumentObject.copy_media_file("#{OOXMLDocumentObject.root_subfolder}/#{path_to_media_file.gsub('..', '')}")
|
|
28
|
+
background.image = path_to_image
|
|
29
|
+
background.type = 'image'
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
background
|
|
34
|
+
end
|
|
9
35
|
end
|
|
10
36
|
end
|
|
@@ -12,7 +12,12 @@ module OoxmlParser
|
|
|
12
12
|
# @return [DocumentProperties]
|
|
13
13
|
def self.parse
|
|
14
14
|
properties = DocumentProperties.new
|
|
15
|
-
|
|
15
|
+
properties_file = "#{OOXMLDocumentObject.path_to_folder}docProps/app.xml"
|
|
16
|
+
unless File.exist?(properties_file)
|
|
17
|
+
warn "There is no 'docProps/app.xml' in docx. It may be some problem with it"
|
|
18
|
+
return properties
|
|
19
|
+
end
|
|
20
|
+
doc_props = XmlSimple.xml_in(File.open(properties_file))
|
|
16
21
|
properties.pages = doc_props['Pages'].first.to_i unless doc_props['Pages'].nil?
|
|
17
22
|
properties.words = doc_props['Words'].first.to_i unless doc_props['Words'].nil?
|
|
18
23
|
properties
|
data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_paragraph_run.rb
CHANGED
|
@@ -332,21 +332,21 @@ module OoxmlParser
|
|
|
332
332
|
end
|
|
333
333
|
when 'footnoteReference'
|
|
334
334
|
character_style.footnote = HeaderFooter.new(:header)
|
|
335
|
-
character_style.footnote.id = r_node_child.attribute('id').value
|
|
335
|
+
character_style.footnote.id = r_node_child.attribute('id').value.to_i
|
|
336
336
|
character_style.footnote.parse('footnote', character_style.footnote.id, @default_paragraph, @default_character)
|
|
337
337
|
when 'endnoteReference'
|
|
338
338
|
character_style.endnote = HeaderFooter.new(:footer)
|
|
339
|
-
character_style.endnote.id = r_node_child.attribute('id').value
|
|
339
|
+
character_style.endnote.id = r_node_child.attribute('id').value.to_i
|
|
340
340
|
character_style.endnote.parse('endnote', character_style.endnote.id, @default_paragraph, @default_character)
|
|
341
341
|
when 'pict'
|
|
342
342
|
r_node_child.xpath('*').each do |pict_node_child|
|
|
343
343
|
case pict_node_child.name
|
|
344
344
|
when 'shape'
|
|
345
|
-
character_style.shape = Shape.parse(pict_node_child, :shape
|
|
345
|
+
character_style.shape = Shape.parse(pict_node_child, :shape)
|
|
346
346
|
when 'rect'
|
|
347
|
-
character_style.shape = Shape.parse(pict_node_child, :rectangle
|
|
347
|
+
character_style.shape = Shape.parse(pict_node_child, :rectangle)
|
|
348
348
|
when 'oval'
|
|
349
|
-
character_style.shape = Shape.parse(pict_node_child, :oval
|
|
349
|
+
character_style.shape = Shape.parse(pict_node_child, :oval)
|
|
350
350
|
when 'shapetype'
|
|
351
351
|
end
|
|
352
352
|
end
|
|
@@ -9,31 +9,30 @@ module OoxmlParser
|
|
|
9
9
|
@elements = elements
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def self.parse(shape_node, type
|
|
12
|
+
def self.parse(shape_node, type)
|
|
13
13
|
shape = Shape.new
|
|
14
14
|
shape.type = type
|
|
15
15
|
shape_node.attribute('style').value.to_s.split(';').each do |property|
|
|
16
|
-
|
|
17
|
-
when property.include?('margin-top')
|
|
16
|
+
if property.include?('margin-top')
|
|
18
17
|
shape.properties.margins.top = property.split(':').last
|
|
19
|
-
|
|
18
|
+
elsif property.include?('margin-left')
|
|
20
19
|
shape.properties.margins.left = property.split(':').last
|
|
21
|
-
|
|
20
|
+
elsif property.include?('margin-right')
|
|
22
21
|
shape.properties.margins.right = property.split(':').last
|
|
23
|
-
|
|
22
|
+
elsif property.include?('width')
|
|
24
23
|
shape.properties.size.width = property.split(':').last
|
|
25
|
-
|
|
24
|
+
elsif property.include?('height')
|
|
26
25
|
shape.properties.size.height = property.split(':').last
|
|
27
|
-
|
|
26
|
+
elsif property.include?('z-index')
|
|
28
27
|
shape.properties.z_index = property.split(':').last
|
|
29
|
-
|
|
28
|
+
elsif property.include?('position')
|
|
30
29
|
shape.properties.position = property.split(':').last
|
|
31
30
|
end
|
|
32
31
|
end
|
|
33
32
|
shape.properties.fill_color = Color.from_int16(shape_node.attribute('fillcolor').value.to_s.sub('#', '').split(' ').first) unless shape_node.attribute('fillcolor').nil?
|
|
34
33
|
shape.properties.stroke.weight = shape_node.attribute('strokeweight').value unless shape_node.attribute('strokeweight').nil?
|
|
35
34
|
shape.properties.stroke.color = Color.from_int16(shape_node.attribute('strokecolor').value.to_s.sub('#', '').split(' ').first) unless shape_node.attribute('strokecolor').nil?
|
|
36
|
-
shape.elements = TextBox.parse_list(shape_node.xpath('v:textbox').first
|
|
35
|
+
shape.elements = TextBox.parse_list(shape_node.xpath('v:textbox').first) unless shape_node.xpath('v:textbox').first.nil?
|
|
37
36
|
shape
|
|
38
37
|
end
|
|
39
38
|
end
|
data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/frame_properties.rb
CHANGED
|
@@ -29,7 +29,7 @@ module OoxmlParser
|
|
|
29
29
|
when 'yAlign'
|
|
30
30
|
frame_properties.vertical_align = value.value.to_sym
|
|
31
31
|
when 'anchorLock'
|
|
32
|
-
frame_properties.anchor_lock = OOXMLDocumentObject.option_enabled?(frame_pr_node, anchorLock)
|
|
32
|
+
frame_properties.anchor_lock = OOXMLDocumentObject.option_enabled?(frame_pr_node, 'anchorLock')
|
|
33
33
|
when 'vSpace'
|
|
34
34
|
frame_properties.vertical_space = (value.value.to_f / 566.9).round(2)
|
|
35
35
|
when 'hSpace'
|
data/lib/ooxml_parser/docx_parser/docx_data/document_structure/page_properties/page_properties.rb
CHANGED
|
@@ -28,10 +28,10 @@ module OoxmlParser
|
|
|
28
28
|
sect_pr.xpath('w:pgBorders').each do |pg_borders|
|
|
29
29
|
page_borders = Borders.new
|
|
30
30
|
unless pg_borders.attribute('display').nil?
|
|
31
|
-
page_borders.display = pg_borders.attribute('display').value
|
|
31
|
+
page_borders.display = pg_borders.attribute('display').value.to_sym
|
|
32
32
|
end
|
|
33
33
|
unless pg_borders.attribute('offsetFrom').nil?
|
|
34
|
-
page_borders.offset_from = pg_borders.attribute('offsetFrom').value
|
|
34
|
+
page_borders.offset_from = pg_borders.attribute('offsetFrom').value.to_sym
|
|
35
35
|
end
|
|
36
36
|
pg_borders.xpath('w:bottom').each do |bottom|
|
|
37
37
|
page_borders.bottom = BordersProperties.parse(bottom)
|
|
@@ -45,7 +45,7 @@ module OoxmlParser
|
|
|
45
45
|
pg_borders.xpath('w:right').each do |right|
|
|
46
46
|
page_borders.bottom = BordersProperties.parse(right)
|
|
47
47
|
end
|
|
48
|
-
page_properties.
|
|
48
|
+
page_properties.page_borders = page_borders
|
|
49
49
|
end
|
|
50
50
|
sect_pr.xpath('w:type').each do |type|
|
|
51
51
|
page_properties.type = type.attribute('val').value
|
|
@@ -68,17 +68,10 @@ module OoxmlParser
|
|
|
68
68
|
sect_pr.xpath('w:cols').each do |columns_grid|
|
|
69
69
|
page_properties.columns = Columns.parse(columns_grid)
|
|
70
70
|
end
|
|
71
|
-
sect_pr.xpath('w:headerReference').each do |
|
|
72
|
-
target = OOXMLDocumentObject.get_link_from_rels(
|
|
71
|
+
sect_pr.xpath('w:headerReference', 'w:footerReference').each do |doc_edge_reference|
|
|
72
|
+
target = OOXMLDocumentObject.get_link_from_rels(doc_edge_reference.attribute('id').value)
|
|
73
73
|
OOXMLDocumentObject.add_to_xmls_stack("word/#{target}")
|
|
74
|
-
note = Note.parse(default_paragraph, default_character, target,
|
|
75
|
-
page_properties.notes << note
|
|
76
|
-
OOXMLDocumentObject.xmls_stack.pop
|
|
77
|
-
end
|
|
78
|
-
sect_pr.xpath('w:footerReference').each do |footer_reference|
|
|
79
|
-
target = OOXMLDocumentObject.get_link_from_rels(footer_reference.attribute('id').value)
|
|
80
|
-
OOXMLDocumentObject.add_to_xmls_stack("word/#{target}")
|
|
81
|
-
note = Note.parse(default_paragraph, default_character, target, footer_reference.attribute('type').value, File.basename(target).sub('.xml', ''))
|
|
74
|
+
note = Note.parse(default_paragraph, default_character, target, doc_edge_reference.attribute('type').value, File.basename(target).sub('.xml', ''))
|
|
82
75
|
page_properties.notes << note
|
|
83
76
|
OOXMLDocumentObject.xmls_stack.pop
|
|
84
77
|
end
|
|
@@ -4,13 +4,9 @@ require_relative 'docx_data/document_structure'
|
|
|
4
4
|
module OoxmlParser
|
|
5
5
|
class DocxParser
|
|
6
6
|
def self.parse_docx(path_to_file)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
docx_model = DocumentStructure.parse(OOXMLDocumentObject.path_to_folder)
|
|
11
|
-
docx_model.file_path = path_to_file
|
|
12
|
-
FileUtils.remove_dir(OOXMLDocumentObject.path_to_folder)
|
|
13
|
-
docx_model
|
|
7
|
+
Parser.parse(path_to_file) do
|
|
8
|
+
DocumentStructure.parse
|
|
9
|
+
end
|
|
14
10
|
end
|
|
15
11
|
end
|
|
16
12
|
end
|
|
@@ -12,8 +12,7 @@ module OoxmlParser
|
|
|
12
12
|
@comments = comments
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
def self.parse
|
|
16
|
-
OOXMLDocumentObject.path_to_folder = path_to_folder
|
|
15
|
+
def self.parse
|
|
17
16
|
OOXMLDocumentObject.root_subfolder = 'ppt/'
|
|
18
17
|
OOXMLDocumentObject.xmls_stack = []
|
|
19
18
|
OOXMLDocumentObject.namespace_prefix = 'a'
|
|
@@ -17,7 +17,8 @@ module OoxmlParser
|
|
|
17
17
|
end
|
|
18
18
|
doc.xpath('p:cmAuthorLst/p:cmAuthor').each do |author_node|
|
|
19
19
|
comment_authors[author_node.attribute('id').value] = PresentationCommentAuthor.new(
|
|
20
|
-
author_node.attribute('id').value, author_node.attribute('name').value, author_node.attribute('initials').value
|
|
20
|
+
author_node.attribute('id').value, author_node.attribute('name').value, author_node.attribute('initials').value
|
|
21
|
+
)
|
|
21
22
|
end
|
|
22
23
|
comment_authors
|
|
23
24
|
end
|
|
@@ -17,7 +17,7 @@ module OoxmlParser
|
|
|
17
17
|
end
|
|
18
18
|
doc = Nokogiri::XML(File.open(OOXMLDocumentObject.current_xml))
|
|
19
19
|
doc.xpath('a:theme').each do |theme_node|
|
|
20
|
-
OOXMLDocumentObject.theme.name = theme_node.attribute('name').value
|
|
20
|
+
OOXMLDocumentObject.theme.name = theme_node.attribute('name').value if theme_node.attribute('name')
|
|
21
21
|
theme_node.xpath('a:themeElements/*').each do |theme_element_node|
|
|
22
22
|
case theme_element_node.name
|
|
23
23
|
when 'clrScheme'
|
|
@@ -20,20 +20,26 @@ module OoxmlParser
|
|
|
20
20
|
@elements.select { |cur_element| cur_element.is_a?(GraphicFrame) }
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
# Get transform property of object, by object type
|
|
24
|
+
# @param object [Symbol] type of object: :image, :chart, :table, :shape
|
|
25
|
+
# @return [OOXMLDocumentObject] needed object
|
|
26
|
+
def transform_of_object(object)
|
|
25
27
|
case object
|
|
26
28
|
when :image
|
|
27
|
-
|
|
29
|
+
return elements.find { |e| e.is_a? Picture }.properties.transform
|
|
28
30
|
when :chart
|
|
29
|
-
|
|
31
|
+
return elements.find { |e| e.is_a? GraphicFrame }.transform
|
|
30
32
|
when :table
|
|
31
|
-
|
|
33
|
+
return elements.find { |e| e.is_a? GraphicFrame }.transform
|
|
32
34
|
when :shape
|
|
33
|
-
|
|
35
|
+
return elements.find { |e| !e.shape_properties.preset.nil? }.shape_properties.transform
|
|
34
36
|
else
|
|
35
37
|
raise "Dont know this type object - #{object}"
|
|
36
38
|
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def content_horizontal_align(object, slide_size)
|
|
42
|
+
transform = transform_of_object(object)
|
|
37
43
|
return :left if transform.offset.x == 0
|
|
38
44
|
return :center if ((slide_size.width / 2) - (transform.extents.x / 2)).round(1) == transform.offset.x.round(1)
|
|
39
45
|
return :right if (slide_size.width - transform.extents.x).round(1) == transform.offset.x.round(1)
|
|
@@ -41,19 +47,7 @@ module OoxmlParser
|
|
|
41
47
|
end
|
|
42
48
|
|
|
43
49
|
def content_vertical_align(object, slide_size)
|
|
44
|
-
transform =
|
|
45
|
-
case object
|
|
46
|
-
when :image
|
|
47
|
-
transform = elements.find { |e| e.is_a? Picture }.properties.transform
|
|
48
|
-
when :chart
|
|
49
|
-
transform = elements.find { |e| e.is_a? GraphicFrame }.transform
|
|
50
|
-
when :table
|
|
51
|
-
transform = elements.find { |e| e.is_a? GraphicFrame }.transform
|
|
52
|
-
when :shape
|
|
53
|
-
transform = elements.find { |e| !e.shape_properties.preset.nil? }.shape_properties.transform
|
|
54
|
-
else
|
|
55
|
-
raise "Dont know this type object - #{object}"
|
|
56
|
-
end
|
|
50
|
+
transform = transform_of_object(object)
|
|
57
51
|
return :top if transform.offset.y == 0
|
|
58
52
|
return :middle if ((slide_size.height / 2) - (transform.extents.y / 2)).round(1) == transform.offset.y.round(1)
|
|
59
53
|
return :bottom if (slide_size.height - transform.extents.y).round(1) == transform.offset.y.round(1)
|