package main import ( e "codeberg.org/pebbe/errors" "bufio" "encoding/xml" "fmt" "html" "os" "strings" "time" ) type Item struct { XMLName xml.Name `xml:"item"` UnixTime int64 `xml:"unixTime"` } var ( x = e.ExitErr escape = html.EscapeString data = make(map[string][]string) location *time.Location ) func main() { var err error location, err = time.LoadLocation("Europe/Amsterdam") x(err) files, err := os.ReadDir("..") x(err) for _, file := range files { filename := file.Name() if strings.HasSuffix(filename, ".txt") { doText(filename) } else if strings.HasSuffix(filename, ".xml") { doXml(filename) } } files, err = os.ReadDir("xml") x(err) for _, file := range files { filename := file.Name() if !strings.HasSuffix(filename, ".xml") { continue } aa := strings.Split(filename, ".") base := strings.Join(aa[1:len(aa)-2], ".") b, err := os.ReadFile("xml/" + filename) x(err) s := string(b) i := strings.Index(s, "\n \n")) for _, m := range data[base] { x(fp.WriteString(" " + m + "\n")) } x(fp.WriteString(" \n ")) x(fp.WriteString(stripMeta(s[i:]))) x(fp.Close()) x(os.Rename("xml/"+filename+".tmp", "xml/"+filename)) } } func doText(filename string) { base := filename[:len(filename)-4] if _, ok := data[base]; !ok { data[base] = make([]string, 0) } fp, err := os.Open("../" + filename) x(err) defer func() { x(fp.Close()) }() scanner := bufio.NewScanner(fp) for scanner.Scan() { line := scanner.Text() if !strings.HasPrefix(line, "##META") { continue } aa := strings.Fields(line) if len(aa) > 4 { data[base] = append(data[base], fmt.Sprintf(``, aa[1], escape(aa[2]), escape(strings.Join(aa[4:], " ")))) } } x(scanner.Err()) } func doXml(filename string) { base := filename[:len(filename)-4] if _, ok := data[base]; !ok { data[base] = make([]string, 0) } b, err := os.ReadFile("../" + filename) x(err) var item Item x(xml.Unmarshal(b, &item)) t := time.Unix(item.UnixTime, 0).In(location) data[base] = append(data[base], fmt.Sprintf(``, t.Year(), int(t.Month()), t.Day())) } func stripMeta(s string) string { i1 := strings.Index(s, "") if i1 < 0 { return s } i2 := i1 + strings.Index(s[i1:], "") + 11 return s[:i1] + strings.TrimLeft(s[i2:], " \t\r\n") }