view cmd_donwload.go @ 22:8d14bbbedf23

genhtml
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Thu, 02 Apr 2020 23:39:55 +0900
parents cc568d791a28
children
line wrap: on
line source

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"
)

type cmdDownload struct{}

func (cd *cmdDownload) name() string {
	return "download"
}

func (cd *cmdDownload) description() string {
	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()
	err := checkAndMkdirBuilddir(dh.Outputdir)
	if err != nil {
		return err
	}

	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))

	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
	}

	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`
}