package main import ( "fmt" "io" "net/url" "strings" "github.com/CloudyKit/jet" "github.com/labstack/echo" "github.com/quiq/docker-registry-ui/registry" "github.com/tidwall/gjson" ) // Template Jet template. type Template struct { View *jet.Set } // Render render template. func (r *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error { t, err := r.View.GetTemplate(name) if err != nil { panic(fmt.Errorf("Fatal error template file: %s", err)) } vars, ok := data.(jet.VarMap) if !ok { vars = jet.VarMap{} } err = t.Execute(w, vars, nil) if err != nil { panic(fmt.Errorf("Error rendering template %s: %s", name, err)) } return nil } // setupRenderer template engine init. func setupRenderer(debug bool, registryHost, basePath string) *Template { view := jet.NewHTMLSet("templates") view.SetDevelopmentMode(debug) view.AddGlobal("version", version) view.AddGlobal("basePath", basePath) view.AddGlobal("registryHost", registryHost) view.AddGlobal("pretty_size", func(size interface{}) string { var value float64 switch i := size.(type) { case gjson.Result: value = float64(i.Int()) case int64: value = float64(i) } return registry.PrettySize(value) }) view.AddGlobal("pretty_time", func(datetime interface{}) string { d := strings.Replace(datetime.(string), "T", " ", 1) d = strings.Replace(d, "Z", "", 1) return strings.Split(d, ".")[0] }) view.AddGlobal("parse_map", func(m interface{}) string { var res string for _, k := range registry.SortedMapKeys(m) { res = res + fmt.Sprintf(`