计算body class

This commit is contained in:
xing 2023-02-14 19:47:47 +08:00
parent 1451b33af4
commit f96f364a69
16 changed files with 174 additions and 26 deletions

View File

@ -3,7 +3,7 @@ package actions
import ( import (
"fmt" "fmt"
str "github.com/fthvgb1/wp-go/helper/strings" str "github.com/fthvgb1/wp-go/helper/strings"
"github.com/fthvgb1/wp-go/internal/phpass" "github.com/fthvgb1/wp-go/internal/phphelper"
"github.com/fthvgb1/wp-go/internal/wpconfig" "github.com/fthvgb1/wp-go/internal/wpconfig"
"github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@ -28,7 +28,7 @@ func Login(c *gin.Context) {
c.Error(err) c.Error(err)
return return
} }
pass, err := phpass.NewPasswordHash(8, true).HashPassword(password) pass, err := phphelper.NewPasswordHash(8, true).HashPassword(password)
if err != nil { if err != nil {
c.Error(err) c.Error(err)
return return

View File

@ -8,6 +8,7 @@ import (
func ThemeHook(scene int) func(*gin.Context) { func ThemeHook(scene int) func(*gin.Context) {
return func(ctx *gin.Context) { return func(ctx *gin.Context) {
theme.Hook(theme.GetTemplateName(), common.NewHandle(ctx, scene)) t := theme.GetTemplateName()
theme.Hook(t, common.NewHandle(ctx, scene, t))
} }
} }

View File

@ -45,7 +45,7 @@ func init() {
} }
cache.InitActionsCommonCache() cache.InitActionsCommonCache()
plugins.InitDigestCache() plugins.InitDigestCache()
theme.InitThemeAndTemplateFuncMap() theme.InitTheme()
go cronClearCache() go cronClearCache()
} }
@ -105,6 +105,7 @@ func reload() {
err = wpconfig.InitOptions() err = wpconfig.InitOptions()
logs.ErrPrintln(err, "获取网站设置WpOption失败") logs.ErrPrintln(err, "获取网站设置WpOption失败")
err = wpconfig.InitTerms() err = wpconfig.InitTerms()
wpconfig.FlushModes()
logs.ErrPrintln(err, "获取WpTerms表失败") logs.ErrPrintln(err, "获取WpTerms表失败")
if middleWareReloadFn != nil { if middleWareReloadFn != nil {
middleWareReloadFn() middleWareReloadFn()

View File

@ -1,4 +1,4 @@
package phpass package phphelper
import ( import (
"crypto/md5" "crypto/md5"

View File

@ -1,4 +1,4 @@
package plugins package phphelper
import ( import (
"github.com/elliotchance/phpserialize" "github.com/elliotchance/phpserialize"

View File

@ -6,7 +6,6 @@ import (
"github.com/fthvgb1/wp-go/helper/slice" "github.com/fthvgb1/wp-go/helper/slice"
str "github.com/fthvgb1/wp-go/helper/strings" str "github.com/fthvgb1/wp-go/helper/strings"
"github.com/fthvgb1/wp-go/internal/pkg/models" "github.com/fthvgb1/wp-go/internal/pkg/models"
"github.com/fthvgb1/wp-go/internal/plugins"
"github.com/fthvgb1/wp-go/internal/wpconfig" "github.com/fthvgb1/wp-go/internal/wpconfig"
"github.com/fthvgb1/wp-go/model" "github.com/fthvgb1/wp-go/model"
"time" "time"
@ -20,13 +19,8 @@ func GetHeaderImages(ctx context.Context, theme string) (r []models.PostThumbnai
func getHeaderImages(a ...any) (r []models.PostThumbnail, err error) { func getHeaderImages(a ...any) (r []models.PostThumbnail, err error) {
ctx := a[0].(context.Context) ctx := a[0].(context.Context)
theme := a[1].(string) theme := a[1].(string)
mods, ok := wpconfig.Options.Load(fmt.Sprintf("theme_mods_%s", theme)) meta, err := wpconfig.GetThemeMods(theme)
if ok && mods != "" { if err != nil && meta.HeaderImage != "" {
meta, er := plugins.UnPHPSerialize[plugins.ThemeMods](mods)
if er != nil || meta.HeaderImage == "" {
err = er
return
}
if "random-uploaded-image" == meta.HeaderImage { if "random-uploaded-image" == meta.HeaderImage {
headers, er := model.Finds[models.Posts](ctx, model.Conditions( headers, er := model.Finds[models.Posts](ctx, model.Conditions(
model.Where(model.SqlBuilder{ model.Where(model.SqlBuilder{
@ -72,7 +66,7 @@ func getHeaderImages(a ...any) (r []models.PostThumbnail, err error) {
} }
func thumb(m models.Posts, theme string) models.PostThumbnail { func thumb(m models.Posts, theme string) models.PostThumbnail {
m.Thumbnail = plugins.Thumbnail(m.AttachmentMetadata, "thumbnail", "", "thumbnail", "post-thumbnail", fmt.Sprintf("%s-thumbnail-avatar", theme)) m.Thumbnail = wpconfig.Thumbnail(m.AttachmentMetadata, "thumbnail", "", "thumbnail", "post-thumbnail", fmt.Sprintf("%s-thumbnail-avatar", theme))
m.Thumbnail.Width = m.AttachmentMetadata.Width m.Thumbnail.Width = m.AttachmentMetadata.Width
m.Thumbnail.Height = m.AttachmentMetadata.Height m.Thumbnail.Height = m.AttachmentMetadata.Height
if m.Thumbnail.Path != "" { if m.Thumbnail.Path != "" {

View File

@ -3,9 +3,10 @@ package dao
import ( import (
"context" "context"
"github.com/fthvgb1/wp-go/helper/slice" "github.com/fthvgb1/wp-go/helper/slice"
"github.com/fthvgb1/wp-go/internal/phphelper"
"github.com/fthvgb1/wp-go/internal/pkg/logs" "github.com/fthvgb1/wp-go/internal/pkg/logs"
"github.com/fthvgb1/wp-go/internal/pkg/models" "github.com/fthvgb1/wp-go/internal/pkg/models"
"github.com/fthvgb1/wp-go/internal/plugins" "github.com/fthvgb1/wp-go/internal/wpconfig"
"github.com/fthvgb1/wp-go/model" "github.com/fthvgb1/wp-go/model"
"strconv" "strconv"
) )
@ -27,7 +28,7 @@ func GetPostMetaByPostIds(args ...any) (r map[uint64]map[string]any, err error)
} }
r[postmeta.PostId][postmeta.MetaKey] = postmeta.MetaValue r[postmeta.PostId][postmeta.MetaKey] = postmeta.MetaValue
if postmeta.MetaKey == "_wp_attachment_metadata" { if postmeta.MetaKey == "_wp_attachment_metadata" {
metadata, err := plugins.UnPHPSerialize[models.WpAttachmentMetadata](postmeta.MetaValue) metadata, err := phphelper.UnPHPSerialize[models.WpAttachmentMetadata](postmeta.MetaValue)
if err != nil { if err != nil {
logs.ErrPrintln(err, "解析postmeta失败", postmeta.MetaId, postmeta.MetaValue) logs.ErrPrintln(err, "解析postmeta失败", postmeta.MetaId, postmeta.MetaValue)
continue continue
@ -60,7 +61,7 @@ func ToPostThumb(c context.Context, meta map[string]any, host string) (r models.
if ok { if ok {
metadata, ok := x.(models.WpAttachmentMetadata) metadata, ok := x.(models.WpAttachmentMetadata)
if ok { if ok {
r = plugins.Thumbnail(metadata, "post-thumbnail", host, "thumbnail") r = wpconfig.Thumbnail(metadata, "post-thumbnail", host, "thumbnail")
} }
} }
} }

View File

@ -6,7 +6,7 @@ import (
"fmt" "fmt"
"github.com/fthvgb1/wp-go/helper/slice" "github.com/fthvgb1/wp-go/helper/slice"
"github.com/fthvgb1/wp-go/internal/pkg/models" "github.com/fthvgb1/wp-go/internal/pkg/models"
"github.com/fthvgb1/wp-go/internal/plugins" "github.com/fthvgb1/wp-go/internal/wpconfig"
"github.com/fthvgb1/wp-go/model" "github.com/fthvgb1/wp-go/model"
"strings" "strings"
"sync/atomic" "sync/atomic"
@ -70,7 +70,7 @@ func GetPostsByIds(a ...any) (m map[uint64]models.Posts, err error) {
pp.Thumbnail = thumb pp.Thumbnail = thumb
} }
} else if pp.PostType == "attachment" && pp.AttachmentMetadata.File != "" { } else if pp.PostType == "attachment" && pp.AttachmentMetadata.File != "" {
thumb := plugins.Thumbnail(pp.AttachmentMetadata, "thumbnail", host, "thumbnail", "post-thumbnail") thumb := wpconfig.Thumbnail(pp.AttachmentMetadata, "thumbnail", host, "thumbnail", "post-thumbnail")
if thumb.Path != "" { if thumb.Path != "" {
pp.Thumbnail = thumb pp.Thumbnail = thumb
} }

View File

@ -0,0 +1,84 @@
package common
import (
"fmt"
"github.com/fthvgb1/wp-go/helper/maps"
"github.com/fthvgb1/wp-go/helper/slice"
str "github.com/fthvgb1/wp-go/helper/strings"
"github.com/fthvgb1/wp-go/internal/pkg/cache"
"github.com/fthvgb1/wp-go/internal/pkg/constraints"
"github.com/fthvgb1/wp-go/internal/pkg/models"
"github.com/fthvgb1/wp-go/internal/wpconfig"
"strings"
)
var commonClass = map[int]string{
constraints.Home: "home blog",
constraints.Archive: "archive date",
constraints.Category: "archive category ",
constraints.Tag: "archive category ",
constraints.Search: "search",
constraints.Detail: "post-template-default single single-post ",
}
type Support map[string]struct{}
var themeSupport = map[string]Support{}
func AddThemeSupport(theme string, support Support) {
themeSupport[theme] = support
}
func (h *Handle) IsSupport(name string) bool {
m, ok := themeSupport[h.Theme]
if ok {
return maps.IsExists(m, name)
}
return ok
}
func (h *Handle) CalBodyClass() {
h.GinH["bodyClass"] = h.bodyClass(h.Class...)
}
func (h *Handle) bodyClass(class ...string) string {
s := ""
if constraints.Ok != h.Stats {
return "error404"
}
switch h.Scene {
case constraints.Search:
s = "search-no-results"
if len(h.GinH["posts"].([]models.Posts)) > 0 {
s = "search-results"
}
case constraints.Category, constraints.Tag:
cat := h.C.Param("category")
if cat == "" {
cat = h.C.Param("tag")
}
_, cate := slice.SearchFirst(cache.CategoriesTags(h.C, h.Scene), func(my models.TermsMy) bool {
return my.Name == cat
})
if cate.Slug[0] != '%' {
s = cate.Slug
}
s = fmt.Sprintf("category-%v category-%v", s, cate.Terms.TermId)
case constraints.Detail:
s = fmt.Sprintf("postid-%d", h.GinH["post"].(models.Posts).Id)
if h.IsSupport("post-formats") {
s = str.Join(s, " single-format-standard")
}
}
class = append(class, s)
if h.IsSupport("custom-background") && wpconfig.IsCustomBackground(h.Theme) {
class = append(class, "custom-background")
}
if h.IsSupport("custom-logo") && wpconfig.IsCustomLogo(h.Theme) {
class = append(class, "wp-custom-logo")
}
if h.IsSupport("responsive-embeds") {
class = append(class, "wp-embed-responsive")
}
return str.Join(commonClass[h.Scene], strings.Join(class, " "))
}

View File

@ -18,6 +18,7 @@ import (
type Handle struct { type Handle struct {
C *gin.Context C *gin.Context
Theme string
Session sessions.Session Session sessions.Session
GinH gin.H GinH gin.H
Password string Password string
@ -25,11 +26,13 @@ type Handle struct {
Code int Code int
Stats int Stats int
Templ string Templ string
Class []string
} }
func NewHandle(c *gin.Context, scene int) *Handle { func NewHandle(c *gin.Context, scene int, theme string) *Handle {
return &Handle{ return &Handle{
C: c, C: c,
Theme: theme,
Session: sessions.Default(c), Session: sessions.Default(c),
GinH: gin.H{}, GinH: gin.H{},
Scene: scene, Scene: scene,

View File

@ -2,14 +2,16 @@ package theme
import ( import (
"github.com/fthvgb1/wp-go/internal/pkg/config" "github.com/fthvgb1/wp-go/internal/pkg/config"
"github.com/fthvgb1/wp-go/internal/theme/common"
"github.com/fthvgb1/wp-go/internal/theme/twentyfifteen" "github.com/fthvgb1/wp-go/internal/theme/twentyfifteen"
"github.com/fthvgb1/wp-go/internal/theme/twentyseventeen" "github.com/fthvgb1/wp-go/internal/theme/twentyseventeen"
"github.com/fthvgb1/wp-go/internal/wpconfig" "github.com/fthvgb1/wp-go/internal/wpconfig"
) )
func InitThemeAndTemplateFuncMap() { func InitTheme() {
addThemeHookFunc(twentyfifteen.ThemeName, twentyfifteen.Hook) addThemeHookFunc(twentyfifteen.ThemeName, twentyfifteen.Hook)
addThemeHookFunc(twentyseventeen.ThemeName, twentyseventeen.Hook) addThemeHookFunc(twentyseventeen.ThemeName, twentyseventeen.Hook)
common.AddThemeSupport(twentyfifteen.ThemeName, twentyfifteen.ThemeSupport())
} }
func GetTemplateName() string { func GetTemplateName() string {

View File

@ -6,7 +6,7 @@
{{block "head" .}} {{block "head" .}}
{{end}} {{end}}
</head> </head>
<body> <body class="{{.bodyClass}}">
{{template "svg"}} {{template "svg"}}
<div id="page" class="hfeed site"> <div id="page" class="hfeed site">
<a class="skip-link screen-reader-text" href="#content"> <a class="skip-link screen-reader-text" href="#content">

View File

@ -55,6 +55,7 @@ func (i *indexHandle) Index() {
i.ExecPostsPlugin() i.ExecPostsPlugin()
i.PageEle = plugins.TwentyFifteenPagination() i.PageEle = plugins.TwentyFifteenPagination()
i.Pagination() i.Pagination()
i.CalBodyClass()
i.C.HTML(i.Code, i.Templ, i.GinH) i.C.HTML(i.Code, i.Templ, i.GinH)
} }
@ -71,6 +72,7 @@ func (d *detailHandle) Detail() {
d.PasswordProject() d.PasswordProject()
d.CommentRender = plugins.CommentRender() d.CommentRender = plugins.CommentRender()
d.RenderComment() d.RenderComment()
d.CalBodyClass()
d.C.HTML(d.Code, d.Templ, d.GinH) d.C.HTML(d.Code, d.Templ, d.GinH)
} }
@ -88,3 +90,12 @@ func getHeaderImage(c *gin.Context) (r models.PostThumbnail) {
r.Sizes = "100vw" r.Sizes = "100vw"
return return
} }
func ThemeSupport() map[string]struct{} {
return map[string]struct{}{
"custom-background": {},
"wp-custom-logo": {},
"responsive-embeds": {},
"post-formats": {},
}
}

View File

@ -11,6 +11,7 @@ import (
"github.com/fthvgb1/wp-go/internal/pkg/models" "github.com/fthvgb1/wp-go/internal/pkg/models"
"github.com/fthvgb1/wp-go/internal/plugins" "github.com/fthvgb1/wp-go/internal/plugins"
"github.com/fthvgb1/wp-go/internal/theme/common" "github.com/fthvgb1/wp-go/internal/theme/common"
"github.com/fthvgb1/wp-go/internal/wpconfig"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"net/http" "net/http"
"strings" "strings"
@ -98,7 +99,7 @@ func (d *detailHandle) Detail() {
return return
} }
d.GinH["bodyClass"] = d.h.bodyClass() d.GinH["bodyClass"] = d.h.bodyClass()
img := plugins.Thumbnail(d.Post.Thumbnail.OriginAttachmentData, "thumbnail", "", "thumbnail", "post-thumbnail") img := wpconfig.Thumbnail(d.Post.Thumbnail.OriginAttachmentData, "thumbnail", "", "thumbnail", "post-thumbnail")
img.Width = img.OriginAttachmentData.Width img.Width = img.OriginAttachmentData.Width
img.Height = img.OriginAttachmentData.Height img.Height = img.OriginAttachmentData.Height
img.Sizes = "100vw" img.Sizes = "100vw"

View File

@ -1,15 +1,18 @@
package plugins package wpconfig
import ( import (
"fmt" "fmt"
"github.com/fthvgb1/wp-go/helper/maps" "github.com/fthvgb1/wp-go/helper/maps"
"github.com/fthvgb1/wp-go/internal/phphelper"
"github.com/fthvgb1/wp-go/internal/pkg/models" "github.com/fthvgb1/wp-go/internal/pkg/models"
"github.com/fthvgb1/wp-go/safety"
"strings" "strings"
) )
type ThemeMods struct { type ThemeMods struct {
CustomCssPostId int `json:"custom_css_post_id,omitempty"` CustomCssPostId int `json:"custom_css_post_id,omitempty"`
NavMenuLocations []string `json:"nav_menu_locations,omitempty"` NavMenuLocations []string `json:"nav_menu_locations,omitempty"`
CustomLogo int `json:"custom_logo"`
HeaderImage string `json:"header_image,omitempty"` HeaderImage string `json:"header_image,omitempty"`
BackgroundImage string `json:"background_image"` BackgroundImage string `json:"background_image"`
BackgroundSize string `json:"background_size"` BackgroundSize string `json:"background_size"`
@ -70,3 +73,50 @@ func Thumbnail(metadata models.WpAttachmentMetadata, Type, host string, except .
} }
return return
} }
var themeModes = safety.Map[string, ThemeMods]{}
func FlushModes() {
themeModes.Flush()
}
func GetThemeMods(theme string) (r ThemeMods, err error) {
r, ok := themeModes.Load(theme)
if ok {
return
}
mods, ok := Options.Load(fmt.Sprintf("theme_mods_%s", theme))
if !ok || mods == "" {
return
}
r, err = phphelper.UnPHPSerialize[ThemeMods](mods)
if err != nil {
return
}
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 IsCustomLogo(theme string) bool {
mods, err := GetThemeMods(theme)
if err != nil {
return false
}
if mods.CustomLogo > 0 {
return true
}
return false
}