refactor: big refactor
This commit is contained in:
57
parser.py
57
parser.py
@@ -9,10 +9,11 @@ WEEKDAYS_STARTSWITH = [
|
||||
"среда",
|
||||
"четверг",
|
||||
"пятница",
|
||||
"суббота"
|
||||
"суббота",
|
||||
"воскр"
|
||||
]
|
||||
|
||||
bad_group_names = [
|
||||
BAD_GROUP_NAMES = [
|
||||
"янв", "февр", "март", "апр", "май", "сент", "окт", "ноя", "дек", "июнь", "июль", "авг"
|
||||
]
|
||||
|
||||
@@ -68,6 +69,7 @@ class Parser:
|
||||
print(" -- Failed parse! -- ")
|
||||
print("дни недели не найдены!")
|
||||
self.parser_error = f"{WEEKDAYS_STARTSWITH} ни один найден в таблице. Дня недели нет."
|
||||
self.parse_raw_no_schedule()
|
||||
return
|
||||
|
||||
pair_num_any = self.reader.find_any(PAIR_NUMS, nospace=True)
|
||||
@@ -98,6 +100,7 @@ class Parser:
|
||||
print(head_joined)
|
||||
if "1 неделя" in head_joined or "1 НЕДЕЛЯ" in head_joined or "2 неделя" in head_joined or "2 НЕДЕЛЯ" in head_joined or "ИЗМЕНЕНИЯ" in head_joined or "изменения" in head_joined or "vtf-vstu.ru" in head_joined:
|
||||
head_rx -= 1
|
||||
self.raw_no_schedule.append(head_joined)
|
||||
head = self.reader.get_row_values(head_rx) # get all ROW (months, groups)
|
||||
pprint(f"head (upper)={head}")
|
||||
self.features.add("post_groups_info_row")
|
||||
@@ -133,7 +136,7 @@ class Parser:
|
||||
def parse_raw_no_schedule(self):
|
||||
"""Распарсить всё за пределами self.schedule_range_row в self.raw_no_schedule"""
|
||||
if self.schedule_range_row is None:
|
||||
return
|
||||
self.schedule_range_row = [999999999, 999999999] # прекрасное далёко
|
||||
|
||||
row = 0
|
||||
while row < self.reader.get_row_count():
|
||||
@@ -209,6 +212,7 @@ class Parser:
|
||||
self.weeknums[week_key_name].add(merged)
|
||||
|
||||
def row_with_schedule_notify(self, row_coord):
|
||||
"""Вызывается каждый раз когда в переданной row обранужено расписание"""
|
||||
if self.schedule_range_row is None:
|
||||
self.schedule_range_row = [row_coord, row_coord]
|
||||
|
||||
@@ -218,20 +222,6 @@ class Parser:
|
||||
if self.schedule_range_row[0] > row_coord:
|
||||
self.schedule_range_row[0] = row_coord
|
||||
|
||||
def parse_potokoviy(self, merged: Merged):
|
||||
speaker = None
|
||||
location = None
|
||||
|
||||
# speaker
|
||||
low = merged.low
|
||||
speaker_pos = low.shift(down=merged.height())
|
||||
speaker = speaker_pos.cell(self.reader).value
|
||||
|
||||
# location
|
||||
location = merged.high.shift(down=1).cell(self.reader).value
|
||||
|
||||
return {"loc": str(location).strip(), "leader": str(speaker).strip(), "name": str(merged.cell(self.reader).value).strip()}
|
||||
|
||||
def process_group(self, group: dict, first_weekday: Coord, pair_pos_col):
|
||||
"""
|
||||
Обработать группы, выполняется для каждой группы, после того как они распарены (parse_groups)
|
||||
@@ -245,13 +235,11 @@ class Parser:
|
||||
group_header_pos = Coord(group['position'][0], group['position'][1])
|
||||
width = group['width']
|
||||
weeknum = 1 # номер недели, щёлкнет +1 при каком-то условии.
|
||||
previous_pair = None
|
||||
|
||||
weekcycles = 0
|
||||
while row_c1 < self.reader.get_row_count():
|
||||
pos_c1 = Coord(row_c1, group['position'][1]) # текущая позиция, верхний левый угол (=low)
|
||||
self.row_with_schedule_notify(pos_c1.row)
|
||||
|
||||
|
||||
if pos_c1.cell(self.reader).is_nospace_nocase_same(group_name):
|
||||
pprint("Ended with grpup name; stop moving down, break")
|
||||
@@ -272,7 +260,7 @@ class Parser:
|
||||
weeknum = 2
|
||||
continue
|
||||
|
||||
pprint(weekday)
|
||||
pprint(weekday)
|
||||
weekday_key_name = weekday + ("_1" if weeknum == 1 else "_2")
|
||||
self.push_weekday_meta(weekday, weeknum, weekday_key_name, weekday_mr)
|
||||
|
||||
@@ -316,6 +304,7 @@ class Parser:
|
||||
pair_num_to_add = pair_num_mr.cell(self.reader).value.replace(" ", "").strip()
|
||||
if len(pair_num_to_add) == 0:
|
||||
pair_num_to_add = "???"
|
||||
pprint("Составители эксельки? Вы почему не указали номер пары ёклмн")
|
||||
pairs.add(pair_num_to_add)
|
||||
|
||||
for cell in dirty_line:
|
||||
@@ -351,7 +340,6 @@ class Parser:
|
||||
pair_name = sorted(pairs)[0]
|
||||
except: pass
|
||||
|
||||
today = slots[w]
|
||||
obj = {
|
||||
"object": "event",
|
||||
"pairs": sorted(pairs),
|
||||
@@ -364,10 +352,29 @@ class Parser:
|
||||
if len(times) > 0:
|
||||
obj['times'] = times
|
||||
|
||||
def smart_insert(first_dict, key, to_insert):
|
||||
if key not in first_dict.keys():
|
||||
first_dict[key] = {}
|
||||
|
||||
if isinstance(first_dict[key], dict):
|
||||
if len(first_dict[key].keys()) == 0:
|
||||
first_dict[key] = to_insert
|
||||
else:
|
||||
p = first_dict[key]
|
||||
first_dict[key] = [p, to_insert]
|
||||
|
||||
elif isinstance(first_dict[key], list):
|
||||
first_dict[key].append(to_insert)
|
||||
|
||||
else:
|
||||
self.parser_warnings.append("Wtf? first_dict[key] not is dict and not is list??? (internal error)")
|
||||
|
||||
if pair_pos_col is None:
|
||||
slots[w] = obj
|
||||
smart_insert(slots, w, obj)
|
||||
|
||||
else:
|
||||
today[pair_name] = obj
|
||||
smart_insert(slots[w], pair_name, obj)
|
||||
|
||||
# here may be a empty all_raw
|
||||
clean_state()
|
||||
first_coord = None
|
||||
@@ -397,13 +404,13 @@ def parse_groups(reader: "ExcelSheetReader", head, col_start, head_rx):
|
||||
name = utils.unspace(x)
|
||||
skip = False
|
||||
if "-" not in name:
|
||||
for x in bad_group_names:
|
||||
for x in BAD_GROUP_NAMES:
|
||||
if x in name.lower():
|
||||
skip = True
|
||||
pprint(f"Skip groupname {name} because not dash in name and in blacklist")
|
||||
|
||||
if not skip:
|
||||
groups[name] = {
|
||||
groups[name.lower()] = {
|
||||
"name": name,
|
||||
"position": [head_rx, i],
|
||||
"width": merged.width(),
|
||||
|
||||
Reference in New Issue
Block a user