课表转 .ics(浙江农林大学)
把学生课表转成一份可直接导入 iOS/Outlook/Gmail 的 .ics。不要自行编造钟点:节次时间取自作息表、周次/教室/教师取自课表原文。
流程
读课表
- PDF:
pdftotext -layout <课表.pdf> - - 图片:用 Read 工具以大缩略图读图。
- 按 references/parsing-guide.md 逐格抽取课程名、节次、周次、地点、教师、学分,并按表头确定 weekday(0=周一…6=周日)。
- 地点统一写作
浙江农林大学东湖校区 <场地>;教X楼/学X楼是完整楼名,不要拆开。
- PDF:
写 config.json:复制
examples/sample_config.json,只改student_name、out_path和courses数组。weekday0-6;start_p/end_p为节次;weeks_spec照抄课表写法。- 不填的校历常量(week1_monday/period_time/holidays/makeup/allday_events)用脚本默认值;新学期/新校历再覆盖,见 references/academic-calendar.md。
生成:
python3 scripts/generate_ics.py <你的config.json>脚本会打印每条课程的上课日期列表,逐条核对周次、单双周、教室、教师与课表一致。
校验(必做):
python3 -c "from icalendar import Calendar; e=Calendar.from_ical(open('<out.ics','rb').read()).walk('VEVENT'); print(len(e), len(set(str(x.get('UID')) for x in e)))"事件数应 = 课程次数 + 调课次数 + 3 个全天事件;UID 无重复。抽查 1~2 个晚间/跨节课程的起止时间是否符合作息表。
交付:用 present_files 把 .ics 交给用户,说明 iOS 打开后"添加全部日历"即可。
硬规则(用户已明确要求)
- 每节课前 15 分钟提醒(
alarms_minutes_before: 15)。 - 军训、国家安全教育(网络)、期末考试 用全天事件(DATE 类型),不编造钟点。
- 节假日(中秋/国庆/元旦)的课跳过;调课日按校历补对应 weekday 的课。
- 时区
Asia/Shanghai(UTC+8,无夏令时),DTSTART/DTEND 带 TZID,苹果/Outlook/Gmail 都能正确识别。