123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- package renderer
- import (
- "encoding/json"
- "errors"
- "fmt"
- "html/template"
- "log"
- "net/http"
- "path"
- "path/filepath"
- "strings"
- "gogs.carducci-dante.gov.it/karmen/config"
- )
- var currRenderer Renderer
- type Renderer interface {
- Render(http.ResponseWriter, string, string, interface{}) error
- }
- type JSONRenderer struct{}
- func NewJSONRenderer() *JSONRenderer {
- return &JSONRenderer{}
- }
- func (r *JSONRenderer) Render(w http.ResponseWriter, layout string, name string, data interface{}) error {
- w.Header().Set("Content-Type", "application/json; charset=utf-8")
- j, err := json.Marshal(data)
- if err != nil {
- return err
- }
- w.Write(j)
- return nil
- }
- type HTMLRenderer struct {
- TemplatePath string
- templates map[string]*template.Template
- }
- func NewHTMLRenderer(templatePath string) (*HTMLRenderer, error) {
- r := &HTMLRenderer{
- TemplatePath: templatePath,
- templates: make(map[string]*template.Template),
- }
- fns, err := filepath.Glob(filepath.Join(templatePath, "*.tpl"))
- if err != nil {
- return nil, err
- }
- lfns, err := filepath.Glob(filepath.Join(templatePath, "layout", "*.tpl"))
- if err != nil {
- return nil, err
- }
- for _, fn := range fns {
- if config.Config.LogLevel > config.LOG_LEVEL_OFF {
- log.Printf("Load %s template", fn)
- }
- tplName := filepath.Base(fn)
- tplName = strings.TrimSuffix(tplName, path.Ext(tplName))
- tplName = strings.TrimSuffix(tplName, path.Ext(tplName))
- files := append(lfns, fn)
- if err != nil {
- return nil, err
- }
- r.templates[tplName] = template.Must(r.templates[tplName].ParseFiles(files...))
- if err != nil {
- return nil, err
- }
- }
- return r, nil
- }
- func Use(r Renderer) {
- currRenderer = r
- }
- func (r *HTMLRenderer) Render(w http.ResponseWriter, layout string, name string, data interface{}) error {
- t, ok := r.templates[name]
- if !ok {
- return fmt.Errorf("Template %s not found", name)
- }
- w.Header().Set("Content-Type", "text/html; charset=utf-8")
- err := t.ExecuteTemplate(w, layout, data)
- if err != nil {
- return err
- }
- return nil
- }
- func Render(w http.ResponseWriter, layout string, name string, data interface{}) error {
- if currRenderer != nil {
- return currRenderer.Render(w, layout, name, data)
- }
- return errors.New("You should set a renderer with Use() first if you want to use Renderer() package function.")
- }
|