Mercurial > hg > Members > anatofuz > lectable
view syllabus/getSyllabus.go @ 2:dccd0dd6cfbc
move package
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 31 Mar 2020 09:49:20 +0900 |
parents | lectable/getSyllabus.go@1f47625c6948 |
children | e4088b031eba |
line wrap: on
line source
package syllabus import ( "bufio" "io" "net/http" "os" "strconv" "strings" "time" "github.com/pkg/errors" ) const ( monday int = iota tuesday wednesday thursday friday ) //GetSyllabus is use main function struct. members using download html operation type GetSyllabus struct { year int term string outputdir string } // LectureDay include day of week (0~4, error -> 5), period, lastpriod (1~6) type LectureDay struct { DayOfWeek int Period int LastPeriod int } //Lecture ID is ex. 600625001 , Name is プログラミング1, Day is LecutreDay type Lecture struct { ID string Name string Day *lectureDay Teacher string } //CreateGetSyllabus is constructor and initialize from now time func CreateGetSyllabus() *GetSyllabus { var gs GetSyllabus tm := time.Now() gs.year = tm.Year() if tm.Month() < 7 { gs.term = "previous" } else { gs.term = "latter" } var b strings.Builder b.WriteString(strconv.Itoa(gs.year)) b.WriteString("/") b.WriteString(gs.term) gs.outputdir = b.String() return &gs } var dayPeriodID = "ctl00_phContents_Detail_lbl_day_period\">" var lectureNameID = "ctl00_phContents_Detail_lbl_lbl_lct_name_double\">" var teacherNameID = "ctl00_phContents_Detail_lbl_syl_staff_name_double\">" var endSpan = "</span>" var dayOfWeeklen = len("月") //LecIDtoDownloadSyllabus is download from lecture ID func (g *GetSyllabus) LecIDtoDownloadSyllabus(lectureID string) error { var strBuilder strings.Builder strBuilder.WriteString(g.outputdir) strBuilder.WriteString("/") strBuilder.WriteString(lectureID) strBuilder.WriteString(".html") file, err := os.Create(strBuilder.String()) defer file.Close() if err != nil { return errors.Wrap("failed create html...") } strBuilder.Reset() res, err := http.Get("http://google.com") defer res.Body.Close() if err != nil { return errors.Wrap("failed download html") } _, err := io.Copy(file, res.Body) if err != nil { return errors.Wrap("failed download html") } return nil } //LecIDwFilePath2LectureStruct is require LectureID (== Lecture.ID), filePath ( syllabus.html path) func (g *GetSyllabus) LecIDwFilePath2LectureStruct(lectureID, filePath string) (*lecture, error) { file, err := os.Open(filePath) if err != nil { return nil, errors.Wrap(err, "failed open html file") } scanner := bufio.NewScanner(file) var lec lecture lec.id = lectureID for scanner.Scan() { line := scanner.Text() // day Period if i := strings.Index(line, dayPeriodID); i >= 0 { if j := strings.Index(line, endSpan); j >= 0 { i += len(dayPeriodID) day := line[i:j] lec.day.dayOfWeek, err = kanjiday2int(day[0:dayOfWeeklen]) if err != nil { return nil, errors.Wrap(err, "failed convert day") } lec.day.period, err = strconv.Atoi(day[dayOfWeeklen : dayOfWeeklen+1]) // dayの長さで〜があるかどうかが判定する } continue } // lecture name if i := strings.Index(line, lectureNameID); i >= 0 { if j := strings.Index(line, endSpan); j >= 0 { i += len(lectureNameID) lec.name = line[i:j] } continue } //teacher name if i := strings.Index(line, teacherNameID); i >= 0 { if j := strings.Index(line, endSpan); j >= 0 { i += len(teacherNameID) lec.teacher = line[i:j] } break } } file.Close() return &lec, nil } func kanjiday2int(kanjiDay string) (int, error) { return 0, nil }