Compare commits

..

No commits in common. "8a2319033eb29e4931a72910e41116c0d850b155" and "b9c0bd863b48f790a51d5764b3e91e66f9f00378" have entirely different histories.

5 changed files with 80 additions and 149 deletions

View file

@ -2,8 +2,10 @@ package handlers
import ( import (
"net/http" "net/http"
"time"
"git.burning.moe/celediel/burning.moe/internal/config" "git.burning.moe/celediel/burning.moe/internal/config"
"git.burning.moe/celediel/burning.moe/internal/models"
"git.burning.moe/celediel/burning.moe/internal/render" "git.burning.moe/celediel/burning.moe/internal/render"
) )
@ -34,11 +36,33 @@ func Initialise(a *config.AppConfig) {
app = a app = a
} }
// makeBasicHandler returns a simple handler that renders a template from `name`.page.tmpl // makeBasicTemplateData creates a blank TemplateData containing only the
// time the related template was generated
func makeBasicTemplateData(name string) models.TemplateData {
var strMap map[string]string
if cacheItem, ok := app.TemplateCache.Cache[name]; ok {
strMap = map[string]string{
"GeneratedAt": cacheItem.GeneratedAt.Format(time.UnixDate),
}
} else {
strMap = map[string]string{
"GeneratedAt": time.Now().Format(time.UnixDate),
}
}
templateData := models.TemplateData{
StringMap: strMap,
}
return templateData
}
// makeBasicHandler creates a basic handler that builds from a .page.tmpl
// file, and sends only the time the template was generated as TemplateData
func makeBasicHandler(name string) func(w http.ResponseWriter, r *http.Request) { func makeBasicHandler(name string) func(w http.ResponseWriter, r *http.Request) {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
app.Logger.Infof("Got request for %s page", name) app.Logger.Infof("Got request for %s page", name)
pageName := name + ".page.tmpl" pageName := name + ".page.tmpl"
render.RenderTemplate(w, pageName) templateData := makeBasicTemplateData(pageName)
render.RenderTemplate(w, pageName, &templateData)
} }
} }

View file

@ -1,63 +1,14 @@
package models package models
import (
"encoding/json"
"html/template"
"os"
"strings"
"time"
)
const dataDir string = "./templates/data/"
type Link struct {
Href template.URL
Text string
Icon template.URL
}
// TemplateData holds data sent from handlers to templates. // TemplateData holds data sent from handlers to templates.
type TemplateData struct { type TemplateData struct {
StringMap map[string]string `json:"stringMap"` StringMap map[string]string
IntMap map[string]int `json:"intMap"` IntMap map[string]int
FloatMap map[string]float32 `json:"floatMap"` FloatMap map[string]float32
LinkMap map[string][]Link `json:"linkMap"` Data map[string]interface{}
Data map[string]interface{} `json:"data"` CSRFToken string
CSRFToken string `json:"csrftoken"` Flash string
Flash string `json:"flash"` Warning string
Warning string `json:"warning"` Error string
Error string `json:"error"`
} }
// makeBasicTemplateData creates a blank TemplateData containing only the
// time the related template was generated
func MakeBasicTemplateData(when time.Time) TemplateData {
strMap := map[string]string{
"GeneratedAt": when.Format(time.UnixDate),
}
templateData := TemplateData{
StringMap: strMap,
}
return templateData
}
// LoadTemplateData loads template data from file. If that
// fails, it returns an empty TemplateData and an error
func LoadTemplateData(page string) (TemplateData, error) {
// TODO: load from something other than JSON
var data *TemplateData
output := dataDir + strings.ReplaceAll(page, "tmpl", "json")
file, err := os.ReadFile(output)
if err != nil {
return TemplateData{}, err
}
err = json.Unmarshal(file, &data)
if err != nil {
return TemplateData{}, err
}
return *data, nil
}

View file

@ -24,9 +24,7 @@ var app *config.AppConfig
func Initialise(a *config.AppConfig) { func Initialise(a *config.AppConfig) {
var err error var err error
app = a app = a
if app.UseCache { app.TemplateCache, err = GenerateNewTemplateCache()
app.TemplateCache, err = GenerateNewTemplateCache()
}
if err != nil { if err != nil {
app.Logger.Fatal("Error generating template cache, bailing out!") app.Logger.Fatal("Error generating template cache, bailing out!")
} }
@ -73,7 +71,7 @@ func GenerateNewTemplateCache() (models.TemplateCache, error) {
Template: templateSet, Template: templateSet,
GeneratedAt: generatedAt, GeneratedAt: generatedAt,
} }
app.Logger.Debugf("Generated %s at %v", name, generatedAt.Format(time.UnixDate)) app.Logger.Debugf("Generated %s at %v", name, generatedAt.String())
} }
// All was good, so return the cache, and no error // All was good, so return the cache, and no error
@ -81,44 +79,29 @@ func GenerateNewTemplateCache() (models.TemplateCache, error) {
} }
// RenderTemplate renders requested template (t), pulling from cache. // RenderTemplate renders requested template (t), pulling from cache.
func RenderTemplate(w http.ResponseWriter, filename string) { func RenderTemplate(w http.ResponseWriter, filename string, data *models.TemplateData) {
if !app.UseCache { var cache models.TemplateCache
c, err := GenerateNewTemplateCache() if app.UseCache {
cache = app.TemplateCache
} else {
var err error
cache, err = GenerateNewTemplateCache()
if err != nil { if err != nil {
app.Logger.Fatal("Error generating template cache, bailing out!") app.Logger.Fatal("Error generating template cache, bailing out!")
} }
app.TemplateCache = c app.TemplateCache = cache
} }
// Get templates from cache // Get templates from cache
template, ok := app.TemplateCache.Cache[filename] template, ok := cache.Cache[filename]
if !ok { if !ok {
app.Logger.Errorf("Couldn't get %s from template cache, dunno what happened, but we're gonna generate a new one", filename) app.Logger.Fatal(fmt.Sprintf("Couldn't get %s from template cache, bailing out!", filename))
c, err := GenerateNewTemplateCache()
if err != nil {
app.Logger.Fatal("Error generating template cache, bailing out!")
}
app.TemplateCache = c
template = app.TemplateCache.Cache[filename]
} }
// Get template data from file, or generate simple
data, err := models.LoadTemplateData(filename)
if err == nil {
app.Logger.Debug(fmt.Sprintf("Loaded data for template %s.", filename), "data", data)
if _, ok := data.StringMap["GeneratedAt"]; !ok {
data.StringMap["GeneratedAt"] = app.TemplateCache.Cache[filename].GeneratedAt.Format(time.UnixDate)
}
} else {
app.Logger.Info(fmt.Sprintf("Loading template data for %s failed, using default template data.", filename), "err", err)
data = models.MakeBasicTemplateData(template.GeneratedAt)
}
l := data.LinkMap["Personal"]
app.Logger.Debugf("%[1]v is %[1]T", l)
// Execute templates in a new buffer // Execute templates in a new buffer
buf := new(bytes.Buffer) buf := new(bytes.Buffer)
err = template.Template.Execute(buf, data) err := template.Template.Execute(buf, data)
if err != nil { if err != nil {
app.Logger.Fatal(fmt.Sprintf("Error executing template %s! Goodbye!", filename), "err", err) app.Logger.Fatal(fmt.Sprintf("Error executing template %s! Goodbye!", filename), "err", err)
} }

View file

@ -4,27 +4,46 @@
<span id="words"> <span id="words">
<h4>celediel</h4> <h4>celediel</h4>
<span id="bigwords"> <span id="bigwords">
{{ index .StringMap "about" }} she/her, 1989, queer anarchist, self-taught aspiring developer
</span> </span>
<h4>links</h4>
<!-- personal links --> <!-- personal links -->
<h4>links</h4> <a href="https://matrix.to/#/@celediel:burning.moe">
{{ range (index .LinkMap "Personal") }} <span class="iconify" data-icon="tabler:brand-matrix"></span>
<a href="{{ .Href }}"> matrix
<span class="iconify" data-icon="{{ .Icon }}"></span> </a><br />
{{ .Text }}
<a href="https://slrpnk.net/u/Celediel">
<span class="iconify" data-icon="simple-icons:lemmy"></span>
lemmy
</a><br />
<a href="https://git.burning.moe/celediel">
<span class="iconify" data-icon="mdi:git"></span>
self-hosted git
</a><br />
<a href="https://github.com/celediel">
<span class="iconify" data-icon="bi:github"></span>
github
</a><br /> </a><br />
{{ end }}
<!-- web app links --> <!-- web app links -->
<h4>hosted apps</h4> <h4>hosted apps</h4>
{{ range (index .LinkMap "HostedApps") }} <a href="https://git.burning.moe/">
<a href="{{ .Href }}"> <span class="iconify" data-icon="mdi:git"></span>
<span class="iconify" data-icon="{{ .Icon }}"></span> self-hosted git
{{ .Text }}
</a><br /> </a><br />
{{ end }} <a href="https://bin.burning.moe/">
<br /> <span class="iconify" data-icon="fluent:bin-recycle-20-filled"></span>
wastebin
</a><br />
<a href="https://gist.burning.moe/">
<span class="iconify" data-icon="carbon:paste"></span>
gist
</a>
<br /><br />
<a href="/">back</a> <a href="/">back</a>
</span> </span>
{{ end -}} {{ end -}}

View file

@ -1,46 +0,0 @@
{
"StringMap": {
"about": "she/her, 1989, queer anarchist, self-taught aspiring developer and sysadmin"
},
"LinkMap": {
"Personal": [
{
"href": "https://matrix.to/#/@celediel:burning.moe",
"text": "matrix",
"icon": "tabler:brand-matrix"
},
{
"href": "https://slrpnk.net/u/Celediel",
"text": "lemmy",
"icon": "simple-icons:lemmy"
},
{
"href": "https://git.burning.moe/celediel",
"text": "self-hosted git",
"icon": "mdi:git"
},
{
"href": "https://github.com/celediel",
"text": "github",
"icon": "bi:github"
}
],
"HostedApps": [
{
"href": "https://git.burning.moe/",
"text": "self-hosted git",
"icon": "mdi:git"
},
{
"href": "https://bin.burning.moe/",
"text": "wastebin",
"icon": "fluent:bin-recycle-20-filled"
},
{
"href": "https://gist.burning.moe/",
"text": "gist",
"icon": "carbon:paste"
}
]
}
}