second commit
This commit is contained in:
79
parser.py
79
parser.py
@@ -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
|
||||
Reference in New Issue
Block a user