wp-go/internal/wpconfig/thememods.go
2023-03-06 20:53:51 +08:00

183 lines
5.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package wpconfig
import (
"embed"
"encoding/json"
"fmt"
"github.com/fthvgb1/wp-go/helper/maps"
"github.com/fthvgb1/wp-go/internal/cmd/reload"
"github.com/fthvgb1/wp-go/internal/phphelper"
"github.com/fthvgb1/wp-go/internal/pkg/logs"
"github.com/fthvgb1/wp-go/internal/pkg/models"
"github.com/fthvgb1/wp-go/safety"
"path/filepath"
"strings"
)
var templateFs embed.FS
func SetTemplateFs(fs embed.FS) {
templateFs = fs
}
// ThemeMods 只有部分公共的参数,其它的参数调用 GetThemeModsVal 函数获取
type ThemeMods struct {
CustomCssPostId int `json:"custom_css_post_id,omitempty"`
NavMenuLocations map[string]int `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"`
SidebarTextcolor string `json:"sidebar_textcolor,omitempty"`
HeaderBackgroundColor string `json:"header_background_color,omitempty"`
HeaderTextcolor string `json:"header_textcolor,omitempty"`
HeaderVideo int `json:"header_video,omitempty"`
ExternalHeaderVideo string `json:"external_header_video,omitempty"`
HeaderImagData ImageData `json:"header_image_data,omitempty"`
SidebarsWidgets Sidebars `json:"sidebars_widgets,omitempty"`
ThemeSupport ThemeSupport
}
type Sidebars struct {
Time int `json:"time,omitempty"`
Data SidebarsData `json:"data,omitempty"`
}
type ColorScheme struct {
Label string `json:"label,omitempty"`
Colors []string `json:"colors,omitempty"`
}
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"`
}
func Thumbnail(metadata models.WpAttachmentMetadata, Type, host string, except ...string) (r models.PostThumbnail) {
up := strings.Split(metadata.File, "/")
if metadata.File != "" && 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,
}
}
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
r.Srcset = strings.Join(maps.FilterToSlice[string](metadata.Sizes, func(s string, size models.MetaDataFileSize) (r string, ok bool) {
up[len(up)-1] = size.File
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
}
var themeModes = func() *safety.Map[string, ThemeMods] {
m := safety.NewMap[string, ThemeMods]()
themeModsRaw = safety.NewMap[string, map[string]any]()
reload.Push(func() {
m.Flush()
themeModsRaw.Flush()
})
return m
}()
var themeModsRaw *safety.Map[string, map[string]any]
func GetThemeModsVal[T any](theme, k string, defaults T) (r T) {
m, ok := themeModsRaw.Load(theme)
if !ok {
r = defaults
return
}
r = maps.GetStrAnyValWithDefaults(m, k, defaults)
return
}
func GetThemeMods(theme string) (r ThemeMods, err error) {
r, ok := themeModes.Load(theme)
if ok {
return
}
mods := GetOption(fmt.Sprintf("theme_mods_%s", theme))
if mods == "" {
return
}
m, err := phphelper.UnPHPSerializeToStrAnyMap(mods)
if err != nil {
return
}
themeModsRaw.Store(theme, m)
//这里在的err可以不用处理因为php的默认值和有设置过的类型可能不一样直接按有设置的类型处理就行
r, err = maps.StrAnyMapToStruct[ThemeMods](m)
if err != nil {
logs.ErrPrintln(err, "解析thememods错误")
err = nil
}
r.setThemeSupport(theme)
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
}
func (m *ThemeMods) setThemeSupport(themeName string) {
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
}