UNPKG

schedule-kernel

Version:

The back-end core module used for storing/displaying the course schedule

214 lines 8.26 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.CsesTransformer = void 0; const crypto_1 = require("crypto"); const yaml = __importStar(require("js-yaml")); class CsesTransformer { /** * 将CSES文件内容转换为内部配置格式 */ static fromCses(content) { const csesData = yaml.load(content); if (csesData.version !== 1) { throw new Error('不支持的CSES版本'); } // 转换科目 const subjects = csesData.subjects.map(subject => ({ uuid: (0, crypto_1.randomUUID)(), name: subject.name, type: 'subject', shortName: subject.simplified_name, teacherName: subject.teacher, extra: { outdoor: false } })); let times = []; // 创建时间表(所有不重复的时间段) csesData.schedules.forEach((schedule, index) => { let Times = []; schedule.classes.forEach(cls => { const startTime = cls.start_time; const endTime = cls.end_time; let timetarget = { startTime: startTime, endTime: endTime }; Times.push(timetarget); }); let timeTargets = { id: (0, crypto_1.randomUUID)(), name: '未命名时间表 ' + (index + 1), targets: Times }; times.push(timeTargets); }); // 转换课程表 const schedules = []; csesData.schedules.forEach((schedule, index) => { // 创建课程列表 const lessons = schedule.classes.map(cls => { const subject = subjects.find(s => s.name === cls.subject); if (!subject) { throw new Error(`未找到科目: ${cls.subject}`); } const timeTargetName = '未命名时间表 ' + (index + 1); const timeTargetsFound = times.find(t => t.name === timeTargetName); if (!timeTargetsFound) { throw new Error(`未找到时间表: ${timeTargetName}`); } return { subjectName: subject.name, timeUuid: timeTargetsFound.id }; }); // 根据weeks字段创建对应的课程表 if (schedule.weeks === 'all') { schedules.push({ dateMode: false, activeDay: schedule.enable_day, activeWeek: 1, lessons }); schedules.push({ dateMode: false, activeDay: schedule.enable_day, activeWeek: 2, lessons }); } else { schedules.push({ dateMode: false, activeDay: schedule.enable_day, activeWeek: schedule.weeks === 'odd' ? 1 : 2, lessons }); } }); return { version: '1.0', startDate: new Date(), schedules, subjects, timeTargets: times, }; } /** * 将内部配置格式转换为CSES文件内容 */ static toCses(config) { const csesSubjects = config.subjects.map(subject => ({ name: subject.name, simplified_name: subject.shortName, teacher: subject.teacherName })); // 按天和周数组织课程 const scheduleMap = new Map(); config.schedules.forEach(schedule => { if (schedule.dateMode) return; // 跳过日期模式的课程 const day = schedule.activeDay; const week = schedule.activeWeek === 1 ? 'odd' : 'even'; const key = `${day}-${week}`; const lessons = schedule.lessons.map((lesson, index) => { const timeTarget = config.timeTargets.find(t => t.id === schedule.timeUuid); if (!timeTarget) { throw new Error(`未找到时间段: ${schedule.timeUuid}`); } return { subject: lesson.subjectName, start_time: timeTarget.targets[index].startTime, end_time: timeTarget.targets[index].endTime }; }); if (scheduleMap.has(key)) { scheduleMap.get(key).classes.push(...lessons); } else { scheduleMap.set(key, { name: `星期${['一', '二', '三', '四', '五', '六', '日'][day - 1]}-${week === 'odd' ? '单周' : '双周'}`, enable_day: day, weeks: week, classes: lessons }); } }); // 合并相同天的单双周课程(如果课程表完全相同) const mergedSchedules = []; const daySchedules = new Map(); // 按天分组 for (const schedule of scheduleMap.values()) { const existingSchedules = daySchedules.get(schedule.enable_day) || []; existingSchedules.push(schedule); daySchedules.set(schedule.enable_day, existingSchedules); } // 检查每天的单双周课程是否相同,如果相同则合并 for (const [day, schedules] of daySchedules.entries()) { if (schedules.length === 2) { const [schedule1, schedule2] = schedules; if (JSON.stringify(schedule1.classes) === JSON.stringify(schedule2.classes)) { // 课程完全相同,合并为all mergedSchedules.push({ name: `星期${['一', '二', '三', '四', '五', '六', '日'][day - 1]}`, enable_day: day, weeks: 'all', classes: schedule1.classes }); } else { // 课程不同,保持分开 mergedSchedules.push(...schedules); } } else { // 只有一个课程表,直接添加 mergedSchedules.push(...schedules); } } const csesConfig = { version: 1, subjects: csesSubjects, schedules: mergedSchedules }; return yaml.dump(csesConfig, { indent: 2, lineWidth: -1, sortKeys: false, forceQuotes: true }); } } exports.CsesTransformer = CsesTransformer; //# sourceMappingURL=csesTransformer.js.map