// Serve starts a web server accepting POST calls and return CSS func Serve(cmd *cobra.Command, paths []string) { _, gba := globalRun(paths) if len(gba.Gen) == 0 { log.Fatal("Must pass an image build directory to use HTTP") } http.Handle("/build/", wt.FileHandler(gba.Gen)) log.Println("Web server started on :12345") var err error lis, err = net.Listen("tcp", ":12345") if err != nil { log.Fatal("Error listening on :12345", err) } http.HandleFunc("/", wt.HTTPHandler(gba, httpPath)) http.Serve(lis, nil) if err != nil { log.Fatal("ListenAndServe: ", err) } log.Println("Server closed") }
func main() { flag.Parse() if showVersion { fmt.Printf("Wellington: %s\n", version) fmt.Printf(" libsass: %s\n", libsass.Version()) os.Exit(0) } start := time.Now() defer func() { diff := float64(time.Since(start).Nanoseconds()) / float64(time.Millisecond) log.Printf("Compilation took: %sms\n", strconv.FormatFloat(diff, 'f', 3, 32)) }() // Profiling code if cpuprofile != "" { f, err := os.Create(cpuprofile) if err != nil { log.Fatal(err) } log.Println("Starting profiler") pprof.StartCPUProfile(f) defer func() { pprof.StopCPUProfile() err := f.Close() if err != nil { log.Fatal(err) } log.Println("Stopping Profiller") }() } for _, v := range flag.Args() { if strings.HasPrefix(v, "-") { log.Fatalf("Please specify flags before other arguments: %s", v) } } if help { fmt.Println("Please specify input filepath.") fmt.Println("\nAvailable options:") flag.PrintDefaults() return } if gen != "" { err := os.MkdirAll(gen, 0755) if err != nil { log.Fatal(err) } } style, ok := libsass.Style[style] if !ok { style = libsass.NESTED_STYLE } gba := wt.NewBuildArgs() gba.Dir = dir gba.BuildDir = buildDir gba.Includes = includes gba.Font = font gba.Style = style gba.Gen = gen gba.Comments = comments pMap := wt.NewPartialMap() // FIXME: Copy pasta with LoadAndBuild ctx := &libsass.Context{ Sprites: gba.Sprites, Imgs: gba.Imgs, OutputStyle: gba.Style, BuildDir: gba.BuildDir, ImageDir: gba.Dir, FontDir: gba.Font, GenImgDir: gba.Gen, Comments: gba.Comments, HTTPPath: httpPath, IncludePaths: []string{gba.Includes}, } ctx.Imports.Init() if ishttp { if len(gba.Gen) == 0 { log.Fatal("Must pass an image build directory to use HTTP") } http.Handle("/build/", wt.FileHandler(gba.Gen)) log.Println("Web server started on :12345") http.HandleFunc("/", wt.HTTPHandler(ctx)) err := http.ListenAndServe(":12345", nil) if err != nil { log.Fatal("ListenAndServe: ", err) } return } if len(flag.Args()) == 0 { // Read from stdin fmt.Println("Reading from stdin, -h for help") out := os.Stdout in := os.Stdin var pout bytes.Buffer _, err := wt.StartParser(ctx, in, &pout, wt.NewPartialMap()) if err != nil { log.Println(err) } err = ctx.Compile(&pout, out) if err != nil { log.Println(err) } return } sassPaths := make([]string, len(flag.Args())) for i, f := range flag.Args() { sassPaths[i] = filepath.Dir(f) err := wt.LoadAndBuild(f, gba, pMap) if err != nil { log.Println(err) os.Exit(1) } } if watch { w := wt.NewWatcher() w.PartialMap = pMap w.Dirs = sassPaths w.BArgs = gba //w.Watch() fmt.Println("File watcher started use `ctrl+d` to exit") in := bufio.NewReader(os.Stdin) for { _, err := in.ReadString(' ') if err != nil { if err == io.EOF { os.Exit(0) } fmt.Println("error", err) } } } }