// 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 makestatic reads a set of files and writes a Go source file to "static.go" // that declares a map of string constants containing contents of the input files. // It is intended to be invoked via "go generate" (directive in "gen.go"). package main import ( "bytes" "fmt" "go/format" "io/ioutil" "os" "time" "unicode/utf8" ) var files = []string{ "analysis/call3.png", "analysis/call-eg.png", "analysis/callers1.png", "analysis/callers2.png", "analysis/chan1.png", "analysis/chan2a.png", "analysis/chan2b.png", "analysis/error1.png", "analysis/help.html", "analysis/ident-def.png", "analysis/ident-field.png", "analysis/ident-func.png", "analysis/ipcg-func.png", "analysis/ipcg-pkg.png", "analysis/typeinfo-pkg.png", "analysis/typeinfo-src.png", "callgraph.html", "codewalk.html", "codewalkdir.html", "dirlist.html", "error.html", "example.html", "godoc.html", "godocs.js", "images/minus.gif", "images/plus.gif", "images/treeview-black-line.gif", "images/treeview-black.gif", "images/treeview-default-line.gif", "images/treeview-default.gif", "images/treeview-gray-line.gif", "images/treeview-gray.gif", "implements.html", "jquery.js", "jquery.treeview.css", "jquery.treeview.edit.js", "jquery.treeview.js", "methodset.html", "opensearch.xml", "package.html", "packageroot.html", "package.txt", "play.js", "playground.js", "search.html", "search.txt", "searchcode.html", "searchdoc.html", "searchtxt.html", "style.css", } func main() { if err := makestatic(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } } func makestatic() error { f, err := os.Create("static.go") if err != nil { return err } defer f.Close() buf := new(bytes.Buffer) fmt.Fprintf(buf, "%v\n\n%v\n\npackage static\n\n", license, warning) fmt.Fprintf(buf, "var Files = map[string]string{\n") for _, fn := range files { b, err := ioutil.ReadFile(fn) if err != nil { return err } fmt.Fprintf(buf, "\t%q: ", fn) if utf8.Valid(b) { fmt.Fprintf(buf, "`%s`", sanitize(b)) } else { fmt.Fprintf(buf, "%q", b) } fmt.Fprintln(buf, ",\n") } fmt.Fprintln(buf, "}") fmtbuf, err := format.Source(buf.Bytes()) if err != nil { return err } return ioutil.WriteFile("static.go", fmtbuf, 0666) } // sanitize prepares a valid UTF-8 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 = `// Code generated by "makestatic"; DO NOT EDIT.` var license = fmt.Sprintf(`// Copyright %d 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.`, time.Now().UTC().Year())