aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2023-10-14 11:38:13 -0400
committerXe Iaso <me@xeiaso.net>2023-10-14 11:38:16 -0400
commitdf59f21fbc27ec37375613be35fd04eb3033189e (patch)
treedb400299783c2ef7d56976be0313939f16382804
parent782faa8d445945c24016a0384480d337abddbab1 (diff)
downloadxesite-df59f21fbc27ec37375613be35fd04eb3033189e.tar.xz
xesite-df59f21fbc27ec37375613be35fd04eb3033189e.zip
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 <me@xeiaso.net>
-rw-r--r--internal/lume/lume.go61
-rw-r--r--lume/src/blog/series/.gitignore2
-rw-r--r--lume/src/blog/series/_data.yml1
-rw-r--r--lume/src/blog/series/index.jsx26
4 files changed, 90 insertions, 0 deletions
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 (
+ <div>
+ <h1 className="text-3xl mb-4">{title}</h1>
+ <p className="mb-4">
+ {{.Desc}}
+ </p>
+
+ <ul class="list-disc ml-4 mb-4">
+ {search.pages("series={{.Series}}", "order date=desc").map((post) => {
+ const url = post.data.redirect_to ? post.data.redirect_to : post.data.url;
+ return (
+ <li>
+ <span className="font-mono">{post.data.date.toLocaleDateString("en-US", dateOptions)}</span> -{" "}
+ <a href={url}>{post.data.title}</a>
+ </li>
+ );
+ })}
+ </ul>
+ </div>
+ );
+};`
+
+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 (
+ <>
+ <h1 className="text-3xl mb-4">{title}</h1>
+ <p className="mb-4">
+ TODO: filler text here
+ </p>
+
+ <ul class="list-disc ml-4 mb-4">
+ {Object
+ .keys(seriesDescriptions)
+ .map((k) => [k, seriesDescriptions[k]])
+ .map(([k, v]) => (
+ <li>
+ <a href={`/blog/series/${k}`}>{k}</a>: {v}
+ </li>
+ ))}
+ </ul>
+ </>
+ );
+};