Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions src/subject.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,9 @@ export function getSubject(
}

const status =
dreamCampusSubject.adjustName === '抽選対象'
dreamCampusSubject.lotResultName === '抽選対象'
? 'lot_pending'
: dreamCampusSubject.lotResultName &&
dreamCampusSubject.lotResultName !== '当選'
: dreamCampusSubject.lotResultName === '抽選漏れ'
? 'lot_rejected'
: dreamCampusSubject.cancelName === '【履修取消】'
? 'canceled'
Expand Down
75 changes: 44 additions & 31 deletions src/timetable.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
import type { DreamCampusTimetable, Timetable } from './schemas/index.js';
import type {
DreamCampusTimetable,
Subject,
Timetable,
} from './schemas/index.js';
import { getSubject } from './subject.js';

export function getTimetable(
Expand Down Expand Up @@ -32,49 +36,54 @@ export function getTimetable(
const firstHalf = normal.map((row) =>
row.map((col) =>
getFirstOrNull(
col.filter((subject) => {
switch (term) {
case 'spring':
return (
!subject.term?.includes('前期2') &&
!subject.term?.includes('前2')
);
case 'fall':
return (
!subject.term?.includes('後期2') &&
!subject.term?.includes('後2')
);
}
}),
sortEnrolled(
col.filter((subject) => {
switch (term) {
case 'spring':
return (
!subject.term?.includes('前期2') &&
!subject.term?.includes('前2')
);
case 'fall':
return (
!subject.term?.includes('後期2') &&
!subject.term?.includes('後2')
);
}
}),
),
),
),
);

const secondHalf = normal.map((row) =>
row.map((col) =>
getFirstOrNull(
col.filter((subject) => {
switch (term) {
case 'spring':
return (
!subject.term?.includes('前期1') &&
!subject.term?.includes('前1')
);
case 'fall':
return (
!subject.term?.includes('後期1') &&
!subject.term?.includes('後1')
);
}
}),
sortEnrolled(
col.filter((subject) => {
switch (term) {
case 'spring':
return (
!subject.term?.includes('前期1') &&
!subject.term?.includes('前1')
);
case 'fall':
return (
!subject.term?.includes('後期1') &&
!subject.term?.includes('後1')
);
}
}),
),
),
),
);

const intensive = dreamCampusTimetable.others.map((row) =>
row.map((col) => {
const subject = getFirstOrNull(col);
return subject ? getSubject(subject) : null;
const subjects = col.flatMap((subject) => getSubject(subject) ?? []);
const subject = getFirstOrNull(sortEnrolled(subjects));
return subject ? subject : null;
}),
);

Expand All @@ -94,3 +103,7 @@ export function getTimetable(
function getFirstOrNull<T>(arr: T[]): T | null {
return arr.length > 0 ? arr[0] : null;
}

function sortEnrolled(arr: Subject[]): Subject[] {
return arr.toSorted((subject) => (subject.status === 'enrolled' ? -1 : 0));
}
16 changes: 8 additions & 8 deletions tests/test0.expected.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export default {
id: 'B10233610',
name: '健康科学',
url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B10233610&je_cd=1',
status: 'lot_rejected',
status: 'lot_pending',
required: '[選択]',
term: '後期',
units: '2単位',
Expand All @@ -64,7 +64,7 @@ export default {
id: 'B10233553',
name: '欧米文化論',
url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B10233553&je_cd=1',
status: 'lot_rejected',
status: 'lot_pending',
required: '[選択]',
term: '後期',
units: '2単位',
Expand Down Expand Up @@ -95,7 +95,7 @@ export default {
id: 'B1042504o',
name: '国語表現法',
url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B1042504o&je_cd=1',
status: 'lot_rejected',
status: 'lot_pending',
required: '[選択必修Ⅱ]',
term: '後期',
units: '2単位',
Expand Down Expand Up @@ -126,7 +126,7 @@ export default {
id: 'B1033207a',
name: 'フランス語Ⅲ',
url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B1033207a&je_cd=1',
status: 'lot_rejected',
status: 'lot_pending',
required: '[フランス語]',
term: '後期',
units: '1単位',
Expand Down Expand Up @@ -341,7 +341,7 @@ export default {
id: 'B10233610',
name: '健康科学',
url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B10233610&je_cd=1',
status: 'lot_rejected',
status: 'lot_pending',
required: '[選択]',
term: '後期',
units: '2単位',
Expand All @@ -355,7 +355,7 @@ export default {
id: 'B10233553',
name: '欧米文化論',
url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B10233553&je_cd=1',
status: 'lot_rejected',
status: 'lot_pending',
required: '[選択]',
term: '後期',
units: '2単位',
Expand Down Expand Up @@ -386,7 +386,7 @@ export default {
id: 'B1042504o',
name: '国語表現法',
url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B1042504o&je_cd=1',
status: 'lot_rejected',
status: 'lot_pending',
required: '[選択必修Ⅱ]',
term: '後期',
units: '2単位',
Expand Down Expand Up @@ -417,7 +417,7 @@ export default {
id: 'B1033207a',
name: 'フランス語Ⅲ',
url: 'https://kyomu.office.tut.ac.jp/Portal/Public/Syllabus/DetailMain.aspx?student=1&lct_year=2024&lct_cd=B1033207a&je_cd=1',
status: 'lot_rejected',
status: 'lot_pending',
required: '[フランス語]',
term: '後期',
units: '1単位',
Expand Down