package main import ( "fmt" "html/template" "io" "mime" "path" "path/filepath" "strings" "git.fuyu.moe/Fuyu/router" "git.fuyu.moe/Tracreed/mal-importer/internal/static" "git.fuyu.moe/Tracreed/mal-importer/internal/templates" ) // Renderer rendders templates type Renderer struct { templates map[string]*template.Template } // NewRenderer loads all templates func NewRenderer() *Renderer { t := &Renderer{} if t.templates == nil { t.templates = make(map[string]*template.Template) } components := template.New(``) pages := []string{} for _, v := range templates.AssetNames() { if strings.HasPrefix(v, `pages/`) { pages = append(pages, v) continue } data, err := templates.Asset(v) if err != nil { panic(err) } template.Must(components.New(v).Parse(string(data))) } for _, page := range pages { data, err := templates.Asset(page) if err != nil { panic(err) } tmpl, _ := components.Clone() name := removeExt(strings.TrimPrefix(page, `pages/`)) t.templates[name] = template.Must(tmpl.New(page).Parse(string(data))) } return t } // Render implements echo's Renderer interface func (t *Renderer) Render(w io.Writer, name string, data interface{}, c *router.Context) error { tmpl, ok := t.templates[name] if !ok { return fmt.Errorf(`template '%s' not found`, name) } templateData := struct { Content interface{} }{data} return tmpl.ExecuteTemplate(w, `base`, templateData) } func removeExt(s string) string { return strings.TrimSuffix(s, path.Ext(s)) } func getStatic(c *router.Context) error { path := path.Clean(strings.TrimPrefix(c.Request.URL.Path, `/static/`)) data, err := static.Asset(path) if err != nil { return c.String(404, `Resource not found`) } c.Response.Header().Set(`Content-Type`, mime.TypeByExtension(filepath.Ext(path))) _, _ = c.Response.Write(data) return nil }