class ReplaceOffsetsWithReferencesAst
Attributes
count_replaced[RW]
replacement_made[RW]
Public Class Methods
new()
click to toggle source
# File src/simplify/replace_offsets_with_references.rb, line 6 def initialize @count_replaced = 0 end
Public Instance Methods
function(ast)
click to toggle source
# File src/simplify/replace_offsets_with_references.rb, line 23 def function(ast) name = ast[1] args = ast[2..-1] return unless ast[1] == :OFFSET reference = ast[2] row_offset = ast[3] column_offset = ast[4] height = ast[5] width = ast[6] reference = reference.original unless %i{cell sheet_reference array}.include?(reference.first) unless height if reference.first != :array height = [:number, 1.0] else height = [:number, reference.length - 1] end end unless width if reference.first != :array width = [:number, 1.0] else width = [:number, reference[1].length - 1] end end if reference.first == :array reference = reference[1][1].original end [row_offset, column_offset, height, width].each do |arg| next unless arg.first == :error ast.replace(arg) return end return unless [row_offset, column_offset, height, width].all? { |a| a.first == :number } if reference.first == :cell ast.replace(offset_cell(reference, row_offset, column_offset, height, width, nil)) elsif reference.first == :sheet_reference && reference[2].first == :cell ast.replace(offset_cell(reference[2], row_offset, column_offset, height, width, reference[1])) else p "OFFSET reference is #{reference} from #{ast}, so not replacing" end end
map(ast)
click to toggle source
# File src/simplify/replace_offsets_with_references.rb, line 16 def map(ast) return ast unless ast.is_a?(Array) function(ast) if ast[0] == :function ast.each { |a| map(a) } ast end
offset_cell(reference, row_offset, column_offset, height, width, sheet)
click to toggle source
# File src/simplify/replace_offsets_with_references.rb, line 72 def offset_cell(reference, row_offset, column_offset, height, width, sheet) reference = reference[1] row_offset = row_offset[1].to_i column_offset = column_offset[1].to_i height = height[1].to_i width = width[1].to_i @count_replaced += 1 @replacement_made = true reference = Reference.for(reference).unfix start_reference = reference.offset(row_offset.to_i, column_offset.to_i) end_reference = reference.offset(row_offset.to_i + height.to_i - 1, column_offset.to_i + width.to_i - 1) if start_reference == end_reference if sheet return [:sheet_reference, sheet, [:cell, start_reference]] else return [:cell, start_reference] end else area = Area.for("#{start_reference}:#{end_reference}") return area.to_array_literal(sheet) end end
replace(ast)
click to toggle source
# File src/simplify/replace_offsets_with_references.rb, line 10 def replace(ast) @replacement_made = false map(ast) @replacement_made end