Mercurial > yakumo_izuru > aya
diff vendor/github.com/yosssi/gcss/compile.go @ 66:787b5ee0289d draft
Use vendored modules
Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author | yakumo.izuru |
---|---|
date | Sun, 23 Jul 2023 13:18:53 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/github.com/yosssi/gcss/compile.go Sun Jul 23 13:18:53 2023 +0000 @@ -0,0 +1,130 @@ +package gcss + +import ( + "bytes" + "io" + "io/ioutil" + "path/filepath" + "strings" +) + +// extensions +const ( + extCSS = ".css" + extGCSS = ".gcss" +) + +// cssFilePath converts path's extenstion into a CSS file extension. +var cssFilePath = func(path string) string { + return convertExt(path, extCSS) +} + +// Compile compiles GCSS data which is read from src and +// Writes the result CSS data to the dst. +func Compile(dst io.Writer, src io.Reader) (int, error) { + data, err := ioutil.ReadAll(src) + + if err != nil { + return 0, err + } + + bc, berrc := compileBytes(data) + + bf := new(bytes.Buffer) + +BufWriteLoop: + for { + select { + case b, ok := <-bc: + if !ok { + break BufWriteLoop + } + + bf.Write(b) + case err := <-berrc: + return 0, err + } + } + + return dst.Write(bf.Bytes()) +} + +// CompileFile parses the GCSS file specified by the path parameter, +// generates a CSS file and returns the path of the generated CSS file +// and an error when it occurs. +func CompileFile(path string) (string, error) { + data, err := ioutil.ReadFile(path) + + if err != nil { + return "", err + } + + cssPath := cssFilePath(path) + + bc, berrc := compileBytes(data) + + done, werrc := write(cssPath, bc, berrc) + + select { + case <-done: + case err := <-werrc: + return "", err + } + + return cssPath, nil +} + +// compileBytes parses the GCSS byte array passed as the s parameter, +// generates a CSS byte array and returns the two channels: the first +// one returns the CSS byte array and the last one returns an error +// when it occurs. +func compileBytes(b []byte) (<-chan []byte, <-chan error) { + lines := strings.Split(formatLF(string(b)), lf) + + bc := make(chan []byte, len(lines)) + errc := make(chan error) + + go func() { + ctx := newContext() + + elemc, pErrc := parse(lines) + + for { + select { + case elem, ok := <-elemc: + if !ok { + close(bc) + return + } + + elem.SetContext(ctx) + + switch v := elem.(type) { + case *mixinDeclaration: + ctx.mixins[v.name] = v + case *variable: + ctx.vars[v.name] = v + case *atRule, *declaration, *selector: + bf := new(bytes.Buffer) + elem.WriteTo(bf) + bc <- bf.Bytes() + } + case err := <-pErrc: + errc <- err + return + } + } + }() + + return bc, errc +} + +// Path converts path's extenstion into a GCSS file extension. +func Path(path string) string { + return convertExt(path, extGCSS) +} + +// convertExt converts path's extension into ext. +func convertExt(path string, ext string) string { + return strings.TrimSuffix(path, filepath.Ext(path)) + ext +}