second commit

This commit is contained in:
2025-09-11 10:47:21 +03:00
parent 32954fcd59
commit b62640e39b
5 changed files with 6448 additions and 14 deletions

View File

@@ -2,6 +2,7 @@ import json
import xlrd
import aigenerated
from coord import Coord, Merged
import utils
@@ -11,6 +12,8 @@ class Parser:
def __init__(self, sheet: "xlrd.sheet.Sheet"):
self.sh: "xlrd.sheet.Sheet" = sheet
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))
def parse(self):
@@ -31,6 +34,8 @@ class Parser:
self.process_group(group, monday)
print("\nEND OF PROCESS GROUP\n")
print(self.teachers)
def parse_potokoviy(self, merged: Merged):
speaker = None
location = None
@@ -88,8 +93,11 @@ class Parser:
is_empty_lesson = right_cell.ctype in utils.EMPTY_CTYPES and merged_cell.ctype in utils.EMPTY_CTYPES
dispname = ""
parsed_discipline_name = None
parsed_location = None
parsed_leader = None
is_2pair = False
is_solid = pos_right in merged
parsed_uncotigorized = []
is_wide_maybe_potokoviy = merged.width() > 4 # потоковая ли лекция (занимает несколько групп.)
if is_empty_lesson:
@@ -100,20 +108,21 @@ class Parser:
ret = self.parse_potokoviy(merged)
parsed_location = ret['loc']
parsed_leader = ret['leader']
dispname = ret['name']
parsed_discipline_name = ret['name']
else:
is_solid = pos_right in merged
is_2pair = False
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
dispname = cv
dispname += (" SOLD" if is_solid else " SPLIT")
dispname += (" [ДВУПАРНЫЙ]" if is_2pair else "")
parsed_uncotigorized = utils.parse_all_dirt(self.sh, merged.low, 2, next-1)
parsed_uncotigorized = list(utils.parse_all_dirt(self.sh, merged.low, 4, next))
if parsed_leader: dispname += f" [{parsed_leader}]"
@@ -121,10 +130,57 @@ class Parser:
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}")
# пытаемся из некотегорезированных данных выцепить место и лидера (препода)
prepods = set()
if parsed_leader is not None: prepods.add(aigenerated.extract_last_name(parsed_leader))
locations = set()
if parsed_location is not None: locations.add(parsed_location.replace(" ", "").replace("-", ""))
for x in list(parsed_uncotigorized):
if aigenerated.is_surname_string(x):
prepods.add(aigenerated.extract_last_name(x))
if aigenerated.is_room_number(x):
locations.add(x.replace(" ", "").replace("-", "") if x is not None else None)
# оставшееся в дисциплину (костыль)
if parsed_discipline_name is None:
parsed_discipline_name = " ".join(parsed_uncotigorized)
prepods.discard(None)
prepods.discard("")
locations.discard(None)
locations.discard("")
if not is_empty_lesson:
slots = group['slots']
w = weekday + ("_1" if weeknum == 1 else "_2")
if w not in slots.keys():
slots[w] = {}
today = slots[w]
today[pair] = {
"pos": str(pos),
"discipline": parsed_discipline_name,
"locations": list(locations),
"leads": list(prepods),
"is_solid": is_solid,
"is_2pair": is_2pair,
"is_flow": is_wide_maybe_potokoviy,
"raw": parsed_uncotigorized,
"weeday": utils.weekday_to_num(weekday),
"weeknum": weeknum
}
self.teachers.add(aigenerated.extract_last_name(parsed_leader))
# INCREMENT на next и конец цикла.
row += next
def parse_groups(sh, head, monday, head_rx):
"""Распознать список групп и метаданные к ним, по сути получить список названий группы и координат её верхнего header-а (AQ6:AT6)"""
groups = {}
@@ -132,24 +188,27 @@ def parse_groups(sh, head, monday, head_rx):
while i < len(head):
x = head[i]
print(f"while i={i} head[i]={x}")
merged = utils.get_merged(sh, head_rx, i)
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.")
break
name = utils.unspace(x.value)
groups[name] = {
"name": name,
"position": [head_rx, i],
"position_human": utils.merged_humanize(merged)
"position_human": utils.merged_humanize(merged.as_numbers()),
"slots": {}
}
if merged is None:
i += 1
else:
i += (merged[3] - merged[1] + 1)
i += merged.width()
return groups
def get_weekday_left(sh, rowx, colx):
m = utils.get_merged(sh, rowx, colx)
return sh.cell(m[0], m[1]).value