1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-08-06 17:41:00 +00:00

Use embed package for CSS bundles instead of generated files

This commit is contained in:
Frédéric Guillot 2021-02-17 21:58:04 -08:00 committed by fguillot
parent 42edd357bc
commit 9569666259
9 changed files with 83 additions and 58 deletions

File diff suppressed because one or more lines are too long

View file

@ -5,32 +5,48 @@
package static // import "miniflux.app/ui/static"
import (
"bytes"
"crypto/sha256"
"embed"
"fmt"
"github.com/tdewolff/minify/v2"
"github.com/tdewolff/minify/v2/css"
)
// Static assets.
var (
StylesheetBundleChecksums map[string]string
StylesheetBundles map[string][]byte
)
//go:embed bin/*
var binaryFiles embed.FS
//go:embed css/*.css
var stylesheetFiles embed.FS
var binaryFileChecksums map[string]string
func init() {
// CalculateBinaryFileChecksums generates hash of embed binary files.
func CalculateBinaryFileChecksums() error {
binaryFileChecksums = make(map[string]string)
dirEntries, err := binaryFiles.ReadDir("bin")
if err != nil {
panic(err)
return err
}
for _, dirEntry := range dirEntries {
data, err := LoadBinaryFile(dirEntry.Name())
if err != nil {
panic(err)
return err
}
binaryFileChecksums[dirEntry.Name()] = fmt.Sprintf("%x", sha256.Sum256(data))
}
return nil
}
// LoadBinaryFile loads an embed binary file.
@ -45,3 +61,44 @@ func GetBinaryFileChecksum(filename string) (string, error) {
}
return binaryFileChecksums[filename], nil
}
// GenerateStylesheetsBundles creates CSS bundles.
func GenerateStylesheetsBundles() error {
var bundles = map[string][]string{
"light_serif": {"css/light.css", "css/serif.css", "css/common.css"},
"light_sans_serif": {"css/light.css", "css/sans_serif.css", "css/common.css"},
"dark_serif": {"css/dark.css", "css/serif.css", "css/common.css"},
"dark_sans_serif": {"css/dark.css", "css/sans_serif.css", "css/common.css"},
"system_serif": {"css/system.css", "css/serif.css", "css/common.css"},
"system_sans_serif": {"css/system.css", "css/sans_serif.css", "css/common.css"},
}
StylesheetBundles = make(map[string][]byte)
StylesheetBundleChecksums = make(map[string]string)
minifier := minify.New()
minifier.AddFunc("text/css", css.Minify)
for bundle, srcFiles := range bundles {
var buffer bytes.Buffer
for _, srcFile := range srcFiles {
fileData, err := stylesheetFiles.ReadFile(srcFile)
if err != nil {
return err
}
buffer.Write(fileData)
}
minifiedData, err := minifier.Bytes("text/css", buffer.Bytes())
if err != nil {
return err
}
StylesheetBundles[bundle] = minifiedData
StylesheetBundleChecksums[bundle] = fmt.Sprintf("%x", sha256.Sum256(minifiedData))
}
return nil
}

View file

@ -29,7 +29,7 @@ func (h *handler) showStylesheet(w http.ResponseWriter, r *http.Request) {
return
}
etag, found := static.StylesheetsChecksums[filename]
etag, found := static.StylesheetBundleChecksums[filename]
if !found {
html.NotFound(w, r)
return
@ -37,7 +37,7 @@ func (h *handler) showStylesheet(w http.ResponseWriter, r *http.Request) {
response.New(w, r).WithCaching(etag, 48*time.Hour, func(b *response.Builder) {
b.WithHeader("Content-Type", "text/css; charset=utf-8")
b.WithBody(static.Stylesheets[filename])
b.WithBody(static.StylesheetBundles[filename])
b.Write()
})
}

View file

@ -40,7 +40,7 @@ func New(tpl *template.Engine, r *http.Request, sess *session.Session) *View {
b.params["flashMessage"] = sess.FlashMessage(request.FlashMessage(r))
b.params["flashErrorMessage"] = sess.FlashErrorMessage(request.FlashErrorMessage(r))
b.params["theme"] = theme
b.params["theme_checksum"] = static.StylesheetsChecksums[theme]
b.params["theme_checksum"] = static.StylesheetBundleChecksums[theme]
b.params["app_js_checksum"] = static.JavascriptsChecksums["app"]
b.params["sw_js_checksum"] = static.JavascriptsChecksums["service-worker"]
return b