diff --git a/internal/theme/common/bodyclass.go b/internal/theme/common/bodyclass.go index 6678f4d..0751ccf 100644 --- a/internal/theme/common/bodyclass.go +++ b/internal/theme/common/bodyclass.go @@ -21,10 +21,10 @@ var commonClass = map[int]string{ } func (h *Handle) CalBodyClass() { - h.GinH["bodyClass"] = h.bodyClass(h.Class...) + h.GinH["bodyClass"] = h.BodyClass(h.Class...) } -func (h *Handle) bodyClass(class ...string) string { +func (h *Handle) BodyClass(class ...string) string { s := "" if constraints.Ok != h.Stats { return "error404" diff --git a/internal/theme/common/common.go b/internal/theme/common/common.go index 0493d1d..e0acc30 100644 --- a/internal/theme/common/common.go +++ b/internal/theme/common/common.go @@ -2,6 +2,7 @@ package common import ( "github.com/fthvgb1/wp-go/helper/slice" + str "github.com/fthvgb1/wp-go/helper/strings" "github.com/fthvgb1/wp-go/internal/cmd/reload" "github.com/fthvgb1/wp-go/internal/pkg/constraints" "github.com/fthvgb1/wp-go/internal/pkg/logs" @@ -23,7 +24,7 @@ type Handle struct { Templ string Class []string ThemeMods wpconfig.ThemeMods - Plugins []HandlePluginFn[*Handle] + HandleFns []func(*Handle) } func NewHandle(c *gin.Context, scene int, theme string) *Handle { @@ -61,19 +62,32 @@ func (h *Handle) GetPassword() { } } -func (h *Handle) ExecHandlePlugin() { - if len(h.Plugins) > 0 { - HandlePlugin(h.Plugins, h) +func (h *Handle) Render() { + if h.Templ == "" { + h.Templ = str.Join(h.Theme, "/posts/index.gohtml") + if h.Scene == constraints.Detail { + h.Templ = str.Join(h.Theme, "/posts/detail.gohtml") + } } + h.AutoCal("siteIcon", h.CalSiteIcon) + h.AutoCal("customLogo", h.CalCustomLogo) + h.AutoCal("customCss", h.CalCustomCss) + h.CalBodyClass() + for _, fn := range h.HandleFns { + fn(h) + } + h.C.HTML(h.Code, h.Templ, h.GinH) } type HandleFn[T any] func(T) -type HandlePluginFn[T any] func(HandleFn[T], T) HandleFn[T] +type HandlePipeFn[T any] func(HandleFn[T], T) -// HandlePlugin 方便把功能写在其它包里 -func HandlePlugin[T any](fns []HandlePluginFn[T], h T) HandleFn[T] { - return slice.ReverseReduce(fns, func(t HandlePluginFn[T], r HandleFn[T]) HandleFn[T] { - return t(r, h) - }, func(t T) {}) +// HandlePipe 方便把功能写在其它包里 +func HandlePipe[T any](fns []HandlePipeFn[T], initial func(T)) HandleFn[T] { + return slice.ReverseReduce(fns, func(next HandlePipeFn[T], f func(t T)) func(t T) { + return func(t T) { + next(f, t) + } + }, initial) } diff --git a/internal/theme/common/index.go b/internal/theme/common/index.go index 43435e1..13c8aba 100644 --- a/internal/theme/common/index.go +++ b/internal/theme/common/index.go @@ -15,6 +15,26 @@ import ( "net/http" ) +type IndexHandle struct { + *Handle + Param *IndexParams + Posts []models.Posts + PageEle pagination.Elements + TotalRows int + PostsPlugins map[string]Plugin[models.Posts, *Handle] + Pipes []HandlePipeFn[*IndexHandle] +} + +func NewIndexHandle(handle *Handle) *IndexHandle { + 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) { i.Param = parm switch i.Scene { @@ -64,6 +84,9 @@ func (i *IndexHandle) GetIndexData() (posts []models.Posts, totalRaw int, err er } func (i *IndexHandle) Pagination() { + if i.PageEle == nil { + i.PageEle = plugins.TwentyFifteenPagination() + } q := i.C.Request.URL.Query().Encode() if q != "" { q = fmt.Sprintf("?%s", q) @@ -108,18 +131,8 @@ func (i *IndexHandle) ExecPostsPlugin(calls ...func(*models.Posts)) { func (i *IndexHandle) Render() { i.ExecPostsPlugin() - if i.PageEle == nil { - i.PageEle = plugins.TwentyFifteenPagination() - } i.Pagination() - i.AutoCal("siteIcon", i.CalSiteIcon) - i.AutoCal("customLogo", i.CalCustomLogo) - i.AutoCal("customCss", i.CalCustomCss) - i.CalBodyClass() - if i.Templ == "" { - i.Templ = fmt.Sprintf("%s/posts/index.gohtml", i.Theme) - } - i.C.HTML(i.Code, i.Templ, i.GinH) + i.Handle.Render() } func (i *IndexHandle) Indexs() { @@ -130,6 +143,5 @@ func (i *IndexHandle) Indexs() { i.C.HTML(i.Code, i.Templ, i.GinH) return } - i.ExecHandlePlugin() i.Render() } diff --git a/internal/theme/common/indexparams.go b/internal/theme/common/indexparams.go index a5339fb..29d3a6e 100644 --- a/internal/theme/common/indexparams.go +++ b/internal/theme/common/indexparams.go @@ -11,10 +11,8 @@ import ( "github.com/fthvgb1/wp-go/internal/pkg/config" "github.com/fthvgb1/wp-go/internal/pkg/constraints" "github.com/fthvgb1/wp-go/internal/pkg/dao" - "github.com/fthvgb1/wp-go/internal/pkg/models" "github.com/fthvgb1/wp-go/internal/wpconfig" "github.com/fthvgb1/wp-go/model" - "github.com/fthvgb1/wp-go/plugin/pagination" "github.com/gin-gonic/gin" "strconv" "strings" @@ -55,19 +53,6 @@ type IndexParams struct { BlogName string } -type IndexHandle struct { - *Handle - Param *IndexParams - Posts []models.Posts - PageEle pagination.Elements - TotalRows int - PostsPlugins map[string]Plugin[models.Posts, *Handle] -} - -func NewIndexHandle(handle *Handle) *IndexHandle { - return &IndexHandle{Handle: handle} -} - var months = slice.SimpleToMap(number.Range(1, 12, 1), func(v int) int { return v }) diff --git a/internal/theme/twentyseventeen/twentyseventeen.go b/internal/theme/twentyseventeen/twentyseventeen.go index 7450a1a..bd2fac4 100644 --- a/internal/theme/twentyseventeen/twentyseventeen.go +++ b/internal/theme/twentyseventeen/twentyseventeen.go @@ -37,15 +37,6 @@ func newHandle(h *common.Handle) *handle { return &handle{Handle: h} } -type indexHandle struct { - *common.IndexHandle - h *handle -} - -func newIndexHandle(iHandle *common.IndexHandle) *indexHandle { - return &indexHandle{IndexHandle: iHandle, h: newHandle(iHandle.Handle)} -} - type detailHandle struct { *common.DetailHandle h *handle @@ -63,7 +54,7 @@ func Hook(h *common.Handle) { newDetailHandle(common.NewDetailHandle(h)).Detail() return } - newIndexHandle(common.NewIndexHandle(h)).Index() + common.NewIndexHandle(h).Pipe(index) } var pluginFns = func() map[string]common.Plugin[models.Posts, *common.Handle] { @@ -72,19 +63,18 @@ var pluginFns = func() map[string]common.Plugin[models.Posts, *common.Handle] { }) }() -func (i *indexHandle) Index() { - i.Templ = "twentyseventeen/posts/index.gohtml" +func index(next common.HandleFn[*common.IndexHandle], i *common.IndexHandle) { err := i.BuildIndexData(common.NewIndexParams(i.C)) if err != nil { i.Stats = constraints.Error404 i.Code = http.StatusNotFound - i.GinH["bodyClass"] = i.h.bodyClass() + i.CalBodyClass() i.C.HTML(i.Code, i.Templ, i.GinH) return } i.PostsPlugins = pluginFns i.PageEle = paginate - i.Render() + next(i) } func (d *detailHandle) Detail() { diff --git a/model/parse.go b/model/parse.go index 705840a..3e690d9 100644 --- a/model/parse.go +++ b/model/parse.go @@ -7,7 +7,7 @@ import ( "strings" ) -func (w SqlBuilder) parseField(ss []string, s *strings.Builder) { +func (w SqlBuilder) parseWhereField(ss []string, s *strings.Builder) { if strings.Contains(ss[0], ".") && !strings.Contains(ss[0], "(") { x := slice.Map(strings.Split(ss[0], "."), func(t string) string { return str.Join("`", t, "`") @@ -81,11 +81,11 @@ func (w SqlBuilder) ParseWhere(in *[][]any) (string, []any, error) { s.WriteString(ss[0]) s.WriteString(" and ") case 2: - w.parseField(ss, &s) + w.parseWhereField(ss, &s) s.WriteString("=? and ") args = append(args, ss[1]) case 3, 4: - w.parseField(ss, &s) + w.parseWhereField(ss, &s) s.WriteString(ss[1]) if w.parseIn(ss, &s, &c, &args, in) { s.WriteString(" and ") @@ -115,7 +115,7 @@ func (w SqlBuilder) ParseWhere(in *[][]any) (string, []any, error) { if i == 0 { s.WriteString("( ") } - w.parseField(ss[start+1:end], &s) + w.parseWhereField(ss[start+1:end], &s) s.WriteString(ss[start+2]) if w.parseIn(ss[start+1:end], &s, &c, &args, in) { s.WriteString(" and ")