refactor: big refactor

This commit is contained in:
2026-03-18 22:15:49 +03:00
parent 7e0e4a0b71
commit 1199ce1554
11 changed files with 264 additions and 555 deletions

View File

@@ -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(),