From 1da5062356f93b89592523d071a462ea2bd8cdad Mon Sep 17 00:00:00 2001 From: xing Date: Thu, 9 Mar 2023 22:36:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20=E4=BD=BF=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E7=BB=84=E4=BB=B6=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- helper/html/html.go | 12 ++- helper/html/html_test.go | 8 +- helper/slice/set.go | 6 +- internal/actions/themehook.go | 2 +- internal/cmd/route/route.go | 2 +- internal/theme/fs.go | 7 +- internal/theme/theme.go | 2 +- internal/theme/wp/components/constraints.go | 5 + internal/theme/wp/index.go | 4 + internal/theme/wp/indexparams.go | 2 +- internal/theme/wp/search.go | 60 +++++++++++ internal/theme/wp/wp.go | 109 +++++++++++++++----- model/parse.go | 4 +- 13 files changed, 181 insertions(+), 42 deletions(-) create mode 100644 internal/theme/wp/components/constraints.go create mode 100644 internal/theme/wp/search.go diff --git a/helper/html/html.go b/helper/html/html.go index 2131799..21c31c9 100644 --- a/helper/html/html.go +++ b/helper/html/html.go @@ -31,7 +31,11 @@ const ( EntSpace = 8 ) -func htmlSpecialChars(text string, flags int) string { +func SpecialChars(text string, flag ...int) string { + flags := EntQuotes + if len(flag) > 0 { + flags = flag[0] + } r, ok := unEntitlesMap[flags] e := entitlesMap[flags] if !ok { @@ -48,7 +52,11 @@ func htmlSpecialChars(text string, flags int) string { } return text } -func htmlSpecialCharsDecode(text string, flags int) string { +func SpecialCharsDecode(text string, flag ...int) string { + flags := EntQuotes + if len(flag) > 0 { + flags = flag[0] + } r, ok := entitlesMap[flags] u := unEntitlesMap[flags] if !ok { diff --git a/helper/html/html_test.go b/helper/html/html_test.go index 4dc1ddc..4008395 100644 --- a/helper/html/html_test.go +++ b/helper/html/html_test.go @@ -32,8 +32,8 @@ func Test_htmlSpecialChars(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := htmlSpecialChars(tt.args.text, tt.args.flags); got != tt.want { - t.Errorf("htmlSpecialChars() = %v, want %v", got, tt.want) + if got := SpecialChars(tt.args.text, tt.args.flags); got != tt.want { + t.Errorf("SpecialChars() = %v, want %v", got, tt.want) } }) } @@ -88,8 +88,8 @@ func Test_htmlSpecialCharsDecode(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := htmlSpecialCharsDecode(tt.args.text, tt.args.flags); got != tt.want { - t.Errorf("htmlSpecialCharsDecode() = %v, want %v", got, tt.want) + if got := SpecialCharsDecode(tt.args.text, tt.args.flags); got != tt.want { + t.Errorf("SpecialCharsDecode() = %v, want %v", got, tt.want) } }) } diff --git a/helper/slice/set.go b/helper/slice/set.go index c3b6972..29536fe 100644 --- a/helper/slice/set.go +++ b/helper/slice/set.go @@ -1,6 +1,6 @@ package slice -func IsContained[T comparable](a T, arr []T) bool { +func IsContained[T comparable](arr []T, a T) bool { for _, v := range arr { if a == v { return true @@ -23,7 +23,7 @@ func Diff[T comparable](a []T, b ...[]T) (r []T) { for _, t := range a { f := false for _, ts := range b { - if IsContained(t, ts) { + if IsContained(ts, t) { f = true break } @@ -74,7 +74,7 @@ func Intersect[T comparable](a []T, b ...[]T) (r []T) { for _, t := range a { f := false for _, ts := range b { - if !IsContained(t, ts) { + if !IsContained(ts, t) { f = true break } diff --git a/internal/actions/themehook.go b/internal/actions/themehook.go index fcf2bb6..89e9c98 100644 --- a/internal/actions/themehook.go +++ b/internal/actions/themehook.go @@ -8,7 +8,7 @@ import ( func ThemeHook(scene int) func(*gin.Context) { return func(ctx *gin.Context) { - t := theme.GetTemplateName() + t := theme.GetCurrentTemplateName() h := wp.NewHandle(ctx, scene, t) h.Index = wp.NewIndexHandle(h) h.Detail = wp.NewDetailHandle(h) diff --git a/internal/cmd/route/route.go b/internal/cmd/route/route.go index b94f08b..5e0833c 100644 --- a/internal/cmd/route/route.go +++ b/internal/cmd/route/route.go @@ -29,7 +29,7 @@ func SetupRouter() *gin.Engine { } } - r.HTMLRender = theme.GetTemplate() + r.HTMLRender = theme.Template() wpconfig.SetTemplateFs(theme.TemplateFs) siteFlowLimitMiddleware, siteFlow := middleware.FlowLimit(c.MaxRequestSleepNum, c.MaxRequestNum, c.CacheTime.SleepTime) r.Use( diff --git a/internal/theme/fs.go b/internal/theme/fs.go index bae4ddb..2563a58 100644 --- a/internal/theme/fs.go +++ b/internal/theme/fs.go @@ -14,7 +14,7 @@ var TemplateFs embed.FS var templates map[string]*template.Template //方便外部获取模板render后的字符串,不然在gin中获取不了 -func GetTemplate() *multipTemplate.MultipleFsTemplate { +func Template() *multipTemplate.MultipleFsTemplate { t := multipTemplate.NewFsTemplate(TemplateFs) templates = t.Template t.FuncMap = FuncMap() @@ -24,6 +24,11 @@ func GetTemplate() *multipTemplate.MultipleFsTemplate { return t } +func GetTemplate(name string) (*template.Template, bool) { + t, ok := templates[name] + return t, ok +} + // 所有主题模板通用设置 func commonTemplate(t *multipTemplate.MultipleFsTemplate) { m, err := fs.Glob(t.Fs, "*/posts/*.gohtml") diff --git a/internal/theme/theme.go b/internal/theme/theme.go index bb57dc7..d4dce68 100644 --- a/internal/theme/theme.go +++ b/internal/theme/theme.go @@ -14,7 +14,7 @@ func InitTheme() { twentyseventeen.Init(TemplateFs) } -func GetTemplateName() string { +func GetCurrentTemplateName() string { tmlp := config.GetConfig().Theme if tmlp == "" { tmlp = wpconfig.GetOption("template") diff --git a/internal/theme/wp/components/constraints.go b/internal/theme/wp/components/constraints.go new file mode 100644 index 0000000..801e7c4 --- /dev/null +++ b/internal/theme/wp/components/constraints.go @@ -0,0 +1,5 @@ +package components + +const ( + SearchFormArgs = "SearchFormArgs" +) diff --git a/internal/theme/wp/index.go b/internal/theme/wp/index.go index 62cd71e..20b5f00 100644 --- a/internal/theme/wp/index.go +++ b/internal/theme/wp/index.go @@ -48,6 +48,10 @@ func (i *IndexHandle) ParseIndex(parm *IndexParams) (err error) { i.Param = parm switch i.scene { case constraints.Home, constraints.Search: + s := i.C.Query("s") + if s != "" && strings.Replace(s, " ", "", -1) != "" { + i.scene = constraints.Search + } i.Param.ParseSearch() case constraints.Category: err = i.Param.ParseCategory() diff --git a/internal/theme/wp/indexparams.go b/internal/theme/wp/indexparams.go index 39a4a23..c6f11fe 100644 --- a/internal/theme/wp/indexparams.go +++ b/internal/theme/wp/indexparams.go @@ -105,7 +105,7 @@ func NewIndexParams(ctx *gin.Context) *IndexParams { func (i *IndexParams) parseSearch() { s := i.Ctx.Query("s") - if s != "" && strings.Replace(s, " ", "", -1) != "" { + if s != "" { q := str.Join("%", s, "%") i.Where = append(i.Where, []string{ "and", "post_title", "like", q, "", diff --git a/internal/theme/wp/search.go b/internal/theme/wp/search.go new file mode 100644 index 0000000..10c266d --- /dev/null +++ b/internal/theme/wp/search.go @@ -0,0 +1,60 @@ +package wp + +import ( + "github.com/fthvgb1/wp-go/helper/html" + "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/theme/wp/components" + "github.com/fthvgb1/wp-go/internal/wpconfig" + "strings" +) + +var searchTemplate = `{$before_widget} +{$title} +{$form} +{$after_widget}` + +var searchArgs = map[string]string{ + "{$before_widget}": `