// Init validates options in the struct and returns a Sass Options. func (ctx *compctx) Init(goopts libs.SassOptions) libs.SassOptions { if ctx.Precision == 0 { ctx.Precision = 5 } ctx.options = goopts ctx.Headers.Bind(goopts) ctx.Imports.Bind(goopts) ctx.Funcs.Bind(goopts) libs.SassOptionSetSourceComments(goopts, ctx.compiler.LineComments()) libs.SetIncludePaths(goopts, ctx.IncludePaths) libs.SassOptionSetPrecision(goopts, ctx.Precision) libs.SassOptionSetOutputStyle(goopts, ctx.OutputStyle) libs.SassOptionSetSourceComments(goopts, ctx.Comments) return goopts }
// Compile reads in and writes the libsass compiled result to out. // Options and custom functions are applied as specified in Context. func (ctx *compctx) Compile(in io.Reader, out io.Writer) error { defer ctx.Reset() bs, err := ioutil.ReadAll(in) if err != nil { return err } if len(bs) == 0 { return errors.New("No input provided") } godc := libs.SassMakeDataContext(string(bs)) goopts := libs.SassDataContextGetOptions(godc) libs.SassOptionSetSourceComments(goopts, true) ctx.Init(goopts) libs.SassDataContextSetOptions(godc, goopts) goctx := libs.SassDataContextGetContext(godc) ctx.context = goctx gocompiler := libs.SassMakeDataCompiler(godc) libs.SassCompilerParse(gocompiler) libs.SassCompilerExecute(gocompiler) if ctx.includeMap { libs.SassOptionSetSourceMapEmbed(goopts, true) } defer libs.SassDeleteCompiler(gocompiler) goout := libs.SassContextGetOutputString(goctx) io.WriteString(out, goout) ctx.Status = libs.SassContextGetErrorStatus(goctx) errJSON := libs.SassContextGetErrorJSON(goctx) err = ctx.ProcessSassError([]byte(errJSON)) if err != nil { return err } if ctx.Error() != "" { lines := bytes.Split(bs, []byte("\n")) var out string for i := -7; i < 7; i++ { if i+ctx.err.Line >= 0 && i+ctx.err.Line < len(lines) { out += fmt.Sprintf("%s\n", string(lines[i+ctx.err.Line])) } } // TODO: this is weird, make something more idiomatic return errors.New(ctx.Error() + "\n" + out) } return nil }