class TimetableReader

include Contracts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Public Class Methods

new(spreadsheet, sheet_number=1) click to toggle source

Contract IsA, Pos => Any

# File lib/tmis/engine/import/timetable_reader.rb, line 10
def initialize(spreadsheet, sheet_number=1)
  @table = spreadsheet
  week(sheet_number)
end

Public Instance Methods

groups() click to toggle source

Contract None => Array

# File lib/tmis/engine/import/timetable_reader.rb, line 21
def groups
  (3..@table.last_column).each_slice(2).map do |cols|
    { title: @table[7, cols.first], days: get_days(cols) }
  end
end
week(num) click to toggle source

Contract Pos => TimetableReader

# File lib/tmis/engine/import/timetable_reader.rb, line 16
def week(num)
  @table.sheet(num); self
end

Private Instance Methods

get_days(cols) click to toggle source

Contract [Pos, Pos] => Array

# File lib/tmis/engine/import/timetable_reader.rb, line 29
def get_days(cols)
  (7..84).each_slice(13).map{ |i| [i[1], i.last] }.map do |rows|
    { name: @table[rows.first, 1], studies: get_studies(rows, cols) }
  end
end
get_studies(rows, cols) click to toggle source

Contract [Pos, Pos], [Pos, Pos] => Array

# File lib/tmis/engine/import/timetable_reader.rb, line 36
def get_studies(rows, cols)
  (rows.first..rows.last).each_slice(2).map do |study_rows|
    study_rows.each_with_index.map do |row, index|
      cabinet = @table[row, cols.last]
      { info: parse_info(@table[row, cols.first]),
        cabinet: if cabinet.nil? || if cabinet.kind_of?(String); cabinet.empty?; else; false end;
                   @table[row - index, cols.last]
                 else
                   cabinet
                 end }
    end.reject{ |s| s[:info].nil? }
  end
end
parse_info(info) click to toggle source

Contract Maybe => Maybe

# File lib/tmis/engine/import/timetable_reader.rb, line 51
def parse_info(info)
  unless info.nil? || info.empty?
    reversed_info = info.split(/[\s\n\.\(\)\-_,]/).reverse.join(' ')
    # TODO Переписать регулярку с использованием условий в движке Onigmo (Ruby 2.0)
    r = /
        (
          ([Пп]|[Пп][Гг]|[Пп][Оо][Дд][Гг][Рр]|[Пп][Оо][Дд][Гг][Рр][Уу][Пп][Пп][Аа])*\s*
          (?<subgroup>[[:digit:]])
          \s*([Пп]|[Пп][Гг]|[Пп][Оо][Дд][Гг][Рр]|[Пп][Оо][Дд][Гг][Рр][Уу][Пп][Пп][Аа])*\s*
        )?
          (
            (?<patronymic>[[:upper:]])\s
            (?<name>[[:upper:]])\s*
          )?
        (
          (?<surname>
            ([Вв][Аа][Кк][Аа][Нн][Сс][Ии][Яя]|[[:upper:]][[:lower:]]+)
          )
        )?
        (?<title>.*)/mx
    data = r.match(reversed_info.strip)
    res = { subject: data[:title].split.reverse.join(' ').strip,
      lecturer: { surname: data[:surname], name: data[:name], patronymic: data[:patronymic] },
      subgroup: data[:subgroup] }
    res
  end
end