ooxml_parser 0.2.0 → 0.3.0

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.
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