diff --git a/schema.json b/config.schema.json similarity index 98% rename from schema.json rename to config.schema.json index 2678ecf..9b325c3 100644 --- a/schema.json +++ b/config.schema.json @@ -176,6 +176,9 @@ "image", "tags" ] + }, + "custom_pages": { + "type": "array" } }, "additionalProperties": false, diff --git a/custom_page.schema.json b/custom_page.schema.json new file mode 100644 index 0000000..c7a1907 --- /dev/null +++ b/custom_page.schema.json @@ -0,0 +1,117 @@ +{ + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "uri": { + "type": "string" + }, + "image": { + "type": "string" + }, + "description": { + "type": "string" + }, + "colors": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "tag_hover": { + "type": "string" + }, + "background": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "angle": { + "type": "number" + }, + "colors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "color": { + "type": "string" + }, + "position": { + "type": "number" + } + }, + "required": [ + "color", + "position" + ] + } + } + }, + "required": [ + "type", + "angle", + "colors" + ] + }, + "buttons": { + "type": "object", + "properties": { + "text": { + "type": "string" + }, + "text_hover": { + "type": "string" + }, + "background": { + "type": "string" + }, + "background_hover": { + "type": "string" + } + }, + "required": [ + "text", + "text_hover", + "background", + "background_hover" + ] + } + }, + "required": [ + "text", + "tag_hover", + "background", + "buttons" + ] + }, + "content": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "content": { + "type": "string" + } + }, + "required": [ + "type", + "content" + ] + } + } + }, + "required": [ + "title", + "uri", + "image", + "description", + "colors", + "content" + ] +} \ No newline at end of file diff --git a/data.go b/data.go index 49df295..ad51683 100644 --- a/data.go +++ b/data.go @@ -1,18 +1,39 @@ package main import ( + "encoding/json" + "fmt" "github.com/anhgelus/golatt" "html/template" + "log/slog" + "os" "strconv" + "strings" ) +const ( + TitleContentType = "title" + SubtitleContentType = "subtitle" + ParagraphContentType = "paragraph" + ListContentType = "list" + OrderedListContentType = "ordered_list" + ButtonsContentType = "links" +) + +type ConfigData interface { + GetTextColor() template.CSS + GetBackground() template.CSS + GetBackgroundImage() template.CSS +} + type Config struct { - Image string `json:"image"` - Description string `json:"description"` - Person *Person `json:"person"` - Color *Color `json:"colors"` - Links []*Link `json:"links"` - Legal *Legal `json:"legal"` + Image string `json:"image"` + Description string `json:"description"` + Person *Person `json:"person"` + Color *Color `json:"colors"` + Links []*Link `json:"links"` + Legal *Legal `json:"legal"` + CustomPages []string `json:"custom_pages"` } type Person struct { @@ -63,7 +84,62 @@ type Legal struct { } func (c *Config) GetBackground() template.CSS { - bg := c.Color.Background + return c.Color.GetBackground() +} + +func (c *Config) GetBackgroundImage() template.CSS { + return template.CSS("--background-image: url(" + golatt.GetStaticPath(c.Image) + ");") +} + +func (c *Config) GetTextColor() template.CSS { + 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 { + println("null") + 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 (t *Color) GetBackground() template.CSS { + bg := t.Background css := "background: " + bg.Type + "-gradient(" if bg.Type == "linear" { css += strconv.Itoa(int(bg.Angle)) + "deg," @@ -74,14 +150,6 @@ func (c *Config) GetBackground() template.CSS { return template.CSS(css[:len(css)-1] + ");") } -func (c *Config) GetBackgroundImage() template.CSS { - return template.CSS("--background-image: url(" + golatt.GetStaticPath(c.Image) + ");") -} - -func (c *Config) GetTextColor() template.CSS { - return template.CSS("--text-color: " + c.Color.Text + ";") -} - func (b *ButtonColor) GetTextColor() template.CSS { return template.CSS("--text-color: " + b.Text + ";--text-color-hover: " + b.TextHover + ";") } @@ -93,3 +161,77 @@ func (b *ButtonColor) GetBackground() template.CSS { func (t *Color) GetTagColor() template.CSS { return template.CSS("--tag-hover: " + t.TagHover + ";") } + +func (p *CustomPage) GetTextColor() template.CSS { + return p.Color.GetTextColor() +} + +func (p *CustomPage) GetBackgroundImage() template.CSS { + return template.CSS("--background-image: url(" + golatt.GetStaticPath(p.Image) + ");") +} + +func (p *CustomPage) GetBackground() template.CSS { + return p.Color.GetBackground() +} + +func (p *CustomPage) GetContent() template.HTML { + var res template.HTML + for _, c := range p.Content { + res += c.Get(p) + } + return res +} + +func (c *CustomContent) Get(p *CustomPage) template.HTML { + if c.Type == TitleContentType { + return template.HTML("
" + c.Content + "
") + } else if c.Type == ListContentType { + v := "" + for _, s := range strings.Split(c.Content, "--") { + if len(strings.Trim(s, " ")) == 0 { + continue + } + v += "