// Copyright 2014 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. package static //go:generate go run makestatic.go import ( "bytes" "fmt" "go/format" "io/ioutil" "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", } // Generate reads a set of files and returns a file buffer that declares // a map of string constants containing contents of the input files. func Generate() ([]byte, error) { 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 b, err } fmt.Fprintf(buf, "\t%q: ", fn) if utf8.Valid(b) { fmt.Fprintf(buf, "`%s`", sanitize(b)) } else { fmt.Fprintf(buf, "%q", b) } fmt.Fprintf(buf, ",\n\n") } fmt.Fprintln(buf, "}") b := buf.Bytes() // The ιΏ₯ U+9FE5 character became printable in go 1.10, // causing it to appear literally in newer output. // Force the old behavior. b = bytes.Replace(b, []byte("\u9fe5"), []byte(`\u9fe5`), -1) return format.Source(b) } // 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())