Replaced RunThemeTemplate and GetThemeTemplate with methods on *Theme and refactored their implementations to make them more predictable.
Added the Elapsed1 route timer.
This commit is contained in:
parent
21cf956a26
commit
99012e8961
|
@ -357,7 +357,7 @@ func handleErrorTemplate(w http.ResponseWriter, r *http.Request, pi ErrorPage) {
|
|||
if RunPreRenderHook("pre_render_error", w, r, &pi.Header.CurrentUser, &pi) {
|
||||
return
|
||||
}
|
||||
err := RunThemeTemplate(pi.Header.Theme.Name, "error", pi, w)
|
||||
err := pi.Header.Theme.RunTmpl("error", pi, w)
|
||||
if err != nil {
|
||||
LogError(err)
|
||||
}
|
||||
|
|
|
@ -587,7 +587,7 @@ func InitTemplates() error {
|
|||
|
||||
fmap["dyntmpl"] = func(nameInt interface{}, pageInt interface{}, headerInt interface{}) interface{} {
|
||||
header := headerInt.(*Header)
|
||||
err := RunThemeTemplate(header.Theme.Name, nameInt.(string), pageInt, header.Writer)
|
||||
err := header.Theme.RunTmpl(nameInt.(string), pageInt, header.Writer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -967,7 +967,7 @@ ArgLoop:
|
|||
|
||||
// TODO: Refactor this
|
||||
// TODO: Call the template function directly rather than going through RunThemeTemplate to eliminate a round of indirection?
|
||||
out = "{\nerr := common.RunThemeTemplate(" + headParam + ".Theme.Name," + nameParam + "," + pageParam + ",w)\n"
|
||||
out = "{\nerr := " + headParam + ".Theme.RunTmpl(" + nameParam + "," + pageParam + ",w)\n"
|
||||
out += "if err != nil {\nreturn err\n}\n}\n"
|
||||
literal = true
|
||||
break ArgLoop
|
||||
|
|
|
@ -23,6 +23,7 @@ var Themes ThemeList = make(map[string]*Theme) // ? Refactor this into a store?
|
|||
var DefaultThemeBox atomic.Value
|
||||
var ChangeDefaultThemeMutex sync.Mutex
|
||||
|
||||
// TODO: Fallback to a random theme if this doesn't exist, so admins can remove themes they don't use
|
||||
// TODO: Use this when the default theme doesn't exist
|
||||
var fallbackTheme = "cosora"
|
||||
var overridenTemplates = make(map[string]bool) // ? What is this used for?
|
||||
|
@ -301,14 +302,14 @@ func (w GzipResponseWriter) Write(b []byte) (int, error) {
|
|||
// NEW method of doing theme templates to allow one user to have a different theme to another. Under construction.
|
||||
// TODO: Generate the type switch instead of writing it by hand
|
||||
// TODO: Cut the number of types in half
|
||||
func RunThemeTemplate(theme string, template string, pi interface{}, w io.Writer) error {
|
||||
func (theme *Theme) RunTmpl(template string, pi interface{}, w io.Writer) error {
|
||||
// Unpack this to avoid an indirect call
|
||||
gzw, ok := w.(GzipResponseWriter)
|
||||
if ok {
|
||||
w = gzw.Writer
|
||||
}
|
||||
|
||||
var getTmpl = GetThemeTemplate(theme, template)
|
||||
var getTmpl = theme.GetTmpl(template)
|
||||
switch tmplO := getTmpl.(type) {
|
||||
case *func(CustomPagePage, io.Writer) error:
|
||||
var tmpl = *tmplO
|
||||
|
@ -366,7 +367,7 @@ func RunThemeTemplate(theme string, template string, pi interface{}, w io.Writer
|
|||
case func(Page, io.Writer) error:
|
||||
return tmplO(pi.(Page), w)
|
||||
case nil, string:
|
||||
mapping, ok := Themes[DefaultThemeBox.Load().(string)].TemplatesMap[template]
|
||||
mapping, ok := theme.TemplatesMap[template]
|
||||
if !ok {
|
||||
mapping = template
|
||||
}
|
||||
|
@ -392,10 +393,10 @@ func RunThemeTemplate(theme string, template string, pi interface{}, w io.Writer
|
|||
}
|
||||
|
||||
// GetThemeTemplate attempts to get the template for a specific theme, otherwise it falls back on the default template pointer, which if absent will fallback onto the template interpreter
|
||||
func GetThemeTemplate(theme string, template string) interface{} {
|
||||
func (theme *Theme) GetTmpl(template string) interface{} {
|
||||
// TODO: Figure out why we're getting a nil pointer here when transpiled templates are disabled, I would have assumed that we would just fall back to !ok on this
|
||||
// Might have something to do with it being the theme's TmplPtr map, investigate.
|
||||
tmpl, ok := Themes[theme].TmplPtr[template]
|
||||
tmpl, ok := theme.TmplPtr[template]
|
||||
if ok {
|
||||
return tmpl
|
||||
}
|
||||
|
|
|
@ -186,7 +186,7 @@ func (widget *Widget) Build(hvars interface{}) (string, error) {
|
|||
}
|
||||
|
||||
var header = hvars.(*Header)
|
||||
err := RunThemeTemplate(header.Theme.Name, widget.Body, hvars, header.Writer)
|
||||
err := header.Theme.RunTmpl(widget.Body, hvars, header.Writer)
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
|
|
@ -189,7 +189,7 @@ func RouteGuildList(w http.ResponseWriter, r *http.Request, user common.User) co
|
|||
}
|
||||
|
||||
pi := ListPage{"Guild List", user, header, guildList}
|
||||
err = common.RunThemeTemplate(header.Theme.Name, "guilds_guild_list", pi, w)
|
||||
err = header.Theme.RunTmpl("guilds_guild_list", pi, w)
|
||||
if err != nil {
|
||||
return common.InternalError(err, w, r)
|
||||
}
|
||||
|
|
|
@ -147,7 +147,7 @@ func AccountLoginMFAVerify(w http.ResponseWriter, r *http.Request, user common.U
|
|||
if common.RunPreRenderHook("pre_render_login_mfa_verify", w, r, &user, &pi) {
|
||||
return nil
|
||||
}
|
||||
err = common.RunThemeTemplate(header.Theme.Name, "login_mfa_verify", pi, w)
|
||||
err = header.Theme.RunTmpl("login_mfa_verify", pi, w)
|
||||
if err != nil {
|
||||
return common.InternalError(err, w, r)
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/Azareal/Gosora/common"
|
||||
)
|
||||
|
@ -20,10 +21,13 @@ func ParseSEOURL(urlBit string) (slug string, id int, err error) {
|
|||
}
|
||||
|
||||
func renderTemplate(tmplName string, w http.ResponseWriter, r *http.Request, header *common.Header, pi interface{}) common.RouteError {
|
||||
if header.CurrentUser.IsAdmin {
|
||||
header.Elapsed1 = time.Since(header.StartedAt).String()
|
||||
}
|
||||
if common.RunPreRenderHook("pre_render_"+tmplName, w, r, &header.CurrentUser, pi) {
|
||||
return nil
|
||||
}
|
||||
err := common.RunThemeTemplate(header.Theme.Name, tmplName, pi, w)
|
||||
err := header.Theme.RunTmpl(tmplName, pi, w)
|
||||
if err != nil {
|
||||
return common.InternalError(err, w, r)
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ func IPSearch(w http.ResponseWriter, r *http.Request, user common.User, header *
|
|||
if common.RunPreRenderHook("pre_render_ip_search", w, r, &user, &pi) {
|
||||
return nil
|
||||
}
|
||||
err = common.RunThemeTemplate(header.Theme.Name, "ip_search", pi, w)
|
||||
err = header.Theme.RunTmpl("ip_search", pi, w)
|
||||
if err != nil {
|
||||
return common.InternalError(err, w, r)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue