wp-go/internal/wpconfig/thememods.go

157 lines
4.8 KiB
Go
Raw Normal View History

2023-02-14 11:47:47 +00:00
package wpconfig
2023-01-25 18:26:36 +00:00
import (
2023-02-15 16:32:02 +00:00
"embed"
"encoding/json"
2023-01-25 18:26:36 +00:00
"fmt"
"github.com/fthvgb1/wp-go/helper/maps"
"github.com/fthvgb1/wp-go/internal/cmd/reload"
2023-02-14 11:47:47 +00:00
"github.com/fthvgb1/wp-go/internal/phphelper"
2023-01-25 18:26:36 +00:00
"github.com/fthvgb1/wp-go/internal/pkg/models"
2023-02-14 11:47:47 +00:00
"github.com/fthvgb1/wp-go/safety"
2023-02-15 16:32:02 +00:00
"path/filepath"
2023-01-25 18:26:36 +00:00
"strings"
)
2023-02-15 16:32:02 +00:00
var templateFs embed.FS
func SetTemplateFs(fs embed.FS) {
templateFs = fs
}
2023-02-18 15:35:39 +00:00
type ThemeMods struct {
CustomCssPostId int `json:"custom_css_post_id,omitempty"`
NavMenuLocations []string `json:"nav_menu_locations,omitempty"`
CustomLogo int `json:"custom_logo,omitempty"`
HeaderImage string `json:"header_image,omitempty"`
BackgroundImage string `json:"background_image,omitempty"`
BackgroundSize string `json:"background_size,omitempty"`
BackgroundRepeat string `json:"background_repeat,omitempty"`
BackgroundColor string `json:"background_color,omitempty"`
BackgroundPreset string `json:"background_preset"`
BackgroundPositionX string `json:"background_position_x,omitempty"`
BackgroundPositionY string `json:"background_position_y"`
BackgroundAttachment string `json:"background_attachment"`
ColorScheme string `json:"color_scheme"`
2023-02-15 16:32:02 +00:00
SidebarTextcolor string `json:"sidebar_textcolor,omitempty"`
HeaderBackgroundColor string `json:"header_background_color,omitempty"`
HeaderTextcolor string `json:"header_textcolor,omitempty"`
2023-02-13 15:03:17 +00:00
HeaderImagData ImageData `json:"header_image_data,omitempty"`
2023-02-15 16:32:02 +00:00
SidebarsWidgets Sidebars `json:"sidebars_widgets,omitempty"`
ThemeSupport ThemeSupport
2023-01-31 16:58:42 +00:00
}
type Sidebars struct {
Time int `json:"time,omitempty"`
2023-02-15 16:32:02 +00:00
Data SidebarsData `json:"data,omitempty"`
}
type ColorScheme struct {
Label string `json:"label,omitempty"`
Colors []string `json:"colors,omitempty"`
2023-01-31 16:58:42 +00:00
}
type SidebarsData struct {
WpInactiveWidgets []string `json:"wp_inactive_widgets,omitempty"`
Sidebar1 []string `json:"sidebar-1,omitempty"`
Sidebar2 []string `json:"sidebar-2,omitempty"`
Sidebar3 []string `json:"sidebar-3,omitempty"`
}
type ImageData struct {
AttachmentId int64 `json:"attachment_id,omitempty"`
Url string `json:"url,omitempty"`
ThumbnailUrl string `json:"thumbnail_url,omitempty"`
Height int64 `json:"height,omitempty"`
Width int64 `json:"width,omitempty"`
}
2023-01-25 18:26:36 +00:00
func Thumbnail(metadata models.WpAttachmentMetadata, Type, host string, except ...string) (r models.PostThumbnail) {
2023-02-16 12:48:08 +00:00
up := strings.Split(metadata.File, "/")
if Type == "full" {
metadata.Sizes["full"] = models.MetaDataFileSize{
File: filepath.Base(metadata.File),
Width: metadata.Width,
Height: metadata.Height,
MimeType: metadata.Sizes["thumbnail"].MimeType,
FileSize: metadata.FileSize,
}
}
2023-01-25 18:26:36 +00:00
if _, ok := metadata.Sizes[Type]; ok {
r.Path = fmt.Sprintf("%s/wp-content/uploads/%s", host, metadata.File)
r.Width = metadata.Sizes[Type].Width
r.Height = metadata.Sizes[Type].Height
2023-02-16 12:48:08 +00:00
2023-01-25 18:26:36 +00:00
r.Srcset = strings.Join(maps.FilterToSlice[string](metadata.Sizes, func(s string, size models.MetaDataFileSize) (r string, ok bool) {
2023-02-16 12:48:08 +00:00
up[len(up)-1] = size.File
2023-01-25 18:26:36 +00:00
for _, s2 := range except {
if s == s2 {
return
}
}
r = fmt.Sprintf("%s/wp-content/uploads/%s %dw", host, strings.Join(up, "/"), size.Width)
ok = true
return
}), ", ")
r.Sizes = fmt.Sprintf("(max-width: %dpx) 100vw, %dpx", r.Width, r.Width)
if r.Width >= 740 && r.Width < 767 {
r.Sizes = "(max-width: 706px) 89vw, (max-width: 767px) 82vw, 740px"
} else if r.Width >= 767 {
r.Sizes = "(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px"
}
r.OriginAttachmentData = metadata
}
return
}
2023-02-14 11:47:47 +00:00
2023-02-18 15:35:39 +00:00
var themeModes = func() *safety.Map[string, ThemeMods] {
m := safety.NewMap[string, ThemeMods]()
reload.Push(func() {
m.Flush()
})
return m
}()
2023-02-14 11:47:47 +00:00
2023-02-18 15:35:39 +00:00
func GetThemeMods(theme string) (r ThemeMods, err error) {
2023-02-14 11:47:47 +00:00
r, ok := themeModes.Load(theme)
if ok {
return
}
mods, ok := Options.Load(fmt.Sprintf("theme_mods_%s", theme))
if !ok || mods == "" {
return
}
2023-02-18 15:35:39 +00:00
r, err = phphelper.UnPHPSerialize[ThemeMods](mods)
2023-02-14 11:47:47 +00:00
if err != nil {
return
}
r.setThemeSupport(theme)
2023-02-14 11:47:47 +00:00
themeModes.Store(theme, r)
return
}
func IsCustomBackground(theme string) bool {
mods, err := GetThemeMods(theme)
if err != nil {
return false
}
if mods.BackgroundColor != "" && mods.BackgroundColor != "default-color" || mods.BackgroundImage != "" && mods.BackgroundImage != "default-image" {
return true
}
return false
}
2023-02-15 16:32:02 +00:00
2023-02-18 15:35:39 +00:00
func (m *ThemeMods) setThemeSupport(themeName string) {
2023-02-15 16:32:02 +00:00
bytes, err := templateFs.ReadFile(filepath.Join(themeName, "themesupport.json"))
if err != nil {
return
}
var themeSupport ThemeSupport
err = json.Unmarshal(bytes, &themeSupport)
if err != nil {
return
}
m.ThemeSupport = themeSupport
}