changeset 16:cc568d791a28

fix
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Thu, 02 Apr 2020 03:19:01 +0900
parents 8313f8fd6a44
children 9b4d166e6a7e
files 2020/previous/dumpFromPDFWHTML.json cmd_donwload.go syllabus/getSyllabus.go
diffstat 3 files changed, 158 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2020/previous/dumpFromPDFWHTML.json	Thu Apr 02 03:19:01 2020 +0900
@@ -0,0 +1,1 @@
+[{"ID":"610002071","Name":"工業数学Ⅰ 07組","Day":[3,4],"DayOfWeek":0,"Teacher":"山田 孝治","Grades":[1],"Place":"工1-321"},{"ID":"610002071","Name":"工業数学Ⅰ 07組","Day":[3,4],"DayOfWeek":0,"Teacher":"山田 孝治","Grades":[1],"Place":"工1-321"},{"ID":"610000071","Name":"工学基礎演習 06組","Day":[3,4],"DayOfWeek":0,"Teacher":"國田 樹 [Itsuki Kunita], 遠藤 聡志","Grades":[1],"Place":"工1-321"},{"ID":"610000071","Name":"工学基礎演習 06組","Day":[3,4],"DayOfWeek":0,"Teacher":"國田 樹 [Itsuki Kunita], 遠藤 聡志","Grades":[1],"Place":"工1-321"},{"ID":"617009001","Name":"プロジェクトデザイン","Day":[2],"DayOfWeek":3,"Teacher":"山田 孝治","Grades":[2],"Place":"工1-321"},{"ID":"610000071","Name":"工学基礎演習 06組","Day":[3,4],"DayOfWeek":0,"Teacher":"國田 樹 [Itsuki Kunita], 遠藤 聡志","Grades":[1],"Place":"工1-321"},{"ID":"610000071","Name":"工学基礎演習 06組","Day":[3,4],"DayOfWeek":0,"Teacher":"國田 樹 [Itsuki Kunita], 遠藤 聡志","Grades":[1],"Place":"工1-321"},{"ID":"610019001","Name":"産業社会学原論Ⅰ","Day":[5],"DayOfWeek":4,"Teacher":"玉城 史朗","Grades":[3],"Place":"工1-322"},{"ID":"610019001","Name":"産業社会学原論Ⅰ","Day":[5],"DayOfWeek":4,"Teacher":"玉城 史朗","Grades":[3],"Place":"工1-322"},{"ID":"617000001","Name":"プログラミング演習Ⅰ","Day":[2],"DayOfWeek":4,"Teacher":"赤嶺 有平 [Akamine Yuhei]","Grades":[1],"Place":"工1-321"},{"ID":"610004071","Name":"プログラミングⅠ","Day":[1],"DayOfWeek":4,"Teacher":"當間 愛晃","Grades":[1],"Place":"工1-321"},{"ID":"610004071","Name":"プログラミングⅠ","Day":[1],"DayOfWeek":4,"Teacher":"當間 愛晃","Grades":[1],"Place":"工1-321"},{"ID":"617003011","Name":"知能情報実験Ⅰ 01組","Day":[3,4],"DayOfWeek":1,"Teacher":"吉田 たけお, 宮里 智樹, 赤嶺 有平 [Akamine Yuhei], 國田 樹 [Itsuki Kunita]","Grades":[2],"Place":"地創棟508"},{"ID":"610005071","Name":"基礎数学Ⅰ 06組","Day":[3],"DayOfWeek":3,"Teacher":"岡﨑 威生, 國田 樹 [Itsuki Kunita]","Grades":[1],"Place":"工1-321"},{"ID":"610005071","Name":"基礎数学Ⅰ 06組","Day":[3],"DayOfWeek":3,"Teacher":"岡﨑 威生, 國田 樹 [Itsuki Kunita]","Grades":[1],"Place":"工1-321"},{"ID":"617015001","Name":"ディジタル回路","Day":[4],"DayOfWeek":0,"Teacher":"吉田 たけお","Grades":[2],"Place":"工1-322"},{"ID":"617005001","Name":"アルゴリズムとデータ構造","Day":[2],"DayOfWeek":2,"Teacher":"名嘉村 盛和","Grades":[2],"Place":"工1-322"},{"ID":"610012071","Name":"技術者の倫理 03組","Day":[1],"DayOfWeek":3,"Teacher":"和田 知久","Grades":[1],"Place":"工1-221"},{"ID":"610012071","Name":"技術者の倫理 03組","Day":[1],"DayOfWeek":3,"Teacher":"和田 知久","Grades":[1],"Place":"工1-221"},{"ID":"617003021","Name":"知能情報実験Ⅰ 02組","Day":[3,4],"DayOfWeek":4,"Teacher":"吉田 たけお, 宮里 智樹, 赤嶺 有平 [Akamine Yuhei], 國田 樹 [Itsuki Kunita]","Grades":[2],"Place":"地創棟508"},{"ID":"101501081","Name":"大学英語 08組","Day":[2],"DayOfWeek":0,"Teacher":"富里 明美","Grades":[1],"Place":"共3-205"},{"ID":"101501081","Name":"大学英語 08組","Day":[2],"DayOfWeek":3,"Teacher":"富里 明美","Grades":[1],"Place":"共3-403"},{"ID":"617006001","Name":"情報ネットワークⅠ","Day":[1],"DayOfWeek":2,"Teacher":"長田 智和","Grades":[2],"Place":"工1-322"},{"ID":"610013071","Name":"キャリアデザイン 05組","Day":[4,5],"DayOfWeek":1,"Teacher":"遠藤 聡志","Grades":[3],"Place":"工1-322"},{"ID":"610013071","Name":"キャリアデザイン 05組","Day":[4,5],"DayOfWeek":1,"Teacher":"遠藤 聡志","Grades":[3],"Place":"工1-322"},{"ID":"610001011","Name":"キャリアデザイン入門 01組","Day":[5],"DayOfWeek":1,"Teacher":"清水 肇, 渡嘉敷 健","Grades":[1],"Place":"工1-221"},{"ID":"610042001","Name":"情報科教育法B","Day":[1],"DayOfWeek":3,"Teacher":"岡﨑 威生","Grades":[4],"Place":"工1-509"},{"ID":"610042001","Name":"情報科教育法B","Day":[1],"DayOfWeek":3,"Teacher":"岡﨑 威生","Grades":[4],"Place":"工1-509"},{"ID":"100408031","Name":"物理学Ⅰ 03組","Day":[2],"DayOfWeek":2,"Teacher":"深水 孝則","Grades":[4],"Place":"共1-118"},{"ID":"617021001","Name":"知能情報実験III","Day":[3,4],"DayOfWeek":3,"Teacher":"國田 樹 [Itsuki Kunita], 全教員","Grades":[3],"Place":"地創棟508"},{"ID":"610001021","Name":"キャリアデザイン入門 02組","Day":[5],"DayOfWeek":1,"Teacher":"清水 肇, 渡嘉敷 健","Grades":[1],"Place":"工1-222"},{"ID":"617028001","Name":"ヒューマンコンピュータインタラクション","Day":[2],"DayOfWeek":1,"Teacher":"赤嶺 有平 [Akamine Yuhei]","Grades":[3],"Place":"工2-313"},{"ID":"101501081","Name":"大学英語 08組","Day":[2],"DayOfWeek":0,"Teacher":"富里 明美","Grades":[1],"Place":"共3-205"},{"ID":"101501081","Name":"大学英語 08組","Day":[2],"DayOfWeek":3,"Teacher":"富里 明美","Grades":[1],"Place":"共3-403"},{"ID":"617038001","Name":"ソフトウエア開発演習III","Day":[3],"DayOfWeek":2,"Teacher":"河野 真治","Grades":[3],"Place":"工1-321"},{"ID":"617022001","Name":"ソフトウェア工学","Day":[4],"DayOfWeek":2,"Teacher":"河野 真治","Grades":[3],"Place":"工1-321"},{"ID":"101501091","Name":"大学英語 09組","Day":[2],"DayOfWeek":0,"Teacher":"宮城 和文","Grades":[1],"Place":"共3-403"},{"ID":"101501091","Name":"大学英語 09組","Day":[2],"DayOfWeek":3,"Teacher":"宮城 和文","Grades":[1],"Place":"共3-201"},{"ID":"610001041","Name":"キャリアデザイン入門 04組","Day":[5],"DayOfWeek":1,"Teacher":"清水 肇, 渡嘉敷 健","Grades":[1],"Place":"工1-222"},{"ID":"610001031","Name":"キャリアデザイン入門 03組","Day":[5],"DayOfWeek":1,"Teacher":"清水 肇, 渡嘉敷 健","Grades":[1],"Place":"工1-221"},{"ID":"617008001","Name":"データサイエンス基礎","Day":[1,2],"DayOfWeek":1,"Teacher":"岡﨑 威生","Grades":[2],"Place":"工1-321"},{"ID":"617039001","Name":"ICT実践英語I","Day":[1],"DayOfWeek":2,"Teacher":"比嘉 健伸","Grades":[4],"Place":"共4-305"},{"ID":"617023001","Name":"数理計画とアルゴリズム","Day":[2],"DayOfWeek":2,"Teacher":"長山 格","Grades":[3],"Place":"工1-321"},{"ID":"R00409001","Name":"システムアーキテクチャ論","Day":[1],"DayOfWeek":2,"Teacher":"和田 知久","Grades":[5],"Place":"地創棟503"},{"ID":"101501091","Name":"大学英語 09組","Day":[2],"DayOfWeek":0,"Teacher":"宮城 和文","Grades":[1],"Place":"共3-403"},{"ID":"101501091","Name":"大学英語 09組","Day":[2],"DayOfWeek":3,"Teacher":"宮城 和文","Grades":[1],"Place":"共3-201"},{"ID":"610013071","Name":"キャリアデザイン 05組","Day":[4,5],"DayOfWeek":1,"Teacher":"遠藤 聡志","Grades":[3],"Place":"工1-322"},{"ID":"610013071","Name":"キャリアデザイン 05組","Day":[4,5],"DayOfWeek":1,"Teacher":"遠藤 聡志","Grades":[3],"Place":"工1-322"},{"ID":"R00079001","Name":"ソフトウェアシステム論","Day":[4],"DayOfWeek":3,"Teacher":"河野 真治","Grades":[5],"Place":"工1-321"},{"ID":"610016001","Name":"技術英語Ⅰ","Day":[1],"DayOfWeek":4,"Teacher":"比嘉 広樹","Grades":[3],"Place":"工4-111"},{"ID":"610002071","Name":"工業数学Ⅰ 07組","Day":[3,4],"DayOfWeek":0,"Teacher":"山田 孝治","Grades":[1],"Place":"工1-321"},{"ID":"610002071","Name":"工業数学Ⅰ 07組","Day":[3,4],"DayOfWeek":0,"Teacher":"山田 孝治","Grades":[1],"Place":"工1-321"},{"ID":"R01768001","Name":"UI/UX論","Day":[5],"DayOfWeek":1,"Teacher":"赤嶺 有平 [Akamine Yuhei]","Grades":[5],"Place":"工1-321"},{"ID":"610019001","Name":"産業社会学原論Ⅰ","Day":[5],"DayOfWeek":4,"Teacher":"玉城 史朗","Grades":[3],"Place":"工1-322"},{"ID":"610019001","Name":"産業社会学原論Ⅰ","Day":[5],"DayOfWeek":4,"Teacher":"玉城 史朗","Grades":[3],"Place":"工1-322"},{"ID":"610004071","Name":"プログラミングⅠ","Day":[1],"DayOfWeek":4,"Teacher":"當間 愛晃","Grades":[1],"Place":"工1-321"},{"ID":"610004071","Name":"プログラミングⅠ","Day":[1],"DayOfWeek":4,"Teacher":"當間 愛晃","Grades":[1],"Place":"工1-321"},{"ID":"100826081","Name":"微分積分学ST(スタンダードコース)Ⅰ 08組","Day":[3],"DayOfWeek":2,"Teacher":"林 正史","Grades":[1],"Place":"共1-217"},{"ID":"617007001","Name":"コンピュータシステム","Day":[2],"DayOfWeek":0,"Teacher":"姜 東植","Grades":[2],"Place":"工1-321"},{"ID":"R01423001","Name":"プロジェクト・マネジメント演習","Day":[5],"DayOfWeek":4,"Teacher":"名嘉村 盛和","Grades":[5],"Place":"地創棟508"},{"ID":"R00087001","Name":"知能ロボット論","Day":[5],"DayOfWeek":3,"Teacher":"山田 孝治","Grades":[5],"Place":"地創棟508"},{"ID":"610042001","Name":"情報科教育法B","Day":[1],"DayOfWeek":3,"Teacher":"岡﨑 威生","Grades":[4],"Place":"工1-509"},{"ID":"610042001","Name":"情報科教育法B","Day":[1],"DayOfWeek":3,"Teacher":"岡﨑 威生","Grades":[4],"Place":"工1-509"},{"ID":"610005071","Name":"基礎数学Ⅰ 06組","Day":[3],"DayOfWeek":3,"Teacher":"岡﨑 威生, 國田 樹 [Itsuki Kunita]","Grades":[1],"Place":"工1-321"},{"ID":"610005071","Name":"基礎数学Ⅰ 06組","Day":[3],"DayOfWeek":3,"Teacher":"岡﨑 威生, 國田 樹 [Itsuki Kunita]","Grades":[1],"Place":"工1-321"},{"ID":"610038001","Name":"技術英語Ⅲ","Day":[1],"DayOfWeek":3,"Teacher":"小野 尋子","Grades":[4],"Place":"共4-505"},{"ID":"R01672001","Name":"データマイニング論","Day":[4],"DayOfWeek":1,"Teacher":"當間 愛晃","Grades":[5],"Place":"工1-321"},{"ID":"617016001","Name":"情報処理技術概論","Day":[3],"DayOfWeek":0,"Teacher":"宮里 智樹","Grades":[2],"Place":"工1-322"},{"ID":"610002021","Name":"工業数学Ⅰ 02組","Day":[2],"DayOfWeek":0,"Teacher":"宮﨑 達二郎","Grades":[1],"Place":"工4-111"},{"ID":"610012071","Name":"技術者の倫理 03組","Day":[1],"DayOfWeek":3,"Teacher":"和田 知久","Grades":[1],"Place":"工1-221"},{"ID":"610012071","Name":"技術者の倫理 03組","Day":[1],"DayOfWeek":3,"Teacher":"和田 知久","Grades":[1],"Place":"工1-221"},{"ID":"R00084001","Name":"知能システム論","Day":[2],"DayOfWeek":2,"Teacher":"姜 東植","Grades":[5],"Place":"地創棟504"}]
\ No newline at end of file
--- a/cmd_donwload.go	Wed Apr 01 19:18:40 2020 +0900
+++ b/cmd_donwload.go	Thu Apr 02 03:19:01 2020 +0900
@@ -1,9 +1,15 @@
 package lectable
 
 import (
+	"bufio"
 	"context"
+	"encoding/json"
 	"fmt"
 	"io"
+	"os"
+	"path/filepath"
+	"strconv"
+	"strings"
 
 	"www.cr.ie.u-ryukyu.ac.jp/hg/Members/anatofuz/lectable/syllabus"
 )
@@ -18,6 +24,34 @@
 	return "donwload html from lecture ids"
 }
 
+func convertPDFJson(jsonPath string) ([]DumpLectureFPDF, error) {
+	f, err := os.Open(jsonPath)
+	if err != nil {
+		return nil, err
+	}
+	br := bufio.NewReader(f)
+	dec := json.NewDecoder(br)
+	var dlf []DumpLectureFPDF
+	err = dec.Decode(&dlf)
+	if err != nil {
+		return nil, err
+	}
+	return dlf, nil
+}
+
+func strToIntDays(s string) (int, int, error) {
+	for dayIndex, dow := range days {
+		if strings.Contains(s, dow) {
+			d, err := strconv.Atoi(s[kanjiDayLen:])
+			if err != nil {
+				return 0, 0, err
+			}
+			return dayIndex, d, nil
+		}
+	}
+	return 0, 0, nil
+}
+
 func (cd *cmdDownload) run(ctx context.Context, argv []string, outStream, errStream io.Writer) error {
 	fmt.Println("download now!!")
 	dh := syllabus.CreateGetSyllabus()
@@ -25,12 +59,83 @@
 	if err != nil {
 		return err
 	}
-	arr3 := []string{"601495001", "600625001"}
+
+	dlf, err := convertPDFJson(argv[0])
+	if err != nil {
+		return err
+	}
+
+	var lecIDS []string
+	//var idToLecPDFJ map[string][]Lec
+	idToLecPDFJ := make(map[string][]Lec, len(dlf))
 
-	lwps, err := dh.LecIDStoDonwlodSyllabus(ctx, arr3, outStream)
+	for _, dl := range dlf {
+		lecIDS = append(lecIDS, dl.Id)
+		//idToLecPDFJ[dl.Id] = append(idToLecPDFJ[dl.Id], Lec{ID: dl.Id, Grades: dl.Grades, isSelect: dl.IsSelect, Place: dl.Place})
+		le := Lec{ID: dl.Id, Grades: dl.Grades, isSelect: dl.IsSelect, Place: dl.Place}
+		if dl.Day != "" {
+			dow, dindex, err := strToIntDays(dl.Day)
+			if err != nil {
+				return err
+			}
+			le.DayOfWeek = dow
+			le.Day = []int{dindex}
+		}
+		idToLecPDFJ[dl.Id] = append(idToLecPDFJ[dl.Id], le)
+	}
+
+	lwps, err := dh.LecIDStoDonwlodSyllabus(ctx, lecIDS, outStream)
 	lectures, err := dh.LectureWPathS2LectureStruct(ctx, lwps, outStream)
 	if err != nil {
 		return err
 	}
-	return dh.DumpLecureToJson(lectures)
+
+	var lecs []Lec
+
+	for _, lect := range *lectures {
+		fpds := idToLecPDFJ[lect.ID]
+		for _, fp := range fpds {
+			for _, day := range lect.Day {
+				fp.Name = lect.Name
+				if fp.Day == nil {
+					fp.Day = []int{day.Period}
+					if day.LastPeriod != -1 {
+						fp.Day = append(fp.Day, day.LastPeriod)
+					}
+					fp.DayOfWeek = day.DayOfWeek
+				}
+				fp.Teacher = lect.Teacher
+				lecs = append(lecs, fp)
+			}
+		}
+	}
+	return dumpLecToJson(lecs, dh.Outputdir)
 }
+
+func dumpLecToJson(lec []Lec, outputdir string) error {
+	bytes, err := json.Marshal(lec)
+	if err != nil {
+		return err
+	}
+	fp := filepath.Join(outputdir, "dumpFromPDFWHTML.json")
+	file, err := os.Create(fp)
+	bw := bufio.NewWriter(file)
+	_, err = bw.Write(bytes)
+	if err != nil {
+		return err
+	}
+	bw.Flush()
+	file.Close()
+	return nil
+}
+
+type Lec struct {
+	ID        string `json:id`
+	Name      string `json:name`
+	Day       []int  `json:day`
+	DayOfWeek int    `json:dayOfWeek`
+	Teacher   string `json:teacher`
+	isSelect  bool   `json:isSelect`
+	Grades    []int  `json:grades`
+	Place     string `json:place`
+}
--- a/syllabus/getSyllabus.go	Wed Apr 01 19:18:40 2020 +0900
+++ b/syllabus/getSyllabus.go	Thu Apr 02 03:19:01 2020 +0900
@@ -42,10 +42,10 @@
 
 //Lecture ID is ex. 600625001 , Name is プログラミング1, Day is LecutreDay
 type Lecture struct {
-	ID      string     `json: "id"`
-	Name    string     `json: "name`
-	Day     LectureDay `json: "day"`
-	Teacher string     `json: "teacher"`
+	ID      string       `json: "id"`
+	Name    string       `json: "name`
+	Day     []LectureDay `json: "day"`
+	Teacher string       `json: "teacher"`
 }
 
 type LectureWPath struct {
@@ -57,14 +57,12 @@
 func CreateGetSyllabus() *GetSyllabus {
 	var gs GetSyllabus
 	tm := time.Now()
-	//gs.year = tm.Year()
-	gs.year = 2019
+	gs.year = tm.Year()
 	if tm.Month() < 7 {
 		gs.term = "previous"
 	} else {
 		gs.term = "latter"
 	}
-	gs.term = "previous"
 
 	gs.Outputdir = filepath.Join(strconv.Itoa(gs.year), gs.term)
 	return &gs
@@ -153,22 +151,33 @@
 }
 
 func (g *GetSyllabus) LectureWPathS2LectureStruct(ctx context.Context, lwps *[]LectureWPath, outStream io.Writer) (*[]Lecture, error) {
-	//var wg sync.WaitGroup
-	ch := make(chan Lecture, len(*lwps))
-	for _, lwp := range *lwps {
-		//wg.Add(1)
-		go func(lwp LectureWPath) {
-			//defer wg.Done()
-			lec, _ := g.LectureWPath2LectureStruct(&lwp)
-			ch <- *lec
-		}(lwp)
-	}
-	//wg.Wait()
+	/*
+		ch := make(chan Lecture, len(*lwps))
+		for _, lwp := range *lwps {
+			//wg.Add(1)
+			go func(lwp LectureWPath) {
+				//defer wg.Done()
+				lec, _ := g.LectureWPath2LectureStruct(&lwp)
+				ch <- *lec
+			}(lwp)
+		}
+		//wg.Wait()
+
+		var lecs []Lecture
+		for range *lwps {
+			lecs = append(lecs, <-ch)
+		}
+	*/
 
 	var lecs []Lecture
-	for range *lwps {
-		lecs = append(lecs, <-ch)
+	for _, lwp := range *lwps {
+		lec, err := g.LectureWPath2LectureStruct(&lwp)
+		if err != nil {
+			return nil, err
+		}
+		lecs = append(lecs, *lec)
 	}
+
 	return &lecs, nil
 }
 
@@ -193,22 +202,36 @@
 				i += len(dayPeriodID)
 				day := line[i:j]
 
-				lec.Day.DayOfWeek = kanjiday2int(day[0:dayOfWeeklen])
+				var lecDay LectureDay
+
+				lecDay.DayOfWeek = kanjiday2int(day[0:dayOfWeeklen])
 				if err != nil {
-					return nil, errors.Wrap(err, "failed convert day")
+					fmt.Printf("%s is noconvert, day: %s\n", lwp.Path, day)
+					return nil, errors.Wrap(err, "failed convert dayOfWeek")
 				}
-				lec.Day.Period, err = strconv.Atoi(day[dayOfWeeklen : dayOfWeeklen+1])
+				lecDay.Period, err = strconv.Atoi(day[dayOfWeeklen : dayOfWeeklen+1])
 				if err != nil {
-					return nil, errors.Wrap(err, "failed convert day")
+					fmt.Printf("%s is noconvert, day: %s\n", lwp.Path, day)
+					return nil, errors.Wrap(err, "failed convert period")
 				}
 				if len(day) != (dayOfWeeklen + 1) { // dayOfWeeklen + 1 == 月3, 火2
-					lec.Day.LastPeriod, err = strconv.Atoi(day[dayOfWeeklen+4:]) // 4 is \d + 〜
+					//月2,木3
+					if nextKanji := strings.Index(day, ","); nextKanji != -1 {
+						lec.Day = append(lec.Day, lecDay)
+						continue
+					}
+
+					// 月3~4
+					lecDay.LastPeriod, err = strconv.Atoi(day[dayOfWeeklen+4:]) // 4 is \d + 〜
+					lec.Day = append(lec.Day, lecDay)
 					if err != nil {
+						fmt.Printf("%s is noconvert, day: %s\n", lwp.Path, day)
 						return nil, errors.Wrap(err, "failed convert day")
 					}
 					continue
 				}
-				lec.Day.LastPeriod = -1
+				lecDay.LastPeriod = -1
+				lec.Day = append(lec.Day, lecDay)
 				continue
 			}
 		}