mirror of
https://github.com/thebaer/squigglelog
synced 2018-07-20 10:45:21 +00:00
142 lines
2.8 KiB
Go
142 lines
2.8 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"io/ioutil"
|
||
|
"time"
|
||
|
"strconv"
|
||
|
"text/template"
|
||
|
"os"
|
||
|
"bufio"
|
||
|
"regexp"
|
||
|
"flag"
|
||
|
"encoding/json"
|
||
|
)
|
||
|
|
||
|
const entriesPath = "./entries/"
|
||
|
const templatesPath = "./templates/"
|
||
|
const outputPath = "./html/"
|
||
|
const defaultTemplateFile = "log"
|
||
|
|
||
|
type Entry struct {
|
||
|
Date string
|
||
|
Body []byte
|
||
|
}
|
||
|
|
||
|
func loadEntry(rawDate string) (*Entry, error) {
|
||
|
filename := entriesPath + rawDate
|
||
|
body, err := ioutil.ReadFile(filename)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
// Get raw date parts for formatting
|
||
|
year := rawDate[:4]
|
||
|
month, moErr := strconv.Atoi(rawDate[4:6])
|
||
|
if moErr != nil {
|
||
|
return nil, moErr
|
||
|
}
|
||
|
date, dateErr := strconv.Atoi(rawDate[6:8])
|
||
|
if dateErr != nil {
|
||
|
return nil, dateErr
|
||
|
}
|
||
|
|
||
|
formattedDate := fmt.Sprintf("%d %s %s", date, time.Month(month).String(), year)
|
||
|
|
||
|
return &Entry{Date: formattedDate, Body: body}, nil
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
fmt.Println()
|
||
|
fmt.Println(" ~log generator v1.0")
|
||
|
fmt.Println()
|
||
|
|
||
|
// Get any arguments
|
||
|
templateFilePtr := flag.String("template", defaultTemplateFile, "Tildelog template file (defined name).")
|
||
|
flag.Parse()
|
||
|
|
||
|
c := configuration()
|
||
|
if c = nil {
|
||
|
c := configure()
|
||
|
}
|
||
|
|
||
|
if c != nil {
|
||
|
templateFilePtr = c.TemplateFile
|
||
|
}
|
||
|
|
||
|
entryFiles := getEntries()
|
||
|
entries := make([]Entry, len(*entryFiles))
|
||
|
i := 0
|
||
|
for _, file := range *entryFiles {
|
||
|
entry, err := loadEntry(file)
|
||
|
if err != nil {
|
||
|
fmt.Printf("Error, skipping entry %s: %s\n", file, err)
|
||
|
continue
|
||
|
}
|
||
|
fmt.Printf("Adding entry %s...\n", file)
|
||
|
entries[i] = *entry
|
||
|
i++
|
||
|
}
|
||
|
|
||
|
fmt.Printf("Using template %s...\n", *templateFilePtr)
|
||
|
|
||
|
generateLog(entries, *templateFilePtr)
|
||
|
|
||
|
fmt.Printf("Finished! Saved to %slog.html\n", outputPath)
|
||
|
}
|
||
|
|
||
|
type Config struct {
|
||
|
EntriesPath string
|
||
|
TemplateFile string
|
||
|
}
|
||
|
|
||
|
func configuration() *Config {
|
||
|
file, err := os.Open(os.Getenv("HOME") + "/.tildelog")
|
||
|
if err != nil {
|
||
|
return nil
|
||
|
}
|
||
|
d := json.NewDecoder(file)
|
||
|
c := Config{}
|
||
|
err = d.Decode(&c)
|
||
|
if err != nil {
|
||
|
fmt.Printf("Couldn't decode configuration: %s\n", err)
|
||
|
}
|
||
|
return &c
|
||
|
}
|
||
|
|
||
|
var validFileFormat = regexp.MustCompile("^[0-9]{8}$")
|
||
|
|
||
|
func getEntries() *[]string {
|
||
|
files, _ := ioutil.ReadDir(entriesPath)
|
||
|
fileList := make([]string, len(files))
|
||
|
fileCount := 0
|
||
|
// Traverse file list in reverse, i.e. newest to oldest
|
||
|
for i := len(files)-1; i >= 0; i-- {
|
||
|
file := files[i]
|
||
|
if validFileFormat.Match([]byte(file.Name())) {
|
||
|
fileList[fileCount] = file.Name()
|
||
|
fileCount++
|
||
|
}
|
||
|
}
|
||
|
fileList = fileList[:fileCount]
|
||
|
return &fileList
|
||
|
}
|
||
|
|
||
|
func generateLog(entries []Entry, templateFile string) {
|
||
|
file, err := os.Create(outputPath + "log.html")
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
defer file.Close()
|
||
|
|
||
|
writer := bufio.NewWriter(file)
|
||
|
template, err := template.ParseGlob(templatesPath + "*.html")
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
template.ExecuteTemplate(writer, templateFile, entries)
|
||
|
writer.Flush()
|
||
|
}
|
||
|
|