work copy

This commit is contained in:
2025-09-11 14:16:38 +03:00
parent b62640e39b
commit 414907a929
8 changed files with 88146 additions and 664 deletions

View File

@@ -6,6 +6,11 @@ import aigenerated
from coord import Coord, Merged
import utils
LOGGING = True
def pprint(*args, **kwargs):
if LOGGING:
print(*args, **kwargs)
class Parser:
@@ -14,27 +19,32 @@ class Parser:
self.groups = {}
self.teachers = set()
self.places = set()
print("Parser created for '{0}': size: {1}x{2}".format(self.sh.name, self.sh.nrows, self.sh.ncols))
pprint("Parser created for '{0}': size: {1}x{2}".format(self.sh.name, self.sh.nrows, self.sh.ncols))
def parse(self):
monday = utils.find(self.sh, "ПОНЕДЕЛЬНИК")
if monday is None:
print(" -- Failed parse! -- ")
print("ПОНЕДЕЛЬНИК НЕ НАЙДЕН!")
return
head_rx = monday[0] - 1 # выше первого понидельника
if head_rx < 0:
raise Exception("head_rx < 0: Программа пыталась найти 'ПОНЕДЕЛЬНИК', но по всей видимости не нашла.")
head = self.sh.row(head_rx) # get all ROW (months, groups)
print(f"head={head}")
pprint(f"head={head}")
self.groups = parse_groups(self.sh, head, monday, head_rx) # parse groups to self.groups
print(f'self.groups={json.dumps(self.groups, indent=2, ensure_ascii=False)}')
pprint(f'self.groups={json.dumps(self.groups, indent=2, ensure_ascii=False)}')
print("\n\n\n")
pprint("\n\n\n")
for group in self.groups.values():
print("\nSTART OF PROCESS GROUP\n")
pprint("\nSTART OF PROCESS GROUP\n")
self.process_group(group, monday)
print("\nEND OF PROCESS GROUP\n")
pprint("\nEND OF PROCESS GROUP\n")
print(self.teachers)
pprint(self.teachers)
def parse_potokoviy(self, merged: Merged):
speaker = None
@@ -48,16 +58,16 @@ class Parser:
# location
location = merged.high.shift(down=1).cell(self.sh).value
return {"loc": location, "leader": speaker, "name": merged.cell(self.sh).value}
return {"loc": str(location), "leader": str(speaker), "name": str(merged.cell(self.sh).value)}
def process_group(self, group, monday):
"""
Обработать группы, выполняется для каждой группы, после того как они распарены (parse_groups)
group = {'name': 'ИВТ-260', 'position': [5, 6], 'position_human': 'G6:J6'}
"""
print(f"process_group group={group}")
pprint(f"process_group group={group}")
group_name = group['name']
print(group_name)
pprint(group_name)
row = group['position'][0] + 1 # counter for while, +1 for shift down; также номер строки в таблице (вроде с нуля)
weeknum = 1 # номер недели, щёлкнет +1 при каком-то условии.
while row < self.sh.nrows: # maybe условие чтобы не уйти ниже чем есть строк
@@ -71,7 +81,7 @@ class Parser:
cv = merged_cell.value
# В конце (12 пара:>) название группы, можно использовать как якорь
if utils.unspace(cv) == group_name:
print("Lesson == group name; ending group loop.")
pprint("Lesson == group name; ending group loop.")
break
weekday_mr = utils.get_merged_coord(self.sh, weekday_pos)
@@ -83,7 +93,7 @@ class Parser:
if weekday == "":
if weeknum == 1:
weeknum += 1
print("------")
pprint("------")
skip = 1
row += 1
else:
@@ -104,17 +114,20 @@ class Parser:
dispname = "<no lesson>"
if not is_empty_lesson:
may_prepod = merged.low.shift(down=2)
if utils.has_no_bottom_border(self.sh, may_prepod):
next = 6
is_2pair = True
if is_wide_maybe_potokoviy:
ret = self.parse_potokoviy(merged)
parsed_location = ret['loc']
parsed_leader = ret['leader']
parsed_discipline_name = ret['name']
parsed_uncotigorized = list(utils.parse_all_dirt(self.sh, merged.low, merged.width(), next))
else:
may_prepod = merged.low.shift(down=2)
if utils.border_bottom(self.sh, may_prepod) == 0 and utils.border_top(self.sh, may_prepod.shift(down=1)) == 0:
next = 6
is_2pair = True
if (is_solid):
parsed_discipline_name = cv
@@ -128,7 +141,7 @@ class Parser:
if parsed_leader: dispname += f" [{parsed_leader}]"
if parsed_location: dispname += f" [{parsed_location}]"
dispname = dispname.replace("\n", "\\n")
print(f"[{group_name}] row={row}; {pos} {pos_right} {pair} {weekday}: {'[ПОТОКОВЫЙ] ' if is_wide_maybe_potokoviy else ''}{dispname} {parsed_uncotigorized}")
pprint(f"[{group_name}] row={row}; {pos} {pos_right} {pair} {weekday}: {'[ПОТОКОВЫЙ] ' if is_wide_maybe_potokoviy else ''}{dispname} {parsed_uncotigorized}")
# пытаемся из некотегорезированных данных выцепить место и лидера (препода)
prepods = set()
@@ -187,14 +200,14 @@ def parse_groups(sh, head, monday, head_rx):
i = 0
while i < len(head):
x = head[i]
print(f"while i={i} head[i]={x}")
pprint(f"while i={i} head[i]={x}")
merged = utils.get_merged_coord(sh, Coord(head_rx, i))
if i > monday[1] + 1:
if merged is None or x.value == "":
break
if merged.width() != 4:
print(f"WARNING: group header witdh !=4 (found: {merged.width()}); blocks !=4 not supported by parser.")
pprint(f"WARNING: group header witdh !=4 (found: {merged.width()}); blocks !=4 not supported by parser.")
break
name = utils.unspace(x.value)