| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| package driver |
|
|
| import ( |
| "embed" |
| "fmt" |
| "html/template" |
| "os" |
| "sync" |
|
|
| "github.com/google/pprof/internal/report" |
| ) |
|
|
| var ( |
| htmlTemplates *template.Template |
| htmlTemplateInit sync.Once |
| ) |
|
|
| |
| |
| func getHTMLTemplates() *template.Template { |
| htmlTemplateInit.Do(func() { |
| htmlTemplates = template.New("templategroup") |
| addTemplates(htmlTemplates) |
| report.AddSourceTemplates(htmlTemplates) |
| }) |
| return htmlTemplates |
| } |
|
|
| |
| var embeddedFiles embed.FS |
|
|
| |
| func addTemplates(templates *template.Template) { |
| |
| loadFile := func(fname string) string { |
| data, err := embeddedFiles.ReadFile(fname) |
| if err != nil { |
| fmt.Fprintf(os.Stderr, "internal/driver: embedded file %q not found\n", |
| fname) |
| os.Exit(1) |
| } |
| return string(data) |
| } |
| loadCSS := func(fname string) string { |
| return `<style type="text/css">` + "\n" + loadFile(fname) + `</style>` + "\n" |
| } |
| loadJS := func(fname string) string { |
| return `<script>` + "\n" + loadFile(fname) + `</script>` + "\n" |
| } |
|
|
| |
| def := func(name, contents string) { |
| sub := template.New(name) |
| template.Must(sub.Parse(contents)) |
| template.Must(templates.AddParseTree(name, sub.Tree)) |
| } |
|
|
| |
| def("css", loadCSS("html/common.css")) |
| def("header", loadFile("html/header.html")) |
| def("graph", loadFile("html/graph.html")) |
| def("graph_css", loadCSS("html/graph.css")) |
| def("script", loadJS("html/common.js")) |
| def("top", loadFile("html/top.html")) |
| def("sourcelisting", loadFile("html/source.html")) |
| def("plaintext", loadFile("html/plaintext.html")) |
| |
| def("stacks", loadFile("html/stacks.html")) |
| def("stacks_css", loadCSS("html/stacks.css")) |
| def("stacks_js", loadJS("html/stacks.js")) |
| } |
|
|