ooxml_parser 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +17 -1
  3. data/lib/ooxml_parser/common_parser/common_data/alternate_content/alternate_content/chart_style.rb +4 -0
  4. data/lib/ooxml_parser/common_parser/common_data/alternate_content/chart/chart.rb +1 -0
  5. data/lib/ooxml_parser/common_parser/common_data/alternate_content/chart/chart_axis.rb +9 -0
  6. data/lib/ooxml_parser/common_parser/common_data/alternate_content/chart/chart_axis/scaling.rb +20 -0
  7. data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/drawing_properties/ooxml_size.rb +1 -1
  8. data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/graphic/picture/docx_blip/file_reference.rb +3 -2
  9. data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/graphic/shape/shape_body_properties/ooxml_shape_body_properties.rb +8 -0
  10. data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/graphic/shape/shape_properties/docx_shape_properties/text_box.rb +1 -1
  11. data/lib/ooxml_parser/common_parser/common_data/borders_properties.rb +2 -2
  12. data/lib/ooxml_parser/common_parser/common_data/color.rb +11 -20
  13. data/lib/ooxml_parser/common_parser/common_data/color/color_helper.rb +1 -1
  14. data/lib/ooxml_parser/common_parser/common_data/color/ooxml_color.rb +57 -0
  15. data/lib/ooxml_parser/common_parser/common_data/colors/theme_colors.rb +3 -6
  16. data/lib/ooxml_parser/common_parser/common_data/coordinates.rb +17 -1
  17. data/lib/ooxml_parser/common_parser/common_data/hyperlink.rb +12 -1
  18. data/lib/ooxml_parser/common_parser/common_data/ooxml_document_object.rb +4 -4
  19. data/lib/ooxml_parser/common_parser/common_data/ooxml_document_object/ooxml_document_object_helper.rb +30 -1
  20. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_properties.rb +5 -2
  21. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_run.rb +9 -1
  22. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_run/run_properties.rb +1 -1
  23. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragraph_run/text.rb +23 -0
  24. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragrpah_properties/paragraph_borders.rb +2 -2
  25. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragrpah_properties/spacing.rb +0 -1
  26. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragrpah_properties/tabs.rb +2 -2
  27. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragrpah_properties/{tab_list/presentation_tab.rb → tabs/tab.rb} +17 -4
  28. data/lib/ooxml_parser/common_parser/common_data/table.rb +1 -1
  29. data/lib/ooxml_parser/common_parser/common_data/table/margins/table_margins.rb +1 -3
  30. data/lib/ooxml_parser/common_parser/common_data/table/properties/table_style.rb +31 -37
  31. data/lib/ooxml_parser/common_parser/common_data/table/properties/table_style_properties.rb +4 -0
  32. data/lib/ooxml_parser/common_parser/common_data/table/properties/table_style_properties/table_style_properties_helper.rb +2 -2
  33. data/lib/ooxml_parser/common_parser/common_data/table/row/cell/cell.rb +4 -4
  34. data/lib/ooxml_parser/common_parser/common_data/table/row/cell/properties/border.rb +1 -1
  35. data/lib/ooxml_parser/common_parser/common_data/table/table_properties.rb +1 -16
  36. data/lib/ooxml_parser/docx_parser/docx_data/document_structure.rb +14 -7
  37. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/comment.rb +2 -2
  38. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/comments_extended.rb +39 -0
  39. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/comments_extended/comment_extended.rb +24 -0
  40. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/document_background.rb +9 -12
  41. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/document_style.rb +1 -1
  42. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph.rb +51 -73
  43. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_formula/delimeter.rb +2 -2
  44. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_paragraph_helper.rb +8 -0
  45. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_paragraph_run.rb +8 -56
  46. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_paragraph_run/docx_paragraph_run_helpers.rb +2 -12
  47. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/inserted.rb +15 -1
  48. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/sdt/sdt_content.rb +30 -0
  49. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/sdt/sdt_properties.rb +28 -0
  50. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/structured_document_tag.rb +26 -0
  51. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/header_footer.rb +1 -1
  52. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/page_properties/note.rb +10 -10
  53. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/page_properties/page_margins.rb +9 -16
  54. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/page_properties/page_properties.rb +11 -9
  55. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation.rb +5 -2
  56. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/presentation_theme/theme_color.rb +1 -3
  57. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide.rb +35 -24
  58. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/common_slide_data.rb +26 -0
  59. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/common_slide_data/shape_tree.rb +33 -0
  60. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/connection_shape.rb +5 -0
  61. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/graphic_frame/graphic_frame.rb +2 -0
  62. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/presentation_notes.rb +21 -0
  63. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/slide/shapes_grouping.rb +2 -0
  64. data/lib/ooxml_parser/pptx_parser/pptx_data/presentation/slide/slide_helper.rb +3 -3
  65. data/lib/ooxml_parser/version.rb +1 -1
  66. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook.rb +1 -1
  67. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/style_sheet/fills/fill.rb +20 -0
  68. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/style_sheet/fills/fill/pattern_fill.rb +2 -2
  69. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/style_sheet/fonts/font.rb +5 -1
  70. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet.rb +10 -1
  71. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/ole_objects.rb +18 -0
  72. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/sheet_view.rb +1 -1
  73. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part.rb +7 -1
  74. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/autofilter.rb +34 -0
  75. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/autofilter/filter_column.rb +28 -0
  76. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension.rb +5 -0
  77. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/sparkline_groups.rb +31 -0
  78. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/sparkline_groups/sparkline_group.rb +113 -0
  79. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/table_style_info.rb +41 -0
  80. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/xlsx_drawing.rb +5 -11
  81. metadata +31 -14
  82. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragrpah_properties/tab_list.rb +0 -36
  83. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragrpah_properties/tabs/paragraph_tab.rb +0 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 17ff610450bb961ad457f38aa206097940893f58
4
- data.tar.gz: bcfe11a7a961f9a103eb8c047fb503e324d05bb3
2
+ SHA256:
3
+ metadata.gz: 071bdcbc2fb31371918e97a11e168bcdd849a3a606d880a6f8f29f03d3fc54c9
4
+ data.tar.gz: 48631f0dcb24d64688065bbb226d8e0c3dd13f18473a680aa33fcf284751b195
5
5
  SHA512:
6
- metadata.gz: 03f3590091b03d708883a052300a754e9e94b64c55fbc85564514d3194d8bf3e9e1927069eaa30ee2aea0a095e77a089c0a899029eceb5f60394064869e6c59c
7
- data.tar.gz: 4c7eb4fa0cf09ced780de674a48acd4939b29b01bb09b0e240627cc1654a1f90a945c738dba76d0e59db3c88ee859028f3dda38b4990c8165bc9adf9b200ef67
6
+ metadata.gz: 175a3bb85a4c2b85cf577c498c50c021c180c9054440451a55b81d93752eb6211908e2309738dc8486ab0adfdd0cdcd3f5afbf75910226141f179ae878c62e6a
7
+ data.tar.gz: 031f7cf2aa5d53223df37d425fa0050a5ff875d3646ea5e82c56064262927ac728d5ed6563c557a9fc74d8da6f3a1b34ce230ed41b536914450ee7efe2a58831
data/README.md CHANGED
@@ -4,7 +4,23 @@ _ooxml_parser_ is a Ooxml files (docx, xlsx, pptx) parser written in Ruby.
4
4
 
5
5
  ## Installation
6
6
 
7
- $ gem install ooxml_parser
7
+ 1. Install `magic` lib, required by `ruby-filemagic`
8
+ Mac OS:
9
+ ```
10
+ brew install libmagic
11
+ ```
12
+ Debian-Based Linux:
13
+ ```
14
+ sudo apt-get install libmagic-dev
15
+ ```
16
+ Centos-Based Linux:
17
+ ```
18
+ sudo yum install file-devel
19
+ ```
20
+ 2. Install gem by command:
21
+ ```
22
+ gem install ooxml_parser
23
+ ```
8
24
 
9
25
  ## Usage
10
26
 
@@ -2,6 +2,8 @@ module OoxmlParser
2
2
  # Chart Style
3
3
  class ChartStyle < OOXMLDocumentObject
4
4
  attr_accessor :style_number
5
+ # @return [OleObject] ole object
6
+ attr_accessor :ole_object
5
7
 
6
8
  # Parse ChartStyle
7
9
  # @param [Nokogiri::XML:Node] node with Relationships
@@ -11,6 +13,8 @@ module OoxmlParser
11
13
  case node_child.name
12
14
  when 'style'
13
15
  @style_number = node_child.attribute('val').value.to_i
16
+ when 'oleObject'
17
+ @ole_object = OleObject.new(parent: self).parse(node_child)
14
18
  end
15
19
  end
16
20
  self
@@ -37,6 +37,7 @@ module OoxmlParser
37
37
  else
38
38
  val = chart_props_node_child.xpath('c:val')[0]
39
39
  end
40
+ next unless val
40
41
  next if val.xpath('c:numRef').empty?
41
42
  @data << ChartCellsRange.new(parent: self).parse(val.xpath('c:numRef').first).dup
42
43
  when 'dLbls'
@@ -1,8 +1,13 @@
1
+ require_relative 'chart_axis/scaling'
1
2
  require_relative 'chart_axis_title'
2
3
  module OoxmlParser
3
4
  # Parsing Chart axis tags 'catAx', 'valAx'
4
5
  class ChartAxis < OOXMLDocumentObject
5
6
  attr_accessor :title, :display, :position, :major_grid_lines, :minor_grid_lines
7
+ # @return [Scaling] scaling attribute
8
+ attr_reader :scaling
9
+ # @return [ValuedChild] the position of the tick labels
10
+ attr_reader :tick_label_position
6
11
 
7
12
  def initialize(title = ChartAxisTitle.new,
8
13
  display = true,
@@ -30,6 +35,10 @@ module OoxmlParser
30
35
  @major_grid_lines = true
31
36
  when 'minorGridlines'
32
37
  @minor_grid_lines = true
38
+ when 'scaling'
39
+ @scaling = Scaling.new(parent: self).parse(node_child)
40
+ when 'tickLblPos'
41
+ @tick_label_position = ValuedChild.new(:symbol, parent: self).parse(node_child)
33
42
  when 'axPos'
34
43
  @position = value_to_symbol(node_child.attribute('val'))
35
44
  end
@@ -0,0 +1,20 @@
1
+ module OoxmlParser
2
+ # Parsing Scaling tag 'scaling'
3
+ class Scaling < OOXMLDocumentObject
4
+ # @return [ValuedChild] orientation value
5
+ attr_reader :orientation
6
+
7
+ # Parse Scaling object
8
+ # @param node [Nokogiri::XML:Element] node to parse
9
+ # @return [Scaling] result of parsing
10
+ def parse(node)
11
+ node.xpath('*').each do |node_child|
12
+ case node_child.name
13
+ when 'orientation'
14
+ @orientation = ValuedChild.new(:symbol, parent: self).parse(node_child)
15
+ end
16
+ end
17
+ self
18
+ end
19
+ end
20
+ end
@@ -63,7 +63,7 @@ module OoxmlParser
63
63
  when :percent
64
64
  OoxmlSize.new(@value * 100_000, :one_100000th_percent)
65
65
  when :pct
66
- OoxmlSize.new(@value * 1_000, :one_100000th_percent)
66
+ OoxmlSize.new(@value * 100_000 / 50, :one_100000th_percent)
67
67
  when :one_1000th_percent
68
68
  OoxmlSize.new(@value * 100, :one_100000th_percent)
69
69
  else
@@ -15,9 +15,10 @@ module OoxmlParser
15
15
  @resource_id = value.value
16
16
  end
17
17
  end
18
- return self if @resource_id.nil?
18
+ return self unless @resource_id
19
+ return self if @resource_id.empty?
19
20
  @path = OOXMLDocumentObject.get_link_from_rels(@resource_id)
20
- if @path.empty?
21
+ if !@path || @path.empty?
21
22
  warn "Cant find path to media file by id: #{@resource_id}"
22
23
  return self
23
24
  end
@@ -6,6 +6,10 @@ module OoxmlParser
6
6
  attr_accessor :margins, :anchor, :wrap, :preset_text_warp
7
7
  # @return [Symbol] Vertical Text
8
8
  attr_accessor :vertical
9
+ # @return [Symbol] Number of Columns
10
+ attr_reader :number_columns
11
+ # @return [Symbol] Spacing between columns
12
+ attr_reader :space_columns
9
13
 
10
14
  alias vertical_align anchor
11
15
 
@@ -25,6 +29,10 @@ module OoxmlParser
25
29
  @anchor = value_to_symbol(value)
26
30
  when 'vert'
27
31
  @vertical = value_to_symbol(value)
32
+ when 'numCol'
33
+ @number_columns = value.value.to_i
34
+ when 'spcCol'
35
+ @space_columns = OoxmlSize.new(value.value.to_f, :emu)
28
36
  end
29
37
  end
30
38
  node.xpath('*').each do |node_child|
@@ -13,7 +13,7 @@ module OoxmlParser
13
13
  when 'p'
14
14
  DocumentStructure.default_paragraph_style = DocxParagraph.new
15
15
  DocumentStructure.default_paragraph_style.spacing = Spacing.new(0, 0.35, 1.15, :multiple)
16
- elements << DocumentStructure.default_paragraph_style.copy.parse(textbox_element, i, parent: parent)
16
+ elements << DocumentStructure.default_paragraph_style.dup.parse(textbox_element, i, parent: parent)
17
17
  when 'tbl'
18
18
  elements << Table.new(parent: parent).parse(textbox_element, i)
19
19
  end
@@ -1,7 +1,7 @@
1
1
  # Border Properties Data
2
2
  module OoxmlParser
3
3
  class BordersProperties < OOXMLDocumentObject
4
- attr_accessor :color, :space, :sz, :val, :space, :shadow, :frame, :side
4
+ attr_accessor :color, :space, :sz, :val, :shadow, :frame, :side
5
5
 
6
6
  def initialize(color = :auto, sz = 0, val = :none, space = 0, parent: nil)
7
7
  @color = color
@@ -28,7 +28,7 @@ module OoxmlParser
28
28
 
29
29
  def visible?
30
30
  return false if nil?
31
- !(val == 'none')
31
+ val != 'none'
32
32
  end
33
33
 
34
34
  # Parse BordersProperties
@@ -1,4 +1,5 @@
1
1
  require_relative 'color/color_helper'
2
+ require_relative 'color/ooxml_color'
2
3
  require_relative 'colors/color_alpha_channel'
3
4
  require_relative 'colors/hsl_color'
4
5
  require_relative 'colors/scheme_color'
@@ -13,7 +14,7 @@ module OoxmlParser
13
14
  # List of color duplicated from `OpenXML Sdk IndexedColors` class
14
15
  # See https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.indexedcolors.aspx
15
16
  COLOR_INDEXED =
16
- %w(
17
+ %w[
17
18
  000000
18
19
  FFFFFF
19
20
  FF0000
@@ -80,7 +81,7 @@ module OoxmlParser
80
81
  333333
81
82
  n/a
82
83
  n/a
83
- ).freeze
84
+ ].freeze
84
85
 
85
86
  # @return [Integer] Value of Red Part
86
87
  attr_accessor :red
@@ -133,7 +134,12 @@ module OoxmlParser
133
134
  alias to_int16 to_hex
134
135
 
135
136
  def none?
136
- (@red == VALUE_FOR_NONE_COLOR) && (@green == VALUE_FOR_NONE_COLOR) && (@blue == VALUE_FOR_NONE_COLOR)
137
+ (@red == VALUE_FOR_NONE_COLOR) && (@green == VALUE_FOR_NONE_COLOR) && (@blue == VALUE_FOR_NONE_COLOR) ||
138
+ (style == :nil)
139
+ end
140
+
141
+ def any?
142
+ !none?
137
143
  end
138
144
 
139
145
  def white?
@@ -171,7 +177,8 @@ module OoxmlParser
171
177
  color_to_check = Color.parse(color_to_check.to_s) if color_to_check.is_a?(Symbol)
172
178
  color_to_check = Color.parse(color_to_check.value) if color_to_check.is_a?(DocxColor)
173
179
  return true if none? && color_to_check.nil?
174
- return false if none? && !color_to_check.none?
180
+ return true if none? && color_to_check.none?
181
+ return false if none? && color_to_check.any?
175
182
  return false if !none? && color_to_check.none?
176
183
  return true if self == color_to_check
177
184
  red = color_to_check.red
@@ -253,22 +260,6 @@ module OoxmlParser
253
260
  end
254
261
  end
255
262
 
256
- def parse_color_tag(node)
257
- return if node.nil?
258
- node.attributes.each do |key, value|
259
- case key
260
- when 'val'
261
- return Color.new.parse_hex_string(value.value.to_s)
262
- when 'theme'
263
- return ThemeColors.parse_color_theme(node)
264
- when 'rgb'
265
- return Color.new.parse_hex_string(value.value.to_s)
266
- when 'indexed'
267
- return Color.get_rgb_by_color_index(value.value.to_i)
268
- end
269
- end
270
- end
271
-
272
263
  def parse_scheme_color(scheme_color_node)
273
264
  color = ThemeColors.list[scheme_color_node.attribute('val').value.to_sym]
274
265
  hls = HSLColor.rgb_to_hsl(color)
@@ -3,7 +3,7 @@ module ColorHelper
3
3
  # Parse string in hex
4
4
  # @param [String] hex_string with or without alpha-channel
5
5
  def parse_hex_string(hex_string)
6
- return self if hex_string == 'auto' || hex_string == 'null'
6
+ return self if %w[auto null].include?(hex_string)
7
7
 
8
8
  char_array = hex_string.split(//)
9
9
  if char_array.length == 3
@@ -0,0 +1,57 @@
1
+ module OoxmlParser
2
+ # Class for parsing `color` tag
3
+ class OoxmlColor < OOXMLDocumentObject
4
+ # @return [Color] value of color
5
+ attr_reader :value
6
+ # @return [Symbol] theme color name
7
+ attr_reader :theme_color
8
+ # @return [Symbol] theme shade
9
+ attr_reader :theme_shade
10
+ # @return [Integer] theme index
11
+ attr_reader :theme
12
+ # @return [Float] tint
13
+ attr_reader :tint
14
+ # @return [Float] Indexed id
15
+ attr_reader :indexed
16
+ # @return [Color] rgb color
17
+ attr_reader :rgb
18
+
19
+ def to_color
20
+ return Color.get_rgb_by_color_index(indexed) if indexed
21
+ return ThemeColors.parse_color_theme(theme, tint) if theme
22
+ return rgb if rgb
23
+ value
24
+ end
25
+
26
+ def ==(other)
27
+ return to_color == other if other.is_a?(Color)
28
+ return to_color == other if other.is_a?(Symbol)
29
+ super
30
+ end
31
+
32
+ # Parse Hyperlink object
33
+ # @param node [Nokogiri::XML:Element] node to parse
34
+ # @return [Hyperlink] result of parsing
35
+ def parse(node)
36
+ node.attributes.each do |key, value|
37
+ case key
38
+ when 'val'
39
+ @value = Color.new.parse_hex_string(value.value.to_s)
40
+ when 'themeColor'
41
+ @theme_color = value.value.to_sym
42
+ when 'themeShade'
43
+ @theme_shade = Integer("0x#{value.value}")
44
+ when 'theme'
45
+ @theme = value.value.to_i
46
+ when 'tint'
47
+ @tint = value.value.to_f
48
+ when 'indexed'
49
+ @indexed = value.value.to_i
50
+ when 'rgb'
51
+ @rgb = Color.new.parse_hex_string(value.value)
52
+ end
53
+ end
54
+ self
55
+ end
56
+ end
57
+ end
@@ -5,16 +5,13 @@ module OoxmlParser
5
5
  # @return [Hash] list of colors
6
6
  attr_accessor :list
7
7
 
8
- def parse_color_theme(color_theme_node)
8
+ def parse_color_theme(theme, tint)
9
9
  themes_array = ThemeColors.list.to_a
10
10
  # TODO: if no swap performed - incorrect color parsing. But don't know why it needed
11
11
  themes_array[0], themes_array[1] = themes_array[1], themes_array[0]
12
12
  themes_array[2], themes_array[3] = themes_array[3], themes_array[2]
13
- hls = HSLColor.rgb_to_hsl(themes_array[color_theme_node.attribute('theme').value.to_i][1])
14
- tint = 0
15
- unless color_theme_node.attribute('tint').nil?
16
- tint = color_theme_node.attribute('tint').value.to_f
17
- end
13
+ hls = HSLColor.rgb_to_hsl(themes_array[theme][1])
14
+ tint = 0 if tint.nil?
18
15
  hls.calculate_rgb_with_tint(tint)
19
16
  end
20
17
  end
@@ -27,10 +27,14 @@ module OoxmlParser
27
27
  end
28
28
 
29
29
  def parser_coordinates_range(arguments_string)
30
+ return parse_coordinates_array(arguments_string) if arguments_string.include?(',')
31
+ return warn "Formulas with # is unsupported: #{arguments_string}" if arguments_string.include?('#')
32
+ return warn 'Formulas consists from `!` only' if arguments_string == '!'
30
33
  sheet_name = 'Sheet1'
31
34
 
32
35
  if arguments_string.include?('!')
33
- sheet_name, arguments_string = arguments_string.split('!')
36
+ sheet_name = arguments_string.match(/.*!/).to_s
37
+ arguments_string = arguments_string.sub(sheet_name, '')
34
38
  end
35
39
 
36
40
  range = arguments_string.split(':')
@@ -70,6 +74,18 @@ module OoxmlParser
70
74
  arguments_array
71
75
  end
72
76
 
77
+ # Parse array of coordinates
78
+ # @param arguments_string [String] string
79
+ # @return [Array] result
80
+ def parse_coordinates_array(arguments_string)
81
+ result = []
82
+ coord_array = arguments_string.split(',')
83
+ coord_array.each do |current_coord|
84
+ result << parser_coordinates_range(current_coord)
85
+ end
86
+ result
87
+ end
88
+
73
89
  # This method check is argument contains coordinate
74
90
  # @param [String] string
75
91
  def coordinates?(string)
@@ -1,9 +1,11 @@
1
1
  module OoxmlParser
2
2
  # Class for parsing `hlinkClick`, `hyperlink` tags
3
3
  class Hyperlink < OOXMLDocumentObject
4
- attr_accessor :url, :tooltip, :coordinates, :id, :highlight_click, :action
4
+ attr_accessor :url, :tooltip, :coordinates, :highlight_click, :action
5
5
  attr_accessor :action_link
6
6
  attr_accessor :id
7
+ # @return [Array<ParagraphRun>] run of paragraph
8
+ attr_reader :runs
7
9
 
8
10
  def initialize(link = nil,
9
11
  tooltip = nil,
@@ -13,6 +15,7 @@ module OoxmlParser
13
15
  @tooltip = tooltip
14
16
  @coordinates = coordinates
15
17
  @parent = parent
18
+ @runs = []
16
19
  end
17
20
 
18
21
  alias link url
@@ -41,6 +44,14 @@ module OoxmlParser
41
44
  @highlight_click = attribute_enabled?(value)
42
45
  end
43
46
  end
47
+
48
+ node.xpath('*').each do |node_child|
49
+ case node_child.name
50
+ when 'r'
51
+ @runs << ParagraphRun.new(parent: self).parse(node_child)
52
+ end
53
+ end
54
+
44
55
  case @action_link
45
56
  when 'ppaction://hlinkshowjump?jump=previousslide'
46
57
  @action = :previous_slide
@@ -17,9 +17,7 @@ module OoxmlParser
17
17
  def ==(other)
18
18
  instance_variables.each do |current_attribute|
19
19
  next if current_attribute == :@parent
20
- unless instance_variable_get(current_attribute) == other.instance_variable_get(current_attribute)
21
- return false
22
- end
20
+ return false unless instance_variable_get(current_attribute) == other.instance_variable_get(current_attribute)
23
21
  end
24
22
  true
25
23
  end
@@ -42,7 +40,9 @@ module OoxmlParser
42
40
  # Support of Encrtypted status in `file` util was introduced in file v5.20
43
41
  # but LTS version of ubuntu before 16.04 uses older `file` and it return `Composite Document`
44
42
  # https://github.com/file/file/blob/master/ChangeLog#L217
45
- if file_result.include?('encrypted') || file_result.include?('Composite Document File V2 Document, No summary info')
43
+ if file_result.include?('encrypted') ||
44
+ file_result.include?('Composite Document File V2 Document, No summary info') ||
45
+ file_result.include?('application/CDFV2-corrupt')
46
46
  warn("File #{path_to_file} is encrypted. Can't parse it")
47
47
  return true
48
48
  end
@@ -1,6 +1,28 @@
1
- # frozen_string_literal: true
2
1
  # Module for helper methods for OOXMLDocumentObject
3
2
  module OoxmlDocumentObjectHelper
3
+ # Convert object to hash
4
+ # @return [Hash]
5
+ def to_hash
6
+ result_hash = {}
7
+ instance_variables.each do |current_attribute|
8
+ next if current_attribute == :@parent
9
+ attribute_value = instance_variable_get(current_attribute)
10
+ next unless attribute_value
11
+ if attribute_value.is_a?(Array)
12
+ attribute_value.each_with_index do |object_element, index|
13
+ result_hash["#{current_attribute}_#{index}".to_sym] = object_element.to_hash
14
+ end
15
+ else
16
+ result_hash[current_attribute.to_sym] = if attribute_value.respond_to?(:to_hash)
17
+ attribute_value.to_hash
18
+ else
19
+ attribute_value.to_s
20
+ end
21
+ end
22
+ end
23
+ result_hash
24
+ end
25
+
4
26
  private
5
27
 
6
28
  VALUE_TO_SYMBOL_HASH = { l: :left,
@@ -13,6 +35,7 @@ module OoxmlDocumentObjectHelper
13
35
  tl: :top_left,
14
36
  br: :bottom_right,
15
37
  bl: :bottom_left,
38
+ contentLocked: :content_locked,
16
39
  dist: :distributed,
17
40
  tb: :horizontal,
18
41
  rl: :rotate_on_90,
@@ -44,6 +67,8 @@ module OoxmlDocumentObjectHelper
44
67
  mediumDashDotDot: :medium_dash_dot_dot,
45
68
  lgDashDot: :large_dash_dot,
46
69
  lgDashDotDot: :large_dash_dot_dot,
70
+ sdtLocked: :sdt_locked,
71
+ sdtContentLocked: :sdt_content_locked,
47
72
  sysDash: :system_dash,
48
73
  sysDot: :system_dot,
49
74
  sysDashDot: :system_dash_dot,
@@ -58,7 +83,11 @@ module OoxmlDocumentObjectHelper
58
83
  tbRl: :top_to_bottom_right_to_left,
59
84
  btLr: :bottom_to_top_left_to_right,
60
85
  singlelevel: :single_level,
86
+ maxMin: :max_min,
87
+ middleDot: :middle_dot,
88
+ minMax: :min_max,
61
89
  multilevel: :multi_level,
90
+ nextTo: :next_to,
62
91
  hybridMultilevel: :hybrid_multi_level,
63
92
  rnd: :round,
64
93
  sq: :square }.freeze