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 +++++++++++++++++++++++++++++++++++++++++ lume/src/blog/series/.gitignore | 2 ++ lume/src/blog/series/_data.yml | 1 + lume/src/blog/series/index.jsx | 26 ++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 lume/src/blog/series/.gitignore create mode 100644 lume/src/blog/series/_data.yml create mode 100644 lume/src/blog/series/index.jsx 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") diff --git a/lume/src/blog/series/.gitignore b/lume/src/blog/series/.gitignore new file mode 100644 index 0000000..3410fa1 --- /dev/null +++ b/lume/src/blog/series/.gitignore @@ -0,0 +1,2 @@ +*.jsx +!index.jsx diff --git a/lume/src/blog/series/_data.yml b/lume/src/blog/series/_data.yml new file mode 100644 index 0000000..ab74b42 --- /dev/null +++ b/lume/src/blog/series/_data.yml @@ -0,0 +1 @@ +type: info diff --git a/lume/src/blog/series/index.jsx b/lume/src/blog/series/index.jsx new file mode 100644 index 0000000..1e5cbb8 --- /dev/null +++ b/lume/src/blog/series/index.jsx @@ -0,0 +1,26 @@ +export const title = "Post Series"; +export const layout = "base.njk"; + +export default ({ seriesDescriptions }) => { + const dateOptions = { year: "numeric", month: "2-digit", day: "2-digit" }; + + return ( + <> +

{title}

+

+ TODO: filler text here +

+ + + + ); +}; -- cgit v1.2.3