-
Notifications
You must be signed in to change notification settings - Fork 0
/
required.js
113 lines (104 loc) · 3.61 KB
/
required.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// クラス毎の必修授業の時間割コードのリストを提供する
/** @typedef {string} Code */
/** @typedef {string} Semester */
/** @typedef {string} Period */
/** @typedef {string} TitleJp */
/**
* @typedef {Object} Lecture
* @prop {Code} code
* @prop {string} type
* @prop {string} category
* @prop {Semester} semester
* @prop {Period[]} periods
* @prop {string} classroom
* @prop {TitleJp} titleJp
* @prop {string} titleEn
* @prop {string} lecturerJp
* @prop {string} lecturerEn
* @prop {string} ccCode
* @prop {number} credits
* @prop {string} detail
* @prop {string} schedule
* @prop {string} methods
* @prop {string} evaluation
* @prop {string} notes
* @prop {string} class
* @prop {[string[], string[]]} importance
* @prop {[string[], string[]]} targetClass
* @prop {string} guidance
* @prop {string} guidanceDate
* @prop {string} guidancePeriod
* @prop {string} guidancePlace
* @prop {string} shortenedCategory
* @prop {string} shortenedEvaluation
* @prop {string} shortenedClassroom
* @prop {number} time
* @prop {string} timeCompensation
* @prop {HTMLTableRowElement} tableRow
*/
const fs = require("fs");
const version = JSON.parse(fs.readFileSync("version.json").toString());
const getRequiredDB = (version) => {
const readFileName = `processed${version}.json`;
const writeFileName = `required${version}.json`;
const logFileName = `requiredTitle${version}.json`;
const rawData = fs.readFileSync(readFileName).toString();
/** @type {Lecture[]} */
const data = JSON.parse(rawData);
/** @type {Object.<string, string[]>[]} */
const required = [{}, {}];
/** @type {Object.<string, string[]>[]} */
const requiredTitle = [{}, {}];
/** @type {string[]} */
const inited = [];
const init = (className) => {
if (!inited.includes(className)) {
inited.push(className);
required[0][className] = [];
required[1][className] = [];
requiredTitle[0][className] = [];
requiredTitle[1][className] = [];
}
};
data.forEach((e) => {
// 文科
const regexpL = [/^(?:法|政治)[ⅠⅡ]$/, /^(?:数学|経済)[ⅠⅡ]$/, /(?!)/];
for (let group = 1; group <= 3; group++) {
const classNum = group === 3 ? 20 : 39;
for (let i = 1; i <= classNum; i++) {
const className = `l${group}_${i}`;
init(className);
const grade = 1; // 文科2年には必修科目の指定がない
if (
e.category === "社会科学"
? e.titleJp.match(regexpL[group - 1])
: (e.type !== "総合" || e.shortenedCategory === "総合L") &&
e.targetClass[grade - 1].includes(className)
) {
required[grade - 1][className].push(e.code);
requiredTitle[grade - 1][className].push(e.titleJp);
}
}
}
// 理科
for (let group = 1; group <= 3; group++) {
const classNum = group === 1 ? 39 : 24;
for (let i = 1; i <= classNum; i++) {
const className = `s${group}_${i}`;
init(className);
for (let grade = 1; grade <= 2; grade++) {
if (
(e.type !== "総合" || e.shortenedCategory === "総合L") &&
e.targetClass[grade - 1].includes(className)
) {
required[grade - 1][className].push(e.code);
requiredTitle[grade - 1][className].push(e.titleJp);
}
}
}
}
});
fs.writeFileSync(writeFileName, JSON.stringify(required));
fs.writeFileSync(logFileName, JSON.stringify(requiredTitle, undefined, 4));
};
getRequiredDB(version);