拆分文件、添加单日课表渲染功能

This commit is contained in:
2026-04-02 21:23:09 +08:00
parent fd948ca897
commit 868abb2358
4 changed files with 783 additions and 465 deletions

124
schedule_utils.py Normal file
View File

@@ -0,0 +1,124 @@
"""课表数据处理工具函数"""
def convert_tuple_schedule_to_dict(schedule: list[tuple]) -> list[dict]:
"""将元组格式的课表转换为字典格式。
Args:
schedule: list[tuple],每个元组包含 (name, teacher, classroom, weeks, day, classes)
其中 weeks 可以是 list[int] 或 str"1-17"
Returns:
list[dict]: 标准格式的课程数据
"""
result = []
for course in schedule:
# 确保元组长度足够,不足的补 None
padded = list(course) + [None] * (6 - len(course))
name, teacher, classroom, weeks, day, classes = padded[:6]
# 处理 weeks支持 list 或 str如 "1-17", "1,3,5-10"
weeks_list = []
if isinstance(weeks, list):
weeks_list = weeks
elif isinstance(weeks, str):
weeks_list = parse_weeks_string(weeks)
result.append({
"name": name,
"teacher": teacher,
"classroom": classroom,
"weeks": weeks_list,
"day": day if isinstance(day, int) else 1,
"classes": classes if isinstance(classes, list) else []
})
return result
def parse_weeks_string(weeks_str: str) -> list[int]:
"""将周数字符串解析为整数列表。
支持格式:
"1-17" -> [1,2,3,...,17]
"1,3,5" -> [1,3,5]
"1-5,7,9-11" -> [1,2,3,4,5,7,9,10,11]
Args:
weeks_str: 周数字符串
Returns:
list[int]: 周数列表
"""
if not weeks_str or not isinstance(weeks_str, str):
return []
result = []
parts = weeks_str.split(',')
for part in parts:
part = part.strip()
if '-' in part:
# 范围格式1-17
try:
start, end = part.split('-', 1)
start = int(start.strip())
end = int(end.strip())
result.extend(range(start, end + 1))
except ValueError:
continue
else:
# 单个数字
try:
result.append(int(part))
except ValueError:
continue
# 去重并排序
return sorted(set(result))
def format_weeks(weeks: list[int]) -> str:
"""格式化周数显示,如 [1,2,3,5,6,7] -> "1-3,5-7" """
if not weeks:
return ''
weeks = sorted(set(weeks))
ranges = []
start = end = weeks[0]
for w in weeks[1:]:
if w == end + 1:
end = w
else:
if start == end:
ranges.append(str(start))
else:
ranges.append(f"{start}-{end}")
start = end = w
if start == end:
ranges.append(str(start))
else:
ranges.append(f"{start}-{end}")
return ','.join(ranges)
def get_period_time(period: int) -> str:
"""获取节次对应的时间(南邮标准时间)"""
time_map = {
1: '08:00',
2: '08:50',
3: '09:50',
4: '10:40',
5: '11:30',
6: '13:45',
7: '14:35',
8: '15:35',
9: '16:25',
10: '18:30',
11: '19:20',
12: '20:10'
}
return time_map.get(period, '')