view dumphtml.go @ 23:25596a97b873

imple output after term
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 03 Apr 2020 07:32:25 +0900
parents 8d14bbbedf23
children
line wrap: on
line source

package lectable

import (
	"bufio"
	"encoding/json"
	"html/template"
	"io"
	"log"
	"os"
	"path/filepath"
	"strings"
)

/*
<td class="required"><a href="http://ie.u-ryukyu.ac.jp/syllabus/2019/early/617009001.html">プロジェクトデザイン</a>
<a href="http://ie.u-ryukyu.ac.jp/%7koji/pw/" target="_blank" rel="noopener noreferrer">山田 孝治</a>
<span style="font-size: 8pt;">工1-321</span></td>

<td class="select"><a href="http://ie.u-ryukyu.ac.jp/syllabus/2019/early/617016001.html">情報処理技術概論</a>
<a>宮里 智樹</a>
<span style="font-size: 8pt;">工1-322</span></td>
*/

type teacherSTR struct {
	Name string
	Url  string
}

type TeacherFromJSON struct {
	Teacher []string `json:"teacher"`
}

type dumpHTMLSTR struct {
	ID       string
	Name     string
	Teacher  teacherSTR
	Place    string
	IsSelect bool
	NextTerm *dumpHTMLSTR
}

type teacherNameToURL map[string]string

func convertStaticTeacherToMap(jsonPath string) (*teacherNameToURL, error) {
	f, err := os.Open(jsonPath)
	if err != nil {
		return nil, err
	}
	br := bufio.NewReader(f)
	dec := json.NewDecoder(br)
	var teacherFJson []TeacherFromJSON
	err = dec.Decode(&teacherFJson)
	if err != nil {
		return nil, err
	}

	tnametoURL := make(teacherNameToURL, len(teacherFJson))

	for _, tcfj := range teacherFJson {
		tnametoURL[tcfj.Teacher[0]] = tcfj.Teacher[1]
	}
	return &tnametoURL, nil
}

func convertLec(jsonPath string) ([]Lec, error) {
	f, err := os.Open(jsonPath)
	if err != nil {
		return nil, err
	}
	br := bufio.NewReader(f)
	dec := json.NewDecoder(br)
	var lecs []Lec
	err = dec.Decode(&lecs)
	if err != nil {
		return nil, err
	}
	return lecs, nil
}

/*
 */
/*
type dumpHTMLSTR struct {
	ID       string
	Name     string
	Teacher  teacherSTR
	Place    string
	IsSelect bool
	NextTerm *DumpLectureFPDF
}
*/

type GradeLecturesArray [6][5][5]*dumpHTMLSTR

type GradeLectures struct {
	B1  *[5][5]*dumpHTMLSTR //[ day of week ] [period]
	B2  *[5][5]*dumpHTMLSTR //[ day of week ] [period]
	B3  *[5][5]*dumpHTMLSTR //[ day of week ] [period]
	B4  *[5][5]*dumpHTMLSTR //[ day of week ] [period]
	M   *[5][5]*dumpHTMLSTR //[ day of week ] [period]
	OLD *[5][5]*dumpHTMLSTR //[ day of week ] [period]
}

func convertdumpHTMLSTR(lecs []Lec, teacherToJSON teacherNameToURL) (*GradeLectures, error) {
	glecturesArray := new(GradeLecturesArray)
	for _, lec := range lecs {
		grade := lec.Grades[0] //NOTE: now, grade elements is always one
		grade--

		teacherURL := teacherToJSON[lec.Teacher]

		lTeacher := teacherSTR{
			Name: lec.Teacher,
			Url:  teacherURL,
		}
		for _, day := range lec.Day {
			dhstr := dumpHTMLSTR{
				ID:       lec.ID,
				Name:     lec.Name,
				Teacher:  lTeacher,
				Place:    lec.Place,
				IsSelect: lec.IsSelect,
			}
			day--
			if glecturesArray[grade][day][lec.DayOfWeek] != nil {
				if strings.Contains(glecturesArray[grade][day][lec.DayOfWeek].Name, "大学英語") {
					var strBuilder strings.Builder
					strBuilder.WriteString(dhstr.Teacher.Name)
					strBuilder.WriteString("/")
					strBuilder.WriteString(glecturesArray[grade][day][lec.DayOfWeek].Teacher.Name)
					glecturesArray[grade][day][lec.DayOfWeek].Teacher.Name = strBuilder.String()
					strBuilder.Reset()

					strBuilder.WriteString(dhstr.Place)
					strBuilder.WriteString("/")
					strBuilder.WriteString(glecturesArray[grade][day][lec.DayOfWeek].Place)
					glecturesArray[grade][day][lec.DayOfWeek].Place = strBuilder.String()
					continue
				}
				glecturesArray[grade][day][lec.DayOfWeek].NextTerm = &dhstr
				continue
			}
			glecturesArray[grade][day][lec.DayOfWeek] = &dhstr
		}
	}
	glectures := new(GradeLectures)
	glectures.B1 = &glecturesArray[0]
	glectures.B2 = &glecturesArray[1]
	glectures.B3 = &glecturesArray[2]
	glectures.B4 = &glecturesArray[3]
	glectures.M = &glecturesArray[4]

	return glectures, nil
}

func dumpHTML(grlectures *GradeLectures, writer io.Writer) error {
	funcMap := template.FuncMap{
		// The name "inc" is what the function will be called in the template text.
		"inc": func(i int) int {
			return i + 1
		},
	}

	t := template.Must(template.New("").Funcs(funcMap).ParseFiles(filepath.Join("template", "base.html.tmpl")))

	st := struct {
		B1 *[5][5]*dumpHTMLSTR
		B2 *[5][5]*dumpHTMLSTR
		B3 *[5][5]*dumpHTMLSTR
		B4 *[5][5]*dumpHTMLSTR
		M  *[5][5]*dumpHTMLSTR
	}{
		B1: grlectures.B1,
		B2: grlectures.B2,
		B3: grlectures.B3,
		B4: grlectures.B4,
		M:  grlectures.M,
	}

	if err := t.Funcs(funcMap).ExecuteTemplate(writer, "base.html.tmpl", st); err != nil {
		log.Fatal(err)
	}

	return nil
}