prose/style.go
Naman Sood 996f6466cf style: libsass gone rip o7
Signed-off-by: Naman Sood <mail@nsood.in>
2023-07-30 00:58:47 -04:00

99 lines
2.4 KiB
Go

package main
import (
"fmt"
"io"
"log"
"os"
"strings"
"github.com/bep/godartsass/v2"
)
var sassTranspiler *godartsass.Transpiler
func newStylesMap() (map[string]string, error) {
folder, err := os.ReadDir("styles/")
if err != nil {
return nil, fmt.Errorf("could not load styles directory: %s", err)
}
styles := make(map[string]string)
for _, s := range folder {
contents, filename, err := loadStylesheet(s.Name())
if err != nil {
return nil, fmt.Errorf("could not generate styles for %s: %v", s.Name(), err)
}
styles[filename] = contents
log.Printf("Loaded stylesheet %s", filename)
}
return styles, nil
}
func newStylesListener(updateMap func(func(map[string]string))) *listener {
ln := &listener{
folder: "styles/",
update: func(file string) error {
contents, filename, err := loadStylesheet(file)
if err != nil {
return err
}
updateMap(func(styles map[string]string) {
styles[filename] = contents
})
return nil
},
clean: func(file string) error {
updateMap(func(styles map[string]string) {
delete(styles, file+".css")
})
return nil
},
}
return ln
}
func loadStylesheet(filename string) (string, string, error) {
if strings.HasSuffix(filename, ".scss") {
return loadSCSS(filename)
}
return loadCSS(filename)
}
func loadSCSS(filename string) (string, string, error) {
in, err := os.Open("styles/" + filename)
if err != nil {
return "", "", fmt.Errorf("could not open stylesheet %s: %w", filename, err)
}
stylesheet, err := io.ReadAll(in)
if err != nil {
return "", "", fmt.Errorf("could not read stylesheet %s: %w", filename, err)
}
if sassTranspiler == nil {
sassTranspiler, err = godartsass.Start(godartsass.Options{})
if err != nil {
return "", "", fmt.Errorf("could not start sass transpiler: %w", err)
}
}
res, err := sassTranspiler.Execute(godartsass.Args{
Source: string(stylesheet),
})
if err != nil {
return "", "", fmt.Errorf("could not generate stylesheet %s: %w", filename, err)
}
return res.CSS, strings.TrimSuffix(filename, ".scss") + ".css", nil
}
func loadCSS(filename string) (string, string, error) {
in, err := os.Open("styles/" + filename)
if err != nil {
return "", "", fmt.Errorf("could not open style infile %s: %w", filename, err)
}
var buf strings.Builder
_, err = io.Copy(&buf, in)
if err != nil {
return "", "", fmt.Errorf("could not copy stylesheet %s: %s", filename, err)
}
return buf.String(), filename, nil
}