feat(custom): config and generation

This commit is contained in:
Anhgelus Morhtuuzh 2024-12-10 19:00:56 +01:00
parent 730ec34758
commit 279f73187b
No known key found for this signature in database
GPG key ID: CAD341EFA92DDDE5
4 changed files with 111 additions and 7 deletions

81
data.go
View file

@ -1,9 +1,21 @@
package main
import (
"encoding/json"
"github.com/anhgelus/golatt"
"html/template"
"log/slog"
"os"
"strconv"
"strings"
)
const (
TitleContentType = "title"
SubtitleContentType = "subtitle"
ParagraphContentType = "paragraph"
ListContentType = "list"
OrderedListContentType = "ordered_list"
)
type Config struct {
@ -13,6 +25,7 @@ type Config struct {
Color *Color `json:"colors"`
Links []*Link `json:"links"`
Legal *Legal `json:"legal"`
CustomPages []string `json:"custom_pages"`
}
type Person struct {
@ -79,7 +92,49 @@ func (c *Config) GetBackgroundImage() template.CSS {
}
func (c *Config) GetTextColor() template.CSS {
return template.CSS("--text-color: " + c.Color.Text + ";")
return c.Color.GetTextColor()
}
type CustomPage struct {
Title string `json:"title"`
URI string `json:"uri"`
Image string `json:"image"`
Description string `json:"description"`
Color *Color `json:"colors"`
Content []*CustomContent `json:"content"`
}
type CustomContent struct {
Type string `json:"type"`
Content string `json:"content"`
}
type Content interface {
Get() template.HTML
}
func (c *Config) LoadCustomPages() ([]*CustomPage, error) {
if c.CustomPages == nil {
return nil, nil
}
var pages []*CustomPage
for _, cp := range c.CustomPages {
b, err := os.ReadFile(cp)
if err != nil {
return nil, err
}
var p *CustomPage
err = json.Unmarshal(b, p)
if err != nil {
return nil, err
}
pages = append(pages, p)
}
return pages, nil
}
func (t *Color) GetTextColor() template.CSS {
return template.CSS("--text-color: " + t.Text + ";")
}
func (b *ButtonColor) GetTextColor() template.CSS {
@ -93,3 +148,27 @@ func (b *ButtonColor) GetBackground() template.CSS {
func (t *Color) GetTagColor() template.CSS {
return template.CSS("--tag-hover: " + t.TagHover + ";")
}
func (c *CustomContent) Get() template.HTML {
if c.Type == TitleContentType {
return template.HTML("<h2>" + c.Content + "</h2>")
} else if c.Type == SubtitleContentType {
return template.HTML("<h3>" + c.Content + "</h3>")
} else if c.Type == ParagraphContentType {
return template.HTML("<p>" + c.Content + "</p>")
} else if c.Type == ListContentType {
v := ""
for _, s := range strings.Split(c.Content, "--") {
v += "<li>" + strings.Trim(s, " ") + "</li>"
}
return template.HTML("<ul>" + v + "</ul>")
} else if c.Type == OrderedListContentType {
v := ""
for _, s := range strings.Split(c.Content, "--") {
v += "<li>" + strings.Trim(s, " ") + "</li>"
}
return template.HTML("<ol>" + v + "</ol>")
}
slog.Warn("Unknown type", "type", c.Type, "value", c.Content)
return ""
}

14
main.go
View file

@ -50,6 +50,10 @@ func main() {
if err != nil {
panic(err)
}
customPages, err := cfg.LoadCustomPages()
if err != nil {
panic(err)
}
g := golatt.New(templates)
g.DefaultSeoData = &golatt.SeoData{
Image: cfg.Image,
@ -74,6 +78,16 @@ func main() {
&cfg).
Handle()
for _, cp := range customPages {
g.NewTemplate("custom_page",
cp.URI,
cp.Title,
cp.Image,
cp.Description,
cp).
Handle()
}
g.NotFoundHandler = func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/", http.StatusTemporaryRedirect)
}

View file

@ -176,6 +176,9 @@
"image",
"tags"
]
},
"custom_page": {
"type": "array"
}
},
"additionalProperties": false,

View file

@ -0,0 +1,8 @@
{{define "body"}}
<main class="custom-page" style="{{ .GetBackground }}">
<h2>{{ .Title }}</h2>
{{ range $content := .Content }}
{{ .Get }}
{{ end }}
</main>
{{end}}