diff --git a/internal/actions/themehook.go b/internal/actions/themehook.go index 6b2edd9..cbcbcd5 100644 --- a/internal/actions/themehook.go +++ b/internal/actions/themehook.go @@ -9,6 +9,9 @@ import ( func ThemeHook(scene int) func(*gin.Context) { return func(ctx *gin.Context) { t := theme.GetTemplateName() - theme.Hook(t, common.NewHandle(ctx, scene, t)) + h := common.NewHandle(ctx, scene, t) + h.Index = common.NewIndexHandle(h) + h.Detail = common.NewDetailHandle(h) + theme.Hook(t, h) } } diff --git a/internal/theme/common/common.go b/internal/theme/common/common.go index 9b41975..6a3ea88 100644 --- a/internal/theme/common/common.go +++ b/internal/theme/common/common.go @@ -13,6 +13,8 @@ import ( ) type Handle struct { + Index *IndexHandle + Detail *DetailHandle C *gin.Context Theme string Session sessions.Session @@ -96,3 +98,12 @@ func HandlePipe[T any](initial func(T), fns ...HandlePipeFn[T]) HandleFn[T] { } }, initial) } + +func Render(h *Handle) { + switch h.Scene { + case constraints.Detail: + h.Detail.Render() + default: + h.Index.Render() + } +} diff --git a/internal/theme/common/detail.go b/internal/theme/common/detail.go index cad7b77..1c41f37 100644 --- a/internal/theme/common/detail.go +++ b/internal/theme/common/detail.go @@ -46,7 +46,6 @@ func (d *DetailHandle) CheckAndGetPost() (err error) { return } - d.GinH["post"] = post d.Post = post d.GinH["user"] = cache.GetUserById(d.C, post.PostAuthor) d.GinH["title"] = fmt.Sprintf("%s-%s", post.PostTitle, wpconfig.GetOption("blogname")) @@ -96,6 +95,7 @@ func (d *DetailHandle) ContextPost() { func (d *DetailHandle) Render() { d.PasswordProject() d.RenderComment() + d.GinH["post"] = d.Post d.Handle.Render() } diff --git a/internal/theme/hook.go b/internal/theme/hook.go index 40c83e7..4819f7e 100644 --- a/internal/theme/hook.go +++ b/internal/theme/hook.go @@ -5,7 +5,7 @@ import ( "github.com/fthvgb1/wp-go/internal/theme/twentyfifteen" ) -var themeMap = map[string]func(handle *common.Handle){} +var themeMap = map[string]func(*common.Handle){} func addThemeHookFunc(name string, fn func(handle *common.Handle)) { if _, ok := themeMap[name]; ok { diff --git a/internal/theme/twentyseventeen/twentyseventeen.go b/internal/theme/twentyseventeen/twentyseventeen.go index be7a778..205b81f 100644 --- a/internal/theme/twentyseventeen/twentyseventeen.go +++ b/internal/theme/twentyseventeen/twentyseventeen.go @@ -27,23 +27,22 @@ var paginate = func() plugins.PageEle { return p }() -var detailPipe = common.HandlePipe(func(d *common.DetailHandle) { - d.Render() -}, detail) -var indexPipe = common.HandlePipe(func(i *common.IndexHandle) { - i.Render() -}, index) +var pipe = common.HandlePipe(common.Render, dispatch) func Hook(h *common.Handle) { + pipe(h) +} + +func dispatch(next common.HandleFn[*common.Handle], h *common.Handle) { h.WidgetAreaData() h.GetPassword() h.PushHandleFn(calClass) h.GinH["HeaderImage"] = getHeaderImage(h) switch h.Scene { case constraints.Detail: - detailPipe(common.NewDetailHandle(h)) + detail(next, h.Detail) default: - indexPipe(common.NewIndexHandle(h)) + index(next, h.Index) } } @@ -53,7 +52,7 @@ var listPostsPlugins = func() map[string]common.Plugin[models.Posts, *common.Han }) }() -func index(next common.HandleFn[*common.IndexHandle], i *common.IndexHandle) { +func index(next common.HandleFn[*common.Handle], i *common.IndexHandle) { err := i.BuildIndexData(common.NewIndexParams(i.C)) if err != nil { i.Stats = constraints.Error404 @@ -64,10 +63,10 @@ func index(next common.HandleFn[*common.IndexHandle], i *common.IndexHandle) { } i.PostsPlugins = listPostsPlugins i.PageEle = paginate - next(i) + next(i.Handle) } -func detail(next common.HandleFn[*common.DetailHandle], d *common.DetailHandle) { +func detail(next common.HandleFn[*common.Handle], d *common.DetailHandle) { err := d.BuildDetailData() if err != nil { d.Code = http.StatusNotFound @@ -76,16 +75,16 @@ func detail(next common.HandleFn[*common.DetailHandle], d *common.DetailHandle) d.C.HTML(d.Code, d.Templ, d.GinH) return } - img := wpconfig.Thumbnail(d.Post.Thumbnail.OriginAttachmentData, "thumbnail", "", "thumbnail", "post-thumbnail") - img.Width = img.OriginAttachmentData.Width - img.Height = img.OriginAttachmentData.Height - img.Sizes = "100vw" - img.Srcset = fmt.Sprintf("%s %dw, %s", img.Path, img.Width, img.Srcset) - d.Post.Thumbnail = img - d.CommentRender = commentFormat - d.GinH["post"] = d.Post + if d.Post.Thumbnail.Path != "" { + img := wpconfig.Thumbnail(d.Post.Thumbnail.OriginAttachmentData, "full", "", "thumbnail", "post-thumbnail") + img.Sizes = "100vw" + img.Srcset = fmt.Sprintf("%s %dw, %s", img.Path, img.Width, img.Srcset) + d.Post.Thumbnail = img + } - next(d) + d.CommentRender = commentFormat + + next(d.Handle) } var commentFormat = comment{} diff --git a/internal/wpconfig/thememods.go b/internal/wpconfig/thememods.go index 4fa66e7..3dbda58 100644 --- a/internal/wpconfig/thememods.go +++ b/internal/wpconfig/thememods.go @@ -72,7 +72,7 @@ type ImageData struct { func Thumbnail(metadata models.WpAttachmentMetadata, Type, host string, except ...string) (r models.PostThumbnail) { up := strings.Split(metadata.File, "/") - if Type == "full" { + if metadata.File != "" && Type == "full" { metadata.Sizes["full"] = models.MetaDataFileSize{ File: filepath.Base(metadata.File), Width: metadata.Width,