generate.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. // +build ignore
  5. package main
  6. import (
  7. "crypto/sha256"
  8. "encoding/base64"
  9. "fmt"
  10. "io/ioutil"
  11. "os"
  12. "path"
  13. "path/filepath"
  14. "strings"
  15. "text/template"
  16. "time"
  17. "github.com/tdewolff/minify"
  18. "github.com/tdewolff/minify/css"
  19. "github.com/tdewolff/minify/js"
  20. )
  21. const tpl = `// Code generated by go generate; DO NOT EDIT.
  22. // {{ .Timestamp }}
  23. package {{ .Package }}
  24. var {{ .Map }} = map[string]string{
  25. {{ range $constant, $content := .Files }}` + "\t" + `"{{ $constant }}": ` + "`{{ $content }}`" + `,
  26. {{ end }}}
  27. var {{ .Map }}Checksums = map[string]string{
  28. {{ range $constant, $content := .Checksums }}` + "\t" + `"{{ $constant }}": "{{ $content }}",
  29. {{ end }}}
  30. `
  31. var generatedTpl = template.Must(template.New("").Parse(tpl))
  32. type GeneratedFile struct {
  33. Package, Map string
  34. Timestamp time.Time
  35. Files map[string]string
  36. Checksums map[string]string
  37. }
  38. func normalizeBasename(filename string) string {
  39. filename = strings.TrimSuffix(filename, filepath.Ext(filename))
  40. return strings.Replace(filename, " ", "_", -1)
  41. }
  42. func generateFile(serializer, pkg, mapName, pattern, output string) {
  43. generatedFile := &GeneratedFile{
  44. Package: pkg,
  45. Map: mapName,
  46. Timestamp: time.Now(),
  47. Files: make(map[string]string),
  48. Checksums: make(map[string]string),
  49. }
  50. files, _ := filepath.Glob(pattern)
  51. for _, file := range files {
  52. basename := path.Base(file)
  53. content, err := ioutil.ReadFile(file)
  54. if err != nil {
  55. panic(err)
  56. }
  57. switch serializer {
  58. case "css":
  59. m := minify.New()
  60. m.AddFunc("text/css", css.Minify)
  61. content, err = m.Bytes("text/css", content)
  62. if err != nil {
  63. panic(err)
  64. }
  65. basename = normalizeBasename(basename)
  66. generatedFile.Files[basename] = string(content)
  67. case "js":
  68. m := minify.New()
  69. m.AddFunc("text/javascript", js.Minify)
  70. content, err = m.Bytes("text/javascript", content)
  71. if err != nil {
  72. panic(err)
  73. }
  74. basename = normalizeBasename(basename)
  75. generatedFile.Files[basename] = string(content)
  76. case "base64":
  77. encodedContent := base64.StdEncoding.EncodeToString(content)
  78. generatedFile.Files[basename] = encodedContent
  79. default:
  80. basename = normalizeBasename(basename)
  81. generatedFile.Files[basename] = string(content)
  82. }
  83. generatedFile.Checksums[basename] = fmt.Sprintf("%x", sha256.Sum256(content))
  84. }
  85. f, err := os.Create(output)
  86. if err != nil {
  87. panic(err)
  88. }
  89. defer f.Close()
  90. generatedTpl.Execute(f, generatedFile)
  91. }
  92. func main() {
  93. generateFile("none", "sql", "SqlMap", "sql/*.sql", "sql/sql.go")
  94. generateFile("base64", "static", "Binaries", "ui/static/bin/*", "ui/static/bin.go")
  95. generateFile("css", "static", "Stylesheets", "ui/static/css/*.css", "ui/static/css.go")
  96. generateFile("js", "static", "Javascript", "ui/static/js/*.js", "ui/static/js.go")
  97. generateFile("none", "template", "templateViewsMap", "template/html/*.html", "template/views.go")
  98. generateFile("none", "template", "templateCommonMap", "template/html/common/*.html", "template/common.go")
  99. generateFile("none", "locale", "translations", "locale/translations/*.json", "locale/translations.go")
  100. }