gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

html.go (2527B)


      1 // Copyright 2014 Manu Martinez-Almeida. All rights reserved.
      2 // Use of this source code is governed by a MIT style
      3 // license that can be found in the LICENSE file.
      4 
      5 package render
      6 
      7 import (
      8 	"html/template"
      9 	"net/http"
     10 )
     11 
     12 // Delims represents a set of Left and Right delimiters for HTML template rendering.
     13 type Delims struct {
     14 	// Left delimiter, defaults to {{.
     15 	Left string
     16 	// Right delimiter, defaults to }}.
     17 	Right string
     18 }
     19 
     20 // HTMLRender interface is to be implemented by HTMLProduction and HTMLDebug.
     21 type HTMLRender interface {
     22 	// Instance returns an HTML instance.
     23 	Instance(string, any) Render
     24 }
     25 
     26 // HTMLProduction contains template reference and its delims.
     27 type HTMLProduction struct {
     28 	Template *template.Template
     29 	Delims   Delims
     30 }
     31 
     32 // HTMLDebug contains template delims and pattern and function with file list.
     33 type HTMLDebug struct {
     34 	Files   []string
     35 	Glob    string
     36 	Delims  Delims
     37 	FuncMap template.FuncMap
     38 }
     39 
     40 // HTML contains template reference and its name with given interface object.
     41 type HTML struct {
     42 	Template *template.Template
     43 	Name     string
     44 	Data     any
     45 }
     46 
     47 var htmlContentType = []string{"text/html; charset=utf-8"}
     48 
     49 // Instance (HTMLProduction) returns an HTML instance which it realizes Render interface.
     50 func (r HTMLProduction) Instance(name string, data any) Render {
     51 	return HTML{
     52 		Template: r.Template,
     53 		Name:     name,
     54 		Data:     data,
     55 	}
     56 }
     57 
     58 // Instance (HTMLDebug) returns an HTML instance which it realizes Render interface.
     59 func (r HTMLDebug) Instance(name string, data any) Render {
     60 	return HTML{
     61 		Template: r.loadTemplate(),
     62 		Name:     name,
     63 		Data:     data,
     64 	}
     65 }
     66 func (r HTMLDebug) loadTemplate() *template.Template {
     67 	if r.FuncMap == nil {
     68 		r.FuncMap = template.FuncMap{}
     69 	}
     70 	if len(r.Files) > 0 {
     71 		return template.Must(template.New("").Delims(r.Delims.Left, r.Delims.Right).Funcs(r.FuncMap).ParseFiles(r.Files...))
     72 	}
     73 	if r.Glob != "" {
     74 		return template.Must(template.New("").Delims(r.Delims.Left, r.Delims.Right).Funcs(r.FuncMap).ParseGlob(r.Glob))
     75 	}
     76 	panic("the HTML debug render was created without files or glob pattern")
     77 }
     78 
     79 // Render (HTML) executes template and writes its result with custom ContentType for response.
     80 func (r HTML) Render(w http.ResponseWriter) error {
     81 	r.WriteContentType(w)
     82 
     83 	if r.Name == "" {
     84 		return r.Template.Execute(w, r.Data)
     85 	}
     86 	return r.Template.ExecuteTemplate(w, r.Name, r.Data)
     87 }
     88 
     89 // WriteContentType (HTML) writes HTML ContentType.
     90 func (r HTML) WriteContentType(w http.ResponseWriter) {
     91 	writeContentType(w, htmlContentType)
     92 }