gitee.com/h79/goutils@v1.22.10/common/template/engine.go (about)

     1  package template
     2  
     3  import (
     4  	"gitee.com/h79/goutils/common/result"
     5  	"io"
     6  	"io/fs"
     7  	"os"
     8  	"text/template"
     9  )
    10  
    11  type Engine struct {
    12  	Delims  Delims
    13  	funcMap template.FuncMap
    14  	tmpl    *template.Template
    15  }
    16  
    17  type Delims struct {
    18  	Left  string
    19  	Right string
    20  }
    21  
    22  func DefEngine() *Engine {
    23  	return NewEngine(Delims{
    24  		Left:  "{{",
    25  		Right: "}}",
    26  	})
    27  }
    28  
    29  func NewEngine(delims Delims) *Engine {
    30  	return &Engine{
    31  		Delims: delims,
    32  		funcMap: template.FuncMap{
    33  			"marshal":     JSONMarshal,
    34  			"timeCurrent": TimeCurrent,
    35  		},
    36  	}
    37  }
    38  
    39  func (cr *Engine) DelFunc(key string) *Engine {
    40  	if _, ok := cr.funcMap[key]; ok {
    41  		delete(cr.funcMap, key)
    42  	}
    43  	return cr
    44  }
    45  
    46  func (cr *Engine) AddFunc(key string, value any) *Engine {
    47  	cr.funcMap[key] = value
    48  	return cr
    49  }
    50  
    51  func (cr *Engine) LoadGlob(pattern string) *Engine {
    52  	tl := template.New("").
    53  		Delims(cr.Delims.Left, cr.Delims.Right).
    54  		Funcs(cr.funcMap)
    55  	cr.tmpl = template.Must(tl.ParseGlob(pattern))
    56  	return cr
    57  }
    58  
    59  func (cr *Engine) LoadFiles(files ...string) *Engine {
    60  	tl := template.New("").
    61  		Delims(cr.Delims.Left, cr.Delims.Right).
    62  		Funcs(cr.funcMap)
    63  	cr.tmpl = template.Must(tl.ParseFiles(files...))
    64  	return cr
    65  }
    66  
    67  func (cr *Engine) LoadString(str string) *Engine {
    68  	tl := template.New("").
    69  		Delims(cr.Delims.Left, cr.Delims.Right).
    70  		Funcs(cr.funcMap)
    71  	cr.tmpl = template.Must(tl.Parse(str))
    72  	return cr
    73  }
    74  
    75  func (cr *Engine) LoadFS(obj fs.FS, patterns ...string) *Engine {
    76  	tl := template.New("").
    77  		Delims(cr.Delims.Left, cr.Delims.Right).
    78  		Funcs(cr.funcMap)
    79  	cr.tmpl = template.Must(tl.ParseFS(obj, patterns...))
    80  	return cr
    81  }
    82  
    83  func (cr *Engine) OUTPUT(name string, d interface{}) (*Data, error) {
    84  
    85  	if cr.tmpl == nil {
    86  		return nil, result.Error(result.ErrNil, "template object is null")
    87  	}
    88  
    89  	w := &Data{}
    90  	if name == "" {
    91  		if err := cr.tmpl.Execute(w, d); err != nil {
    92  			return nil, result.Error(result.ErrException, err.Error())
    93  		}
    94  		return w, nil
    95  	}
    96  	if err := cr.tmpl.ExecuteTemplate(w, name, d); err != nil {
    97  		return nil, result.Error(result.ErrException, err.Error())
    98  	}
    99  	return w, nil
   100  }
   101  
   102  func Replace(filename string, tempConfing any) (io.Reader, error) {
   103  	return replaceTemplate(filename, tempConfing, func(engine *Engine) {})
   104  }
   105  
   106  func ReplaceV2(filename string, tempConfing any, engFn func(engine *Engine)) ([]byte, error) {
   107  	data, err := replaceTemplate(filename, tempConfing, engFn)
   108  	if err != nil {
   109  		return nil, err
   110  	}
   111  	return data.Bytes(), nil
   112  }
   113  
   114  func replaceTemplate(filename string, tempConfing any, engFn func(engine *Engine)) (*Data, error) {
   115  	bys, err := os.ReadFile(filename)
   116  	if err != nil {
   117  		return nil, err
   118  	}
   119  	engine := DefEngine()
   120  	engFn(engine)
   121  	engine.LoadString(string(bys))
   122  	return engine.OUTPUT("", tempConfing)
   123  }