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 +++++++++++++++++++++++++++----------------- src/gmi/tpl/feed.xml | 28 ++++++++++++ src/gmi/tpl/posts/index.gmi | 2 +- 3 files changed, 94 insertions(+), 40 deletions(-) create mode 100644 src/gmi/tpl/feed.xml (limited to 'src/gmi') 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 { diff --git a/src/gmi/tpl/feed.xml b/src/gmi/tpl/feed.xml new file mode 100644 index 0000000..497fb11 --- /dev/null +++ b/src/gmi/tpl/feed.xml @@ -0,0 +1,28 @@ +{{ $getPostsRes := .GetPosts 0 15 -}} +{{ $posts := $getPostsRes.Posts -}} + + + mediocregopher's lil web corner + {{ BlogURLAbs "/" }} + {{ if gt (len $posts) 0 -}} + {{ (index $posts 0).PublishedAt.Format "2006-01-02T15:04:05Z07:00" }} + {{ end -}} + + + mediocregopher + + {{ range $posts -}} + + {{ .Title }} + {{ .PublishedAt.Format "2006-01-02T15:04:05Z07:00" }} + {{ PostURLAbs .ID }} + + {{ if .Description -}} + {{ .Description }} + {{ end -}} + + mediocregopher + + + {{ end -}} + diff --git a/src/gmi/tpl/posts/index.gmi b/src/gmi/tpl/posts/index.gmi index dd4c84c..9d0f6e2 100644 --- a/src/gmi/tpl/posts/index.gmi +++ b/src/gmi/tpl/posts/index.gmi @@ -9,7 +9,7 @@ {{ end -}} {{ range $getPostsRes.Posts -}} -=> /posts/{{ .ID }}.gmi {{ .PublishedAt.Format "2006-01-02" }} - {{ .Title }} +=> {{ PostURL .ID }} {{ .PublishedAt.Format "2006-01-02" }} - {{ .Title }} {{ end -}} -- cgit v1.2.3