From 8d7e708d98a3a46ba3ba08f9c8deeb4838bb8ca5 Mon Sep 17 00:00:00 2001 From: Brian Picciano Date: Fri, 17 May 2024 23:37:43 +0200 Subject: Render posts completely using common rendering methods The aim is to reduce reliance on custom logic in the handlers for every protocol, eventually outsourcing all of it into `render.Methods`, leaving each protocol to simply direct calls to the correct template. --- src/http/posts.go | 129 +++--------------------------------------------------- 1 file changed, 7 insertions(+), 122 deletions(-) (limited to 'src/http/posts.go') diff --git a/src/http/posts.go b/src/http/posts.go index ab3a18a..939b811 100644 --- a/src/http/posts.go +++ b/src/http/posts.go @@ -12,13 +12,10 @@ import ( txttpl "text/template" "time" - "github.com/gomarkdown/markdown" - "github.com/gomarkdown/markdown/html" - "github.com/gomarkdown/markdown/parser" - "dev.mediocregopher.com/mediocre-blog.git/src/gmi" "dev.mediocregopher.com/mediocre-blog.git/src/http/apiutil" "dev.mediocregopher.com/mediocre-blog.git/src/post" "dev.mediocregopher.com/mediocre-blog.git/src/post/asset" + "dev.mediocregopher.com/mediocre-blog.git/src/render" "dev.mediocregopher.com/mediocre-go-lib.git/mctx" ) @@ -92,80 +89,6 @@ func (a *api) postPreprocessFuncs() post.PreprocessFunctions { } } -func (a *api) postToPostTplPayload(storedPost post.StoredPost) (postTplPayload, error) { - - preprocessFuncs := a.postPreprocessFuncs() - - bodyBuf := new(bytes.Buffer) - - if err := storedPost.PreprocessBody(bodyBuf, preprocessFuncs); err != nil { - return postTplPayload{}, fmt.Errorf("preprocessing post body: %w", err) - } - - if storedPost.Format == post.FormatGemtext { - - prevBodyBuf := bodyBuf - bodyBuf = new(bytes.Buffer) - - err := gmi.GemtextToMarkdown( - bodyBuf, prevBodyBuf, a.params.GeminiGatewayURL, - ) - - if err != nil { - return postTplPayload{}, fmt.Errorf("converting gemtext to markdown: %w", err) - } - } - - // this helps the markdown renderer properly parse pages which end in a - // `` tag... I don't know why. - _, _ = bodyBuf.WriteString("\n") - - parserExt := parser.CommonExtensions | parser.AutoHeadingIDs - parser := parser.NewWithExtensions(parserExt) - - htmlFlags := html.HrefTargetBlank - htmlRenderer := html.NewRenderer(html.RendererOptions{Flags: htmlFlags}) - - renderedBody := markdown.ToHTML(bodyBuf.Bytes(), parser, htmlRenderer) - - tplPayload := postTplPayload{ - StoredPost: storedPost, - Body: template.HTML(renderedBody), - } - - if series := storedPost.Series; series != "" { - - seriesPosts, err := a.params.PostStore.GetBySeries(series) - if err != nil { - return postTplPayload{}, fmt.Errorf( - "fetching posts for series %q: %w", series, err, - ) - } - - var foundThis bool - - for i := range seriesPosts { - - seriesPost := seriesPosts[i] - - if seriesPost.ID == storedPost.ID { - foundThis = true - continue - } - - if !foundThis { - tplPayload.SeriesNext = &seriesPost - continue - } - - tplPayload.SeriesPrevious = &seriesPost - break - } - } - - return tplPayload, nil -} - func (a *api) getPostsHandler() http.Handler { tpl := a.mustParseBasedTpl("posts.html") @@ -236,7 +159,7 @@ func (a *api) getPostsHandler() http.Handler { tplPayload.NextPage = page + 1 } - executeTemplate(rw, r, tpl, tplPayload) + a.executeTemplate(rw, r, tpl, tplPayload) }) } @@ -245,37 +168,7 @@ func (a *api) getPostHandler() http.Handler { tpl := a.mustParseBasedTpl("post.html") return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - - id := strings.TrimSuffix(filepath.Base(r.URL.Path), ".html") - - storedPost, err := a.params.PostStore.GetByID(id) - - if errors.Is(err, post.ErrPostNotFound) { - http.Error(rw, "Post not found", 404) - return - } else if err != nil { - apiutil.InternalServerError( - rw, r, fmt.Errorf("fetching post with id %q: %w", id, err), - ) - return - } - - tplPayload, err := a.postToPostTplPayload(storedPost) - - if err != nil { - apiutil.InternalServerError( - rw, r, fmt.Errorf( - "generating template payload for post with id %q: %w", - id, err, - ), - ) - return - } - - executeTemplate( - rw, r, tpl, tplPayload, - executeTemplateWithTitlePrefix(storedPost.Title), - ) + a.executeTemplate(rw, r, tpl, nil) }) } @@ -319,7 +212,7 @@ func (a *api) managePostsHandler() http.Handler { tplPayload.NextPage = page + 1 } - executeTemplate(rw, r, tpl, tplPayload) + a.executeTemplate(rw, r, tpl, tplPayload) }) } @@ -378,7 +271,7 @@ func (a *api) editPostHandler(isDraft bool) http.Handler { Formats: post.Formats, } - executeTemplate(rw, r, tpl, tplPayload) + a.executeTemplate(rw, r, tpl, tplPayload) }) } @@ -516,15 +409,7 @@ func (a *api) previewPostHandler() http.Handler { PublishedAt: time.Now(), } - tplPayload, err := a.postToPostTplPayload(storedPost) - - if err != nil { - apiutil.InternalServerError( - rw, r, fmt.Errorf("generating template payload: %w", err), - ) - return - } - - executeTemplate(rw, r, tpl, tplPayload) + r = r.WithContext(render.WithPost(r.Context(), storedPost)) + a.executeTemplate(rw, r, tpl, nil) }) } -- cgit v1.2.3