From df59f21fbc27ec37375613be35fd04eb3033189e Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Sat, 14 Oct 2023 11:38:13 -0400 Subject: internal/lume: make pages for post series I'm probably reading something wrong in the documentation for Lume, but I wasn't able to find an obvious way to generate pages for each of the post series programmatically. This is a bit of a hacky workaround that makes the Lume driver write individual JSX files for each series defined in the Dhall source. It should work for my needs though. Signed-off-by: Xe Iaso --- internal/lume/lume.go | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) (limited to 'internal') diff --git a/internal/lume/lume.go b/internal/lume/lume.go index 7bee446..3f7c84e 100644 --- a/internal/lume/lume.go +++ b/internal/lume/lume.go @@ -5,6 +5,7 @@ import ( "encoding/json" "expvar" "fmt" + "html/template" "io/fs" "log" "log/slog" @@ -339,6 +340,10 @@ func (f *FS) writeConfig() error { } } + if err := f.writeSeriesPages(); err != nil { + return err + } + return nil } @@ -348,6 +353,62 @@ func (f *FS) Clacks() []string { return f.conf.ClackSet } +func (f *FS) writeSeriesPages() error { + seriesPageDir := filepath.Join(f.repoDir, f.opt.StaticSiteDir, "src", "blog", "series") + + for k, v := range f.conf.SeriesDescMap { + fname := filepath.Join(seriesPageDir, fmt.Sprintf("%s.jsx", k)) + + fout, err := os.Create(fname) + if err != nil { + return fmt.Errorf("can't open %s: %w", fname, err) + } + defer fout.Close() + + if err := seriesPageTemplate.Execute(fout, struct { + Series string + Desc string + }{ + Series: k, + Desc: v, + }); err != nil { + return fmt.Errorf("can't write %s: %w", fname, err) + } + } + + return nil +} + +const seriesPageTemplateStr = `export const title = "{{.Series}}"; +export const layout = "base.njk"; + +export default ({ search }) => { + const dateOptions = { year: "numeric", month: "2-digit", day: "2-digit" }; + + return ( +
+

{title}

+

+ {{.Desc}} +

+ +
    + {search.pages("series={{.Series}}", "order date=desc").map((post) => { + const url = post.data.redirect_to ? post.data.redirect_to : post.data.url; + return ( +
  • + {post.data.date.toLocaleDateString("en-US", dateOptions)} -{" "} + {post.data.title} +
  • + ); + })} +
+
+ ); +};` + +var seriesPageTemplate = template.Must(template.New("seriesPage.jsx.tmpl").Parse(seriesPageTemplateStr)) + func (f *FS) buildResume(ctx context.Context) error { t0 := time.Now() wd := filepath.Join(f.repoDir, "dhall", "resume") -- cgit v1.2.3