2020-04-29 17:44:29 -07:00
|
|
|
package gcutil
|
|
|
|
|
|
|
|
import (
|
|
|
|
"html/template"
|
|
|
|
"io"
|
|
|
|
|
|
|
|
"github.com/gochan-org/gochan/pkg/config"
|
|
|
|
"github.com/tdewolff/minify"
|
|
|
|
minifyHTML "github.com/tdewolff/minify/html"
|
|
|
|
minifyJS "github.com/tdewolff/minify/js"
|
|
|
|
minifyJSON "github.com/tdewolff/minify/json"
|
|
|
|
)
|
|
|
|
|
|
|
|
var minifier *minify.M
|
|
|
|
|
|
|
|
// InitMinifier sets up the HTML/JS/JSON minifier if enabled in gochan.json
|
|
|
|
func InitMinifier() {
|
|
|
|
if !config.Config.MinifyHTML && !config.Config.MinifyJS {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
minifier = minify.New()
|
|
|
|
if config.Config.MinifyHTML {
|
|
|
|
minifier.AddFunc("text/html", minifyHTML.Minify)
|
|
|
|
}
|
|
|
|
if config.Config.MinifyJS {
|
|
|
|
minifier.AddFunc("text/javascript", minifyJS.Minify)
|
|
|
|
minifier.AddFunc("application/json", minifyJSON.Minify)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func canMinify(mediaType string) bool {
|
|
|
|
if mediaType == "text/html" && config.Config.MinifyHTML {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
if (mediaType == "application/json" || mediaType == "text/javascript") && config.Config.MinifyJS {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
// MinifyTemplate minifies the given template/data (if enabled) and returns any errors
|
2020-06-06 09:28:45 -07:00
|
|
|
func MinifyTemplate(tmpl *template.Template, data interface{}, writer io.Writer, mediaType string) error {
|
2020-04-29 17:44:29 -07:00
|
|
|
if !canMinify(mediaType) {
|
2020-06-06 09:28:45 -07:00
|
|
|
return tmpl.Execute(writer, data)
|
2020-04-29 17:44:29 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
minWriter := minifier.Writer(mediaType, writer)
|
|
|
|
defer minWriter.Close()
|
2020-06-06 09:28:45 -07:00
|
|
|
return tmpl.Execute(minWriter, data)
|
2020-04-29 17:44:29 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// MinifyWriter minifies the given writer/data (if enabled) and returns the number of bytes written and any errors
|
2020-06-06 09:28:45 -07:00
|
|
|
func MinifyWriter(writer io.Writer, data []byte, mediaType string) (int, error) {
|
2020-04-29 17:44:29 -07:00
|
|
|
if !canMinify(mediaType) {
|
2020-05-28 12:49:41 -07:00
|
|
|
n, err := writer.Write(data)
|
2020-06-06 09:28:45 -07:00
|
|
|
return n, err
|
2020-04-29 17:44:29 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
minWriter := minifier.Writer(mediaType, writer)
|
|
|
|
defer minWriter.Close()
|
2020-05-28 12:49:41 -07:00
|
|
|
n, err := minWriter.Write(data)
|
2020-06-06 09:28:45 -07:00
|
|
|
return n, err
|
2020-04-29 17:44:29 -07:00
|
|
|
}
|