4
|
1 package lectable
|
|
2
|
|
3 import (
|
16
|
4 "bufio"
|
4
|
5 "context"
|
16
|
6 "encoding/json"
|
4
|
7 "fmt"
|
|
8 "io"
|
16
|
9 "os"
|
|
10 "path/filepath"
|
|
11 "strconv"
|
|
12 "strings"
|
5
|
13
|
11
|
14 "www.cr.ie.u-ryukyu.ac.jp/hg/Members/anatofuz/lectable/syllabus"
|
4
|
15 )
|
|
16
|
|
17 type cmdDownload struct{}
|
|
18
|
|
19 func (cd *cmdDownload) name() string {
|
|
20 return "download"
|
|
21 }
|
|
22
|
|
23 func (cd *cmdDownload) description() string {
|
|
24 return "donwload html from lecture ids"
|
|
25 }
|
|
26
|
16
|
27 func convertPDFJson(jsonPath string) ([]DumpLectureFPDF, error) {
|
|
28 f, err := os.Open(jsonPath)
|
|
29 if err != nil {
|
|
30 return nil, err
|
|
31 }
|
|
32 br := bufio.NewReader(f)
|
|
33 dec := json.NewDecoder(br)
|
|
34 var dlf []DumpLectureFPDF
|
|
35 err = dec.Decode(&dlf)
|
|
36 if err != nil {
|
|
37 return nil, err
|
|
38 }
|
|
39 return dlf, nil
|
|
40 }
|
|
41
|
|
42 func strToIntDays(s string) (int, int, error) {
|
|
43 for dayIndex, dow := range days {
|
|
44 if strings.Contains(s, dow) {
|
|
45 d, err := strconv.Atoi(s[kanjiDayLen:])
|
|
46 if err != nil {
|
|
47 return 0, 0, err
|
|
48 }
|
|
49 return dayIndex, d, nil
|
|
50 }
|
|
51 }
|
|
52 return 0, 0, nil
|
|
53 }
|
|
54
|
4
|
55 func (cd *cmdDownload) run(ctx context.Context, argv []string, outStream, errStream io.Writer) error {
|
|
56 fmt.Println("download now!!")
|
5
|
57 dh := syllabus.CreateGetSyllabus()
|
14
|
58 err := checkAndMkdirBuilddir(dh.Outputdir)
|
5
|
59 if err != nil {
|
|
60 return err
|
|
61 }
|
16
|
62
|
|
63 dlf, err := convertPDFJson(argv[0])
|
|
64 if err != nil {
|
|
65 return err
|
|
66 }
|
|
67
|
|
68 var lecIDS []string
|
|
69 //var idToLecPDFJ map[string][]Lec
|
|
70 idToLecPDFJ := make(map[string][]Lec, len(dlf))
|
5
|
71
|
16
|
72 for _, dl := range dlf {
|
|
73 lecIDS = append(lecIDS, dl.Id)
|
|
74 //idToLecPDFJ[dl.Id] = append(idToLecPDFJ[dl.Id], Lec{ID: dl.Id, Grades: dl.Grades, isSelect: dl.IsSelect, Place: dl.Place})
|
22
|
75 le := Lec{ID: dl.Id, Grades: dl.Grades, IsSelect: dl.IsSelect, Place: dl.Place}
|
16
|
76 if dl.Day != "" {
|
|
77 dow, dindex, err := strToIntDays(dl.Day)
|
|
78 if err != nil {
|
|
79 return err
|
|
80 }
|
|
81 le.DayOfWeek = dow
|
|
82 le.Day = []int{dindex}
|
|
83 }
|
|
84 idToLecPDFJ[dl.Id] = append(idToLecPDFJ[dl.Id], le)
|
|
85 }
|
|
86
|
|
87 lwps, err := dh.LecIDStoDonwlodSyllabus(ctx, lecIDS, outStream)
|
10
|
88 lectures, err := dh.LectureWPathS2LectureStruct(ctx, lwps, outStream)
|
|
89 if err != nil {
|
|
90 return err
|
|
91 }
|
16
|
92
|
|
93 var lecs []Lec
|
|
94
|
|
95 for _, lect := range *lectures {
|
|
96 fpds := idToLecPDFJ[lect.ID]
|
|
97 for _, fp := range fpds {
|
|
98 for _, day := range lect.Day {
|
|
99 fp.Name = lect.Name
|
|
100 if fp.Day == nil {
|
|
101 fp.Day = []int{day.Period}
|
|
102 if day.LastPeriod != -1 {
|
|
103 fp.Day = append(fp.Day, day.LastPeriod)
|
|
104 }
|
|
105 fp.DayOfWeek = day.DayOfWeek
|
|
106 }
|
|
107 fp.Teacher = lect.Teacher
|
|
108 lecs = append(lecs, fp)
|
|
109 }
|
|
110 }
|
|
111 }
|
|
112 return dumpLecToJson(lecs, dh.Outputdir)
|
4
|
113 }
|
16
|
114
|
|
115 func dumpLecToJson(lec []Lec, outputdir string) error {
|
|
116 bytes, err := json.Marshal(lec)
|
|
117 if err != nil {
|
|
118 return err
|
|
119 }
|
|
120 fp := filepath.Join(outputdir, "dumpFromPDFWHTML.json")
|
|
121 file, err := os.Create(fp)
|
|
122 bw := bufio.NewWriter(file)
|
|
123 _, err = bw.Write(bytes)
|
|
124 if err != nil {
|
|
125 return err
|
|
126 }
|
|
127 bw.Flush()
|
|
128 file.Close()
|
|
129 return nil
|
|
130 }
|
|
131
|
|
132 type Lec struct {
|
|
133 ID string `json:id`
|
|
134 Name string `json:name`
|
|
135 Day []int `json:day`
|
|
136 DayOfWeek int `json:dayOfWeek`
|
|
137 Teacher string `json:teacher`
|
22
|
138 IsSelect bool `json:isSelect`
|
16
|
139 Grades []int `json:grades`
|
|
140 Place string `json:place`
|
|
141 }
|