2020-09-19 10:27:07 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"crypto/sha1"
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"net/http"
|
|
|
|
"os"
|
|
|
|
"path"
|
|
|
|
"path/filepath"
|
2020-09-19 10:57:14 +00:00
|
|
|
"strings"
|
2020-09-19 10:27:07 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
const assetsFolder = "templates/assets"
|
|
|
|
const compiledAssetsFolder = "tmp_assets"
|
|
|
|
|
|
|
|
var assetFiles map[string]string
|
|
|
|
|
|
|
|
func initTemplateAssets() error {
|
|
|
|
err := os.RemoveAll(compiledAssetsFolder)
|
2020-09-21 14:12:17 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2020-09-19 10:27:07 +00:00
|
|
|
err = os.MkdirAll(compiledAssetsFolder, 0755)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
assetFiles = map[string]string{}
|
|
|
|
err = filepath.Walk(assetsFolder, func(path string, info os.FileInfo, err error) error {
|
|
|
|
if info.Mode().IsRegular() {
|
|
|
|
compiled, err := compileAssets(path)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if compiled != "" {
|
2020-09-19 10:57:14 +00:00
|
|
|
assetFiles[strings.TrimPrefix(path, assetsFolder+"/")] = compiled
|
2020-09-19 10:27:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func compileAssets(name string) (compiledFileName string, err error) {
|
|
|
|
originalContent, err := ioutil.ReadFile(name)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ext := path.Ext(name)
|
|
|
|
var compiledContent []byte
|
|
|
|
compiledExt := ext
|
|
|
|
switch ext {
|
|
|
|
case ".js":
|
|
|
|
compiledContent, err = minifier.Bytes("application/javascript", originalContent)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
case ".css":
|
|
|
|
compiledContent, err = minifier.Bytes("text/css", originalContent)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
// Just copy the file
|
|
|
|
compiledContent = originalContent
|
|
|
|
}
|
|
|
|
sha := sha1.New()
|
|
|
|
sha.Write(compiledContent)
|
|
|
|
hash := fmt.Sprintf("%x", sha.Sum(nil))
|
|
|
|
compiledFileName = hash + compiledExt
|
|
|
|
err = ioutil.WriteFile(path.Join(compiledAssetsFolder, compiledFileName), compiledContent, 0644)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Function for templates
|
|
|
|
func assetFile(fileName string) string {
|
2020-09-19 10:57:14 +00:00
|
|
|
return "/" + assetFiles[fileName]
|
2020-09-19 10:27:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func allAssetPaths() []string {
|
|
|
|
var paths []string
|
|
|
|
for _, name := range assetFiles {
|
|
|
|
paths = append(paths, "/"+name)
|
|
|
|
}
|
|
|
|
return paths
|
|
|
|
}
|
|
|
|
|
|
|
|
// Gets only called by registered paths
|
2020-10-15 17:50:34 +00:00
|
|
|
func serveAsset(w http.ResponseWriter, r *http.Request) {
|
|
|
|
w.Header().Add("Cache-Control", "public,max-age=31536000,immutable")
|
|
|
|
http.ServeFile(w, r, path.Join(compiledAssetsFolder, r.URL.Path))
|
2020-09-19 10:27:07 +00:00
|
|
|
}
|