205 lines
4.4 KiB
Go
205 lines
4.4 KiB
Go
package main
|
|
|
|
//go:generate go tool templ generate templates
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"piekarnikgosi/data"
|
|
"piekarnikgosi/html"
|
|
"piekarnikgosi/utils"
|
|
"sort"
|
|
"strings"
|
|
"sync"
|
|
|
|
"github.com/tdewolff/minify/v2"
|
|
mcss "github.com/tdewolff/minify/v2/css"
|
|
mhtml "github.com/tdewolff/minify/v2/html"
|
|
mjs "github.com/tdewolff/minify/v2/js"
|
|
)
|
|
|
|
type ComponentRenderer interface {
|
|
Render(ctx context.Context, w io.Writer) error
|
|
}
|
|
|
|
var minifier = sync.OnceValue(func() *minify.M {
|
|
m := minify.New()
|
|
m.Add("text/html", &mhtml.Minifier{
|
|
KeepDocumentTags: true,
|
|
KeepEndTags: true,
|
|
})
|
|
m.Add("text/css", &mcss.Minifier{})
|
|
m.Add("application/javascript", &mjs.Minifier{})
|
|
return m
|
|
})
|
|
|
|
func minifyFile(path, mediatype string) {
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
err = os.WriteFile(path, minifyData(mediatype, data), 0666)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func minifyData(mediatype string, data []byte) []byte {
|
|
b, err := minifier().Bytes(mediatype, data)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
return b
|
|
}
|
|
|
|
func saveFile(name string, comp ComponentRenderer) {
|
|
var buf bytes.Buffer
|
|
err := comp.Render(context.Background(), &buf)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
minified := minifyData("text/html", buf.Bytes())
|
|
|
|
if name == "index" {
|
|
err = os.WriteFile("www/index.html", minified, 0666)
|
|
} else {
|
|
dir := "www/" + name
|
|
os.MkdirAll(dir, 0777)
|
|
err = os.WriteFile(dir+"/index.html", minified, 0666)
|
|
}
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func albumImages(page string) []string {
|
|
entries, err := os.ReadDir("img/album/" + 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 "album/" + strings.NewReplacer(" ", "_", "ł", "l", "ó", "o").Replace(lower_case)
|
|
}
|
|
|
|
func albumPages() {
|
|
entries, err := os.ReadDir("img/album")
|
|
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 := albumImages(page)
|
|
if i == 0 {
|
|
saveFile("album", html.Album(images, "album", pages))
|
|
} else {
|
|
saveFile(to_url(page), html.Album(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())
|
|
albumPages()
|
|
}
|
|
|
|
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",
|
|
"album.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')
|
|
}
|
|
|
|
minified := minifyData("text/css", bundledCSS)
|
|
err := os.WriteFile("www/style.css", minified, 0666)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func ensureDir() {
|
|
log.Println("creating directories")
|
|
os.MkdirAll("www/images", 0777)
|
|
entries, _ := os.ReadDir("www")
|
|
for _, e := range entries {
|
|
if e.Name() != "images" {
|
|
os.RemoveAll("www/" + e.Name())
|
|
}
|
|
}
|
|
}
|
|
|
|
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/album.js", "www/album.js")
|
|
minifyFile("www/album.js", "application/javascript")
|
|
mustCopy("js/htmx.min.js", "www/htmx.min.js")
|
|
mustCopy("js/preload.js", "www/preload.js")
|
|
minifyFile("www/preload.js", "application/javascript")
|
|
if len(os.Args) > 1 {
|
|
return
|
|
}
|
|
log.Println("listening on :8000")
|
|
log.Fatal(http.ListenAndServe(":8000", http.FileServer(http.Dir("www"))))
|
|
}
|