選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

41 行
845B

  1. package views
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "html/template"
  6. "net/http"
  7. )
  8. type Renderer struct {
  9. tpl *template.Template
  10. }
  11. func NewRenderer(pattern string) (*Renderer, error) {
  12. tpl, err := template.New("ui").Funcs(template.FuncMap{
  13. "prettyJSON": prettyJSON,
  14. }).ParseGlob(pattern)
  15. if err != nil {
  16. return nil, err
  17. }
  18. return &Renderer{tpl: tpl}, nil
  19. }
  20. func (r *Renderer) Render(w http.ResponseWriter, name string, data any) {
  21. w.Header().Set("Content-Type", "text/html; charset=utf-8")
  22. if err := r.tpl.ExecuteTemplate(w, name, data); err != nil {
  23. http.Error(w, "template rendering failed", http.StatusInternalServerError)
  24. }
  25. }
  26. func prettyJSON(raw []byte) string {
  27. if len(raw) == 0 {
  28. return ""
  29. }
  30. var out bytes.Buffer
  31. if err := json.Indent(&out, raw, "", " "); err != nil {
  32. return string(raw)
  33. }
  34. return out.String()
  35. }