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 }