From 5b5a0438682ecb69bbc8d7cb9904ad4b049033a3 Mon Sep 17 00:00:00 2001 From: Brian Picciano Date: Sun, 22 Jan 2023 12:45:03 +0100 Subject: Implement gemini atom feed --- src/gmi/tpl.go | 104 +++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 65 insertions(+), 39 deletions(-) (limited to 'src/gmi/tpl.go') diff --git a/src/gmi/tpl.go b/src/gmi/tpl.go index c648abd..edd3a75 100644 --- a/src/gmi/tpl.go +++ b/src/gmi/tpl.go @@ -35,10 +35,9 @@ type rendererGetPostSeriesNextPreviousRes struct { } type renderer struct { - url *url.URL - postStore post.Store - gmiPublicURL *url.URL - httpPublicURL *url.URL + url *url.URL + postStore post.Store + preprocessFuncs post.PreprocessFunctions } func (r renderer) GetPosts(page, count int) (rendererGetPostsRes, error) { @@ -91,39 +90,9 @@ func (r renderer) GetPostSeriesNextPrevious(p post.StoredPost) (rendererGetPostS func (r renderer) PostBody(p post.StoredPost) (string, error) { - preprocessFuncs := post.PreprocessFunctions{ - BlogURL: func(path string) string { - return filepath.Join("/", r.gmiPublicURL.Path, path) - }, - AssetURL: func(id string) string { - return filepath.Join("/assets", id) - }, - PostURL: func(id string) string { - return filepath.Join("/posts", id) - }, - StaticURL: func(path string) string { - httpPublicURL := *r.httpPublicURL - httpPublicURL.Path = filepath.Join(httpPublicURL.Path, "/static", path) - return httpPublicURL.String() - }, - Image: func(args ...string) (string, error) { - - var ( - id = args[0] - descr = "Image" - ) - - if len(args) > 1 { - descr = args[1] - } - - return fmt.Sprintf("=> %s %s", filepath.Join("/assets", id), descr), nil - }, - } - buf := new(bytes.Buffer) - if err := p.PreprocessBody(buf, preprocessFuncs); err != nil { + if err := p.PreprocessBody(buf, r.preprocessFuncs); err != nil { return "", fmt.Errorf("preprocessing post body: %w", err) } @@ -159,8 +128,66 @@ func (r renderer) Add(a, b int) int { return a + b } func (a *api) tplHandler() (gemini.Handler, error) { + blogURL := func(path string, abs bool) string { + path = filepath.Join(a.params.PublicURL.Path, path) + + if !abs { + return path + } + + u := *a.params.PublicURL + u.Path = path + return u.String() + } + + preprocessFuncs := post.PreprocessFunctions{ + BlogURL: func(path string) string { + return blogURL(path, false) + }, + AssetURL: func(id string) string { + path := filepath.Join("assets", id) + return blogURL(path, false) + }, + PostURL: func(id string) string { + path := filepath.Join("posts", id) + ".gmi" + return blogURL(path, false) + }, + StaticURL: func(path string) string { + httpPublicURL := *a.params.HTTPPublicURL + httpPublicURL.Path = filepath.Join(httpPublicURL.Path, "/static", path) + return httpPublicURL.String() + }, + Image: func(args ...string) (string, error) { + + var ( + id = args[0] + descr = "Image" + ) + + if len(args) > 1 { + descr = args[1] + } + + path := blogURL(filepath.Join("assets", id), false) + + return fmt.Sprintf("=> %s %s", path, descr), nil + }, + } + allTpls := template.New("") + allTpls.Funcs(preprocessFuncs.ToFuncsMap()) + + allTpls.Funcs(template.FuncMap{ + "BlogURLAbs": func(path string) string { + return blogURL(path, true) + }, + "PostURLAbs": func(id string) string { + path := filepath.Join("posts", id) + ".gmi" + return blogURL(path, true) + }, + }) + err := fs.WalkDir(tplFS, "tpl", func(path string, d fs.DirEntry, err error) error { if err != nil { @@ -219,10 +246,9 @@ func (a *api) tplHandler() (gemini.Handler, error) { buf := new(bytes.Buffer) err := tpl.Execute(buf, renderer{ - url: r.URL, - postStore: a.params.PostStore, - gmiPublicURL: a.params.PublicURL, - httpPublicURL: a.params.HTTPPublicURL, + url: r.URL, + postStore: a.params.PostStore, + preprocessFuncs: preprocessFuncs, }) if err != nil { -- cgit v1.2.3