1// Copyright 2020 The Gitea Authors. All rights reserved.
2// Use of this source code is governed by a MIT-style
3// license that can be found in the LICENSE file.
4
5package templates
6
7import (
8	"os"
9	"strings"
10	"time"
11
12	"code.gitea.io/gitea/modules/log"
13	"code.gitea.io/gitea/modules/setting"
14	"code.gitea.io/gitea/modules/util"
15
16	"github.com/unrolled/render"
17)
18
19// Vars represents variables to be render in golang templates
20type Vars map[string]interface{}
21
22// Merge merges another vars to the current, another Vars will override the current
23func (vars Vars) Merge(another map[string]interface{}) Vars {
24	for k, v := range another {
25		vars[k] = v
26	}
27	return vars
28}
29
30// BaseVars returns all basic vars
31func BaseVars() Vars {
32	var startTime = time.Now()
33	return map[string]interface{}{
34		"IsLandingPageHome":          setting.LandingPageURL == setting.LandingPageHome,
35		"IsLandingPageExplore":       setting.LandingPageURL == setting.LandingPageExplore,
36		"IsLandingPageOrganizations": setting.LandingPageURL == setting.LandingPageOrganizations,
37
38		"ShowRegistrationButton":      setting.Service.ShowRegistrationButton,
39		"ShowMilestonesDashboardPage": setting.Service.ShowMilestonesDashboardPage,
40		"ShowFooterBranding":          setting.ShowFooterBranding,
41		"ShowFooterVersion":           setting.ShowFooterVersion,
42
43		"EnableSwagger":      setting.API.EnableSwagger,
44		"EnableOpenIDSignIn": setting.Service.EnableOpenIDSignIn,
45		"PageStartTime":      startTime,
46	}
47}
48
49func getDirAssetNames(dir string) []string {
50	var tmpls []string
51	f, err := os.Stat(dir)
52	if err != nil {
53		if os.IsNotExist(err) {
54			return tmpls
55		}
56		log.Warn("Unable to check if templates dir %s is a directory. Error: %v", dir, err)
57		return tmpls
58	}
59	if !f.IsDir() {
60		log.Warn("Templates dir %s is a not directory.", dir)
61		return tmpls
62	}
63
64	files, err := util.StatDir(dir)
65	if err != nil {
66		log.Warn("Failed to read %s templates dir. %v", dir, err)
67		return tmpls
68	}
69	for _, filePath := range files {
70		if strings.HasPrefix(filePath, "mail/") {
71			continue
72		}
73
74		if !strings.HasSuffix(filePath, ".tmpl") {
75			continue
76		}
77
78		tmpls = append(tmpls, "templates/"+filePath)
79	}
80	return tmpls
81}
82
83// HTMLRenderer returns a render.
84func HTMLRenderer() *render.Render {
85	return render.New(render.Options{
86		Extensions:                []string{".tmpl"},
87		Directory:                 "templates",
88		Funcs:                     NewFuncMap(),
89		Asset:                     GetAsset,
90		AssetNames:                GetAssetNames,
91		IsDevelopment:             !setting.IsProd,
92		DisableHTTPErrorRendering: true,
93	})
94}
95