1
0
mirror of https://github.com/golang/go synced 2024-11-18 16:24:42 -07:00
go/godoc/static/gen.go
Agniva De Sarker ae8027637c godoc/static: add test for static.go file generation
Moved the code which generates static.go to remain in the static package.
This makes the code testable.

Additionally, it is very easy for developers to forget to run "go generate"
to update static.go. Because while development, the templates directory
can be directly passed as a flag to read the files from it.

This test catches that.

Change-Id: I314907b98907bb14e4eabfd3c532ba2d84ce7c5f
Reviewed-on: https://go-review.googlesource.com/110158
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
2018-05-03 19:34:25 +00:00

111 lines
2.8 KiB
Go

// 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, "}")
return format.Source(buf.Bytes())
}
// 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())