diff --git a/.gitignore b/.gitignore index 27ae6f1..7e0589d 100644 --- a/.gitignore +++ b/.gitignore @@ -373,3 +373,4 @@ FodyWeavers.xsd # Local History for Visual Studio Code .history/ +heatmap diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..684e6fd --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module heatmap + +go 1.17 diff --git a/heatmap.go b/heatmap.go new file mode 100644 index 0000000..2447181 --- /dev/null +++ b/heatmap.go @@ -0,0 +1,93 @@ +package main + +import ( + "bufio" + "encoding/csv" + "fmt" + "io" + "io/ioutil" + "log" + "os" + "strconv" + "time" +) + +type ActivityLine struct { + Date time.Time + CaloriesEstimate uint64 +} + +func main() { + csvFile, _ := os.Open("heat.csv") + reader := csv.NewReader(bufio.NewReader(csvFile)) + var length int = 17 + var days = make(map[time.Time]uint64) + for { + line, error := reader.Read() + if error == io.EOF { + break + } else if error != nil { + log.Fatal(error) + } + thisTime, error := time.Parse("2006-01-02", line[0]) + thisTime = time.Date(thisTime.Year(), thisTime.Month(), thisTime.Day(), 0, 0, 0, 0, time.Local) + if error != nil { + fmt.Println(error) + break + } + cals, error := strconv.ParseUint(line[1], 10, 64) + if error != nil { + break + } + + days[thisTime] = days[thisTime] + cals + } + start := time.Date(time.Now().Year()-1, time.Now().Month(), time.Now().Day(), 0, 0, 0, 0, time.Local) + svg := "" + datePointer := start + var week int = 0 + midnightThisMorning := time.Date(time.Now().Year(), time.Now().Month(), time.Now().Day(), 0, 0, 0, 0, time.Local) + + var monthChange = false + var monthLabelSpots = make(map[string]int) + for { + + var calsOnDay = days[datePointer] + + if calsOnDay > 0 { + svg = fmt.Sprintf("%s\n", svg, length, length, week*length, length*int(datePointer.Weekday())) + } else { + svg = fmt.Sprintf("%s\n", svg, length, length, week*length, length*int(datePointer.Weekday())) + } + datePointer = datePointer.Add(time.Hour * 24) + + if datePointer.After(midnightThisMorning) { + break + } + if datePointer.Day() == 1 { + monthChange = true + } + if datePointer.Weekday() == time.Sunday { + week++ + if monthChange { + monthLabelSpots[datePointer.Month().String()] = week * length + monthChange = false + } + } + } + svg = fmt.Sprintf("%s\n", svg) + + //week labels + //tODO: parameterize + svg = fmt.Sprintf("%sMonWedFri", svg) + + //month labels + svg = fmt.Sprintf("%s", svg) + for monthName := range monthLabelSpots { + svg = fmt.Sprintf("%s%v", svg, monthLabelSpots[monthName], monthName[:3]) + } + svg = fmt.Sprintf("%s", svg) + + svg = fmt.Sprintf("%s", svg) + ioutil.WriteFile("heatmap.svg", []byte(svg), 0644) +}