ooxml_parser 0.17.0 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0237d3a93d29a2948634cd1e3f4c9c414347ee39176aad7d3c7e75e55b2a8314
4
- data.tar.gz: e423b10a5309aac333a95be460b863cc2cbea1449b866817dafbe427c092bf34
3
+ metadata.gz: ed12c90b346ab55a8a41932a3fb957bfbddccf71fdedf15ec6f7b140b1be88eb
4
+ data.tar.gz: 24bff23c9c3f29cfac0e6db68def27199d984366c07b951fe5adb0f88e54468d
5
5
  SHA512:
6
- metadata.gz: 22783602daacb4933c941023d39757fd4dddef2adc64dcd58e6ef70ad6141b764b300e65745b50691cf138e2b212ccbd8ed542d0cbbe8b62dc0cc905d47760ed
7
- data.tar.gz: 4a1843d681f5253234eeb4bf33c240db9ea46f2ab43f219a0a391297475a4f1716ba4b7915599bcb06ad41605071190e4788f6516ce43983c5d3f0846ea78dc8
6
+ metadata.gz: '09bad9d23a5157e19fecf0989ac7c812a0b300920c5978f9f6c8ea9241e311dd4e3f3c68f965b52955eba1791c46b46ef22f47728148583e7a0a703d7aaadff0'
7
+ data.tar.gz: c31c20c9a9ca7e4ade83b93653d8d04eed3117a822d9a81d4b9f10f1d7323bb164c281e0f4b75a5c061acb430ee8d08e424a9a8c723c3346dbc74fddd0ed4685
@@ -35,7 +35,7 @@ module OoxmlParser
35
35
 
36
36
  full_path_to_file = OOXMLDocumentObject.path_to_folder + OOXMLDocumentObject.root_subfolder + @path.gsub('..', '')
37
37
  if File.exist?(full_path_to_file)
38
- @content = IO.binread(full_path_to_file)
38
+ @content = File.binread(full_path_to_file)
39
39
  else
40
40
  warn "Couldn't find #{full_path_to_file} file on filesystem. Possible problem in original document"
41
41
  end
@@ -76,14 +76,29 @@ module OoxmlParser
76
76
  @action = :last_slide
77
77
  when 'ppaction://hlinksldjump'
78
78
  @action = :slide
79
- @url = OOXMLDocumentObject.get_link_from_rels(@id).scan(/\d+/).join.to_i
79
+ parse_url_for_slide_link
80
80
  else
81
- if @id && !@id.empty?
81
+ if meaningful_id?
82
82
  @action = :external_link
83
83
  @url = OOXMLDocumentObject.get_link_from_rels(@id)
84
84
  end
85
85
  end
86
86
  self
87
87
  end
88
+
89
+ private
90
+
91
+ # Check if id parameter has any information in it
92
+ # @return [Boolean] Can id be used
93
+ def meaningful_id?
94
+ @id && !@id.empty?
95
+ end
96
+
97
+ # Parse url for slide link
98
+ def parse_url_for_slide_link
99
+ return unless meaningful_id?
100
+
101
+ @url = OOXMLDocumentObject.get_link_from_rels(@id).scan(/\d+/).join.to_i
102
+ end
88
103
  end
89
104
  end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Exception for Nokogiri parsing error
5
+ class NokogiriParsingException < StandardError; end
6
+ end
@@ -4,6 +4,7 @@ require 'filemagic' unless Gem.win_platform?
4
4
  require 'securerandom'
5
5
  require 'nokogiri'
6
6
  require 'zip'
7
+ require_relative 'ooxml_document_object/nokogiri_parsing_exception'
7
8
  require_relative 'ooxml_document_object/ooxml_document_object_helper'
8
9
  require_relative 'ooxml_document_object/ooxml_object_attribute_helper'
9
10
 
@@ -39,7 +40,12 @@ module OoxmlParser
39
40
 
40
41
  # @return [Nokogiri::XML::Document] result of parsing xml via nokogiri
41
42
  def parse_xml(xml_path)
42
- Nokogiri::XML(File.open(xml_path), &:strict)
43
+ xml = Nokogiri::XML(File.open(xml_path), &:strict)
44
+ unless xml.errors.empty?
45
+ raise NokogiriParsingException,
46
+ "Nokogiri found errors in file: #{xml_path}. Errors: #{xml.errors}"
47
+ end
48
+ xml
43
49
  end
44
50
 
45
51
  class << self
@@ -15,10 +15,6 @@ module OoxmlParser
15
15
  attr_reader :font_color
16
16
  # @return [OoxmlSize] space size
17
17
  attr_reader :space
18
- # @return [string] name of font
19
- attr_reader :font_name
20
- # @return [Float] font size
21
- attr_reader :font_size
22
18
  # @return [Symbol] baseline of run
23
19
  attr_reader :baseline
24
20
  # @return [Hyperlink] hyperlink of run
@@ -79,14 +75,7 @@ module OoxmlParser
79
75
  when 'strike'
80
76
  @font_style.strike = value_to_symbol(value)
81
77
  when 'baseline'
82
- case value.value.to_i
83
- when -25_000, -30_000
84
- @baseline = :subscript
85
- when 30_000
86
- @baseline = :superscript
87
- when 0
88
- @baseline = :baseline
89
- end
78
+ @baseline = parse_baseline(value)
90
79
  when 'cap'
91
80
  @caps = value.value.to_sym
92
81
  end
@@ -107,8 +96,6 @@ module OoxmlParser
107
96
  @spacing = RunSpacing.new(parent: self).parse(node_child)
108
97
  when 'color'
109
98
  @color = OoxmlColor.new(parent: self).parse(node_child)
110
- when 'solidFill'
111
- @font_color = Color.new(parent: self).parse_color(node_child.xpath('*').first)
112
99
  when 'latin'
113
100
  @font_name = node_child.attribute('typeface').value
114
101
  when 'b'
@@ -140,9 +127,34 @@ module OoxmlParser
140
127
  end
141
128
  end
142
129
  @font_color = DocxColorScheme.new(parent: self).parse(node)
143
- @font_name = root_object.default_font_typeface if @font_name.empty?
144
- @font_size ||= root_object.default_font_size
145
130
  self
146
131
  end
132
+
133
+ # @return [Float] font size
134
+ def font_size
135
+ @font_size ||= root_object.default_font_size
136
+ end
137
+
138
+ # @return [String] name of font
139
+ def font_name
140
+ return @font_name unless @font_name.empty?
141
+
142
+ root_object.default_font_typeface
143
+ end
144
+
145
+ private
146
+
147
+ # @param value [Nokogiri::XML::Attr] nokogiri parameter to parse
148
+ # @return [Symbol] baseline value depending of type
149
+ def parse_baseline(value)
150
+ case value.value.to_i
151
+ when -25_000, -30_000
152
+ :subscript
153
+ when 30_000
154
+ :superscript
155
+ when 0
156
+ :baseline
157
+ end
158
+ end
147
159
  end
148
160
  end
@@ -16,7 +16,7 @@ module OoxmlParser
16
16
  # @param [Nokogiri::XML:Node] node with ParagraphSpacing
17
17
  # @return [ParagraphSpacing] result of parsing
18
18
  def parse(node)
19
- node.attributes.each do |key, value|
19
+ sorted_attributes(node).each do |key, value|
20
20
  case key
21
21
  when 'before'
22
22
  @before = OoxmlSize.new(value.value.to_f)
@@ -34,5 +34,17 @@ module OoxmlParser
34
34
  end
35
35
  self
36
36
  end
37
+
38
+ private
39
+
40
+ # This is dirty workaround for situations
41
+ # Then @line_rule parsed after @line so getting
42
+ # @line value is totally screwed up
43
+ # @param [Nokogiri::XML:Node] node with ParagraphSpacing
44
+ # @return [Hash] hash with sorted values
45
+ # TODO: Totally redone parsing of spacing to remove this workaround
46
+ def sorted_attributes(node)
47
+ node.attributes.sort.reverse.to_h
48
+ end
37
49
  end
38
50
  end
@@ -3,7 +3,8 @@
3
3
  module OoxmlParser
4
4
  # Class for parsing `snd` tags
5
5
  class Sound < OOXMLDocumentObject
6
- attr_accessor :name
6
+ # @return [String] name of sound
7
+ attr_reader :name
7
8
  # @return [FileReference] image structure
8
9
  attr_accessor :file_reference
9
10
 
@@ -18,7 +19,12 @@ module OoxmlParser
18
19
  # @return [Sound] result of parsing
19
20
  def parse(node)
20
21
  @file_reference = FileReference.new(parent: self).parse(node)
21
- @name = node.attribute('name').value
22
+ node.attributes.each do |key, value|
23
+ case key
24
+ when 'name'
25
+ @name = value.value.to_s
26
+ end
27
+ end
22
28
  self
23
29
  end
24
30
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Class for parsing SlideLayout files
5
+ class SlideLayoutFile < OOXMLDocumentObject
6
+ # @return [CommonSlideData] common slide data
7
+ attr_reader :common_slide_data
8
+
9
+ # Parse SlideLayoutFile
10
+ # @param file [String] path to file to parse
11
+ # @return [SlideLayoutFile] result of parsing
12
+ def parse(file)
13
+ OOXMLDocumentObject.add_to_xmls_stack(file.gsub(OOXMLDocumentObject.path_to_folder, ''))
14
+ doc = parse_xml(file)
15
+ doc.xpath('p:sldLayout/*').each do |node_child|
16
+ case node_child.name
17
+ when 'cSld'
18
+ @common_slide_data = CommonSlideData.new(parent: self).parse(node_child)
19
+ end
20
+ end
21
+ OOXMLDocumentObject.xmls_stack.pop
22
+ self
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # method to help to work with SlideLayouts
5
+ module SlideLayoutsHelper
6
+ # @return [Array<String>] list of slide layouts files
7
+ def slide_layouts_files
8
+ Dir["#{OOXMLDocumentObject.path_to_folder}ppt/slideLayouts/*.xml"]
9
+ end
10
+
11
+ private
12
+
13
+ # Parse slide layouts file
14
+ def parse_slide_layouts
15
+ slide_layouts_files.each do |file|
16
+ @slide_layouts << SlideLayoutFile.new(parent: self).parse(file)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Class for parsing SlideMaster files
5
+ class SlideMasterFile < OOXMLDocumentObject
6
+ # @return [CommonSlideData] common slide data
7
+ attr_reader :common_slide_data
8
+
9
+ # Parse SlideMaster
10
+ # @param file [String] path to file to parse
11
+ # @return [SlideMasterFile] result of parsing
12
+ def parse(file)
13
+ OOXMLDocumentObject.add_to_xmls_stack(file.gsub(OOXMLDocumentObject.path_to_folder, ''))
14
+ doc = parse_xml(file)
15
+ doc.xpath('p:sldMaster/*').each do |node_child|
16
+ case node_child.name
17
+ when 'cSld'
18
+ @common_slide_data = CommonSlideData.new(parent: self).parse(node_child)
19
+ end
20
+ end
21
+ OOXMLDocumentObject.xmls_stack.pop
22
+ self
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # method to help to work with SlideMasters
5
+ module SlideMastersHelper
6
+ # @return [Array<String>] list of slide masters files
7
+ def slide_masters_files
8
+ Dir["#{OOXMLDocumentObject.path_to_folder}ppt/slideMasters/*.xml"]
9
+ end
10
+
11
+ private
12
+
13
+ # Parse slide masters file
14
+ def parse_slide_masters
15
+ slide_masters_files.each do |file|
16
+ @slide_masters << SlideMasterFile.new(parent: self).parse(file)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -5,12 +5,18 @@ require_relative 'presentation/presentation_comments'
5
5
  require_relative 'presentation/presentation_helpers'
6
6
  require_relative 'presentation/presentation_theme'
7
7
  require_relative 'presentation/slide'
8
+ require_relative 'presentation/slide_master_file'
9
+ require_relative 'presentation/slide_masters_helper'
10
+ require_relative 'presentation/slide_layout_file'
11
+ require_relative 'presentation/slide_layouts_helper'
8
12
  require_relative 'presentation/slide_size'
9
13
  require_relative 'presentation/table_styles'
10
14
  module OoxmlParser
11
15
  # Basic class for all parsed pptx data
12
16
  class Presentation < CommonDocumentStructure
13
17
  include PresentationHelpers
18
+ include SlideLayoutsHelper
19
+ include SlideMastersHelper
14
20
  attr_accessor :slides, :theme, :slide_size
15
21
  # @return [Relationships] relationships of presentation
16
22
  attr_accessor :relationships
@@ -20,10 +26,16 @@ module OoxmlParser
20
26
  attr_reader :comment_authors
21
27
  # @return [PresentationComments] comments of presentation
22
28
  attr_reader :comments
29
+ # @return [Array<SlideMasterFile>] list of slide master
30
+ attr_reader :slide_masters
31
+ # @return [Array<SlideLayout>] list of slide layouts
32
+ attr_reader :slide_layouts
23
33
 
24
34
  def initialize(params = {})
25
35
  @slides = []
26
36
  @comments = []
37
+ @slide_masters = []
38
+ @slide_layouts = []
27
39
  super
28
40
  end
29
41
 
@@ -56,6 +68,8 @@ module OoxmlParser
56
68
  end
57
69
  OOXMLDocumentObject.xmls_stack.pop
58
70
  @relationships = Relationships.new(parent: self).parse_file("#{OOXMLDocumentObject.path_to_folder}/ppt/_rels/presentation.xml.rels")
71
+ parse_slide_layouts
72
+ parse_slide_masters
59
73
  self
60
74
  end
61
75
  end
@@ -4,6 +4,6 @@ module OoxmlParser
4
4
  # This module holds the RuboCop version information.
5
5
  module Version
6
6
  # [String] Version of Gem
7
- STRING = '0.17.0'
7
+ STRING = '0.20.0'
8
8
  end
9
9
  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.17.0
4
+ version: 0.20.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: 2021-09-15 00:00:00.000000000 Z
13
+ date: 2021-11-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
@@ -305,6 +305,7 @@ files:
305
305
  - lib/ooxml_parser/common_parser/common_data/font_style.rb
306
306
  - lib/ooxml_parser/common_parser/common_data/hyperlink.rb
307
307
  - lib/ooxml_parser/common_parser/common_data/ooxml_document_object.rb
308
+ - lib/ooxml_parser/common_parser/common_data/ooxml_document_object/nokogiri_parsing_exception.rb
308
309
  - lib/ooxml_parser/common_parser/common_data/ooxml_document_object/ooxml_document_object_helper.rb
309
310
  - lib/ooxml_parser/common_parser/common_data/ooxml_document_object/ooxml_object_attribute_helper.rb
310
311
  - lib/ooxml_parser/common_parser/common_data/paragraph.rb
@@ -480,6 +481,10 @@ files:
480
481
  - lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/transition/transition/sound_action/sound.rb
481
482
  - lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/transition/transition_properties/transition_properties.rb
482
483
  - lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/transition/transition_properties/transition_properties/wheel.rb
484
+ - lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide_layout_file.rb
485
+ - lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide_layouts_helper.rb
486
+ - lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide_master_file.rb
487
+ - lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide_masters_helper.rb
483
488
  - lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide_size.rb
484
489
  - lib/ooxml_parser/pptx_parser/pptx_data/presentation/table_styles.rb
485
490
  - lib/ooxml_parser/pptx_parser/pptx_parser.rb
@@ -574,6 +579,7 @@ metadata:
574
579
  documentation_uri: https://www.rubydoc.info/gems/ooxml_parser
575
580
  homepage_uri: https://github.com/onlyoffice/ooxml_parser
576
581
  source_code_uri: https://github.com/onlyoffice/ooxml_parser
582
+ rubygems_mfa_required: 'true'
577
583
  post_install_message:
578
584
  rdoc_options: []
579
585
  require_paths:
@@ -589,7 +595,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
589
595
  - !ruby/object:Gem::Version
590
596
  version: '0'
591
597
  requirements: []
592
- rubygems_version: 3.2.27
598
+ rubygems_version: 3.2.29
593
599
  signing_key:
594
600
  specification_version: 4
595
601
  summary: OoxmlParser Gem