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
}