| // Copyright 2013 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // +build ignore |
| |
| // Command bake takes a list of file names and writes a Go source file to |
| // standard output that declares a map of string constants containing the input files. |
| // |
| // For example, the command |
| // bake foo.html bar.txt |
| // produces a source file in package main that declares the variable bakedFiles |
| // that is a map with keys "foo.html" and "bar.txt" that contain the contents |
| // of foo.html and bar.txt. |
| package main |
| |
| import ( |
| "bufio" |
| "bytes" |
| "fmt" |
| "io/ioutil" |
| "os" |
| "path/filepath" |
| "unicode/utf8" |
| ) |
| |
| func main() { |
| if err := bake(os.Args[1:]); err != nil { |
| fmt.Fprintln(os.Stderr, err) |
| os.Exit(1) |
| } |
| } |
| |
| func bake(files []string) error { |
| w := bufio.NewWriter(os.Stdout) |
| fmt.Fprintf(w, "%v\n\npackage static\n\n", warning) |
| fmt.Fprintf(w, "var Files = map[string]string{\n") |
| for _, fn := range files { |
| b, err := ioutil.ReadFile(fn) |
| if err != nil { |
| return err |
| } |
| if !utf8.Valid(b) { |
| return fmt.Errorf("file %s is not valid UTF-8", fn) |
| } |
| fmt.Fprintf(w, "\t%q: `%s`,\n", filepath.Base(fn), sanitize(b)) |
| } |
| fmt.Fprintln(w, "}") |
| return w.Flush() |
| } |
| |
| // sanitize prepares a string as a raw string constant. |
| func sanitize(b []byte) []byte { |
| // Replace ` with `+"`"+` |
| b = bytes.Replace(b, []byte("`"), []byte("`+\"`\"+`"), -1) |
| |
| // Replace BOM with `+"\xEF\xBB\xBF"+` |
| // (A BOM is valid UTF-8 but not permitted in Go source files. |
| // I wouldn't bother handling this, but for some insane reason |
| // jquery.js has a BOM somewhere in the middle.) |
| return bytes.Replace(b, []byte("\xEF\xBB\xBF"), []byte("`+\"\\xEF\\xBB\\xBF\"+`"), -1) |
| } |
| |
| const warning = "// DO NOT EDIT ** This file was generated with the bake tool ** DO NOT EDIT //" |