|
|
@@ -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
|
|
|
+}
|