From 9b46a86d5db38d5b3cd88f094db8cdbaf2cb7985 Mon Sep 17 00:00:00 2001 From: xing Date: Tue, 28 Feb 2023 15:17:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20components=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cache/map.go | 13 ++- internal/pkg/constraints/const.go | 3 +- internal/theme/common/common.go | 87 +++++++++++-------- internal/theme/twentyfifteen/twentyfifteen.go | 5 +- .../theme/twentyseventeen/twentyseventeen.go | 4 +- 5 files changed, 67 insertions(+), 45 deletions(-) diff --git a/cache/map.go b/cache/map.go index dfa1f87..684bcf5 100644 --- a/cache/map.go +++ b/cache/map.go @@ -44,21 +44,20 @@ func (m *MapCache[K, V]) setCacheFn(fn func(...any) (map[K]V, error)) { m.cacheFunc = func(a ...any) (V, error) { var err error var r map[K]V - var id K + var k K ctx, ok := a[0].(context.Context) if ok { - id = a[1].(K) - r, err = fn(ctx, []K{id}) - } else { - id = a[0].(K) - r, err = fn([]K{id}) + k, ok = a[1].(K) + if ok { + r, err = fn(ctx, []K{k}) + } } if err != nil { var rr V return rr, err } - return r[id], err + return r[k], err } } diff --git a/internal/pkg/constraints/const.go b/internal/pkg/constraints/const.go index 3d3ec87..448727a 100644 --- a/internal/pkg/constraints/const.go +++ b/internal/pkg/constraints/const.go @@ -16,5 +16,6 @@ const ( Defaults = "default" - HeadScript = "headScript" + HeadScript = "headScript" + FooterScript = "footerScript" ) diff --git a/internal/theme/common/common.go b/internal/theme/common/common.go index f45c7bf..321c05b 100644 --- a/internal/theme/common/common.go +++ b/internal/theme/common/common.go @@ -14,42 +14,53 @@ import ( ) type Handle struct { - Index *IndexHandle - Detail *DetailHandle - C *gin.Context - Theme string - Session sessions.Session - GinH gin.H - Password string - Scene int - Code int - Stats int - Templ string - Class []string - Scripts map[string][]func(*Handle) string - ThemeMods wpconfig.ThemeMods - HandleFns []HandleFn[*Handle] + Index *IndexHandle + Detail *DetailHandle + C *gin.Context + Theme string + Session sessions.Session + GinH gin.H + Password string + Scene int + Code int + Stats int + Templ string + Class []string + Components map[string][]Components + ThemeMods wpconfig.ThemeMods + HandleFns []HandleFn[*Handle] } func NewHandle(c *gin.Context, scene int, theme string) *Handle { mods, err := wpconfig.GetThemeMods(theme) logs.ErrPrintln(err, "获取mods失败") return &Handle{ - C: c, - Theme: theme, - Session: sessions.Default(c), - GinH: gin.H{}, - Scene: scene, - ThemeMods: mods, - Scripts: make(map[string][]func(*Handle) string), + C: c, + Theme: theme, + Session: sessions.Default(c), + GinH: gin.H{}, + Scene: scene, + Stats: constraints.Ok, + ThemeMods: mods, + Components: make(map[string][]Components), } } +// Components Order 为执行顺序,降序执行 +type Components struct { + Fn func(*Handle) string + Order int +} + +func NewComponents(fn func(*Handle) string, order int) Components { + return Components{Fn: fn, Order: order} +} + func (h *Handle) PushHandleFn(fns ...HandleFn[*Handle]) { h.HandleFns = append(h.HandleFns, fns...) } -func (h *Handle) PlushComponent(name string, fn func(*Handle) string) { +func (h *Handle) AddComponent(name string, fn func(*Handle) string) { v, ok := reload.GetStr(name) if !ok { v = fn(h) @@ -58,12 +69,11 @@ func (h *Handle) PlushComponent(name string, fn func(*Handle) string) { h.GinH[name] = v } -func (h *Handle) PushHeadScript(name string, fn ...func(*Handle) string) { - h.Scripts[name] = append(h.Scripts[name], fn...) +func (h *Handle) PushHeadScript(fn ...Components) { + h.Components[constraints.HeadScript] = append(h.Components[constraints.HeadScript], fn...) } - -func Default[T any](t T) T { - return t +func (h *Handle) PushFooterScript(fn ...Components) { + h.Components[constraints.FooterScript] = append(h.Components[constraints.FooterScript], fn...) } func (h *Handle) GetPassword() { @@ -105,19 +115,26 @@ func (h *Handle) Render() { h.PreCodeAndStats() h.PreTemplate() h.ExecHandleFns() - h.PushHeadScript(constraints.HeadScript, CalSiteIcon, CalCustomCss) - h.PlushComponent("customLogo", CalCustomLogo) - h.CalMultipleScript() + h.PushHeadScript(Components{CalSiteIcon, 10}, Components{CalCustomCss, -1}) + h.AddComponent("customLogo", CalCustomLogo) + h.CalMultipleComponents() h.CalBodyClass() h.C.HTML(h.Code, h.Templ, h.GinH) } -func (h *Handle) CalMultipleScript() { - for k, ss := range h.Scripts { +func (h *Handle) PushComponents(name string, components ...Components) { + h.Components[name] = append(h.Components[name], components...) +} + +func (h *Handle) CalMultipleComponents() { + for k, ss := range h.Components { v, ok := reload.GetStr(k) if !ok { - v = strings.Join(slice.FilterAndMap(ss, func(t func(*Handle) string) (string, bool) { - s := t(h) + slice.SortSelf(ss, func(i, j Components) bool { + return i.Order > j.Order + }) + v = strings.Join(slice.FilterAndMap(ss, func(t Components) (string, bool) { + s := t.Fn(h) return s, s != "" }), "\n") reload.SetStr(k, v) diff --git a/internal/theme/twentyfifteen/twentyfifteen.go b/internal/theme/twentyfifteen/twentyfifteen.go index 108173a..8850ee6 100644 --- a/internal/theme/twentyfifteen/twentyfifteen.go +++ b/internal/theme/twentyfifteen/twentyfifteen.go @@ -37,7 +37,10 @@ func Hook(h *common.Handle) { func dispatch(next common.HandleFn[*common.Handle], h *common.Handle) { h.WidgetAreaData() h.GetPassword() - h.PushHeadScript(constraints.HeadScript, CalCustomBackGround, colorSchemeCss) + h.PushHeadScript( + common.NewComponents(CalCustomBackGround, 10), + common.NewComponents(colorSchemeCss, 10), + ) h.PushHandleFn(customHeader) switch h.Scene { case constraints.Detail: diff --git a/internal/theme/twentyseventeen/twentyseventeen.go b/internal/theme/twentyseventeen/twentyseventeen.go index 4dd19de..50bb475 100644 --- a/internal/theme/twentyseventeen/twentyseventeen.go +++ b/internal/theme/twentyseventeen/twentyseventeen.go @@ -37,7 +37,9 @@ func dispatch(next common.HandleFn[*common.Handle], h *common.Handle) { h.WidgetAreaData() h.GetPassword() h.PushHandleFn(calClass) - h.PushHeadScript(constraints.HeadScript, colorScheme) + h.PushHeadScript( + common.NewComponents(colorScheme, 10), + ) h.GinH["HeaderImage"] = getHeaderImage(h) switch h.Scene { case constraints.Detail: