152 lines
3.5 KiB
Go
152 lines
3.5 KiB
Go
// TODO: docstring
|
|
|
|
package main
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"text/template"
|
|
"time"
|
|
)
|
|
|
|
type frabSchedule struct {
|
|
Conf conference
|
|
Days []day
|
|
}
|
|
|
|
type conference struct {
|
|
Title string
|
|
Start string // date (yyyy-mm-dd)
|
|
End string // date (yyyy-mm-dd)
|
|
Days int
|
|
}
|
|
|
|
type day struct {
|
|
Index int
|
|
Date string // date (yyyy-mm-dd)
|
|
Start string // timedate (RFC3339)
|
|
End string // timedate (RFC3339)
|
|
Rooms []room
|
|
}
|
|
|
|
type room struct {
|
|
Name string
|
|
Events []event
|
|
}
|
|
|
|
type event struct {
|
|
ID int
|
|
GUID string // autogen UUID
|
|
|
|
Room string
|
|
Title string
|
|
Date string // timedate (RFC3339)
|
|
Start string // time (hh:mm)
|
|
Duration string // time (hh:mm)
|
|
Language string
|
|
|
|
Persons []person
|
|
}
|
|
|
|
type person struct {
|
|
ID int
|
|
Name string
|
|
}
|
|
|
|
func main() {
|
|
fmt.Println("Conference Schedule: CSV to Frab (Infobeamer) Converter")
|
|
|
|
/*
|
|
* Data Input
|
|
*/
|
|
// read CSV contents
|
|
csvFile, err := os.Open("schedule.csv")
|
|
if err != nil {
|
|
log.Fatal("Error opening CSV file:\n", err)
|
|
}
|
|
|
|
records, err := csv.NewReader(csvFile).ReadAll()
|
|
if err != nil {
|
|
log.Fatal("Error reading CSV file:\n", err)
|
|
}
|
|
|
|
// omit title row
|
|
csvRecords := records[1:]
|
|
|
|
fmt.Println(csvRecords) // TODO
|
|
|
|
/*
|
|
* Data Conversion
|
|
*/
|
|
timeDateFormat := "2006-01-02"
|
|
// timeTimeFormat := "15:04"
|
|
|
|
// new conference
|
|
cmdTitle := "Test Conference" // TODO: get from command line
|
|
cmdStart := "2018-11-18" // TODO: get from command line
|
|
cmdEnd := "2018-11-19" // TODO: get from command line
|
|
|
|
cmdStartTime, _ := time.Parse(timeDateFormat, cmdStart)
|
|
cmdEndTime, _ := time.Parse(timeDateFormat, cmdEnd)
|
|
|
|
confDurationDays := int(cmdEndTime.Sub(cmdStartTime).Hours()/24) + 1
|
|
conf := conference{cmdTitle, cmdStart, cmdEnd, confDurationDays}
|
|
|
|
// gather all rooms and persons
|
|
// TODO
|
|
|
|
// TODO: make room and day structs
|
|
|
|
// sort by room and day into structure
|
|
// TODO
|
|
// valid rooms: Heuckenlock, Heuckenlock {Ebbe, Flut}, Holzhafen, Raackmoor, Wohldorfer Wald
|
|
|
|
// assign the conference and days to the schedule
|
|
speaker1 := person{1, "Frau Testperson"}
|
|
|
|
day1Room1Event1 := event{123, "1-123", "Heuckenlock", "Opening Keynote", "2018-11-18T21:00:00+01:00", "21:00", "01:00", "", []person{speaker1}}
|
|
day1Room1Event2 := event{124, "1-124", "Heuckenlock", "Quartalszahlen", "2018-11-18T22:00:00+01:00", "22:00", "00:30", "de", []person{speaker1}}
|
|
day1Room1Events := []event{day1Room1Event1, day1Room1Event2}
|
|
day1Room1 := room{"Heuckenlock", day1Room1Events}
|
|
|
|
day1Room2Event1 := event{223, "", "Holzhafen", "Room 2 Talk 1", "2018-11-18T21:00:00+01:00", "21:00", "01:00", "", []person{speaker1}}
|
|
day1Room2Event2 := event{224, "", "Holzhafen", "Room 2 Title 2", "2018-11-18T22:00:00+01:00", "22:00", "00:30", "", []person{speaker1}}
|
|
day1Room2Events := []event{day1Room2Event1, day1Room2Event2}
|
|
day1Room2 := room{"Holzhafen", day1Room2Events}
|
|
|
|
day1Rooms := []room{day1Room1, day1Room2}
|
|
day1 := day{1, "2018-11-18", "2018-11-18T00:00:00+01:00", "2018-11-19T00:00:00+01:00", day1Rooms}
|
|
|
|
days := []day{day1}
|
|
sched := frabSchedule{conf, days}
|
|
|
|
/*
|
|
* Data Export
|
|
*/
|
|
// open output file
|
|
xmlOutput, err := os.Create("schedule.xml")
|
|
defer xmlOutput.Close()
|
|
if err != nil {
|
|
log.Fatal("Error opening XML file for output:\n", err)
|
|
}
|
|
|
|
t := template.New("Frab XML Template")
|
|
t, err = t.ParseFiles("tmpl/schedule.xml")
|
|
if err != nil {
|
|
log.Fatal("Error parsing XML template:\n", err)
|
|
}
|
|
err = t.ExecuteTemplate(xmlOutput, "schedule.xml", sched)
|
|
if err != nil {
|
|
log.Println("Error executing XML template:\n", err)
|
|
}
|
|
|
|
/*
|
|
* Print Summary
|
|
*/
|
|
// TODO
|
|
|
|
fmt.Println("done")
|
|
}
|