2016-12-06 18:58:31 +01:00
// Copyright 2016 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2016-12-06 18:58:31 +01:00
2021-08-24 11:47:09 -05:00
//go:build bindata
2016-12-06 18:58:31 +01:00
package templates
import (
"html/template"
2021-09-22 13:38:34 +08:00
"io"
2022-08-28 10:43:25 +01:00
"io/fs"
2021-01-05 21:05:40 +08:00
"os"
2016-12-06 18:58:31 +01:00
"path"
2021-01-05 21:05:40 +08:00
"path/filepath"
2016-12-06 18:58:31 +01:00
"strings"
2019-11-07 10:34:28 -03:00
texttmpl "text/template"
2022-01-07 10:33:17 +08:00
"time"
2016-12-06 18:58:31 +01:00
"code.gitea.io/gitea/modules/setting"
2022-01-07 10:33:17 +08:00
"code.gitea.io/gitea/modules/timeutil"
2016-12-06 18:58:31 +01:00
)
var (
2019-11-07 10:34:28 -03:00
subjectTemplates = texttmpl . New ( "" )
bodyTemplates = template . New ( "" )
2016-12-06 18:58:31 +01:00
)
2022-01-10 04:32:37 -05:00
// GlobalModTime provide a global mod time for embedded asset files
2022-01-07 10:33:17 +08:00
func GlobalModTime ( filename string ) time . Time {
return timeutil . GetExecutableModTime ( )
}
2022-10-07 22:02:24 +01:00
// GetAssetFilename returns the filename of the provided asset
func GetAssetFilename ( name string ) ( string , error ) {
filename := filepath . Join ( setting . CustomPath , name )
_ , err := os . Stat ( filename )
if err != nil && ! os . IsNotExist ( err ) {
return name , err
} else if err == nil {
return filename , nil
}
return "(builtin) " + name , nil
}
2021-01-05 21:05:40 +08:00
// GetAsset get a special asset, only for chi
func GetAsset ( name string ) ( [ ] byte , error ) {
2021-09-22 13:38:34 +08:00
bs , err := os . ReadFile ( filepath . Join ( setting . CustomPath , name ) )
2021-01-05 21:05:40 +08:00
if err != nil && ! os . IsNotExist ( err ) {
return nil , err
} else if err == nil {
return bs , nil
}
2022-08-28 10:43:25 +01:00
return BuiltinAsset ( strings . TrimPrefix ( name , "templates/" ) )
2021-01-05 21:05:40 +08:00
}
2022-08-28 10:43:25 +01:00
// GetFiles calls a callback for each template asset
func walkTemplateFiles ( callback func ( path , name string , d fs . DirEntry , err error ) error ) error {
if err := walkAssetDir ( filepath . Join ( setting . CustomPath , "templates" ) , true , callback ) ; err != nil && ! os . IsNotExist ( err ) {
return err
}
return nil
}
// GetTemplateAssetNames only for chi
func GetTemplateAssetNames ( ) [ ] string {
2021-01-05 21:05:40 +08:00
realFS := Assets . ( vfsgen۰ FS )
2022-01-20 18:46:10 +01:00
tmpls := make ( [ ] string , 0 , len ( realFS ) )
2021-01-05 21:05:40 +08:00
for k := range realFS {
2022-08-28 10:43:25 +01:00
if strings . HasPrefix ( k , "/mail/" ) {
continue
}
2021-01-05 21:05:40 +08:00
tmpls = append ( tmpls , "templates/" + k [ 1 : ] )
}
customDir := path . Join ( setting . CustomPath , "templates" )
2022-08-28 10:43:25 +01:00
customTmpls := getDirTemplateAssetNames ( customDir )
2021-01-05 21:05:40 +08:00
return append ( tmpls , customTmpls ... )
}
2022-08-28 10:43:25 +01:00
func walkMailerTemplates ( callback func ( path , name string , d fs . DirEntry , err error ) error ) error {
if err := walkAssetDir ( filepath . Join ( setting . CustomPath , "templates" , "mail" ) , false , callback ) ; err != nil && ! os . IsNotExist ( err ) {
return err
2016-12-06 18:58:31 +01:00
}
2022-08-28 10:43:25 +01:00
return nil
2016-12-06 18:58:31 +01:00
}
2019-06-03 05:43:47 +08:00
2022-08-28 10:43:25 +01:00
// BuiltinAsset reads the provided asset from the builtin embedded assets
func BuiltinAsset ( name string ) ( [ ] byte , error ) {
2019-06-03 05:43:47 +08:00
f , err := Assets . Open ( "/" + name )
if err != nil {
return nil , err
}
defer f . Close ( )
2021-09-22 13:38:34 +08:00
return io . ReadAll ( f )
2019-06-03 05:43:47 +08:00
}
2022-08-28 10:43:25 +01:00
// BuiltinAssetNames returns the names of the built-in embedded assets
func BuiltinAssetNames ( ) [ ] string {
2019-06-03 05:43:47 +08:00
realFS := Assets . ( vfsgen۰ FS )
2022-01-20 18:46:10 +01:00
results := make ( [ ] string , 0 , len ( realFS ) )
2019-06-03 05:43:47 +08:00
for k := range realFS {
results = append ( results , k [ 1 : ] )
}
return results
}
2020-02-01 23:17:44 -03:00
2022-08-28 10:43:25 +01:00
// BuiltinAssetIsDir returns if a provided asset is a directory
func BuiltinAssetIsDir ( name string ) ( bool , error ) {
2020-02-01 23:17:44 -03:00
if f , err := Assets . Open ( "/" + name ) ; err != nil {
return false , err
} else {
defer f . Close ( )
if fi , err := f . Stat ( ) ; err != nil {
return false , err
} else {
return fi . IsDir ( ) , nil
}
}
}