package main //go:generate go tool templ generate templates import ( "context" "fmt" "io" "log" "net/http" "os" "path/filepath" "piekarnikgosi/data" "piekarnikgosi/html" "piekarnikgosi/utils" "sort" "strings" ) type ComponentRenderer interface { Render(ctx context.Context, w io.Writer) error } func saveFile(name string, comp ComponentRenderer) { file, err := os.Create("www/" + name + ".html") if err != nil { log.Fatal(err) } defer file.Close() err = comp.Render(context.Background(), file) if err != nil { log.Fatal(err) } } func portfolioImages(page string) []string { entries, err := os.ReadDir("img/portfolio/" + page) if err != nil { log.Fatal(err) } var names []string for _, e := range entries { if filepath.Ext(e.Name()) == ".avif" { name := page + "/" + e.Name() names = append(names, name) } } sort.Strings(names) return names } func to_url(input string) string { lower_case := strings.ToLower(input) return "portfolio_" + strings.NewReplacer(" ", "_", "ł", "l", "ó", "o").Replace(lower_case) } func portfolioPages() { entries, err := os.ReadDir("img/portfolio") if err != nil { log.Fatal(err) } var pages []string for _, e := range entries { pages = append(pages, e.Name()) } sort.Strings(pages) for i, page := range pages { images := portfolioImages(page) if i == 0 { saveFile("portfolio", html.Portfolio(images, "portfolio", pages)) } else { saveFile(to_url(page), html.Portfolio(images, to_url(page), pages)) } } } func generateHTML() { log.Println("generating html") saveFile(`index`, html.Index()) saveFile(`kawiarnia`, html.Kawiarnia()) saveFile(`wyroby`, html.Wyroby(data.Cakes, "wyroby")) saveFile(`wyroby_deserki`, html.Wyroby(data.Desserts, "wyroby_deserki")) saveFile(`wyroby_torty`, html.WyrobyTorty()) saveFile(`wyroby_slodkie_stoly`, html.WyrobySlodkieStoly()) saveFile(`wyroby_lody`, html.WyrobyLody()) portfolioPages() } func mergeStyles() { log.Println("generating css") cssFiles := []string{ "normalize.css", "base.css", "components.css", "home.css", "layout.css", "wyroby.css", "wyroby_torty.css", "wyroby_slodkie_stoly.css", "wyroby_lody.css", "portfolio.css", "kawiarnia.css", } var bundledCSS []byte for _, fileName := range cssFiles { filePath := fmt.Sprint("css/", fileName) content, err := os.ReadFile(filePath) if err != nil { log.Fatal(err) } bundledCSS = append(bundledCSS, content...) bundledCSS = append(bundledCSS, '\n') } err := os.WriteFile("www/style.css", bundledCSS, 0666) if err != nil { log.Fatal(err) } } func ensureDir() { log.Println("creating directories") err := os.MkdirAll("www/images", 0777) if err != nil { log.Fatal(err) } } func mustCopy(src, dst string) { _, err := utils.CopyIfNotExists(src, dst) if err != nil { log.Fatalf("copying %s: %s", src, err) } } func main() { ensureDir() generateHTML() mergeStyles() mustCopy("img/favicon.avif", "www/images/favicon.avif") mustCopy("img/logo.svg", "www/images/logo.svg") mustCopy("js/portfolio.js", "www/portfolio.js") if len(os.Args) > 1 { return } log.Println("listening on :8000") log.Fatal(http.ListenAndServe(":8000", http.FileServer(http.Dir("www")))) }