Compare commits

...

2 Commits

Author SHA1 Message Date
xing
865b37cf89 组合优于继承。。。。。。。 2023-02-23 23:42:51 +08:00
xing
bd7d20160a 优化代码 2023-02-23 20:22:42 +08:00
12 changed files with 108 additions and 100 deletions

View File

@ -42,10 +42,14 @@ func NewHandle(c *gin.Context, scene int, theme string) *Handle {
} }
} }
func (h *Handle) AutoCal(name string, fn func() string) { func (h *Handle) PushHandleFn(fns ...func(*Handle)) {
h.HandleFns = append(h.HandleFns, fns...)
}
func (h *Handle) AutoCal(name string, fn func(*Handle) string) {
v, ok := reload.GetStr(name) v, ok := reload.GetStr(name)
if !ok { if !ok {
v = fn() v = fn(h)
reload.SetStr(name, v) reload.SetStr(name, v)
} }
h.GinH[name] = v h.GinH[name] = v
@ -72,9 +76,9 @@ func (h *Handle) Render() {
for _, fn := range h.HandleFns { for _, fn := range h.HandleFns {
fn(h) fn(h)
} }
h.AutoCal("siteIcon", h.CalSiteIcon) h.AutoCal("siteIcon", CalSiteIcon)
h.AutoCal("customLogo", h.CalCustomLogo) h.AutoCal("customLogo", CalCustomLogo)
h.AutoCal("customCss", h.CalCustomCss) h.AutoCal("customCss", CalCustomCss)
h.CalBodyClass() h.CalBodyClass()
h.C.HTML(h.Code, h.Templ, h.GinH) h.C.HTML(h.Code, h.Templ, h.GinH)
@ -85,7 +89,7 @@ type HandleFn[T any] func(T)
type HandlePipeFn[T any] func(HandleFn[T], T) type HandlePipeFn[T any] func(HandleFn[T], T)
// HandlePipe 方便把功能写在其它包里 // HandlePipe 方便把功能写在其它包里
func HandlePipe[T any](fns []HandlePipeFn[T], initial func(T)) HandleFn[T] { func HandlePipe[T any](initial func(T), fns ...HandlePipeFn[T]) HandleFn[T] {
return slice.ReverseReduce(fns, func(next HandlePipeFn[T], f func(t T)) func(t T) { return slice.ReverseReduce(fns, func(next HandlePipeFn[T], f func(t T)) func(t T) {
return func(t T) { return func(t T) {
next(f, t) next(f, t)

View File

@ -6,7 +6,7 @@ import (
"github.com/fthvgb1/wp-go/internal/pkg/cache" "github.com/fthvgb1/wp-go/internal/pkg/cache"
) )
func (h *Handle) CalCustomCss() (r string) { func CalCustomCss(h *Handle) (r string) {
if h.ThemeMods.CustomCssPostId < 1 { if h.ThemeMods.CustomCssPostId < 1 {
return return
} }

View File

@ -8,7 +8,7 @@ import (
"github.com/fthvgb1/wp-go/internal/wpconfig" "github.com/fthvgb1/wp-go/internal/wpconfig"
) )
func (h *Handle) CalCustomLogo() (r string) { func CalCustomLogo(h *Handle) (r string) {
id := uint64(h.ThemeMods.CustomLogo) id := uint64(h.ThemeMods.CustomLogo)
if id < 1 { if id < 1 {
id = str.ToInteger[uint64](wpconfig.GetOption("site_logo"), 0) id = str.ToInteger[uint64](wpconfig.GetOption("site_logo"), 0)

View File

@ -17,19 +17,12 @@ type DetailHandle struct {
CommentRender plugins.CommentHtml CommentRender plugins.CommentHtml
Comments []models.Comments Comments []models.Comments
Post models.Posts Post models.Posts
Pipes []HandlePipeFn[*DetailHandle]
} }
func NewDetailHandle(handle *Handle) *DetailHandle { func NewDetailHandle(handle *Handle) *DetailHandle {
return &DetailHandle{Handle: handle} return &DetailHandle{Handle: handle}
} }
func (d *DetailHandle) Pipe(calls ...HandlePipeFn[*DetailHandle]) {
HandlePipe[*DetailHandle](append(calls, d.Pipes...), func(d *DetailHandle) {
d.Render()
})(d)
}
func (d *DetailHandle) BuildDetailData() (err error) { func (d *DetailHandle) BuildDetailData() (err error) {
d.GinH["title"] = wpconfig.GetOption("blogname") d.GinH["title"] = wpconfig.GetOption("blogname")
err = d.CheckAndGetPost() err = d.CheckAndGetPost()

View File

@ -22,19 +22,12 @@ type IndexHandle struct {
PageEle pagination.Elements PageEle pagination.Elements
TotalRows int TotalRows int
PostsPlugins map[string]Plugin[models.Posts, *Handle] PostsPlugins map[string]Plugin[models.Posts, *Handle]
Pipes []HandlePipeFn[*IndexHandle]
} }
func NewIndexHandle(handle *Handle) *IndexHandle { func NewIndexHandle(handle *Handle) *IndexHandle {
return &IndexHandle{Handle: handle} return &IndexHandle{Handle: handle}
} }
func (i *IndexHandle) Pipe(calls ...HandlePipeFn[*IndexHandle]) {
HandlePipe[*IndexHandle](append(calls, i.Pipes...), func(i *IndexHandle) {
i.Render()
})(i)
}
func (i *IndexHandle) ParseIndex(parm *IndexParams) (err error) { func (i *IndexHandle) ParseIndex(parm *IndexParams) (err error) {
i.Param = parm i.Param = parm
switch i.Scene { switch i.Scene {

View File

@ -11,7 +11,7 @@ import (
var sizes = []string{"site_icon-270", "site_icon-32", "site_icon-192", "site_icon-180"} var sizes = []string{"site_icon-270", "site_icon-32", "site_icon-192", "site_icon-180"}
func (h *Handle) CalSiteIcon() (r string) { func CalSiteIcon(h *Handle) (r string) {
id := str.ToInteger[uint64](wpconfig.GetOption("site_icon"), 0) id := str.ToInteger[uint64](wpconfig.GetOption("site_icon"), 0)
if id < 1 { if id < 1 {
return return

View File

@ -3,12 +3,13 @@ package twentyfifteen
import ( import (
"fmt" "fmt"
"github.com/fthvgb1/wp-go/helper/slice" "github.com/fthvgb1/wp-go/helper/slice"
"github.com/fthvgb1/wp-go/internal/theme/common"
"strconv" "strconv"
"strings" "strings"
) )
func (h *handle) colorSchemeCss() string { func colorSchemeCss(h *common.Handle) string {
s := slice.Filter([]string{h.calColorSchemeCss(), h.calSidebarTextColorCss(), h.calHeaderBackgroundColorCss()}, func(s string) bool { s := slice.Filter([]string{calColorSchemeCss(h), calSidebarTextColorCss(h), calHeaderBackgroundColorCss(h)}, func(s string) bool {
return s != "" return s != ""
}) })
if len(s) < 1 { if len(s) < 1 {
@ -16,9 +17,9 @@ func (h *handle) colorSchemeCss() string {
} }
return fmt.Sprintf(`<style id='%s-inline-css'%s>\n%s\n</style>`, "twentyfifteen-style", "", strings.Join(s, "\n")) return fmt.Sprintf(`<style id='%s-inline-css'%s>\n%s\n</style>`, "twentyfifteen-style", "", strings.Join(s, "\n"))
} }
func (h *handle) calColorSchemeCss() (r string) { func calColorSchemeCss(h *common.Handle) (r string) {
color := h.getColorScheme() color := getColorScheme(h)
if "default" == h.IndexHandle.ThemeMods.ColorScheme || len(color) < 1 { if "default" == h.ThemeMods.ColorScheme || len(color) < 1 {
return return
} }
textColorRgb := slice.ToAnySlice(Hex2RgbUint8(color[3])) textColorRgb := slice.ToAnySlice(Hex2RgbUint8(color[3]))
@ -45,31 +46,31 @@ func (h *handle) calColorSchemeCss() (r string) {
return return
} }
func (h *handle) calSidebarTextColorCss() (r string) { func calSidebarTextColorCss(h *common.Handle) (r string) {
colors := h.getColorScheme() colors := getColorScheme(h)
if h.IndexHandle.ThemeMods.SidebarTextcolor == "" || h.IndexHandle.ThemeMods.SidebarTextcolor == colors[4] { if h.ThemeMods.SidebarTextcolor == "" || h.ThemeMods.SidebarTextcolor == colors[4] {
return return
} }
linkColorRgb := Hex2RgbUint8(h.IndexHandle.ThemeMods.SidebarTextcolor) linkColorRgb := Hex2RgbUint8(h.ThemeMods.SidebarTextcolor)
color := slice.ToAnySlice(linkColorRgb) color := slice.ToAnySlice(linkColorRgb)
textColor := fmt.Sprintf(`rgba( %[1]v, %[2]v, %[3]v, 0.7)`, color...) textColor := fmt.Sprintf(`rgba( %[1]v, %[2]v, %[3]v, 0.7)`, color...)
borderColor := fmt.Sprintf(`rgba( %[1]v, %[2]v, %[3]v, 0.1)`, color...) borderColor := fmt.Sprintf(`rgba( %[1]v, %[2]v, %[3]v, 0.1)`, color...)
borderFocusColor := fmt.Sprintf(`rgba( %[1]v, %[2]v, %[3]v, 0.3)`, color...) borderFocusColor := fmt.Sprintf(`rgba( %[1]v, %[2]v, %[3]v, 0.3)`, color...)
r = fmt.Sprintf(sidebarTextColorTemplate, h.IndexHandle.ThemeMods.SidebarTextcolor, textColor, borderColor, borderFocusColor) r = fmt.Sprintf(sidebarTextColorTemplate, h.ThemeMods.SidebarTextcolor, textColor, borderColor, borderFocusColor)
return return
} }
func (h *handle) calHeaderBackgroundColorCss() (r string) { func calHeaderBackgroundColorCss(h *common.Handle) (r string) {
colors := h.getColorScheme() colors := getColorScheme(h)
if h.IndexHandle.ThemeMods.HeaderBackgroundColor == "" || h.IndexHandle.ThemeMods.HeaderBackgroundColor == colors[1] { if h.ThemeMods.HeaderBackgroundColor == "" || h.ThemeMods.HeaderBackgroundColor == colors[1] {
return return
} }
r = fmt.Sprintf(headerBackgroundColorCssTemplate, h.IndexHandle.ThemeMods.HeaderBackgroundColor, h.IndexHandle.ThemeMods.HeaderBackgroundColor) r = fmt.Sprintf(headerBackgroundColorCssTemplate, h.ThemeMods.HeaderBackgroundColor, h.ThemeMods.HeaderBackgroundColor)
return return
} }
func (h *handle) getColorScheme() (r []string) { func getColorScheme(h *common.Handle) (r []string) {
x, ok := colorscheme[h.IndexHandle.ThemeMods.ColorScheme] x, ok := colorscheme[h.ThemeMods.ColorScheme]
if ok { if ok {
r = x.Colors r = x.Colors
} }

View File

@ -5,6 +5,7 @@ import (
"github.com/fthvgb1/wp-go/helper" "github.com/fthvgb1/wp-go/helper"
"github.com/fthvgb1/wp-go/helper/maps" "github.com/fthvgb1/wp-go/helper/maps"
str "github.com/fthvgb1/wp-go/helper/strings" str "github.com/fthvgb1/wp-go/helper/strings"
"github.com/fthvgb1/wp-go/internal/theme/common"
) )
var postx = map[string]string{ var postx = map[string]string{
@ -29,30 +30,30 @@ var repeat = map[string]string{
"no-repeat": "no-repeat", "no-repeat": "no-repeat",
} }
func (h *handle) CalCustomBackGround() (r string) { func CalCustomBackGround(h *common.Handle) (r string) {
if h.IndexHandle.ThemeMods.BackgroundImage == "" && h.IndexHandle.ThemeMods.BackgroundColor == themesupport.CustomBackground.DefaultColor { if h.ThemeMods.BackgroundImage == "" && h.ThemeMods.BackgroundColor == themesupport.CustomBackground.DefaultColor {
return return
} }
s := str.NewBuilder() s := str.NewBuilder()
if h.IndexHandle.ThemeMods.BackgroundImage != "" { if h.ThemeMods.BackgroundImage != "" {
s.Sprintf(` background-image: url("%s");`, helper.CutUrlHost(h.IndexHandle.ThemeMods.BackgroundImage)) s.Sprintf(` background-image: url("%s");`, helper.CutUrlHost(h.ThemeMods.BackgroundImage))
} }
backgroundPositionX := helper.Defaults(h.IndexHandle.ThemeMods.BackgroundPositionX, themesupport.CustomBackground.DefaultPositionX) backgroundPositionX := helper.Defaults(h.ThemeMods.BackgroundPositionX, themesupport.CustomBackground.DefaultPositionX)
backgroundPositionX = maps.WithDefaultVal(postx, backgroundPositionX, "left") backgroundPositionX = maps.WithDefaultVal(postx, backgroundPositionX, "left")
backgroundPositionY := helper.Defaults(h.IndexHandle.ThemeMods.BackgroundPositionY, themesupport.CustomBackground.DefaultPositionY) backgroundPositionY := helper.Defaults(h.ThemeMods.BackgroundPositionY, themesupport.CustomBackground.DefaultPositionY)
backgroundPositionY = maps.WithDefaultVal(posty, backgroundPositionY, "top") backgroundPositionY = maps.WithDefaultVal(posty, backgroundPositionY, "top")
positon := fmt.Sprintf(" background-position: %s %s;", backgroundPositionX, backgroundPositionY) positon := fmt.Sprintf(" background-position: %s %s;", backgroundPositionX, backgroundPositionY)
siz := helper.DefaultVal(h.IndexHandle.ThemeMods.BackgroundSize, themesupport.CustomBackground.DefaultSize) siz := helper.DefaultVal(h.ThemeMods.BackgroundSize, themesupport.CustomBackground.DefaultSize)
siz = maps.WithDefaultVal(size, siz, "auto") siz = maps.WithDefaultVal(size, siz, "auto")
siz = fmt.Sprintf(" background-size: %s;", siz) siz = fmt.Sprintf(" background-size: %s;", siz)
repeats := helper.Defaults(h.IndexHandle.ThemeMods.BackgroundRepeat, themesupport.CustomBackground.DefaultRepeat) repeats := helper.Defaults(h.ThemeMods.BackgroundRepeat, themesupport.CustomBackground.DefaultRepeat)
repeats = maps.WithDefaultVal(repeat, repeats, "repeat") repeats = maps.WithDefaultVal(repeat, repeats, "repeat")
repeats = fmt.Sprintf(" background-repeat: %s;", repeats) repeats = fmt.Sprintf(" background-repeat: %s;", repeats)
attachment := helper.Defaults(h.IndexHandle.ThemeMods.BackgroundAttachment, themesupport.CustomBackground.DefaultAttachment) attachment := helper.Defaults(h.ThemeMods.BackgroundAttachment, themesupport.CustomBackground.DefaultAttachment)
attachment = helper.Or(attachment == "fixed", "fixed", "scroll") attachment = helper.Or(attachment == "fixed", "fixed", "scroll")
attachment = fmt.Sprintf(" background-attachment: %s;", attachment) attachment = fmt.Sprintf(" background-attachment: %s;", attachment)
s.WriteString(positon, siz, repeats, attachment) s.WriteString(positon, siz, repeats, attachment)

View File

@ -4,6 +4,7 @@ import (
str "github.com/fthvgb1/wp-go/helper/strings" str "github.com/fthvgb1/wp-go/helper/strings"
"github.com/fthvgb1/wp-go/internal/cmd/reload" "github.com/fthvgb1/wp-go/internal/cmd/reload"
"github.com/fthvgb1/wp-go/internal/pkg/constraints" "github.com/fthvgb1/wp-go/internal/pkg/constraints"
"github.com/fthvgb1/wp-go/internal/theme/common"
) )
var style = `<style type="text/css" id="twentyfifteen-header-css">` var style = `<style type="text/css" id="twentyfifteen-header-css">`
@ -82,20 +83,20 @@ var imgStyle = `.site-header {
var header = reload.Vars(constraints.Defaults) var header = reload.Vars(constraints.Defaults)
func (h *handle) CalCustomHeader() (r string, rand bool) { func calCustomHeader(h *common.Handle) (r string, rand bool) {
img, rand := h.IndexHandle.GetCustomHeader() img, rand := h.GetCustomHeader()
if img.Path == "" && h.IndexHandle.DisplayHeaderText() { if img.Path == "" && h.DisplayHeaderText() {
return return
} }
ss := str.NewBuilder() ss := str.NewBuilder()
ss.WriteString(style) ss.WriteString(style)
if img.Path == "" && !h.IndexHandle.DisplayHeaderText() { if img.Path == "" && !h.DisplayHeaderText() {
ss.WriteString(defaultTextStyle) ss.WriteString(defaultTextStyle)
} }
if img.Path != "" { if img.Path != "" {
ss.Sprintf(imgStyle, img.Path, img.Path) ss.Sprintf(imgStyle, img.Path, img.Path)
} }
if !h.IndexHandle.DisplayHeaderText() { if !h.DisplayHeaderText() {
ss.WriteString(`.site-title, ss.WriteString(`.site-title,
.site-description { .site-description {
clip: rect(1px, 1px, 1px, 1px); clip: rect(1px, 1px, 1px, 1px);
@ -107,15 +108,15 @@ func (h *handle) CalCustomHeader() (r string, rand bool) {
return return
} }
func (h *handle) CustomHeader() { func customHeader(h *common.Handle) {
headers := header.Load() headers := header.Load()
if headers == constraints.Defaults { if headers == constraints.Defaults {
headerss, rand := h.CalCustomHeader() headerss, rand := calCustomHeader(h)
headers = headerss headers = headerss
if !rand { if !rand {
header.Store(headers) header.Store(headers)
} }
} }
h.IndexHandle.GinH["customHeader"] = headers h.GinH["customHeader"] = headers
return return
} }

View File

@ -1,7 +1,7 @@
{{template "layout/base" .}} {{template "layout/base" .}}
{{define "content"}} {{define "content"}}
{{ if .post.PostContent}} {{ if gt .post.Id 0}}
<div id="primary" class="content-area"> <div id="primary" class="content-area">
<main id="main" class="site-main"> <main id="main" class="site-main">
<article id="post-{{.post.Id}}" <article id="post-{{.post.Id}}"

View File

@ -28,36 +28,31 @@ func Init(fs embed.FS) {
logs.ErrPrintln(err, "解析colorscheme失败") logs.ErrPrintln(err, "解析colorscheme失败")
} }
type handle struct { var detailPipe = common.HandlePipe(func(d *common.DetailHandle) {
*common.IndexHandle d.Render()
*common.DetailHandle }, detail)
} var indexPipe = common.HandlePipe(func(i *common.IndexHandle) {
i.Render()
func newHandle(iHandle *common.IndexHandle, dHandle *common.DetailHandle) *handle { }, index)
return &handle{iHandle, dHandle}
}
func Hook(h *common.Handle) { func Hook(h *common.Handle) {
h.WidgetAreaData() h.WidgetAreaData()
h.GetPassword() h.GetPassword()
handle := newHandle(common.NewIndexHandle(h), common.NewDetailHandle(h)) h.AutoCal("colorScheme", colorSchemeCss)
if h.Scene == constraints.Detail { h.AutoCal("customBackground", CalCustomBackGround)
handle.Detail() h.PushHandleFn(customHeader)
return switch h.Scene {
case constraints.Detail:
detailPipe(common.NewDetailHandle(h))
default:
indexPipe(common.NewIndexHandle(h))
} }
handle.Index()
} }
func (h *handle) Index() { func index(next common.HandleFn[*common.IndexHandle], i *common.IndexHandle) {
h.CustomHeader() i.Indexs()
h.IndexHandle.AutoCal("colorScheme", h.colorSchemeCss)
h.IndexHandle.AutoCal("customBackground", h.CalCustomBackGround)
h.Indexs()
} }
func (h *handle) Detail() { func detail(fn common.HandleFn[*common.DetailHandle], d *common.DetailHandle) {
h.CustomHeader() d.Details()
h.IndexHandle.AutoCal("colorScheme", h.colorSchemeCss)
h.IndexHandle.AutoCal("customBackground", h.CalCustomBackGround)
h.Details()
} }

View File

@ -2,11 +2,10 @@ package twentyseventeen
import ( import (
"fmt" "fmt"
"github.com/fthvgb1/wp-go/helper"
"github.com/fthvgb1/wp-go/helper/maps" "github.com/fthvgb1/wp-go/helper/maps"
"github.com/fthvgb1/wp-go/helper/slice" "github.com/fthvgb1/wp-go/internal/cmd/reload"
"github.com/fthvgb1/wp-go/internal/pkg/cache"
"github.com/fthvgb1/wp-go/internal/pkg/constraints" "github.com/fthvgb1/wp-go/internal/pkg/constraints"
"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/plugins"
"github.com/fthvgb1/wp-go/internal/theme/common" "github.com/fthvgb1/wp-go/internal/theme/common"
@ -28,19 +27,27 @@ var paginate = func() plugins.PageEle {
return p return p
}() }()
var detailPipe = common.HandlePipe(func(d *common.DetailHandle) {
d.Render()
}, detail)
var indexPipe = common.HandlePipe(func(i *common.IndexHandle) {
i.Render()
}, index)
func Hook(h *common.Handle) { func Hook(h *common.Handle) {
h.WidgetAreaData() h.WidgetAreaData()
h.GetPassword() h.GetPassword()
h.HandleFns = append(h.HandleFns, calClass) h.PushHandleFn(calClass)
h.GinH["HeaderImage"] = getHeaderImage(h.C) h.GinH["HeaderImage"] = getHeaderImage(h)
if h.Scene == constraints.Detail { switch h.Scene {
common.NewDetailHandle(h).Pipe(detail) case constraints.Detail:
return detailPipe(common.NewDetailHandle(h))
default:
indexPipe(common.NewIndexHandle(h))
} }
common.NewIndexHandle(h).Pipe(index)
} }
var pluginFns = func() map[string]common.Plugin[models.Posts, *common.Handle] { var listPostsPlugins = func() map[string]common.Plugin[models.Posts, *common.Handle] {
return maps.Merge(common.ListPostPlugins(), map[string]common.Plugin[models.Posts, *common.Handle]{ return maps.Merge(common.ListPostPlugins(), map[string]common.Plugin[models.Posts, *common.Handle]{
"twentyseventeen_postThumbnail": postThumbnail, "twentyseventeen_postThumbnail": postThumbnail,
}) })
@ -55,7 +62,7 @@ func index(next common.HandleFn[*common.IndexHandle], i *common.IndexHandle) {
i.C.HTML(i.Code, i.Templ, i.GinH) i.C.HTML(i.Code, i.Templ, i.GinH)
return return
} }
i.PostsPlugins = pluginFns i.PostsPlugins = listPostsPlugins
i.PageEle = paginate i.PageEle = paginate
next(i) next(i)
} }
@ -111,16 +118,29 @@ func postThumbnail(next common.Fn[models.Posts], h *common.Handle, t models.Post
return next(t) return next(t)
} }
func getHeaderImage(c *gin.Context) (r models.PostThumbnail) { var header = reload.Vars(models.PostThumbnail{})
r.Path = "/wp-content/themes/twentyseventeen/assets/images/header.jpg"
r.Width = 2000 func getHeaderImage(h *common.Handle) (r models.PostThumbnail) {
r.Height = 1200 img := header.Load()
hs, err := cache.GetHeaderImages(c, ThemeName) r.Sizes = "100vw"
if err != nil { if img.Path == "" {
logs.ErrPrintln(err, "获取页眉背景图失败") image, rand := h.GetCustomHeader()
} else if len(hs) > 0 && err == nil { if !rand {
_, r = slice.Rand(hs) if image.Path == "" {
r.Path = helper.CutUrlHost(h.ThemeMods.ThemeSupport.CustomHeader.DefaultImage)
r.Width = 2000
r.Height = 1200
header.Store(r)
return
}
r = image
r.Sizes = "100vw"
header.Store(r)
return
}
img = image
} }
r = img
r.Sizes = "100vw" r.Sizes = "100vw"
return return
} }