2016-12-06 20:58:31 +03:00
// Copyright 2016 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2021-08-24 19:47:09 +03:00
//go:build bindata
// +build bindata
2016-12-06 20:58:31 +03:00
package templates
import (
"html/template"
2021-09-22 08:38:34 +03:00
"io"
2021-01-05 16:05:40 +03:00
"os"
2016-12-06 20:58:31 +03:00
"path"
2021-01-05 16:05:40 +03:00
"path/filepath"
2016-12-06 20:58:31 +03:00
"strings"
2019-11-07 16:34:28 +03:00
texttmpl "text/template"
2016-12-06 20:58:31 +03:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
2020-11-28 05:42:08 +03:00
"code.gitea.io/gitea/modules/util"
2016-12-06 20:58:31 +03:00
)
var (
2019-11-07 16:34:28 +03:00
subjectTemplates = texttmpl . New ( "" )
bodyTemplates = template . New ( "" )
2016-12-06 20:58:31 +03:00
)
2021-01-05 16:05:40 +03:00
// GetAsset get a special asset, only for chi
func GetAsset ( name string ) ( [ ] byte , error ) {
2021-09-22 08:38:34 +03:00
bs , err := os . ReadFile ( filepath . Join ( setting . CustomPath , name ) )
2021-01-05 16:05:40 +03:00
if err != nil && ! os . IsNotExist ( err ) {
return nil , err
} else if err == nil {
return bs , nil
}
return Asset ( strings . TrimPrefix ( name , "templates/" ) )
}
// GetAssetNames only for chi
func GetAssetNames ( ) [ ] string {
realFS := Assets . ( vfsgen۰ FS )
var tmpls = make ( [ ] string , 0 , len ( realFS ) )
for k := range realFS {
tmpls = append ( tmpls , "templates/" + k [ 1 : ] )
}
customDir := path . Join ( setting . CustomPath , "templates" )
customTmpls := getDirAssetNames ( customDir )
return append ( tmpls , customTmpls ... )
}
2016-12-06 20:58:31 +03:00
// Mailer provides the templates required for sending notification mails.
2019-11-07 16:34:28 +03:00
func Mailer ( ) ( * texttmpl . Template , * template . Template ) {
for _ , funcs := range NewTextFuncMap ( ) {
subjectTemplates . Funcs ( funcs )
}
2016-12-06 20:58:31 +03:00
for _ , funcs := range NewFuncMap ( ) {
2019-11-07 16:34:28 +03:00
bodyTemplates . Funcs ( funcs )
2016-12-06 20:58:31 +03:00
}
for _ , assetPath := range AssetNames ( ) {
if ! strings . HasPrefix ( assetPath , "mail/" ) {
continue
}
if ! strings . HasSuffix ( assetPath , ".tmpl" ) {
continue
}
content , err := Asset ( assetPath )
if err != nil {
log . Warn ( "Failed to read embedded %s template. %v" , assetPath , err )
continue
}
2019-11-07 16:34:28 +03:00
buildSubjectBodyTemplate ( subjectTemplates ,
bodyTemplates ,
2016-12-06 20:58:31 +03:00
strings . TrimPrefix (
strings . TrimSuffix (
assetPath ,
".tmpl" ,
) ,
"mail/" ,
) ,
2019-11-07 16:34:28 +03:00
content )
2016-12-06 20:58:31 +03:00
}
customDir := path . Join ( setting . CustomPath , "templates" , "mail" )
2020-11-28 05:42:08 +03:00
isDir , err := util . IsDir ( customDir )
if err != nil {
log . Warn ( "Failed to check if custom directory %s is a directory. %v" , err )
}
if isDir {
2020-12-22 02:40:57 +03:00
files , err := util . StatDir ( customDir )
2016-12-06 20:58:31 +03:00
if err != nil {
log . Warn ( "Failed to read %s templates dir. %v" , customDir , err )
} else {
for _ , filePath := range files {
if ! strings . HasSuffix ( filePath , ".tmpl" ) {
continue
}
2021-09-22 08:38:34 +03:00
content , err := os . ReadFile ( path . Join ( customDir , filePath ) )
2016-12-06 20:58:31 +03:00
if err != nil {
log . Warn ( "Failed to read custom %s template. %v" , filePath , err )
continue
}
2019-11-07 16:34:28 +03:00
buildSubjectBodyTemplate ( subjectTemplates ,
bodyTemplates ,
2016-12-06 20:58:31 +03:00
strings . TrimSuffix (
filePath ,
".tmpl" ,
) ,
2019-11-07 16:34:28 +03:00
content )
2016-12-06 20:58:31 +03:00
}
}
}
2019-11-07 16:34:28 +03:00
return subjectTemplates , bodyTemplates
2016-12-06 20:58:31 +03:00
}
2019-06-03 00:43:47 +03:00
func Asset ( name string ) ( [ ] byte , error ) {
f , err := Assets . Open ( "/" + name )
if err != nil {
return nil , err
}
defer f . Close ( )
2021-09-22 08:38:34 +03:00
return io . ReadAll ( f )
2019-06-03 00:43:47 +03:00
}
func AssetNames ( ) [ ] string {
realFS := Assets . ( vfsgen۰ FS )
var results = make ( [ ] string , 0 , len ( realFS ) )
for k := range realFS {
results = append ( results , k [ 1 : ] )
}
return results
}
2020-02-02 05:17:44 +03:00
func AssetIsDir ( name string ) ( bool , error ) {
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
}
}
}