ooxml_parser 0.27.0 → 0.30.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ooxml_parser/common_parser/common_data/alternate_content/chart/chart.rb +4 -4
- data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/graphic/docx_graphic.rb +2 -2
- data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/graphic/picture/docx_blip/file_reference.rb +16 -3
- data/lib/ooxml_parser/common_parser/common_data/content_types.rb +1 -1
- data/lib/ooxml_parser/common_parser/common_data/hyperlink.rb +3 -3
- data/lib/ooxml_parser/common_parser/common_data/ooxml_document_object.rb +2 -91
- data/lib/ooxml_parser/common_parser/common_document_structure.rb +38 -0
- data/lib/ooxml_parser/common_parser/parser/ooxml_file.rb +68 -0
- data/lib/ooxml_parser/common_parser/parser.rb +32 -38
- data/lib/ooxml_parser/docx_parser/document_structure/comments.rb +1 -1
- data/lib/ooxml_parser/docx_parser/document_structure/comments_extended.rb +1 -1
- data/lib/ooxml_parser/docx_parser/document_structure/document_properties.rb +1 -1
- data/lib/ooxml_parser/docx_parser/document_structure/document_settings.rb +1 -1
- data/lib/ooxml_parser/docx_parser/document_structure/document_style.rb +8 -2
- data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph.rb +7 -18
- data/lib/ooxml_parser/docx_parser/document_structure/header_footer.rb +1 -1
- data/lib/ooxml_parser/docx_parser/document_structure/numbering.rb +1 -1
- data/lib/ooxml_parser/docx_parser/document_structure/page_properties/note.rb +2 -2
- data/lib/ooxml_parser/docx_parser/document_structure/page_properties/page_properties.rb +3 -3
- data/lib/ooxml_parser/docx_parser/document_structure/styles.rb +1 -1
- data/lib/ooxml_parser/docx_parser/document_structure.rb +34 -36
- data/lib/ooxml_parser/docx_parser.rb +3 -2
- data/lib/ooxml_parser/pptx_parser/presentation/comment_authors.rb +1 -1
- data/lib/ooxml_parser/pptx_parser/presentation/presentation_comments.rb +1 -1
- data/lib/ooxml_parser/pptx_parser/presentation/presentation_theme.rb +23 -23
- data/lib/ooxml_parser/pptx_parser/presentation/slide/graphic_frame/graphic_frame.rb +2 -2
- data/lib/ooxml_parser/pptx_parser/presentation/slide.rb +5 -5
- data/lib/ooxml_parser/pptx_parser/presentation/slide_layout_file.rb +2 -2
- data/lib/ooxml_parser/pptx_parser/presentation/slide_layouts_helper.rb +1 -1
- data/lib/ooxml_parser/pptx_parser/presentation/slide_master_file.rb +2 -2
- data/lib/ooxml_parser/pptx_parser/presentation/slide_masters_helper.rb +1 -1
- data/lib/ooxml_parser/pptx_parser/presentation/table_styles.rb +1 -1
- data/lib/ooxml_parser/pptx_parser/presentation.rb +7 -8
- data/lib/ooxml_parser/pptx_parser.rb +3 -2
- data/lib/ooxml_parser/version.rb +1 -1
- data/lib/ooxml_parser/xlsx_parser/workbook/chartsheet.rb +3 -3
- data/lib/ooxml_parser/xlsx_parser/workbook/pivot_cache.rb +1 -1
- data/lib/ooxml_parser/xlsx_parser/workbook/pivot_table_definition.rb +1 -1
- data/lib/ooxml_parser/xlsx_parser/workbook/style_sheet.rb +1 -1
- data/lib/ooxml_parser/xlsx_parser/workbook/worksheet/table_part.rb +2 -2
- data/lib/ooxml_parser/xlsx_parser/workbook/worksheet.rb +11 -11
- data/lib/ooxml_parser/xlsx_parser/workbook.rb +7 -8
- data/lib/ooxml_parser/xlsx_parser.rb +3 -2
- metadata +4 -4
- data/lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/style_parametres.rb +0 -30
@@ -44,7 +44,7 @@ module OoxmlParser
|
|
44
44
|
# @return [CommentsExtended] extended comments
|
45
45
|
attr_accessor :comments_extended
|
46
46
|
|
47
|
-
def initialize
|
47
|
+
def initialize(params = {})
|
48
48
|
@elements = []
|
49
49
|
@notes = []
|
50
50
|
@document_properties = DocumentProperties.new
|
@@ -156,67 +156,65 @@ module OoxmlParser
|
|
156
156
|
|
157
157
|
# Parse docx file
|
158
158
|
# @return [DocumentStructure] parsed structure
|
159
|
-
def
|
160
|
-
|
161
|
-
|
162
|
-
OOXMLDocumentObject.root_subfolder = 'word/'
|
163
|
-
OOXMLDocumentObject.xmls_stack = []
|
159
|
+
def parse
|
160
|
+
@content_types = ContentTypes.new(parent: self).parse
|
161
|
+
@root_subfolder = 'word/'
|
164
162
|
@comments = []
|
165
163
|
DocumentStructure.default_paragraph_style = DocxParagraph.new
|
166
|
-
DocumentStructure.default_run_style = DocxParagraphRun.new(parent:
|
167
|
-
|
168
|
-
|
169
|
-
|
164
|
+
DocumentStructure.default_run_style = DocxParagraphRun.new(parent: self)
|
165
|
+
@theme = PresentationTheme.new(parent: self).parse('word/theme/theme1.xml')
|
166
|
+
@relationships = Relationships.new(parent: self).parse_file("#{root_object.unpacked_folder}word/_rels/document.xml.rels")
|
167
|
+
parse_styles
|
170
168
|
number = 0
|
171
|
-
|
172
|
-
doc =
|
169
|
+
root_object.add_to_xmls_stack('word/document.xml')
|
170
|
+
doc = parse_xml(root_object.current_xml)
|
173
171
|
doc.search('//w:document').each do |document|
|
174
172
|
document.xpath('w:background').each do |background|
|
175
|
-
|
173
|
+
@background = DocumentBackground.new(parent: self).parse(background)
|
176
174
|
end
|
177
175
|
document.xpath('w:body').each do |body|
|
178
176
|
body.xpath('*').each do |element|
|
179
177
|
case element.name
|
180
178
|
when 'p'
|
181
179
|
child = element.child
|
182
|
-
unless child.nil? &&
|
183
|
-
paragraph_style = DocumentStructure.default_paragraph_style.dup.parse(element, number, DocumentStructure.default_run_style, parent:
|
180
|
+
unless child.nil? && @elements.last.instance_of?(Table)
|
181
|
+
paragraph_style = DocumentStructure.default_paragraph_style.dup.parse(element, number, DocumentStructure.default_run_style, parent: self)
|
184
182
|
number += 1
|
185
|
-
|
183
|
+
@elements << paragraph_style.dup
|
186
184
|
end
|
187
185
|
when 'tbl'
|
188
|
-
table = Table.new(parent:
|
189
|
-
|
190
|
-
|
186
|
+
table = Table.new(parent: self).parse(element,
|
187
|
+
number,
|
188
|
+
TableProperties.new)
|
191
189
|
number += 1
|
192
|
-
|
190
|
+
@elements << table
|
193
191
|
when 'sdt'
|
194
|
-
|
192
|
+
@elements << StructuredDocumentTag.new(parent: self).parse(element)
|
195
193
|
end
|
196
194
|
end
|
197
195
|
body.xpath('w:sectPr').each do |sect_pr|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
196
|
+
@page_properties = PageProperties.new(parent: self).parse(sect_pr,
|
197
|
+
DocumentStructure.default_paragraph_style,
|
198
|
+
DocumentStructure.default_run_style)
|
199
|
+
@notes = page_properties.notes # keep copy of notes to compatibility with previous docx models
|
202
200
|
end
|
203
201
|
end
|
204
202
|
end
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
203
|
+
root_object.xmls_stack.pop
|
204
|
+
@document_properties = DocumentProperties.new(parent: self).parse
|
205
|
+
@comments = Comments.new(parent: self).parse
|
206
|
+
@comments_extended = CommentsExtended.new(parent: self).parse
|
207
|
+
@comments_document = Comments.new(parent: self,
|
208
|
+
file: "#{root_object.unpacked_folder}word/#{relationships.target_by_type('commentsDocument').first}")
|
209
|
+
.parse
|
210
|
+
@settings = DocumentSettings.new(parent: self).parse
|
211
|
+
self
|
214
212
|
end
|
215
213
|
|
216
214
|
# Parse default style
|
217
215
|
# @return [void]
|
218
216
|
def parse_default_style
|
219
|
-
doc = parse_xml("#{
|
217
|
+
doc = parse_xml("#{root_object.unpacked_folder}word/styles.xml")
|
220
218
|
doc.search('//w:style').each do |style|
|
221
219
|
next if style.attribute('default').nil?
|
222
220
|
|
@@ -257,7 +255,7 @@ module OoxmlParser
|
|
257
255
|
|
258
256
|
# Perform parsing styles.xml
|
259
257
|
def parse_styles
|
260
|
-
file = "#{
|
258
|
+
file = "#{root_object.unpacked_folder}/word/styles.xml"
|
261
259
|
DocumentStructure.default_paragraph_style = DocxParagraph.new(parent: self)
|
262
260
|
DocumentStructure.default_table_paragraph_style = DocxParagraph.new(parent: self)
|
263
261
|
DocumentStructure.default_run_style = DocxParagraphRun.new(parent: self)
|
@@ -10,8 +10,9 @@ module OoxmlParser
|
|
10
10
|
# @param path_to_file [String] file path
|
11
11
|
# @return [DocumentStructure] result of parse
|
12
12
|
def self.parse_docx(path_to_file)
|
13
|
-
|
14
|
-
|
13
|
+
file = OoxmlFile.new(path_to_file)
|
14
|
+
Parser.parse_format(file) do |yielded_file|
|
15
|
+
DocumentStructure.new(unpacked_folder: yielded_file.path_to_folder).parse
|
15
16
|
end
|
16
17
|
end
|
17
18
|
end
|
@@ -15,7 +15,7 @@ module OoxmlParser
|
|
15
15
|
# Parse CommentAuthors object
|
16
16
|
# @param file [Nokogiri::XML:Element] node to parse
|
17
17
|
# @return [CommentAuthors] result of parsing
|
18
|
-
def parse(file = "#{
|
18
|
+
def parse(file = "#{root_object.unpacked_folder}/#{root_object.root_subfolder}/commentAuthors.xml")
|
19
19
|
return nil unless File.exist?(file)
|
20
20
|
|
21
21
|
document = parse_xml(File.open(file))
|
@@ -15,7 +15,7 @@ module OoxmlParser
|
|
15
15
|
# Parse PresentationComments object
|
16
16
|
# @param file [Nokogiri::XML:Element] node to parse
|
17
17
|
# @return [PresentationComments] result of parsing
|
18
|
-
def parse(file = "#{
|
18
|
+
def parse(file = "#{root_object.unpacked_folder}/#{root_object.root_subfolder}/comments/comment1.xml")
|
19
19
|
return nil unless File.exist?(file)
|
20
20
|
|
21
21
|
document = parse_xml(File.open(file))
|
@@ -9,46 +9,46 @@ module OoxmlParser
|
|
9
9
|
# @return [FontScheme] font scheme
|
10
10
|
attr_accessor :font_scheme
|
11
11
|
|
12
|
-
def initialize(
|
13
|
-
@name =
|
14
|
-
@color_scheme =
|
15
|
-
super
|
12
|
+
def initialize(parent: nil)
|
13
|
+
@name = ''
|
14
|
+
@color_scheme = {}
|
15
|
+
super
|
16
16
|
end
|
17
17
|
|
18
18
|
# Parse PresentationTheme
|
19
19
|
# @param file [String] path to file to parse
|
20
20
|
# @return [PresentationTheme] result of parsing
|
21
|
-
def
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
OOXMLDocumentObject.xmls_stack.pop
|
21
|
+
def parse(file)
|
22
|
+
root_object.add_to_xmls_stack(file)
|
23
|
+
unless File.exist?(root_object.current_xml)
|
24
|
+
root_object.xmls_stack.pop
|
26
25
|
return
|
27
26
|
end
|
28
|
-
doc =
|
27
|
+
doc = parse_xml(root_object.current_xml)
|
28
|
+
|
29
29
|
doc.xpath('a:theme').each do |theme_node|
|
30
|
-
|
30
|
+
@name = theme_node.attribute('name').value if theme_node.attribute('name')
|
31
31
|
theme_node.xpath('a:themeElements/*').each do |theme_element_node|
|
32
32
|
case theme_element_node.name
|
33
33
|
when 'clrScheme'
|
34
34
|
theme_element_node.xpath('*').each do |color_scheme_element|
|
35
|
-
|
35
|
+
@color_scheme[color_scheme_element.name.to_sym] = ThemeColor.new.parse(color_scheme_element)
|
36
36
|
end
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
37
|
+
@color_scheme[:background1] = @color_scheme[:lt1]
|
38
|
+
@color_scheme[:background2] = @color_scheme[:lt2]
|
39
|
+
@color_scheme[:bg1] = @color_scheme[:lt1]
|
40
|
+
@color_scheme[:bg2] = @color_scheme[:lt2]
|
41
|
+
@color_scheme[:text1] = @color_scheme[:dk1]
|
42
|
+
@color_scheme[:text2] = @color_scheme[:dk2]
|
43
|
+
@color_scheme[:tx1] = @color_scheme[:dk1]
|
44
|
+
@color_scheme[:tx2] = @color_scheme[:dk2]
|
45
45
|
when 'fontScheme'
|
46
|
-
|
46
|
+
@font_scheme = FontScheme.new(parent: self).parse(theme_element_node)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
50
|
-
|
51
|
-
|
50
|
+
root_object.xmls_stack.pop
|
51
|
+
self
|
52
52
|
end
|
53
53
|
end
|
54
54
|
end
|
@@ -30,9 +30,9 @@ module OoxmlParser
|
|
30
30
|
when 'tbl'
|
31
31
|
graphic_data << Table.new(parent: self).parse(graphic_node_child)
|
32
32
|
when 'chart'
|
33
|
-
|
33
|
+
root_object.add_to_xmls_stack(root_object.get_link_from_rels(graphic_node_child.attribute('id').value))
|
34
34
|
graphic_data << Chart.new(parent: self).parse
|
35
|
-
|
35
|
+
root_object.xmls_stack.pop
|
36
36
|
when 'oleObj'
|
37
37
|
graphic_data << OleObject.new(parent: self).parse(graphic_node_child)
|
38
38
|
end
|
@@ -51,9 +51,9 @@ module OoxmlParser
|
|
51
51
|
# Parse Slide object
|
52
52
|
# @return [Slide] result of parsing
|
53
53
|
def parse
|
54
|
-
|
54
|
+
root_object.add_to_xmls_stack(@xml_path)
|
55
55
|
@name = File.basename(@xml_path, '.*')
|
56
|
-
node = parse_xml(
|
56
|
+
node = parse_xml(root_object.current_xml)
|
57
57
|
node.xpath('//p:sld/*').each do |node_child|
|
58
58
|
case node_child.name
|
59
59
|
when 'cSld'
|
@@ -66,8 +66,8 @@ module OoxmlParser
|
|
66
66
|
@alternate_content = PresentationAlternateContent.new(parent: self).parse(node_child)
|
67
67
|
end
|
68
68
|
end
|
69
|
-
|
70
|
-
@relationships = Relationships.new(parent: self).parse_file("#{
|
69
|
+
root_object.xmls_stack.pop
|
70
|
+
@relationships = Relationships.new(parent: self).parse_file("#{root_object.unpacked_folder}#{File.dirname(@xml_path)}/_rels/#{@name}.xml.rels")
|
71
71
|
parse_note
|
72
72
|
self
|
73
73
|
end
|
@@ -79,7 +79,7 @@ module OoxmlParser
|
|
79
79
|
notes_target = @relationships.target_by_type('notes')
|
80
80
|
return nil if notes_target.empty?
|
81
81
|
|
82
|
-
@note = PresentationNotes.new(parent: self).parse("#{
|
82
|
+
@note = PresentationNotes.new(parent: self).parse("#{root_object.unpacked_folder}#{File.dirname(@xml_path)}/#{notes_target.first}")
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
@@ -10,7 +10,7 @@ module OoxmlParser
|
|
10
10
|
# @param file [String] path to file to parse
|
11
11
|
# @return [SlideLayoutFile] result of parsing
|
12
12
|
def parse(file)
|
13
|
-
|
13
|
+
root_object.add_to_xmls_stack(file.gsub(root_object.unpacked_folder, ''))
|
14
14
|
doc = parse_xml(file)
|
15
15
|
doc.xpath('p:sldLayout/*').each do |node_child|
|
16
16
|
case node_child.name
|
@@ -18,7 +18,7 @@ module OoxmlParser
|
|
18
18
|
@common_slide_data = CommonSlideData.new(parent: self).parse(node_child)
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
21
|
+
root_object.xmls_stack.pop
|
22
22
|
self
|
23
23
|
end
|
24
24
|
end
|
@@ -5,7 +5,7 @@ module OoxmlParser
|
|
5
5
|
module SlideLayoutsHelper
|
6
6
|
# @return [Array<String>] list of slide layouts files
|
7
7
|
def slide_layouts_files
|
8
|
-
Dir["#{
|
8
|
+
Dir["#{root_object.unpacked_folder}ppt/slideLayouts/*.xml"]
|
9
9
|
end
|
10
10
|
|
11
11
|
private
|
@@ -10,7 +10,7 @@ module OoxmlParser
|
|
10
10
|
# @param file [String] path to file to parse
|
11
11
|
# @return [SlideMasterFile] result of parsing
|
12
12
|
def parse(file)
|
13
|
-
|
13
|
+
root_object.add_to_xmls_stack(file.gsub(root_object.unpacked_folder, ''))
|
14
14
|
doc = parse_xml(file)
|
15
15
|
doc.xpath('p:sldMaster/*').each do |node_child|
|
16
16
|
case node_child.name
|
@@ -18,7 +18,7 @@ module OoxmlParser
|
|
18
18
|
@common_slide_data = CommonSlideData.new(parent: self).parse(node_child)
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
21
|
+
root_object.xmls_stack.pop
|
22
22
|
self
|
23
23
|
end
|
24
24
|
end
|
@@ -5,7 +5,7 @@ module OoxmlParser
|
|
5
5
|
module SlideMastersHelper
|
6
6
|
# @return [Array<String>] list of slide masters files
|
7
7
|
def slide_masters_files
|
8
|
-
Dir["#{
|
8
|
+
Dir["#{root_object.unpacked_folder}ppt/slideMasters/*.xml"]
|
9
9
|
end
|
10
10
|
|
11
11
|
private
|
@@ -14,7 +14,7 @@ module OoxmlParser
|
|
14
14
|
# Parse TableStyles object
|
15
15
|
# @param file [Nokogiri::XML:Element] node to parse
|
16
16
|
# @return [TableStyles] result of parsing
|
17
|
-
def parse(file = "#{
|
17
|
+
def parse(file = "#{root_object.unpacked_folder}/#{root_object.root_subfolder}/tableStyles.xml")
|
18
18
|
return nil unless File.exist?(file)
|
19
19
|
|
20
20
|
document = parse_xml(file)
|
@@ -43,11 +43,10 @@ module OoxmlParser
|
|
43
43
|
# @return [Presentation] parsed presentation
|
44
44
|
def parse
|
45
45
|
@content_types = ContentTypes.new(parent: self).parse
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
@theme = PresentationTheme.parse('ppt/theme/theme1.xml')
|
46
|
+
@root_subfolder = 'ppt/'
|
47
|
+
root_object.add_to_xmls_stack('ppt/presentation.xml')
|
48
|
+
doc = parse_xml(root_object.current_xml)
|
49
|
+
@theme = PresentationTheme.new(parent: self).parse('ppt/theme/theme1.xml')
|
51
50
|
@table_styles = TableStyles.new(parent: self).parse
|
52
51
|
@comment_authors = CommentAuthors.new(parent: self).parse
|
53
52
|
@comments = PresentationComments.new(parent: self).parse
|
@@ -60,13 +59,13 @@ module OoxmlParser
|
|
60
59
|
presentation_node_child.xpath('p:sldId').each do |silde_id_node|
|
61
60
|
slide_id = silde_id_node.attr('r:id')
|
62
61
|
@slides << Slide.new(parent: self,
|
63
|
-
xml_path: "#{
|
62
|
+
xml_path: "#{root_object.root_subfolder}/#{root_object.get_link_from_rels(slide_id)}")
|
64
63
|
.parse
|
65
64
|
end
|
66
65
|
end
|
67
66
|
end
|
68
|
-
|
69
|
-
@relationships = Relationships.new(parent: self).parse_file("#{
|
67
|
+
root_object.xmls_stack.pop
|
68
|
+
@relationships = Relationships.new(parent: self).parse_file("#{root_object.unpacked_folder}/ppt/_rels/presentation.xml.rels")
|
70
69
|
parse_slide_layouts
|
71
70
|
parse_slide_masters
|
72
71
|
self
|
@@ -9,8 +9,9 @@ module OoxmlParser
|
|
9
9
|
# @param path_to_file [String] file path
|
10
10
|
# @return [Presentation] result of parse
|
11
11
|
def self.parse_pptx(path_to_file)
|
12
|
-
|
13
|
-
|
12
|
+
file = OoxmlFile.new(path_to_file)
|
13
|
+
Parser.parse_format(file) do |yielded_file|
|
14
|
+
Presentation.new(unpacked_folder: yielded_file.path_to_folder).parse
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
data/lib/ooxml_parser/version.rb
CHANGED
@@ -15,8 +15,8 @@ module OoxmlParser
|
|
15
15
|
# @param file [String] file to parse
|
16
16
|
# @return [Chartsheet] result of parsing
|
17
17
|
def parse(file)
|
18
|
-
|
19
|
-
doc = parse_xml(
|
18
|
+
root_object.add_to_xmls_stack(root_object.root_subfolder + file)
|
19
|
+
doc = parse_xml(root_object.current_xml)
|
20
20
|
node = doc.xpath('//xmlns:chartsheet').first
|
21
21
|
node.xpath('*').each do |node_child|
|
22
22
|
case node_child.name
|
@@ -26,7 +26,7 @@ module OoxmlParser
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
29
|
-
|
29
|
+
root_object.xmls_stack.pop
|
30
30
|
self
|
31
31
|
end
|
32
32
|
end
|
@@ -33,7 +33,7 @@ module OoxmlParser
|
|
33
33
|
# @return [PivotCacheDefinition] pivot cache definition for current pivot cache
|
34
34
|
def parse_pivot_cache_definition
|
35
35
|
definition_file = root_object.relationships.target_by_id(id)
|
36
|
-
full_file_path = "#{
|
36
|
+
full_file_path = "#{root_object.unpacked_folder}/xl/#{definition_file}"
|
37
37
|
@pivot_cache_definition = PivotCacheDefinition.new(parent: root_object)
|
38
38
|
.parse(full_file_path)
|
39
39
|
end
|
@@ -55,7 +55,7 @@ module OoxmlParser
|
|
55
55
|
# @param [String] file path
|
56
56
|
# @return [PivotTableDefinition] result of parsing
|
57
57
|
def parse(file)
|
58
|
-
doc = Nokogiri::XML.parse(File.open("#{
|
58
|
+
doc = Nokogiri::XML.parse(File.open("#{root_object.unpacked_folder}/#{file}"))
|
59
59
|
node = doc.xpath('//xmlns:pivotTableDefinition').first
|
60
60
|
node.attributes.each do |key, value|
|
61
61
|
case key
|
@@ -32,7 +32,7 @@ module OoxmlParser
|
|
32
32
|
# Parse StyleSheet object
|
33
33
|
# @return [StyleSheet] result of parsing
|
34
34
|
def parse
|
35
|
-
doc = parse_xml("#{
|
35
|
+
doc = parse_xml("#{root_object.unpacked_folder}/#{root_object.root_subfolder}/styles.xml")
|
36
36
|
doc.root.xpath('*').each do |node_child|
|
37
37
|
case node_child.name
|
38
38
|
when 'numFmts'
|
@@ -19,8 +19,8 @@ module OoxmlParser
|
|
19
19
|
# @param node [Nokogiri::XML:Element] node to parse
|
20
20
|
# @return [TablePart] result of parsing
|
21
21
|
def parse(node)
|
22
|
-
link_to_table_part_xml =
|
23
|
-
doc = parse_xml(
|
22
|
+
link_to_table_part_xml = root_object.get_link_from_rels(node.attribute('id').value)
|
23
|
+
doc = parse_xml(root_object.unpacked_folder + link_to_table_part_xml.gsub('..', 'xl'))
|
24
24
|
table_node = doc.xpath('xmlns:table').first
|
25
25
|
table_node.attributes.each do |key, value|
|
26
26
|
case key
|
@@ -61,9 +61,9 @@ module OoxmlParser
|
|
61
61
|
# Perform parsing of relationships
|
62
62
|
# @return [nil]
|
63
63
|
def parse_relationships
|
64
|
-
|
65
|
-
@relationships = Relationships.new(parent: self).parse_file(
|
66
|
-
|
64
|
+
root_object.add_to_xmls_stack("#{root_object.root_subfolder}/worksheets/_rels/#{@xml_name}.rels")
|
65
|
+
@relationships = Relationships.new(parent: self).parse_file(root_object.current_xml) if File.exist?(root_object.current_xml)
|
66
|
+
root_object.xmls_stack.pop
|
67
67
|
end
|
68
68
|
|
69
69
|
# @return [True, false] if structure contain any user data
|
@@ -79,7 +79,7 @@ module OoxmlParser
|
|
79
79
|
|
80
80
|
# Parse list of drawings in file
|
81
81
|
def parse_drawing
|
82
|
-
drawing_node = parse_xml(
|
82
|
+
drawing_node = parse_xml(root_object.current_xml)
|
83
83
|
drawing_node.xpath('xdr:wsDr/*').each do |drawing_node_child|
|
84
84
|
@drawings << XlsxDrawing.new(parent: self).parse(drawing_node_child)
|
85
85
|
end
|
@@ -91,8 +91,8 @@ module OoxmlParser
|
|
91
91
|
def parse(path_to_xml_file)
|
92
92
|
@xml_name = File.basename path_to_xml_file
|
93
93
|
parse_relationships
|
94
|
-
|
95
|
-
doc = parse_xml(
|
94
|
+
root_object.add_to_xmls_stack("#{root_object.root_subfolder}/worksheets/#{File.basename(path_to_xml_file)}")
|
95
|
+
doc = parse_xml(root_object.current_xml)
|
96
96
|
sheet = doc.search('//xmlns:worksheet').first
|
97
97
|
sheet.xpath('*').each do |worksheet_node_child|
|
98
98
|
case worksheet_node_child.name
|
@@ -107,11 +107,11 @@ module OoxmlParser
|
|
107
107
|
@merge << merge_node.attribute('ref').value.to_s
|
108
108
|
end
|
109
109
|
when 'drawing'
|
110
|
-
path_to_drawing =
|
110
|
+
path_to_drawing = root_object.get_link_from_rels(worksheet_node_child.attribute('id').value)
|
111
111
|
unless path_to_drawing.nil?
|
112
|
-
|
112
|
+
root_object.add_to_xmls_stack(path_to_drawing)
|
113
113
|
parse_drawing
|
114
|
-
|
114
|
+
root_object.xmls_stack.pop
|
115
115
|
end
|
116
116
|
when 'hyperlinks'
|
117
117
|
worksheet_node_child.xpath('xmlns:hyperlink').each do |hyperlink_node|
|
@@ -150,7 +150,7 @@ module OoxmlParser
|
|
150
150
|
end
|
151
151
|
end
|
152
152
|
parse_comments
|
153
|
-
|
153
|
+
root_object.xmls_stack.pop
|
154
154
|
self
|
155
155
|
end
|
156
156
|
|
@@ -175,7 +175,7 @@ module OoxmlParser
|
|
175
175
|
comments_target = relationships.target_by_type('comment')
|
176
176
|
return if comments_target.empty?
|
177
177
|
|
178
|
-
comments_file = "#{
|
178
|
+
comments_file = "#{root_object.unpacked_folder}/#{root_object.root_subfolder}/#{comments_target.first.gsub('..', '')}"
|
179
179
|
@comments = ExcelComments.new(parent: self).parse(comments_file)
|
180
180
|
end
|
181
181
|
end
|
@@ -109,7 +109,7 @@ module OoxmlParser
|
|
109
109
|
shared_strings_target = relationships.target_by_type('sharedString')
|
110
110
|
return if shared_strings_target.empty?
|
111
111
|
|
112
|
-
shared_string_file = "#{
|
112
|
+
shared_string_file = "#{root_object.unpacked_folder}/xl/#{shared_strings_target.first}"
|
113
113
|
@shared_strings_table = SharedStringTable.new(parent: self).parse(shared_string_file)
|
114
114
|
end
|
115
115
|
|
@@ -117,13 +117,12 @@ module OoxmlParser
|
|
117
117
|
# @return [XLSXWorkbook]
|
118
118
|
def parse
|
119
119
|
@content_types = ContentTypes.new(parent: self).parse
|
120
|
-
@relationships = Relationships.new(parent: self).parse_file("#{
|
120
|
+
@relationships = Relationships.new(parent: self).parse_file("#{root_object.unpacked_folder}xl/_rels/workbook.xml.rels")
|
121
121
|
parse_shared_strings
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
@
|
126
|
-
@theme = PresentationTheme.parse("xl/#{link_to_theme_xml}") if link_to_theme_xml
|
122
|
+
@root_subfolder = 'xl/'
|
123
|
+
root_object.add_to_xmls_stack('xl/workbook.xml')
|
124
|
+
@doc = Nokogiri::XML.parse(File.open(root_object.current_xml))
|
125
|
+
@theme = PresentationTheme.new(parent: self).parse("xl/#{link_to_theme_xml}") if link_to_theme_xml
|
127
126
|
@style_sheet = StyleSheet.new(parent: self).parse
|
128
127
|
@doc.xpath('xmlns:workbook/xmlns:sheets/xmlns:sheet').each do |sheet|
|
129
128
|
@sheets << Sheet.new(parent: self).parse(sheet)
|
@@ -139,7 +138,7 @@ module OoxmlParser
|
|
139
138
|
parse_pivot_table
|
140
139
|
parse_defined_names
|
141
140
|
parse_workbook_protection
|
142
|
-
|
141
|
+
root_object.xmls_stack.pop
|
143
142
|
self
|
144
143
|
end
|
145
144
|
|
@@ -9,8 +9,9 @@ module OoxmlParser
|
|
9
9
|
# @param path_to_file [String] file path
|
10
10
|
# @return [XLSXWorkbook] result of parse
|
11
11
|
def self.parse_xlsx(path_to_file)
|
12
|
-
|
13
|
-
|
12
|
+
file = OoxmlFile.new(path_to_file)
|
13
|
+
Parser.parse_format(file) do |yielded_file|
|
14
|
+
XLSXWorkbook.new(unpacked_folder: yielded_file.path_to_folder).parse
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ooxml_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.30.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ONLYOFFICE
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2022-
|
13
|
+
date: 2022-09-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: nokogiri
|
@@ -363,6 +363,7 @@ files:
|
|
363
363
|
- lib/ooxml_parser/common_parser/common_document_structure.rb
|
364
364
|
- lib/ooxml_parser/common_parser/parser.rb
|
365
365
|
- lib/ooxml_parser/common_parser/parser/encryption_checker.rb
|
366
|
+
- lib/ooxml_parser/common_parser/parser/ooxml_file.rb
|
366
367
|
- lib/ooxml_parser/configuration.rb
|
367
368
|
- lib/ooxml_parser/docx_parser.rb
|
368
369
|
- lib/ooxml_parser/docx_parser/document_structure.rb
|
@@ -423,7 +424,6 @@ files:
|
|
423
424
|
- lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_content.rb
|
424
425
|
- lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/sdt/sdt_properties.rb
|
425
426
|
- lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/structured_document_tag.rb
|
426
|
-
- lib/ooxml_parser/docx_parser/document_structure/docx_paragraph/style_parametres.rb
|
427
427
|
- lib/ooxml_parser/docx_parser/document_structure/header_footer.rb
|
428
428
|
- lib/ooxml_parser/docx_parser/document_structure/numbering.rb
|
429
429
|
- lib/ooxml_parser/docx_parser/document_structure/numbering/abstract_numbering.rb
|
@@ -608,7 +608,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
608
608
|
- !ruby/object:Gem::Version
|
609
609
|
version: '0'
|
610
610
|
requirements: []
|
611
|
-
rubygems_version: 3.3.
|
611
|
+
rubygems_version: 3.3.22
|
612
612
|
signing_key:
|
613
613
|
specification_version: 4
|
614
614
|
summary: OoxmlParser Gem
|