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 -}} diff --git a/src/http/feed.go b/src/http/feed.go index 8bb01c4..918eb86 100644 --- a/src/http/feed.go +++ b/src/http/feed.go @@ -39,10 +39,9 @@ func (a *api) renderFeedHandler() http.Handler { publicURL := a.params.PublicURL.String() feed := feeds.Feed{ - Title: "Mediocre Blog", - Link: &feeds.Link{Href: publicURL + "/"}, - Description: "A mix of tech, art, travel, and who knows what else.", - Author: author, + Title: "mediocregopher's lil web corner", + Link: &feeds.Link{Href: publicURL + "/"}, + Author: author, } for _, post := range posts { diff --git a/src/http/tpl/base.html b/src/http/tpl/base.html index dbfdbb0..612657e 100644 --- a/src/http/tpl/base.html +++ b/src/http/tpl/base.html @@ -2,6 +2,7 @@ + mediocregopher's lil web corner diff --git a/src/post/preprocess.go b/src/post/preprocess.go index 4d4be9d..424c7b8 100644 --- a/src/post/preprocess.go +++ b/src/post/preprocess.go @@ -37,6 +37,16 @@ type PreprocessFunctions struct { Image func(args ...string) (string, error) } +func (funcs PreprocessFunctions) ToFuncsMap() template.FuncMap { + return template.FuncMap{ + "BlogURL": funcs.BlogURL, + "AssetURL": funcs.AssetURL, + "PostURL": funcs.PostURL, + "StaticURL": funcs.StaticURL, + "Image": funcs.Image, + } +} + // PreprocessBody interprets the Post's Body as a text template which may use // any of the functions found in PreprocessFunctions (all must be set). It // executes the template and writes the result to the given writer. @@ -44,13 +54,7 @@ func (p Post) PreprocessBody(into io.Writer, funcs PreprocessFunctions) error { tpl := template.New("") - tpl.Funcs(template.FuncMap{ - "BlogURL": funcs.BlogURL, - "AssetURL": funcs.AssetURL, - "PostURL": funcs.PostURL, - "StaticURL": funcs.StaticURL, - "Image": funcs.Image, - }) + tpl.Funcs(funcs.ToFuncsMap()) tpl, err := tpl.Parse(p.Body)