Skip to content

Commit

Permalink
開設期や授業時間に関する実装
Browse files Browse the repository at this point in the history
  • Loading branch information
swawa-yu committed Dec 25, 2023
1 parent 7acb38f commit d0f958b
Show file tree
Hide file tree
Showing 4 changed files with 141 additions and 60 deletions.
28 changes: 18 additions & 10 deletions src/subject/index.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,25 @@
// import { Periods } from './period';

// 全授業の主要情報の辞書
import subjectData from '../../data/subject-maininfo.json'

export interface kaisetsuki {
export interface Kaisetsuki {
rishuNenji: number
semester: Semester
jikiKubun: JikiKubun
}

export interface schedule {
jikiKubun: JikiKubun
jigen: string // TODO 集中 とかある どうにかしたい
room: string
// TODO 命名が最悪すぎる 「jigen」ってなんだ
export interface Jigen {
youbi: "月" | "火" | "水" | "木" | "金" | "土" | "解析エラー"
jigenRange: [begin: number, last: number] | "解析エラー"
komaRange: [begin: number, last: number] | "解析エラー"
}

export interface Schedule {
jikiKubun: JikiKubun // 1ターム、2ターム、3ターム、4ターム、セメスター(前期)、セメスター(後期)、ターム外(前期)、ターム外(後期)、年度、通年、集中
jigen: Jigen | undefined // 集中講義の場合はundefined
room: string // 何も書かれていない場合は空文字列
}

// TODO 「解析エラー」としているが、他に適切な書き方がありそう
Expand Down Expand Up @@ -48,13 +56,13 @@ export type Subject = {
}

export type SubjectMap = { [subjectCode: string]: Subject }
// export const subjectMap: SubjectMap = {};
export const subjectMap: SubjectMap = {};
export const subjectCodeList = Object.keys(subjectMap);


// 何を表示するかここで決める
// export const propertyToShowList = ["講義コード", "開講部局", "開設期", "授業科目名", "単位", "教科書・参考書等"]
// ※今は便宜的にすべてのプロパティを表示するためにinitializeSubject()内で初期化している。
export const propertyToShowList: string[] = []

export const subjectProperties: string[] = []
Expand All @@ -63,11 +71,9 @@ export const subjectProperties: string[] = []
// TODO 教員のリサーチマップ https://researchmap.jp/researchers?q=名字+名前
// TODO お気に入り教員
// TODO 講義名をマウスホバーで講義の詳細を表示
// TODO setTimeout()ってなに
// TODO setTimeout()ってなに, async await って使ったほうがいいの?

// TODO async await って使ったほうがいいの?
export const initializeSubject = () => {
// export const initializeSubject = async () => {

// 表示する授業を記憶しておく配列とかを空にする
Object.keys(subjectMap).forEach((key) => {
Expand All @@ -78,13 +84,15 @@ export const initializeSubject = () => {

// 授業データの読み込み
const subjectMap_ = subjectData as unknown as SubjectMap;
// const subjectMap_ = (await import('../../subjects.json')) as unknown as SubjectMap;

// 表示する授業を記憶しておく配列とかに値を設定する
Object.entries(subjectMap_).forEach(([key, value]) => {
subjectMap[key] = value
subjectCodeList.push(key)
})

// 便宜的に、すべてのプロパティを表示することにしている。そのためのループ。本来は変数定義時に決定する。
// propertyToShowList = Object.keys(subjectMap["10000100"]);
Object.keys(subjectMap["10000100"]).forEach((value) => {
// if (propertyToShowList.length < 27)
propertyToShowList.push(value)
Expand Down
127 changes: 93 additions & 34 deletions src/subject/parser.ts
Original file line number Diff line number Diff line change
@@ -1,75 +1,134 @@
import {
schedule, kaisetsuki,
Schedule, Kaisetsuki,
// Semester,
jikiKubuns,
// JikiKubun,
semesters
semesters,
Jigen,
JikiKubun
} from ".";

// TODO: semester, jikikubunはKaisetsukiとScheduleで被っている

/**
*
* @param s
* @returns schedule[]
* @param s: string
* @returns Kaisetsuki
*/
export function parseKaisetsuki(s: string): kaisetsuki {
// TODO 開口部局が大学院かどうかは履修年次に影響する
export function parseKaisetsuki(s: string): Kaisetsuki {
// TODO 開口部局が大学院かどうかが履修年次に影響する
// 1年次生 前期 2ターム
// 1年次生 前期 集中
// 1年次生 後期 セメスター(後期)
// 空白によって3つに区切られている
// TODO(それ以外のケースはないか)

// n年次生 (n=1~5)
// n (n=1~5) ※修士博士をどう扱うか(そのための実装はまだできていないので、修士1年は5年じゃなくて1年になる)
// 前期 | 後期
// 1ターム | 2ターム | 3ターム | 4ターム | セメスター(前期) | セメスター(後期) | 集中 | 年度 | 通年
// TODO それ以外のケースがないか

const splitted = s.split(' ');

// let semester: Semester
// if (splitted[1] == "前期") {
// semester = "前期"
// } else if (splitted[1] == "後期") {
// semester = "後期"
// } else {
// semester = "解析エラー"
// }

// TODO ゴリ押し(下に同じ)
return {
rishuNenji: parseInt(splitted[0][0]),
semester: semesters.some((v) => v === (splitted[1])) ? semesters.filter((v) => v === splitted[1])[0] : "解析エラー",
// semester: semester,
jikiKubun: jikiKubuns.some((v) => v === (splitted[2])) ? jikiKubuns.filter((v) => v === splitted[2])[0] : "解析エラー"
semester: semesters.some((v) => v === (splitted[1])) ? splitted[1] as Kaisetsuki['semester'] : "解析エラー",
jikiKubun: jikiKubuns.some((v) => v === (splitted[2])) ? splitted[2] as Kaisetsuki['jikiKubun'] : "解析エラー"
};

}

const jikiKubunMap: { [key: string]: JikiKubun } = {
"(1T)": "1ターム",
"(2T)": "2ターム",
"(3T)": "3ターム",
"(4T)": "4ターム",
"(前)": "セメスター(前期)",
"(後)": "セメスター(後期)",
"(集)": "集中",
"(年)": "年度",
"(通)": "通年",
}

/**
*
* @param s: string
* @returns Schedule[]
*/
export function parseSchedule(s: string) {
// 例----------------------------------------
// (2T) 火7-8, 金7-8:先405N → (2T) 火7-8:先405N, (2T) 金7-8:先405N
// (1T) 木1-2:オンライン, (1T) 木3-4:霞R402講義室
// 1年次生 前期 2ターム, (2T) 火7-8,金7-8:先405N
// (4T) 集中:担当教員の指定による
// (前) 木7-8:理E102
// (前) 金7-8:北体育館,教K102 → そのままでOK
// ------------------------------------------

// 検索するとき、部屋は別にそんなに重要ではない
// ただし、空き部屋検索のときは重要

// 空白で区切ったときの長さが2の時は、その後":"でsplitすれば曜日時限と教室に分かれる

// 時間だけで部屋が書かれていないことがある
// 時間がなく部屋だけ書かれているなど、その他のパターンはある? → ない
// 時間がなく部屋だけ書かれているなど、その他のパターンはある? → ない(検証済み)

let schedules: Schedule[] = []

let schedules: schedule[] = []


// シンプルなパターンの実装
try {
const splittedBySpace = s.split(' ');
const splittedByColon = splittedBySpace[1].split(':');

// 辞書の中にない場合は解析エラー
const jikiKubun: Schedule['jikiKubun'] = jikiKubunMap[splittedBySpace[0]] ? jikiKubunMap[splittedBySpace[0]] : "解析エラー";

jikiKubunMap[splittedBySpace[0]];

const jigenString = splittedByColon[0]; // 金3-6 (難しいやつだと火7-8,金7-8もある)
// jigenStringの0文字目は曜日
// jigenStringの1文字目以降をsplit('-')してさらに各要素をintに変換したもの
const jigenNums = jigenString.slice(1).split('-').map((v) => parseInt(v));

const splitted = s.split(' ')
// 1スケジュール単位を2つ以上繰り返すときに","がつくので、取り除く
for (let i = 0; i < splitted.length / 2; i++) {
const jigenAndRoom = splitted[i * 2].split(":");
// TODO ゴリ押しすぎる
const jiki: schedule['jikiKubun'] = jikiKubuns.some((v) => v === (splitted[i * 2])) ? jikiKubuns.filter((v) => v === splitted[i * 2])[0] : "解析エラー";
const jigen: schedule['jigen'] = jigenAndRoom[0]
const room: schedule['room'] = jigenAndRoom.length == 2 ? jigenAndRoom[1] : ""
schedules.push({ jikiKubun: jiki, jigen: jigen, room: room })
const jigen: Schedule["jigen"] = jigenString[0] === "集" ? undefined : {
youbi: jigenString[0] as Jigen['youbi'],
jigenRange: [jigenNums[0], jigenNums[jigenNums.length - 1]] as Jigen['jigenRange'],
komaRange: [(jigenNums[0] + 1) / 2 | 0, (jigenNums[jigenNums.length - 1] + 1) / 2 | 0] as Jigen['komaRange']
}

const room = splittedByColon[1];

schedules.push({ jikiKubun: jikiKubun, jigen: jigen, room: room })
} catch (e: unknown) {
schedules.push({ jikiKubun: "解析エラー", jigen: "解析エラー", room: "解析エラー" })
schedules.push({ jikiKubun: "解析エラー", jigen: { youbi: "解析エラー", jigenRange: "解析エラー", komaRange: "解析エラー" }, room: "解析エラー" })
return schedules;
}


// 複雑なパターンの実装
// try {
// const hiphenCount = s.split('-').length - 1;
// const colonCount = s.split(':').length - 1;
// const splitted = s.split(' ')
// // 1スケジュール単位を2つ以上繰り返すときに","がつくので、取り除く
// for (let i = 0; i < splitted.length / 2; i++) {
// const jigenAndRoom = splitted[i * 2].split(":");

// // TODO ゴリ押しすぎる
// const jiki: Schedule['jikiKubun'] = jikiKubuns.some((v) => v === (splitted[i * 2])) ?
// jikiKubuns.filter((v) => v === splitted[i * 2])[0] :
// "解析エラー";
// const jigen: Schedule["jigen"] = { youbi: "解析エラー", jigenRange: "解析エラー", komaRange: "解析エラー" }
// const room: Schedule['room'] = jigenAndRoom.length == 2 ?
// jigenAndRoom[1] :
// ""
// schedules.push({ jikiKubun: jiki, jigen: jigen, room: room })
// }
// } catch (e: unknown) {
// schedules.push({ jikiKubun: "解析エラー", jigen: { youbi: "解析エラー", jigenRange: "解析エラー", komaRange: "解析エラー" }, room: "解析エラー" })
// return schedules;
// }

return schedules;
}

Expand Down
44 changes: 29 additions & 15 deletions src/table-view/SubjectUnitComponent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,35 +6,49 @@ import React from 'react';
// } from './';

import './SubjectUnitComponent.css'
import { parseKaisetsuki, parseSchedule } from '../subject/parser'
import { Subject } from '../subject';


type LectureUnitProps = {
type SubjectUnitComponentProps = {
// 必要なプロパティを定義
subjectData: any; // 適切な型に変更してください
subject: Subject; // 適切な型に変更してください
};






const SubjectUnitComponent: React.FC<LectureUnitProps> = ({ subjectData }) => {
const SubjectUnitComponent: React.FC<SubjectUnitComponentProps> = ({ subject: subject }) => {
const schedules = parseSchedule(subject["曜日・時限・講義室"]);

Check failure on line 24 in src/table-view/SubjectUnitComponent.tsx

View workflow job for this annotation

GitHub Actions / build-and-deploy

'schedules' is declared but its value is never read.
const kaisetsuki = parseKaisetsuki(subject["開設期"]);

Check failure on line 25 in src/table-view/SubjectUnitComponent.tsx

View workflow job for this annotation

GitHub Actions / build-and-deploy

'kaisetsuki' is declared but its value is never read.

return (
<div className="lecture-details">
<div className="star-button"></div>
<div className="lecture-code-name">
<div className="lecture-code">{subjectData["講義コード"]}</div>
<div className="lecture-name">{subjectData["授業科目名"]}</div> </div>
<div className="instructor">{subjectData["担当教員名"]}</div>
<div className="lecture-code">{subject["講義コード"]}</div>
<div className="lecture-name">{subject["授業科目名"]}</div> </div>
<div className="instructor">{subject["担当教員名"]}</div>
<div className="lecture-details-columns">
<div>{subjectData["開設期"]}</div>
<div>{subjectData["開講キャンパス"]}</div>
<div>{subjectData["対象学生"]}</div>
<div>{subjectData["使用言語"]}</div>
<div>{subject["開設期"]}</div>
<div>{subject["曜日・時限・講義室"]}</div>
{/* <div>セメスター:{kaisetsuki.semester}</div> */}
{/* <div>履修年次:{kaisetsuki.rishuNenji}</div>
<div>時期区分(開設期):{kaisetsuki.jikiKubun}</div>
<div>時期区分(schedules):{schedules[0].jikiKubun}</div> */}
{/* <div>曜日:{schedules[0].jigen?.youbi[0]}</div>
<div>時限Range:{schedules[0].jigen?.jigenRange[0]}-{schedules[0].jigen?.jigenRange[1]}</div>
<div>コマRange:{schedules[0].jigen?.komaRange[0]}-{schedules[0].jigen?.komaRange[1]}</div> */}
{/* <div>講義室:{schedules[0].room}</div> */}
<div>{subject["開講キャンパス"]}</div>
{/* <div>対象学生:{subject["対象学生"]}</div> */}
{/* <div>{subject["使用言語"]}</div> */}
</div>
<div className="lecture-details-info">
<div>{subjectData["授業の目標・概要等"]}</div>
<div>{subjectData["メッセージ"]}</div>
<div>{subject["授業の目標・概要等"]}</div>
<div>{subject["メッセージ"]}</div>
</div>
</div>
);
Expand All @@ -43,9 +57,9 @@ const SubjectUnitComponent: React.FC<LectureUnitProps> = ({ subjectData }) => {
return (
<div className="lecture-unit">
{/* ここに授業の情報を表示するコードを書きます */}
<h3>{subjectData["授業科目名"]}</h3>
<p>{subjectData["開講部局"]}</p>
<p>{subjectData["科目区分"]}</p>
<h3>{subject["授業科目名"]}</h3>
<p>{subject["開講部局"]}</p>
<p>{subject["科目区分"]}</p>
{/* 他の必要な情報を追加 */}
</div>
);
Expand Down
2 changes: 1 addition & 1 deletion src/table-view/SyllabusTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ function SyllabusTable({ searchOptions }: SyllabusTableProps) {
{/* LectureUnit コンポーネントを使用して授業を表示 */}
<div className="lectures-container">
{data.map((subject, index) => (
<SubjectUnitComponent key={index} subjectData={subject} />
<SubjectUnitComponent key={index} subject={subject} />
))}
</div>
</>
Expand Down

0 comments on commit d0f958b

Please sign in to comment.