2021-03-11 04:19:37 +00:00
|
|
|
package buildscss
|
|
|
|
|
|
|
|
import (
|
2021-03-14 20:49:58 +00:00
|
|
|
"context"
|
|
|
|
"encoding/base64"
|
2021-03-11 04:19:37 +00:00
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
|
2021-03-14 20:49:58 +00:00
|
|
|
color "git.handmade.network/hmn/hmn/src/ansicolor"
|
2021-03-11 04:19:37 +00:00
|
|
|
"git.handmade.network/hmn/hmn/src/oops"
|
|
|
|
"git.handmade.network/hmn/hmn/src/website"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
"github.com/wellington/go-libsass"
|
|
|
|
)
|
|
|
|
|
|
|
|
var compressed bool
|
|
|
|
|
|
|
|
func init() {
|
2021-03-14 20:49:58 +00:00
|
|
|
libsass.RegisterSassFunc("base64($filename)", func(ctx context.Context, in libsass.SassValue) (*libsass.SassValue, error) {
|
|
|
|
var filename string
|
|
|
|
err := libsass.Unmarshal(in, &filename)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
fileBytes, err := os.ReadFile(filename)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
encoded, _ := libsass.Marshal(base64.StdEncoding.EncodeToString(fileBytes))
|
|
|
|
return &encoded, nil
|
|
|
|
})
|
|
|
|
|
2021-03-11 04:19:37 +00:00
|
|
|
buildCommand := &cobra.Command{
|
|
|
|
Use: "buildscss",
|
|
|
|
Short: "Build the website CSS",
|
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
|
|
style := libsass.NESTED_STYLE
|
|
|
|
if compressed {
|
|
|
|
style = libsass.COMPRESSED_STYLE
|
|
|
|
}
|
|
|
|
|
|
|
|
err := compile("src/rawdata/scss/style.scss", "public/style.css", "light", style)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(color.Bold + color.Red + "Failed to compile main SCSS." + color.Reset)
|
|
|
|
fmt.Println(err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, theme := range []string{"light", "dark"} {
|
|
|
|
err := compile("src/rawdata/scss/theme.scss", fmt.Sprintf("public/themes/%s/theme.css", theme), theme, style)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(color.Bold + color.Red + "Failed to compile theme SCSS." + color.Reset)
|
|
|
|
fmt.Println(err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
}
|
|
|
|
buildCommand.Flags().BoolVar(&compressed, "compressed", false, "Minify the output CSS")
|
|
|
|
|
|
|
|
website.WebsiteCommand.AddCommand(buildCommand)
|
|
|
|
}
|
|
|
|
|
|
|
|
func compile(inpath, outpath string, theme string, style int) error {
|
|
|
|
err := os.MkdirAll(filepath.Dir(outpath), 0755)
|
|
|
|
if err != nil {
|
|
|
|
panic(oops.New(err, "failed to create directory for CSS file"))
|
|
|
|
}
|
|
|
|
|
|
|
|
outfile, err := os.OpenFile(outpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
|
|
|
|
if err != nil {
|
|
|
|
panic(oops.New(err, "failed to open CSS file for writing"))
|
|
|
|
}
|
|
|
|
defer outfile.Close()
|
|
|
|
|
|
|
|
infile, err := os.Open(inpath)
|
|
|
|
if err != nil {
|
|
|
|
panic(oops.New(err, "failed to open SCSS file"))
|
|
|
|
}
|
|
|
|
compiler, err := libsass.New(outfile, infile,
|
|
|
|
libsass.IncludePaths([]string{
|
|
|
|
"src/rawdata/scss",
|
|
|
|
fmt.Sprintf("src/rawdata/scss/themes/%s", theme),
|
|
|
|
}),
|
|
|
|
libsass.OutputStyle(style),
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
panic(oops.New(err, "failed to create SCSS compiler"))
|
|
|
|
}
|
|
|
|
|
|
|
|
return compiler.Run()
|
|
|
|
}
|