拆分文件、添加单日课表渲染功能
This commit is contained in:
124
schedule_utils.py
Normal file
124
schedule_utils.py
Normal 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, '')
|
||||
Reference in New Issue
Block a user