aboutsummaryrefslogtreecommitdiff
path: root/internal/ui/static/static.go
diff options
context:
space:
mode:
authorGravatar Frédéric Guillot <f@miniflux.net> 2023-08-10 19:46:45 -0700
committerGravatar Frédéric Guillot <f@miniflux.net> 2023-08-10 20:29:34 -0700
commit168a870c025bfef6efdeb46e166e79a16093c157 (patch)
tree4d8ab69c7e3ef03a7ade06e7b5e5053429a64c3b /internal/ui/static/static.go
parentc2349032552891745cbbc3d2a9e772845a0239f4 (diff)
downloadv2-168a870c025bfef6efdeb46e166e79a16093c157.tar.gz
v2-168a870c025bfef6efdeb46e166e79a16093c157.tar.zst
v2-168a870c025bfef6efdeb46e166e79a16093c157.zip
Move internal packages to an internal folder
For reference: https://go.dev/doc/go1.4#internalpackages
Diffstat (limited to 'internal/ui/static/static.go')
-rw-r--r--internal/ui/static/static.go172
1 files changed, 172 insertions, 0 deletions
diff --git a/internal/ui/static/static.go b/internal/ui/static/static.go
new file mode 100644
index 00000000..5ea2a263
--- /dev/null
+++ b/internal/ui/static/static.go
@@ -0,0 +1,172 @@
+// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
+// SPDX-License-Identifier: Apache-2.0
+
+package static // import "miniflux.app/v2/internal/ui/static"
+
+import (
+ "bytes"
+ "crypto/sha256"
+ "embed"
+ "fmt"
+
+ "github.com/tdewolff/minify/v2"
+ "github.com/tdewolff/minify/v2/css"
+ "github.com/tdewolff/minify/v2/js"
+)
+
+// Static assets.
+var (
+ StylesheetBundleChecksums map[string]string
+ StylesheetBundles map[string][]byte
+ JavascriptBundleChecksums map[string]string
+ JavascriptBundles map[string][]byte
+)
+
+//go:embed bin/*
+var binaryFiles embed.FS
+
+//go:embed css/*.css
+var stylesheetFiles embed.FS
+
+//go:embed js/*.js
+var javascriptFiles embed.FS
+
+var binaryFileChecksums map[string]string
+
+// CalculateBinaryFileChecksums generates hash of embed binary files.
+func CalculateBinaryFileChecksums() error {
+ binaryFileChecksums = make(map[string]string)
+
+ dirEntries, err := binaryFiles.ReadDir("bin")
+ if err != nil {
+ return err
+ }
+
+ for _, dirEntry := range dirEntries {
+ data, err := LoadBinaryFile(dirEntry.Name())
+ if err != nil {
+ return err
+ }
+
+ binaryFileChecksums[dirEntry.Name()] = fmt.Sprintf("%x", sha256.Sum256(data))
+ }
+
+ return nil
+}
+
+// LoadBinaryFile loads an embed binary file.
+func LoadBinaryFile(filename string) ([]byte, error) {
+ return binaryFiles.ReadFile(fmt.Sprintf(`bin/%s`, filename))
+}
+
+// GetBinaryFileChecksum returns a binary file checksum.
+func GetBinaryFileChecksum(filename string) (string, error) {
+ if _, found := binaryFileChecksums[filename]; !found {
+ return "", fmt.Errorf(`static: unable to find checksum for %q`, filename)
+ }
+ 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
+}
+
+// GenerateJavascriptBundles creates JS bundles.
+func GenerateJavascriptBundles() error {
+ var bundles = map[string][]string{
+ "app": {
+ "js/dom_helper.js",
+ "js/touch_handler.js",
+ "js/keyboard_handler.js",
+ "js/request_builder.js",
+ "js/modal_handler.js",
+ "js/app.js",
+ "js/bootstrap.js",
+ },
+ "service-worker": {
+ "js/service_worker.js",
+ },
+ }
+
+ var prefixes = map[string]string{
+ "app": "(function(){'use strict';",
+ }
+
+ var suffixes = map[string]string{
+ "app": "})();",
+ }
+
+ JavascriptBundles = make(map[string][]byte)
+ JavascriptBundleChecksums = make(map[string]string)
+
+ minifier := minify.New()
+ minifier.AddFunc("text/javascript", js.Minify)
+
+ for bundle, srcFiles := range bundles {
+ var buffer bytes.Buffer
+
+ if prefix, found := prefixes[bundle]; found {
+ buffer.WriteString(prefix)
+ }
+
+ for _, srcFile := range srcFiles {
+ fileData, err := javascriptFiles.ReadFile(srcFile)
+ if err != nil {
+ return err
+ }
+
+ buffer.Write(fileData)
+ }
+
+ if suffix, found := suffixes[bundle]; found {
+ buffer.WriteString(suffix)
+ }
+
+ minifiedData, err := minifier.Bytes("text/javascript", buffer.Bytes())
+ if err != nil {
+ return err
+ }
+
+ JavascriptBundles[bundle] = minifiedData
+ JavascriptBundleChecksums[bundle] = fmt.Sprintf("%x", sha256.Sum256(minifiedData))
+ }
+
+ return nil
+}