Class: OoxmlParser::Coordinates

Inherits:
Object
  • Object
show all
Defined in:
lib/ooxml_parser/common_parser/common_data/coordinates.rb

Overview

Class for working with coordinates

Constant Summary collapse

ROW_REGEXP =

Returns regexp for row name.

Returns:

  • (Regexp)

    regexp for row name

/[a-z]/i.freeze
COLUMN_REGEXP =

Returns regexp for column name.

Returns:

  • (Regexp)

    regexp for column name

/\d/.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(row = nil, column = nil, list = nil) ⇒ Coordinates

Returns a new instance of Coordinates.



13
14
15
16
17
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 13

def initialize(row = nil, column = nil, list = nil)
  @row = row.nil? ? row : row.to_i
  @column = column
  @list = list
end

Instance Attribute Details

#columnObject

Returns the value of attribute column.



11
12
13
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 11

def column
  @column
end

#listObject

Returns the value of attribute list.



11
12
13
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 11

def list
  @list
end

#rowObject

Returns the value of attribute row.



11
12
13
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 11

def row
  @row
end

Class Method Details

.coordinates?(string) ⇒ Boolean

This method check is argument contains coordinate

Parameters:

  • string (String)

Returns:

  • (Boolean)


84
85
86
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 84

def coordinates?(string)
  !/^([A-Z]+)(\d+)$/.match(string).nil?
end

.get_column_name(number) ⇒ String

This method takes string like ‘12’ or ‘45’ etc. and converts into spreadsheet column’s name

StringHelper.get_column_name('12')  #=> "L"
StringHelper.get_column_name('45')  #=> "AS"
StringHelper.get_column_name('287')  #=> "KA"

Parameters:

  • number (String or Fixnum)

    to convert

Returns:

  • (String)

    column’s name



95
96
97
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 95

def get_column_name(number)
  (number.to_i.positive? ? ('A'..'Z').to_a[(number.to_i - 1) % 26] + get_column_name((number.to_i - 1) / 26).reverse : '').reverse
end

.parse_coordinates_array(arguments_string) ⇒ Array

Parse array of coordinates

Parameters:

  • arguments_string (String)

    string

Returns:

  • (Array)

    result



73
74
75
76
77
78
79
80
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 73

def parse_coordinates_array(arguments_string)
  result = []
  coord_array = arguments_string.split(',')
  coord_array.each do |current_coord|
    result << parser_coordinates_range(current_coord)
  end
  result
end

.parser_coordinates_range(arguments_string) ⇒ Array

Parse range of coordinates

Parameters:

  • arguments_string (String)

    data to parse

Returns:

  • (Array)

    result



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 23

def parser_coordinates_range(arguments_string)
  return parse_coordinates_array(arguments_string) if arguments_string.include?(',')
  return warn "Formulas with # is unsupported: #{arguments_string}" if arguments_string.include?('#')
  return warn 'Formulas consists from `!` only' if arguments_string == '!'

  sheet_name = 'Sheet1'

  if arguments_string.include?('!')
    sheet_name = arguments_string.match(/.*!/).to_s
    arguments_string = arguments_string.sub(sheet_name, '')
  end

  range = arguments_string.split(':')

  difference = []
  symbols_from = range.first.scan(ROW_REGEXP).join
  symbols_to = range.last.scan(ROW_REGEXP).join
  digits_from = range.first.scan(COLUMN_REGEXP).join
  digits_to = range.last.scan(COLUMN_REGEXP).join

  difference[0] = [symbols_from, symbols_to] unless symbols_from == symbols_to
  difference[1] = [digits_from, digits_to] unless digits_from == digits_to
  arguments_array = []
  case difference.length
  when 0
    arguments_array << Coordinates.new(digits_from, symbols_from)
  when 1
    (difference.first.first..difference.first.last).each do |symbol|
      arguments_array << Coordinates.new(digits_from, symbol, sheet_name)
    end
  when 2
    case difference.first
    when nil
      (difference.last.first..difference.last.last).each do |digit|
        arguments_array << Coordinates.new(digit, symbols_from, sheet_name)
      end
    else
      (difference.first.first..difference.first.last).each do |symbol|
        (difference.last.first..difference.last.last).each do |digit|
          arguments_array << Coordinates.new(digit, symbol, sheet_name)
        end
      end
    end
  end
  arguments_array
end

Instance Method Details

#==(other) ⇒ True, False

Compare this object to other

Parameters:

  • other (Object)

    any other object

Returns:

  • (True, False)

    result of comparision



147
148
149
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 147

def ==(other)
  other.is_a?(Coordinates) ? (@row == other.row && @column == other.column) : false
end

#column_greater_that_other?(other_cell) ⇒ true, false

Compares columns of two cells

Parameters:

Returns:

  • (true, false)

    true, if column greater, than other row



131
132
133
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 131

def column_greater_that_other?(other_cell)
  column_number > other_cell.column_number
end

#column_numberInteger

This method takes @column string and converts into integer

Returns:

  • (Integer)

    number of column



115
116
117
118
119
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 115

def column_number
  @column.reverse.each_char.reduce(0) do |result, char|
    result + ((char.downcase.ord - 96) * (26**@column.reverse.index(char)))
  end
end

#nil?Boolean

Returns:

  • (Boolean)


140
141
142
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 140

def nil?
  @column.nil? && @list.nil? && @row.nil?
end

#parse_string(string) ⇒ Coordinates

Parse string to coordinates

Parameters:

  • string (String)

    to parse

Returns:



103
104
105
106
107
108
109
110
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 103

def parse_string(string)
  string = extract_list_from_string(string) if list_name_in_string?(string)
  if Coordinates.coordinates?(string)
    @row = string.scan(/\d/).join.to_i
    @column = string.scan(/[A-Z]/).join
  end
  self
end

#row_greater_that_other?(other_cell) ⇒ true, false

Compares rows of two cells

Parameters:

Returns:

  • (true, false)

    true, if row greater, than other row



124
125
126
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 124

def row_greater_that_other?(other_cell)
  @row > other_cell.row
end

#to_sString

Returns result of convert of object to string.

Returns:

  • (String)

    result of convert of object to string



136
137
138
# File 'lib/ooxml_parser/common_parser/common_data/coordinates.rb', line 136

def to_s
  "#{@column}#{@row} #{@list ? "list: #{@list}" : ''}"
end