diff options
| author | Weston Ganger <[email protected]> | 2022-02-05 15:39:05 -0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-02-06 00:39:05 +0100 |
| commit | 196862524f94c58b1521ef84a6cf0397b411a685 (patch) | |
| tree | 43903550e4eca508449f48026e9429474d2e75ad /lib | |
| parent | d3cf7bca5728b166c7643ad839efeba60ed0e256 (diff) | |
| download | caxlsx-196862524f94c58b1521ef84a6cf0397b411a685.tar.gz caxlsx-196862524f94c58b1521ef84a6cf0397b411a685.zip | |
Allow border style to accept an Array (#117)
Co-authored-by: Noel Peden <[email protected]>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/axlsx/stylesheet/border.rb | 2 | ||||
| -rw-r--r-- | lib/axlsx/stylesheet/styles.rb | 110 |
2 files changed, 94 insertions, 18 deletions
diff --git a/lib/axlsx/stylesheet/border.rb b/lib/axlsx/stylesheet/border.rb index 422a4466..0a823c7a 100644 --- a/lib/axlsx/stylesheet/border.rb +++ b/lib/axlsx/stylesheet/border.rb @@ -6,6 +6,8 @@ module Axlsx include Axlsx::SerializedAttributes include Axlsx::OptionsParser + EDGES = [:left, :right, :top, :bottom].freeze + # Creates a new Border object # @option options [Boolean] diagonal_up # @option options [Boolean] diagonal_down diff --git a/lib/axlsx/stylesheet/styles.rb b/lib/axlsx/stylesheet/styles.rb index 2460ab10..d1ee1f66 100644 --- a/lib/axlsx/stylesheet/styles.rb +++ b/lib/axlsx/stylesheet/styles.rb @@ -310,33 +310,108 @@ module Axlsx # may include an :edges entry that references an array of symbols identifying which border edges # you wish to apply the style or any other valid Border initializer options. # If the :edges entity is not provided the style is applied to all edges of cells that reference this style. - # Also available :border_top, :border_right, :border_bottom and :border_left options with :style and/or :color - # key-value entries, which override :border values. + # Also available :border_top, :border_right, :border_bottom and :border_left options with :style and/or :color + # key-value entries, which override :border values. # @example # #apply a thick red border to the top and bottom # { :border => { :style => :thick, :color => "FFFF0000", :edges => [:top, :bottom] } # @return [Border|Integer] def parse_border_options(options={}) - return unless options[:border] - b_opts = options[:border] - if b_opts.is_a?(Hash) - raise ArgumentError, (ERR_INVALID_BORDER_OPTIONS % b_opts) unless b_opts.keys.include?(:style) && b_opts.keys.include?(:color) - border = Border.new b_opts - (b_opts[:edges] || [:left, :right, :top, :bottom]).each do |edge| - edge_options = options["border_#{edge}".to_sym] || {} - border_edge = b_opts.merge(edge_options) - b_options = { :name => edge, :style => border_edge[:style], :color => Color.new(:rgb => border_edge[:color]) } - border.prs << BorderPr.new(b_options) + if options[:border].nil? && Border::EDGES.all?{|x| options["border_#{x}".to_sym].nil? } + return nil + end + + if options[:border].is_a?(Integer) + if options[:border] >= borders.size + raise ArgumentError, (ERR_INVALID_BORDER_ID % options[:border]) end - options[:type] == :dxf ? border : borders << border - elsif b_opts.is_a? Integer - raise ArgumentError, (ERR_INVALID_BORDER_ID % b_opts) unless b_opts < borders.size + if options[:type] == :dxf - borders[b_opts].clone + return borders[options[:border]].clone + else + return options[:border] + end + end + + validate_border_hash = ->(val){ + if !(val.keys.include?(:style) && val.keys.include?(:color)) + raise ArgumentError, (ERR_INVALID_BORDER_OPTIONS % options[:border]) + end + } + + borders_array = [] + + if options[:border].nil? + base_border_opts = {} + else + if options[:border].is_a?(Array) + borders_array += options[:border] + + base_border_opts = {} + + options[:border].each do |b_opts| + if b_opts[:edges].nil? + base_border_opts = base_border_opts.merge(b_opts) + end + end else - border = b_opts + borders_array << options[:border] + + base_border_opts = options[:border] + + validate_border_hash.call(base_border_opts) + end + end + + Border::EDGES.each do |edge| + val = options["border_#{edge}".to_sym] + + if val + borders_array << val.merge(edges: [edge]) + end + end + + border = Border.new(base_border_opts) + + Border::EDGES.each do |edge| + edge_b_opts = base_border_opts + + skip_edge = true + + borders_array.each do |b_opts| + if b_opts[:edges] && b_opts[:edges].include?(edge) + edge_b_opts = edge_b_opts.merge(b_opts) + skip_edge = false + end + end + + if options["border_#{edge}".to_sym] + edge_b_opts = edge_b_opts.merge(options["border_#{edge}".to_sym]) + skip_edge = false + end + + if skip_edge && base_border_opts[:edges] + next + end + + if !edge_b_opts.empty? + if base_border_opts.empty? + validate_border_hash.call(edge_b_opts) + end + + border.prs << BorderPr.new({ + :name => edge, + :style => edge_b_opts[:style], + :color => Color.new(:rgb => edge_b_opts[:color]) }, + ) end end + + if options[:type] == :dxf + return border + else + return borders << border + end end # Parses Style#add_style options for number formatting. @@ -417,4 +492,3 @@ module Axlsx end end end - |
