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
# 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