code.gitea.io/gitea@v1.19.3/modules/templates/static.go (about) 1 // Copyright 2016 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 //go:build bindata 5 6 package templates 7 8 import ( 9 "html/template" 10 "io" 11 "io/fs" 12 "os" 13 "path" 14 "path/filepath" 15 "strings" 16 texttmpl "text/template" 17 "time" 18 19 "code.gitea.io/gitea/modules/setting" 20 "code.gitea.io/gitea/modules/timeutil" 21 ) 22 23 var ( 24 subjectTemplates = texttmpl.New("") 25 bodyTemplates = template.New("") 26 ) 27 28 // GlobalModTime provide a global mod time for embedded asset files 29 func GlobalModTime(filename string) time.Time { 30 return timeutil.GetExecutableModTime() 31 } 32 33 // GetAssetFilename returns the filename of the provided asset 34 func GetAssetFilename(name string) (string, error) { 35 filename := filepath.Join(setting.CustomPath, name) 36 _, err := os.Stat(filename) 37 if err != nil && !os.IsNotExist(err) { 38 return name, err 39 } else if err == nil { 40 return filename, nil 41 } 42 return "(builtin) " + name, nil 43 } 44 45 // GetAsset get a special asset, only for chi 46 func GetAsset(name string) ([]byte, error) { 47 bs, err := os.ReadFile(filepath.Join(setting.CustomPath, name)) 48 if err != nil && !os.IsNotExist(err) { 49 return nil, err 50 } else if err == nil { 51 return bs, nil 52 } 53 return BuiltinAsset(strings.TrimPrefix(name, "templates/")) 54 } 55 56 // GetFiles calls a callback for each template asset 57 func walkTemplateFiles(callback func(path, name string, d fs.DirEntry, err error) error) error { 58 if err := walkAssetDir(filepath.Join(setting.CustomPath, "templates"), true, callback); err != nil && !os.IsNotExist(err) { 59 return err 60 } 61 return nil 62 } 63 64 // GetTemplateAssetNames only for chi 65 func GetTemplateAssetNames() []string { 66 realFS := Assets.(vfsgen۰FS) 67 tmpls := make([]string, 0, len(realFS)) 68 for k := range realFS { 69 if strings.HasPrefix(k, "/mail/") { 70 continue 71 } 72 tmpls = append(tmpls, "templates/"+k[1:]) 73 } 74 75 customDir := path.Join(setting.CustomPath, "templates") 76 customTmpls := getDirTemplateAssetNames(customDir) 77 return append(tmpls, customTmpls...) 78 } 79 80 func walkMailerTemplates(callback func(path, name string, d fs.DirEntry, err error) error) error { 81 if err := walkAssetDir(filepath.Join(setting.CustomPath, "templates", "mail"), false, callback); err != nil && !os.IsNotExist(err) { 82 return err 83 } 84 return nil 85 } 86 87 // BuiltinAsset reads the provided asset from the builtin embedded assets 88 func BuiltinAsset(name string) ([]byte, error) { 89 f, err := Assets.Open("/" + name) 90 if err != nil { 91 return nil, err 92 } 93 defer f.Close() 94 return io.ReadAll(f) 95 } 96 97 // BuiltinAssetNames returns the names of the built-in embedded assets 98 func BuiltinAssetNames() []string { 99 realFS := Assets.(vfsgen۰FS) 100 results := make([]string, 0, len(realFS)) 101 for k := range realFS { 102 results = append(results, k[1:]) 103 } 104 return results 105 } 106 107 // BuiltinAssetIsDir returns if a provided asset is a directory 108 func BuiltinAssetIsDir(name string) (bool, error) { 109 if f, err := Assets.Open("/" + name); err != nil { 110 return false, err 111 } else { 112 defer f.Close() 113 if fi, err := f.Stat(); err != nil { 114 return false, err 115 } else { 116 return fi.IsDir(), nil 117 } 118 } 119 }