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  }