1
0
mirror of https://github.com/danog/gojekyll.git synced 2024-12-02 13:27:46 +01:00
gojekyll/pipelines/sass.go
2017-07-09 16:17:20 -04:00

70 lines
1.6 KiB
Go

package pipelines
import (
"bytes"
"io"
"io/ioutil"
"log"
"os"
"path/filepath"
"strings"
"github.com/dchest/cssmin"
"github.com/osteele/gojekyll/utils"
libsass "github.com/wellington/go-libsass"
)
// CopySassFileIncludes copies sass partials into a temporary directory,
// removing initial underscores.
// TODO delete the temp directory when done
func (p *Pipeline) CopySassFileIncludes() error {
// TODO use libsass.ImportsOption instead?
if p.sassTempDir == "" {
dir, err := ioutil.TempDir(os.TempDir(), "_sass")
if err != nil {
return err
}
p.sassTempDir = dir
}
src := filepath.Join(p.SourceDir(), "_sass")
dst := p.sassTempDir
err := filepath.Walk(src, func(from string, info os.FileInfo, err error) error {
if err != nil || info.IsDir() {
return err
}
rel := utils.MustRel(src, from)
to := filepath.Join(dst, strings.TrimPrefix(rel, "_"))
return utils.CopyFileContents(to, from, 0644)
})
if os.IsNotExist(err) {
return nil
}
return err
}
// SassIncludePaths returns an array of sass include directories.
func (p *Pipeline) SassIncludePaths() []string {
return []string{p.sassTempDir}
}
// WriteSass converts a SASS file and writes it to w.
func (p *Pipeline) WriteSass(w io.Writer, b []byte) (err error) {
buf := new(bytes.Buffer)
comp, err := libsass.New(buf, bytes.NewBuffer(b))
if err != nil {
return err
}
err = comp.Option(libsass.IncludePaths(p.SassIncludePaths()))
if err != nil {
log.Fatal(err)
}
if err = comp.Run(); err != nil {
return err
}
b = cssmin.Minify(buf.Bytes())
_, err = w.Write(b)
return err
}