ooxml_parser 0.14.1 → 0.17.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 (26) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ooxml_parser/common_parser/common_data/alternate_content/chart/chart.rb +6 -6
  3. data/lib/ooxml_parser/common_parser/common_data/alternate_content/drawing/graphic/picture/docx_blip/file_reference.rb +2 -0
  4. data/lib/ooxml_parser/common_parser/common_data/color/color_helper.rb +3 -3
  5. data/lib/ooxml_parser/common_parser/common_data/color.rb +11 -3
  6. data/lib/ooxml_parser/common_parser/common_data/colors/hsl_color.rb +4 -4
  7. data/lib/ooxml_parser/common_parser/common_data/coordinates.rb +1 -1
  8. data/lib/ooxml_parser/common_parser/common_data/paragraph/paragrpah_properties/spacing.rb +12 -0
  9. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph/docx_paragraph_run/docx_paragraph_run_helpers.rb +1 -1
  10. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/docx_paragraph.rb +2 -6
  11. data/lib/ooxml_parser/docx_parser/docx_data/document_structure/page_properties/page_size.rb +2 -2
  12. data/lib/ooxml_parser/version.rb +1 -1
  13. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/style_sheet/differential_formatting_records.rb +41 -0
  14. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/style_sheet.rb +5 -0
  15. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule/color_scale.rb +32 -0
  16. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule/data_bar/conditional_format_value_object.rb +44 -0
  17. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule/data_bar.rb +102 -0
  18. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule/differential_formatting_record.rb +34 -0
  19. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule/icon_set/conditional_formatting_icon.rb +26 -0
  20. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule/icon_set.rb +55 -0
  21. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule.rb +117 -0
  22. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting.rb +32 -0
  23. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings.rb +33 -0
  24. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension.rb +5 -0
  25. data/lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet.rb +5 -0
  26. metadata +13 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5bfd9bf403c49920d072ee03ff67f63a80384b427ba11b13e1284aaa7736ec00
4
- data.tar.gz: 7c10534ec85dd9d710759aa243684e37e8bdde011290095d565caed696966330
3
+ metadata.gz: 0237d3a93d29a2948634cd1e3f4c9c414347ee39176aad7d3c7e75e55b2a8314
4
+ data.tar.gz: e423b10a5309aac333a95be460b863cc2cbea1449b866817dafbe427c092bf34
5
5
  SHA512:
6
- metadata.gz: 4c108a26a2a99b55af6e98206979d08a28b8ea05241b463b0a6efa2820798d1b4a4a7efb4d194e2980361569d8c6b10ba0d21bec41a3fbc6cb59c706367f8ac0
7
- data.tar.gz: c4ca66efcd1b8d313fa2e4370f552531e2f7b9af1fa792c5e77b1a8e1566c655efff505ada827869fa92dfda06171e00e0edb1702f754a522a91d3cd460dd44d
6
+ metadata.gz: 22783602daacb4933c941023d39757fd4dddef2adc64dcd58e6ef70ad6141b764b300e65745b50691cf138e2b212ccbd8ed542d0cbbe8b62dc0cc905d47760ed
7
+ data.tar.gz: 4a1843d681f5253234eeb4bf33c240db9ea46f2ab43f219a0a391297475a4f1716ba4b7915599bcb06ad41605071190e4788f6516ce43983c5d3f0846ea78dc8
@@ -53,12 +53,12 @@ module OoxmlParser
53
53
  @grouping = chart_props_node_child.attribute('val').value.to_sym
54
54
  when 'ser'
55
55
  @series << Series.new(parent: self).parse(chart_props_node_child)
56
- case @type
57
- when :point, :bubble
58
- val = chart_props_node_child.xpath('c:yVal')[0]
59
- else
60
- val = chart_props_node_child.xpath('c:val')[0]
61
- end
56
+ val = case @type
57
+ when :point, :bubble
58
+ chart_props_node_child.xpath('c:yVal')[0]
59
+ else
60
+ chart_props_node_child.xpath('c:val')[0]
61
+ end
62
62
  next unless val
63
63
  next if val.xpath('c:numRef').empty?
64
64
 
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'uri'
4
+
3
5
  module OoxmlParser
4
6
  # Class for storing image data
5
7
  class FileReference < OOXMLDocumentObject
@@ -45,11 +45,11 @@ module OoxmlParser
45
45
  hls_color.h = if max == red && green >= blue
46
46
  60.0 * (green - blue) / delta
47
47
  elsif max == red && green < blue
48
- 60.0 * (green - blue) / delta + 360.0
48
+ (60.0 * (green - blue) / delta) + 360.0
49
49
  elsif max == green
50
- 60.0 * (blue - red) / delta + 120.0
50
+ (60.0 * (blue - red) / delta) + 120.0
51
51
  else
52
- 60.0 * (red - green) / delta + 240.0
52
+ (60.0 * (red - green) / delta) + 240.0
53
53
  end
54
54
  end
55
55
 
@@ -48,7 +48,7 @@ module OoxmlParser
48
48
 
49
49
  # @return [String] result of convert of object to string
50
50
  def to_s
51
- if @red == VALUE_FOR_NONE_COLOR && @green == VALUE_FOR_NONE_COLOR && @blue == VALUE_FOR_NONE_COLOR
51
+ if primary_colors_none?
52
52
  'none'
53
53
  else
54
54
  "RGB (#{@red}, #{@green}, #{@blue})"
@@ -69,8 +69,8 @@ module OoxmlParser
69
69
 
70
70
  # @return [True, False] is color default
71
71
  def none?
72
- (@red == VALUE_FOR_NONE_COLOR) && (@green == VALUE_FOR_NONE_COLOR) && (@blue == VALUE_FOR_NONE_COLOR) ||
73
- (style == :nil)
72
+ primary_colors_none? ||
73
+ style == :nil
74
74
  end
75
75
 
76
76
  # @return [True, False] is color not default
@@ -83,6 +83,14 @@ module OoxmlParser
83
83
  (@red == 255) && (@green == 255) && (@blue == 255)
84
84
  end
85
85
 
86
+ # Check if all three primary colors are none
87
+ # @return [Boolean]
88
+ def primary_colors_none?
89
+ @red == VALUE_FOR_NONE_COLOR &&
90
+ @green == VALUE_FOR_NONE_COLOR &&
91
+ @blue == VALUE_FOR_NONE_COLOR
92
+ end
93
+
86
94
  # Method to copy object
87
95
  # @return [Color] copied object
88
96
  def copy
@@ -22,9 +22,9 @@ module OoxmlParser
22
22
  # Chroma - The "colorfulness relative to the brightness of a similarly illuminated white".
23
23
  # @return [Color] result
24
24
  def to_rgb
25
- chroma = (1 - (2 * @l - 1).abs) * @s
26
- x = chroma * (1 - ((@h / 60.0) % 2.0 - 1).abs)
27
- m = @l - chroma / 2.0
25
+ chroma = (1 - ((2 * @l) - 1).abs) * @s
26
+ x = chroma * (1 - (((@h / 60.0) % 2.0) - 1).abs)
27
+ m = @l - (chroma / 2.0)
28
28
 
29
29
  rgb = if @h.zero?
30
30
  Color.new(0, 0, 0)
@@ -52,7 +52,7 @@ module OoxmlParser
52
52
  if tint.nil?
53
53
  lum
54
54
  else
55
- tint.negative? ? lum * (1.0 + tint) : lum * (1.0 - tint) + (255 - 255 * (1.0 - tint))
55
+ tint.negative? ? lum * (1.0 + tint) : (lum * (1.0 - tint)) + (255 - (255 * (1.0 - tint)))
56
56
  end
57
57
  end
58
58
 
@@ -114,7 +114,7 @@ module OoxmlParser
114
114
  # and converts into integer
115
115
  def column_number
116
116
  @column.reverse.each_char.reduce(0) do |result, char|
117
- result + (char.downcase.ord - 96) * (26**@column.reverse.index(char))
117
+ result + ((char.downcase.ord - 96) * (26**@column.reverse.index(char)))
118
118
  end
119
119
  end
120
120
 
@@ -96,5 +96,17 @@ module OoxmlParser
96
96
  end
97
97
  end
98
98
  end
99
+
100
+ # Fetch data from `ParagraphSpacing`
101
+ # Which have values with parameters
102
+ # @param valued_spacing [ParagraphSpacing] spacing to get params
103
+ # @return [Spacing]
104
+ def fetch_from_valued_spacing(valued_spacing)
105
+ @before = valued_spacing.before.to_unit(:centimeter).value if valued_spacing.before
106
+ @after = valued_spacing.after.to_unit(:centimeter).value if valued_spacing.after
107
+ @line = valued_spacing.line.to_unit(:centimeter).value if valued_spacing.line
108
+ @line_rule = valued_spacing.line_rule if valued_spacing.line_rule
109
+ self
110
+ end
99
111
  end
100
112
  end
@@ -33,7 +33,7 @@ module OoxmlParser
33
33
  when 'effect'
34
34
  self.effect = node_child.attribute('val').value
35
35
  when 'position'
36
- self.position = (node_child.attribute('val').value.to_f / (28.0 + 1.0 / 3.0) / 2.0).round(1)
36
+ self.position = (node_child.attribute('val').value.to_f / (28.0 + (1.0 / 3.0)) / 2.0).round(1)
37
37
  when 'em'
38
38
  self.em = node_child.attribute('val').value
39
39
  when 'spacing'
@@ -216,12 +216,8 @@ module OoxmlParser
216
216
  @align = node_child.attribute('val').value.to_sym unless node_child.attribute('val').nil?
217
217
  @align = :justify if node_child.attribute('val').value == 'both'
218
218
  when 'spacing'
219
- @spacing.before = (node_child.attribute('before').value.to_f / 566.9).round(2) unless node_child.attribute('before').nil?
220
- @spacing.after = (node_child.attribute('after').value.to_f / 566.9).round(2) unless node_child.attribute('after').nil?
221
- @spacing.line_rule = node_child.attribute('lineRule').value.sub('atLeast', 'at_least').to_sym unless node_child.attribute('lineRule').nil?
222
- unless node_child.attribute('line').nil?
223
- @spacing.line = (@spacing.line_rule == :auto ? (node_child.attribute('line').value.to_f / 240.0).round(2) : (node_child.attribute('line').value.to_f / 566.9).round(2))
224
- end
219
+ @valued_spacing = ParagraphSpacing.new(parent: self).parse(node_child)
220
+ @spacing = @spacing.fetch_from_valued_spacing(@valued_spacing)
225
221
  when 'sectPr'
226
222
  @sector_properties = PageProperties.new(parent: self).parse(node_child, self, default_char_style)
227
223
  @section_break = case @sector_properties.type
@@ -19,8 +19,8 @@ module OoxmlParser
19
19
 
20
20
  # @return [True, False] compare dimensions of size, ignoring orientation
21
21
  def same_dimensions?(other)
22
- (@height == other.height) && (@width == other.width) ||
23
- (@height == other.width) && (@width == other.height)
22
+ ((@height == other.height) && (@width == other.width)) ||
23
+ ((@height == other.width) && (@width == other.height))
24
24
  end
25
25
 
26
26
  # @return [String] get human format name
@@ -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.14.1'
7
+ STRING = '0.17.0'
8
8
  end
9
9
  end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Parsing `dxfs` tag
5
+ class DifferentialFormattingRecords < OOXMLDocumentObject
6
+ # @return [Array, DifferentialFormattingRecord] list of formatting records
7
+ attr_reader :differential_formatting_records
8
+ # @return [Integer] count of formats
9
+ attr_reader :count
10
+
11
+ def initialize(parent: nil)
12
+ @differential_formatting_records = []
13
+ super
14
+ end
15
+
16
+ # @return [Array, DifferentialFormattingRecord] accessor
17
+ def [](key)
18
+ @differential_formatting_records[key]
19
+ end
20
+
21
+ # Parse DifferentialFormattingRecords data
22
+ # @param [Nokogiri::XML:Element] node with DifferentialFormattingRecords data
23
+ # @return [DifferentialFormattingRecords] value of DifferentialFormattingRecords data
24
+ def parse(node)
25
+ node.attributes.each do |key, value|
26
+ case key
27
+ when 'count'
28
+ @count = value.value.to_i
29
+ end
30
+ end
31
+
32
+ node.xpath('*').each do |node_child|
33
+ case node_child.name
34
+ when 'dxf'
35
+ @differential_formatting_records << DifferentialFormattingRecord.new(parent: self).parse(node_child)
36
+ end
37
+ end
38
+ self
39
+ end
40
+ end
41
+ end
@@ -5,6 +5,7 @@ require_relative 'style_sheet/fills'
5
5
  require_relative 'style_sheet/fonts'
6
6
  require_relative 'style_sheet/number_formats'
7
7
  require_relative 'style_sheet/xlsx_borders'
8
+ require_relative 'style_sheet/differential_formatting_records'
8
9
  module OoxmlParser
9
10
  # Parsing file styles.xml
10
11
  class StyleSheet < OOXMLDocumentObject
@@ -18,6 +19,8 @@ module OoxmlParser
18
19
  attr_reader :cell_xfs
19
20
  # @return [XlsxBorders] Cell XFs
20
21
  attr_reader :borders
22
+ # @return [DifferentialFormattingRecords] list of differential formatting records
23
+ attr_reader :differential_formatting_records
21
24
 
22
25
  def initialize(parent: nil)
23
26
  @number_formats = NumberFormats.new(parent: self)
@@ -42,6 +45,8 @@ module OoxmlParser
42
45
  @cell_xfs = CellXfs.new(parent: self).parse(node_child)
43
46
  when 'borders'
44
47
  @borders = XlsxBorders.new(parent: self).parse(node_child)
48
+ when 'dxfs'
49
+ @differential_formatting_records = DifferentialFormattingRecords.new(parent: self).parse(node_child)
45
50
  end
46
51
  end
47
52
  self
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Class for `colorScale` data
5
+ class ColorScale < OOXMLDocumentObject
6
+ # @return [Array<ConditionalFormatValueObject>] list of values
7
+ attr_reader :values
8
+ # @return [Array<OoxmlColor>] list of colors
9
+ attr_reader :colors
10
+
11
+ def initialize(parent: nil)
12
+ @values = []
13
+ @colors = []
14
+ super
15
+ end
16
+
17
+ # Parse ColorScale data
18
+ # @param [Nokogiri::XML:Element] node with ColorScale data
19
+ # @return [ColorScale] value of ColorScale data
20
+ def parse(node)
21
+ node.xpath('*').each do |node_child|
22
+ case node_child.name
23
+ when 'cfvo'
24
+ @values << ConditionalFormatValueObject.new(parent: self).parse(node_child)
25
+ when 'color'
26
+ @colors << OoxmlColor.new(parent: self).parse(node_child)
27
+ end
28
+ end
29
+ self
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Class for `cfvo` data
5
+ class ConditionalFormatValueObject < OOXMLDocumentObject
6
+ # @return [Symbol] Value type
7
+ attr_reader :type
8
+ # @return [String] Value
9
+ attr_reader :value
10
+ # @return [Symbol] Specifies whether value uses greater than or equal to operator
11
+ attr_reader :greater_or_equal
12
+ # @return [Formula] Formula
13
+ attr_reader :formula
14
+
15
+ def initialize(parent: nil)
16
+ @greater_or_equal = true
17
+ super
18
+ end
19
+
20
+ # Parse ConditionalFormatValueObject data
21
+ # @param [Nokogiri::XML:Element] node with ConditionalFormatValueObject data
22
+ # @return [ConditionalFormatValueObject] value of ConditionalFormatValueObject data
23
+ def parse(node)
24
+ node.attributes.each do |key, value|
25
+ case key
26
+ when 'type'
27
+ @type = value.value.to_sym
28
+ when 'val'
29
+ @value = value.value.to_s
30
+ when 'gte'
31
+ @greater_or_equal = attribute_enabled?(value)
32
+ end
33
+ end
34
+
35
+ node.xpath('*').each do |node_child|
36
+ case node_child.name
37
+ when 'f'
38
+ @formula = Formula.new(parent: self).parse(node_child)
39
+ end
40
+ end
41
+ self
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'data_bar/conditional_format_value_object'
4
+ module OoxmlParser
5
+ # Class for `dataBar` data
6
+ class DataBar < OOXMLDocumentObject
7
+ # @return [Integer] Minimal length of the data bar as a percentage of the cell width
8
+ attr_reader :min_length
9
+ # @return [Integer] Maximal length of the data bar as a percentage of the cell width
10
+ attr_reader :max_length
11
+ # @return [Symbol] Specifies whether value is shown in a cell
12
+ attr_reader :show_value
13
+ # @return [Symbol] Position of axis in a cell
14
+ attr_reader :axis_position
15
+ # @return [Symbol] Data bar direction
16
+ attr_reader :direction
17
+ # @return [Symbol] Specifies whether data bar fill is gradient
18
+ attr_reader :gradient
19
+ # @return [Symbol] Specifies whether data bar has border
20
+ attr_reader :border
21
+ # @return [Symbol] Specifies whether fill color for negative values is same as for positive
22
+ attr_reader :negative_bar_same_as_positive
23
+ # @return [Symbol] Specifies whether border color for negative values is same as for positive
24
+ attr_reader :negative_border_same_as_positive
25
+ # @return [Array, ConditionalFormatValueObject] minimal and maximal value
26
+ attr_reader :values
27
+ # @return [Color] Fill color for positive values
28
+ attr_reader :fill_color
29
+ # @return [Color] Fill color for negative values
30
+ attr_reader :negative_fill_color
31
+ # @return [Color] Border color for positive values
32
+ attr_reader :border_color
33
+ # @return [Color] Border color for negative values
34
+ attr_reader :negative_border_color
35
+ # @return [Color] Axis color
36
+ attr_reader :axis_color
37
+
38
+ def initialize(parent: nil)
39
+ @values = []
40
+ @show_value = true
41
+ @gradient = true
42
+ @negative_border_same_as_positive = true
43
+ super
44
+ end
45
+
46
+ # Parse DataBar data
47
+ # @param [Nokogiri::XML:Element] node with DataBar data
48
+ # @return [DataBar] value of DataBar data
49
+ def parse(node)
50
+ node.attributes.each do |key, value|
51
+ case key
52
+ when 'minLength'
53
+ @min_length = value.value.to_i
54
+ when 'maxLength'
55
+ @max_length = value.value.to_i
56
+ when 'showValue'
57
+ @show_value = attribute_enabled?(value)
58
+ when 'axisPosition'
59
+ @axis_position = value.value.to_sym
60
+ when 'direction'
61
+ @direction = value.value.to_sym
62
+ when 'gradient'
63
+ @gradient = attribute_enabled?(value)
64
+ when 'border'
65
+ @border = attribute_enabled?(value)
66
+ when 'negativeBarColorSameAsPositive'
67
+ @negative_bar_same_as_positive = attribute_enabled?(value)
68
+ when 'negativeBarBorderColorSameAsPositive'
69
+ @negative_border_same_as_positive = attribute_enabled?(value)
70
+ end
71
+ end
72
+
73
+ node.xpath('*').each do |node_child|
74
+ case node_child.name
75
+ when 'cfvo'
76
+ @values << ConditionalFormatValueObject.new(parent: self).parse(node_child)
77
+ when 'fillColor'
78
+ @fill_color = OoxmlColor.new(parent: self).parse(node_child)
79
+ when 'negativeFillColor'
80
+ @negative_fill_color = OoxmlColor.new(parent: self).parse(node_child)
81
+ when 'borderColor'
82
+ @border_color = OoxmlColor.new(parent: self).parse(node_child)
83
+ when 'negativeBorderColor'
84
+ @negative_border_color = OoxmlColor.new(parent: self).parse(node_child)
85
+ when 'axisColor'
86
+ @axis_color = OoxmlColor.new(parent: self).parse(node_child)
87
+ end
88
+ end
89
+ self
90
+ end
91
+
92
+ # @return [ConditionalFormatValueObject] minimal value
93
+ def minimum
94
+ values[0]
95
+ end
96
+
97
+ # @return [ConditionalFormatValueObject] maximal value
98
+ def maximum
99
+ values[1]
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Class for `dxf` data
5
+ class DifferentialFormattingRecord < OOXMLDocumentObject
6
+ # @return [Font] Font
7
+ attr_reader :font
8
+ # @return [NumberFormat] Number format
9
+ attr_reader :number_format
10
+ # @return [Fill] Fill
11
+ attr_reader :fill
12
+ # @return [Borders] Borders
13
+ attr_reader :borders
14
+
15
+ # Parse DifferentialFormattingRecord data
16
+ # @param [Nokogiri::XML:Element] node with DifferentialFormattingRecord data
17
+ # @return [DifferentialFormattingRecord] value of DifferentialFormattingRecord data
18
+ def parse(node)
19
+ node.xpath('*').each do |node_child|
20
+ case node_child.name
21
+ when 'font'
22
+ @font = Font.new(parent: self).parse(node_child)
23
+ when 'numFmt'
24
+ @number_format = NumberFormat.new(parent: self).parse(node_child)
25
+ when 'fill'
26
+ @fill = Fill.new(parent: self).parse(node_child)
27
+ when 'border'
28
+ @borders = XlsxBorder.new(parent: self).parse(node_child)
29
+ end
30
+ end
31
+ self
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OoxmlParser
4
+ # Class for `cfIcon` data
5
+ class ConditionalFormattingIcon < OOXMLDocumentObject
6
+ # @return [String] Name of icon set
7
+ attr_reader :icon_set
8
+ # @return [Integer] Id of icon in set
9
+ attr_reader :icon_id
10
+
11
+ # Parse ConditionalFormattingIcon data
12
+ # @param [Nokogiri::XML:Element] node with ConditionalFormattingIcon data
13
+ # @return [ConditionalFormattingIcon] value of ConditionalFormattingIcon data
14
+ def parse(node)
15
+ node.attributes.each do |key, value|
16
+ case key
17
+ when 'iconSet'
18
+ @icon_set = value.value.to_s
19
+ when 'iconId'
20
+ @icon_id = value.value.to_i
21
+ end
22
+ end
23
+ self
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'icon_set/conditional_formatting_icon'
4
+ module OoxmlParser
5
+ # Class for `iconSet` data
6
+ class IconSet < OOXMLDocumentObject
7
+ # @return [String] Name of icon set
8
+ attr_reader :set
9
+ # @return [Symbol] Specifies whether icons are shown in reverse order
10
+ attr_reader :reverse
11
+ # @return [Symbol] Specifies whether value is shown in a cell
12
+ attr_reader :show_value
13
+ # @return [Symbol] Specifies whether icon set is custom
14
+ attr_reader :custom
15
+ # @return [Array<ConditionalFormatValueObject>] list of values
16
+ attr_reader :values
17
+ # @return [Array<ConditionalFormattingIcon>] list of icons for custom sets
18
+ attr_reader :icons
19
+
20
+ def initialize(parent: nil)
21
+ @values = []
22
+ @icons = []
23
+ @show_value = true
24
+ super
25
+ end
26
+
27
+ # Parse IconSet data
28
+ # @param [Nokogiri::XML:Element] node with IconSet data
29
+ # @return [IconSet] value of IconSet data
30
+ def parse(node)
31
+ node.attributes.each do |key, value|
32
+ case key
33
+ when 'iconSet'
34
+ @set = value.value.to_s
35
+ when 'reverse'
36
+ @reverse = attribute_enabled?(value)
37
+ when 'showValue'
38
+ @show_value = attribute_enabled?(value)
39
+ when 'custom'
40
+ @custom = attribute_enabled?(value)
41
+ end
42
+ end
43
+
44
+ node.xpath('*').each do |node_child|
45
+ case node_child.name
46
+ when 'cfvo'
47
+ @values << ConditionalFormatValueObject.new(parent: self).parse(node_child)
48
+ when 'cfIcon'
49
+ @icons << ConditionalFormattingIcon.new(parent: self).parse(node_child)
50
+ end
51
+ end
52
+ self
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'conditional_formatting_rule/differential_formatting_record'
4
+ require_relative 'conditional_formatting_rule/data_bar'
5
+ require_relative 'conditional_formatting_rule/color_scale'
6
+ require_relative 'conditional_formatting_rule/icon_set'
7
+ module OoxmlParser
8
+ # Class for `cfRule` data
9
+ class ConditionalFormattingRule < OOXMLDocumentObject
10
+ # @return [Symbol] Type of rule
11
+ attr_reader :type
12
+ # @return [Integer] Specifies position on the list of rules
13
+ attr_reader :priority
14
+ # @return [String] ID of rule
15
+ attr_reader :id
16
+ # @return [Integer] index of format
17
+ attr_reader :format_index
18
+ # @return [Symbol] Specifies whether rules with lower priority should be applied over this rule
19
+ attr_reader :stop_if_true
20
+ # @return [Symbol] Relational operator in value rule
21
+ attr_reader :operator
22
+ # @return [Symbol] Specifies whether top/bottom rule highlights bottom values
23
+ attr_reader :bottom
24
+ # @return [Symbol] Specifies whether percent is used in top/bottom rule
25
+ attr_reader :percent
26
+ # @return [Integer] Number of items in top/bottom rule
27
+ attr_reader :rank
28
+ # @return [Boolean] Specifies whether rule highlights values above average
29
+ attr_reader :above_average
30
+ # @return [Boolean] Specifies whether rule highlights values equal to average
31
+ attr_reader :equal_average
32
+ # @return [Integer] Number of standard deviations in above/below average rule
33
+ attr_reader :standard_deviation
34
+ # @return [String] Text value in text rule
35
+ attr_reader :text
36
+ # @return [Symbol] Time period in date rule
37
+ attr_reader :time_period
38
+ # @return [Array<Formula>] Formulas to determine condition
39
+ attr_reader :formulas
40
+ # @return [DifferentialFormattingRecord] Format
41
+ attr_reader :rule_format
42
+ # @return [DataBar] data bar formatting
43
+ attr_reader :data_bar
44
+ # @return [ColorScale] color scale formatting
45
+ attr_reader :color_scale
46
+ # @return [IconSet] icon set formatting
47
+ attr_reader :icon_set
48
+
49
+ def initialize(parent: nil)
50
+ @above_average = true
51
+ @formulas = []
52
+ super
53
+ end
54
+
55
+ # Parse ConditionalFormattingRule data
56
+ # @param [Nokogiri::XML:Element] node with ConditionalFormattingRule data
57
+ # @return [ConditionalFormattingRule] value of ConditionalFormattingRule data
58
+ def parse(node)
59
+ node.attributes.each do |key, value|
60
+ case key
61
+ when 'type'
62
+ @type = value.value.to_sym
63
+ when 'priority'
64
+ @priority = value.value.to_i
65
+ when 'id'
66
+ @id = value.value.to_s
67
+ when 'dxfId'
68
+ @format_index = value.value.to_i
69
+ when 'stopIfTrue'
70
+ @stop_if_true = attribute_enabled?(value)
71
+ when 'operator'
72
+ @operator = value.value.to_sym
73
+ when 'bottom'
74
+ @bottom = attribute_enabled?(value)
75
+ when 'percent'
76
+ @percent = attribute_enabled?(value)
77
+ when 'rank'
78
+ @rank = value.value.to_i
79
+ when 'aboveAverage'
80
+ @above_average = attribute_enabled?(value)
81
+ when 'equalAverage'
82
+ @equal_average = attribute_enabled?(value)
83
+ when 'stdDev'
84
+ @standard_deviation = value.value.to_i
85
+ when 'text'
86
+ @text = value.text.to_s
87
+ when 'timePeriod'
88
+ @time_period = value.value.to_sym
89
+ end
90
+ end
91
+
92
+ node.xpath('*').each do |node_child|
93
+ case node_child.name
94
+ when 'f'
95
+ @formulas << Formula.new(parent: self).parse(node_child)
96
+ when 'dxf'
97
+ @rule_format = DifferentialFormattingRecord.new(parent: self).parse(node_child)
98
+ when 'dataBar'
99
+ @data_bar = DataBar.new(parent: self).parse(node_child)
100
+ when 'colorScale'
101
+ @color_scale = ColorScale.new(parent: self).parse(node_child)
102
+ when 'iconSet'
103
+ @icon_set = IconSet.new(parent: self).parse(node_child)
104
+ end
105
+ end
106
+ self
107
+ end
108
+
109
+ # @return [nil, DifferentialFormattingRecord] format of rule
110
+ def format
111
+ return @rule_format if @rule_format
112
+ return nil unless @format_index
113
+
114
+ root_object.style_sheet.differential_formatting_records[@format_index]
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'conditional_formatting/conditional_formatting_rule'
4
+ module OoxmlParser
5
+ # Class for `conditionalFormatting` data
6
+ class ConditionalFormatting < OOXMLDocumentObject
7
+ # @return [Array, ConditionalFormattingRule] list of conditional formatting rules
8
+ attr_reader :rules
9
+ # @return [String] Ranges to which conditional formatting is applied
10
+ attr_reader :reference_sequence
11
+
12
+ def initialize(parent: nil)
13
+ @rules = []
14
+ super
15
+ end
16
+
17
+ # Parse ConditionalFormatting data
18
+ # @param [Nokogiri::XML:Element] node with ConditionalFormatting data
19
+ # @return [ConditionalFormatting] value of ConditionalFormatting data
20
+ def parse(node)
21
+ node.xpath('*').each do |node_child|
22
+ case node_child.name
23
+ when 'cfRule'
24
+ @rules << ConditionalFormattingRule.new(parent: self).parse(node_child)
25
+ when 'sqref'
26
+ @reference_sequence = node_child.text
27
+ end
28
+ end
29
+ self
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'conditional_formattings/conditional_formatting'
4
+ module OoxmlParser
5
+ # Class for `conditionalFormattings` data
6
+ class ConditionalFormattings < OOXMLDocumentObject
7
+ # @return [Array<ConditionalFormatting>] list of conditional formattings
8
+ attr_reader :conditional_formattings_list
9
+
10
+ def initialize(parent: nil)
11
+ @conditional_formattings_list = []
12
+ super
13
+ end
14
+
15
+ # @return [Array, ConditionalFormatting] accessor
16
+ def [](key)
17
+ @conditional_formattings_list[key]
18
+ end
19
+
20
+ # Parse ConditionalFormattings data
21
+ # @param [Nokogiri::XML:Element] node with ConditionalFormattings data
22
+ # @return [ConditionalFormattings] value of ConditionalFormattings data
23
+ def parse(node)
24
+ node.xpath('*').each do |node_child|
25
+ case node_child.name
26
+ when 'conditionalFormatting'
27
+ @conditional_formattings_list << ConditionalFormatting.new(parent: self).parse(node_child)
28
+ end
29
+ end
30
+ self
31
+ end
32
+ end
33
+ end
@@ -3,11 +3,14 @@
3
3
  require_relative 'extension/data_validations'
4
4
  require_relative 'extension/sparkline_groups'
5
5
  require_relative 'extension/x14_table'
6
+ require_relative 'extension/conditional_formattings'
6
7
  module OoxmlParser
7
8
  # Class for `ext` data
8
9
  class Extension < OOXMLDocumentObject
9
10
  # @return [DataValidations] list of data validations
10
11
  attr_accessor :data_validations
12
+ # @return [ConditionalFormattings] list of conditional formattings
13
+ attr_reader :conditional_formattings
11
14
  # @return [X14Table] table data in x14 namespace
12
15
  attr_accessor :table
13
16
  # @return [SparklineGroups] list of groups
@@ -21,6 +24,8 @@ module OoxmlParser
21
24
  case column_node.name
22
25
  when 'dataValidations'
23
26
  @data_validations = DataValidations.new(parent: self).parse(column_node)
27
+ when 'conditionalFormattings'
28
+ @conditional_formattings = ConditionalFormattings.new(parent: self).parse(column_node)
24
29
  when 'table'
25
30
  @table = X14Table.new(parent: self).parse(column_node)
26
31
  when 'sparklineGroups'
@@ -31,6 +31,8 @@ module OoxmlParser
31
31
  attr_accessor :extension_list
32
32
  # @return [XlsxHeaderFooter] header and footer
33
33
  attr_reader :header_footer
34
+ # @return [Array<ConditionalFormatting>] list of conditional formattings
35
+ attr_reader :conditional_formattings
34
36
 
35
37
  def initialize(parent: nil)
36
38
  @columns = []
@@ -42,6 +44,7 @@ module OoxmlParser
42
44
  @drawings = []
43
45
  @sheet_views = []
44
46
  @table_parts = []
47
+ @conditional_formattings = []
45
48
  super
46
49
  end
47
50
 
@@ -129,6 +132,8 @@ module OoxmlParser
129
132
  @extension_list = ExtensionList.new(parent: self).parse(worksheet_node_child)
130
133
  when 'headerFooter'
131
134
  @header_footer = XlsxHeaderFooter.new(parent: self).parse(worksheet_node_child)
135
+ when 'conditionalFormatting'
136
+ @conditional_formattings << ConditionalFormatting.new(parent: self).parse(worksheet_node_child)
132
137
  end
133
138
  end
134
139
  parse_comments
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.14.1
4
+ version: 0.17.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-08-03 00:00:00.000000000 Z
13
+ date: 2021-09-15 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
@@ -509,6 +509,7 @@ files:
509
509
  - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/style_sheet/cell_xfs.rb
510
510
  - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/style_sheet/cell_xfs/cell_style/alignment.rb
511
511
  - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/style_sheet/cell_xfs/xf.rb
512
+ - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/style_sheet/differential_formatting_records.rb
512
513
  - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/style_sheet/fills.rb
513
514
  - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/style_sheet/fills/fill.rb
514
515
  - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/style_sheet/fills/fill/pattern_fill.rb
@@ -536,6 +537,15 @@ files:
536
537
  - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/autofilter/filter_column/custom_filters/custom_filter.rb
537
538
  - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list.rb
538
539
  - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension.rb
540
+ - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings.rb
541
+ - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting.rb
542
+ - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule.rb
543
+ - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule/color_scale.rb
544
+ - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule/data_bar.rb
545
+ - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule/data_bar/conditional_format_value_object.rb
546
+ - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule/differential_formatting_record.rb
547
+ - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule/icon_set.rb
548
+ - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/conditional_formattings/conditional_formatting/conditional_formatting_rule/icon_set/conditional_formatting_icon.rb
539
549
  - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/data_validations.rb
540
550
  - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/data_validations/data_validation.rb
541
551
  - lib/ooxml_parser/xlsx_parser/xlsx_data/view_model/workbook/worksheet/table_part/extension_list/extension/data_validations/data_validation/data_validation_formula.rb
@@ -579,7 +589,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
579
589
  - !ruby/object:Gem::Version
580
590
  version: '0'
581
591
  requirements: []
582
- rubygems_version: 3.2.22
592
+ rubygems_version: 3.2.27
583
593
  signing_key:
584
594
  specification_version: 4
585
595
  summary: OoxmlParser Gem