From a2feb8c63c80a1f52830f562af2deb2c6065eaae Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Mon, 24 Jun 2024 21:48:36 +0200 Subject: move templ templates into separate package --- default.nix | 3 ++ internal/builder/404.templ | 13 ----- internal/builder/builder.go | 13 ++--- internal/builder/homepage.templ | 42 --------------- internal/builder/list.templ | 51 ------------------ internal/builder/page.templ | 101 ----------------------------------- internal/builder/post.templ | 51 ------------------ internal/builder/tags.templ | 23 -------- internal/builder/template.go | 12 ++--- templates/404.templ | 13 +++++ templates/homepage.templ | 42 +++++++++++++++ templates/list.templ | 51 ++++++++++++++++++ templates/page.templ | 115 ++++++++++++++++++++++++++++++++++++++++ templates/post.templ | 51 ++++++++++++++++++ templates/tags.templ | 23 ++++++++ 15 files changed, 311 insertions(+), 293 deletions(-) delete mode 100644 internal/builder/404.templ delete mode 100644 internal/builder/homepage.templ delete mode 100644 internal/builder/list.templ delete mode 100644 internal/builder/page.templ delete mode 100644 internal/builder/post.templ delete mode 100644 internal/builder/tags.templ create mode 100644 templates/404.templ create mode 100644 templates/homepage.templ create mode 100644 templates/list.templ create mode 100644 templates/page.templ create mode 100644 templates/post.templ create mode 100644 templates/tags.templ diff --git a/default.nix b/default.nix index 778f790..e3a47f7 100644 --- a/default.nix +++ b/default.nix @@ -72,6 +72,7 @@ rec { ./go.sum ./cmd/build ./internal + ./templates ]; }; modules = ./nix/gomod2nix.toml; @@ -92,6 +93,7 @@ rec { ]; }; } '' + cd $src ${builder}/bin/build -s $src -d $out cp $src/config.toml $out/ ''; @@ -106,6 +108,7 @@ rec { ./go.sum ./cmd/server ./internal + ./templates ]; }; modules = ./nix/gomod2nix.toml; diff --git a/internal/builder/404.templ b/internal/builder/404.templ deleted file mode 100644 index 049e67d..0000000 --- a/internal/builder/404.templ +++ /dev/null @@ -1,13 +0,0 @@ -package builder - -import "website/internal/config" - -templ notFound(config config.Config, path string) { - @page(config, PageSettings{ - Title: "Not Found", - Path: path, - }) { -

404

-

ʕノ•ᴥ•ʔノ ︵ ┻━┻

- } -} diff --git a/internal/builder/builder.go b/internal/builder/builder.go index 20714b9..933679d 100644 --- a/internal/builder/builder.go +++ b/internal/builder/builder.go @@ -14,6 +14,7 @@ import ( "website/internal/content" "website/internal/log" "website/internal/sitemap" + "website/templates" "github.com/a-h/templ" mapset "github.com/deckarep/golang-set/v2" @@ -127,7 +128,7 @@ func build(outDir string, config config.Config) (*Result, error) { } log.Debug("rendering post", "post", post.Basename) sitemap.AddPath(post.URL, post.Date) - if err := renderToFile(postPage(config, post), post.Output); err != nil { + if err := renderToFile(templates.PostPage(config, post), post.Output); err != nil { return nil, err } } @@ -136,7 +137,7 @@ func build(outDir string, config config.Config) (*Result, error) { return nil, errors.WithMessage(err, "could not create directory for tags") } log.Debug("rendering tags list") - if err := renderToFile(tagsPage(config, "tags", mapset.Sorted(tags), "/tags"), publicDir, "tags", "index.html"); err != nil { + if err := renderToFile(templates.TagsPage(config, "tags", mapset.Sorted(tags), "/tags"), publicDir, "tags", "index.html"); err != nil { return nil, err } sitemap.AddPath("/tags/", lastMod) @@ -153,7 +154,7 @@ func build(outDir string, config config.Config) (*Result, error) { } log.Debug("rendering tags page", "tag", tag) url := "/tags/" + tag - if err := renderToFile(tagPage(config, tag, matchingPosts, url), publicDir, "tags", tag, "index.html"); err != nil { + if err := renderToFile(templates.TagPage(config, tag, matchingPosts, url), publicDir, "tags", tag, "index.html"); err != nil { return nil, err } sitemap.AddPath(url, matchingPosts[0].Date) @@ -174,7 +175,7 @@ func build(outDir string, config config.Config) (*Result, error) { } log.Debug("rendering list page") - if err := renderToFile(listPage(config, posts, "/post"), publicDir, "post", "index.html"); err != nil { + if err := renderToFile(templates.ListPage(config, posts, "/post"), publicDir, "post", "index.html"); err != nil { return nil, err } sitemap.AddPath("/post/", lastMod) @@ -215,7 +216,7 @@ func build(outDir string, config config.Config) (*Result, error) { if err != nil { return nil, err } - if err := renderToFile(homepage(config, posts, content), publicDir, "index.html"); err != nil { + if err := renderToFile(templates.Homepage(config, posts, content), publicDir, "index.html"); err != nil { return nil, err } // it would be nice to set LastMod here, but using the latest post @@ -226,7 +227,7 @@ func build(outDir string, config config.Config) (*Result, error) { r.Hashes = append(r.Hashes, h) log.Debug("rendering 404 page") - if err := renderToFile(notFound(config, "/404.html"), privateDir, "404.html"); err != nil { + if err := renderToFile(templates.NotFound(config, "/404.html"), privateDir, "404.html"); err != nil { return nil, err } diff --git a/internal/builder/homepage.templ b/internal/builder/homepage.templ deleted file mode 100644 index 848b9ed..0000000 --- a/internal/builder/homepage.templ +++ /dev/null @@ -1,42 +0,0 @@ -package builder - -import ( - "website/internal/config" - "website/internal/content" -) - -templ homepage(config config.Config, posts []content.Post, content string) { - @page(config, PageSettings{ - Title: config.Title, - TitleAttrs: templ.Attributes{ - "class": "p-name u-url", - }, - Path: "/", - BodyAttrs: templ.Attributes{ - "class": "h-card", - }, - }) { -
- @Unsafe(content) -
-
-

Latest Posts

- @list(posts[0:3]) -
-
-

Elsewhere on the Internet

- -
- } -} diff --git a/internal/builder/list.templ b/internal/builder/list.templ deleted file mode 100644 index 24cafe8..0000000 --- a/internal/builder/list.templ +++ /dev/null @@ -1,51 +0,0 @@ -package builder - -import ( - "website/internal/config" - "website/internal/content" -) - -templ tagPage(config config.Config, tag string, posts []content.Post, path string) { - @page(config, PageSettings{ - Title: tag, - Path: path, - TitleAttrs: templ.Attributes{ - "class": "p-author h-card", - "rel": "author", - }, - }) { -
-

#{ tag }

- - Remove filter - -
- @list(posts) - } -} - -templ listPage(config config.Config, posts []content.Post, path string) { - @page(config, PageSettings{ - Title: config.Title, - TitleAttrs: templ.Attributes{ - "class": "p-author h-card", - "rel": "author", - }, - Path: path, - }) { - @list(posts) - } -} - -templ list(posts []content.Post) { - -} diff --git a/internal/builder/page.templ b/internal/builder/page.templ deleted file mode 100644 index 9a2be2f..0000000 --- a/internal/builder/page.templ +++ /dev/null @@ -1,101 +0,0 @@ -package builder - -import ( - "net/url" - "website/internal/config" -) - -type PageSettings struct { - Title string - Path string - TitleAttrs templ.Attributes - BodyAttrs templ.Attributes -} - -func extendClasses(cs string, attrs templ.Attributes) string { - if extras, exists := attrs["class"]; exists { - return templ.Classes(cs, extras).String() - } else { - return cs - } -} - -templ menuItem(item config.MenuItem) { - { item.Name } -} - -templ page(site config.Config, page PageSettings) { - - - - - - { page.Title } - - @style(css) - - - -
-

- { site.Title } -

- -
-
- { children... } -
- - @counter(page.Path, page.Title) - if site.InjectLiveReload { - - } - - -} - -func mkURL(path string, title string) string { - u, err := url.Parse("https://alanpearce-eu.goatcounter.com/count") - if err != nil { - panic(err) - } - q := u.Query() - q.Add("p", path) - q.Add("t", title) - u.RawQuery = q.Encode() - - return u.String() -} - -templ counter(path string, title string) { - - -} - -func style(css string) templ.Component { - return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { - _, err = io.WriteString(w, "") - return - }) -} diff --git a/internal/builder/post.templ b/internal/builder/post.templ deleted file mode 100644 index 6f12e5c..0000000 --- a/internal/builder/post.templ +++ /dev/null @@ -1,51 +0,0 @@ -package builder - -import ( - "time" - "website/internal/config" - "website/internal/content" -) - -func Unsafe(html string) templ.Component { - return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { - _, err = io.WriteString(w, html) - return - }) -} - -templ postDate(d time.Time) { - -} - -templ postPage(config config.Config, post content.Post) { - @page(config, PageSettings{ - Title: post.Title, - TitleAttrs: templ.Attributes{ - "class": "p-author h-card", - "rel": "author", - }, - Path: post.URL, - }) { -
-

{ post.Title }

-

- @postDate(post.Date) -

-
- @Unsafe(post.Content) -
-
- Tags: - -
-
- } -} diff --git a/internal/builder/tags.templ b/internal/builder/tags.templ deleted file mode 100644 index 14abca4..0000000 --- a/internal/builder/tags.templ +++ /dev/null @@ -1,23 +0,0 @@ -package builder - -import "website/internal/config" - -templ tagLink(tag string, attrs templ.Attributes) { - #{ tag } -} - -templ tagsPage(config config.Config, title string, tags []string, path string) { - @page(config, PageSettings{ - Title: title, - Path: path, - }) { -

Tags

- - } -} diff --git a/internal/builder/template.go b/internal/builder/template.go index 53199fc..5ec963a 100644 --- a/internal/builder/template.go +++ b/internal/builder/template.go @@ -21,9 +21,9 @@ import ( ) var ( - css string - templates = make(map[string]*os.File) - nsMap = map[string]string{ + css string + templateFiles = make(map[string]*os.File) + nsMap = map[string]string{ "xsl": "http://www.w3.org/1999/XSL/Transform", "atom": "http://www.w3.org/2005/Atom", "xhtml": "http://www.w3.org/1999/xhtml", @@ -39,14 +39,14 @@ func loadCSS() { } func loadTemplate(path string) (file *os.File, err error) { - if templates[path] == nil { + if templateFiles[path] == nil { file, err = os.OpenFile(path, os.O_RDONLY, 0) if err != nil { return nil, errors.Wrapf(err, "could not load template at path %s", path) } - templates[path] = file + templateFiles[path] = file } - file = templates[path] + file = templateFiles[path] return } diff --git a/templates/404.templ b/templates/404.templ new file mode 100644 index 0000000..4b5e52a --- /dev/null +++ b/templates/404.templ @@ -0,0 +1,13 @@ +package templates + +import "website/internal/config" + +templ NotFound(config config.Config, path string) { + @Page(config, PageSettings{ + Title: "Not Found", + Path: path, + }) { +

404

+

ʕノ•ᴥ•ʔノ ︵ ┻━┻

+ } +} diff --git a/templates/homepage.templ b/templates/homepage.templ new file mode 100644 index 0000000..0afbb2f --- /dev/null +++ b/templates/homepage.templ @@ -0,0 +1,42 @@ +package templates + +import ( + "website/internal/config" + "website/internal/content" +) + +templ Homepage(config config.Config, posts []content.Post, content string) { + @Page(config, PageSettings{ + Title: config.Title, + TitleAttrs: templ.Attributes{ + "class": "p-name u-url", + }, + Path: "/", + BodyAttrs: templ.Attributes{ + "class": "h-card", + }, + }) { +
+ @Unsafe(content) +
+
+

Latest Posts

+ @list(posts[0:3]) +
+
+

Elsewhere on the Internet

+ +
+ } +} diff --git a/templates/list.templ b/templates/list.templ new file mode 100644 index 0000000..602c15c --- /dev/null +++ b/templates/list.templ @@ -0,0 +1,51 @@ +package templates + +import ( + "website/internal/config" + "website/internal/content" +) + +templ TagPage(config config.Config, tag string, posts []content.Post, path string) { + @Page(config, PageSettings{ + Title: tag, + Path: path, + TitleAttrs: templ.Attributes{ + "class": "p-author h-card", + "rel": "author", + }, + }) { +
+

#{ tag }

+ + Remove filter + +
+ @list(posts) + } +} + +templ ListPage(config config.Config, posts []content.Post, path string) { + @Page(config, PageSettings{ + Title: config.Title, + TitleAttrs: templ.Attributes{ + "class": "p-author h-card", + "rel": "author", + }, + Path: path, + }) { + @list(posts) + } +} + +templ list(posts []content.Post) { + +} diff --git a/templates/page.templ b/templates/page.templ new file mode 100644 index 0000000..08c17a0 --- /dev/null +++ b/templates/page.templ @@ -0,0 +1,115 @@ +package templates + +import ( + "os" + "net/url" + + "website/internal/config" +) + +var ( + css string +) + +func init() { + bytes, err := os.ReadFile("templates/style.css") + if err != nil { + panic(err) + } + css = string(bytes) +} + +type PageSettings struct { + Title string + Path string + TitleAttrs templ.Attributes + BodyAttrs templ.Attributes +} + +func extendClasses(cs string, attrs templ.Attributes) string { + if extras, exists := attrs["class"]; exists { + return templ.Classes(cs, extras).String() + } else { + return cs + } +} + +templ menuItem(item config.MenuItem) { + { item.Name } +} + +templ Page(site config.Config, page PageSettings) { + + + + + + { page.Title } + + @style(css) + + + +
+

+ { site.Title } +

+ +
+
+ { children... } +
+ + @counter(page.Path, page.Title) + if site.InjectLiveReload { + + } + + +} + +func mkURL(path string, title string) string { + u, err := url.Parse("https://alanpearce-eu.goatcounter.com/count") + if err != nil { + panic(err) + } + q := u.Query() + q.Add("p", path) + q.Add("t", title) + u.RawQuery = q.Encode() + + return u.String() +} + +templ counter(path string, title string) { + + +} + +func style(css string) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + _, err = io.WriteString(w, "") + return + }) +} diff --git a/templates/post.templ b/templates/post.templ new file mode 100644 index 0000000..5b09d4b --- /dev/null +++ b/templates/post.templ @@ -0,0 +1,51 @@ +package templates + +import ( + "time" + "website/internal/config" + "website/internal/content" +) + +func Unsafe(html string) templ.Component { + return templ.ComponentFunc(func(ctx context.Context, w io.Writer) (err error) { + _, err = io.WriteString(w, html) + return + }) +} + +templ postDate(d time.Time) { + +} + +templ PostPage(config config.Config, post content.Post) { + @Page(config, PageSettings{ + Title: post.Title, + TitleAttrs: templ.Attributes{ + "class": "p-author h-card", + "rel": "author", + }, + Path: post.URL, + }) { +
+

{ post.Title }

+

+ @postDate(post.Date) +

+
+ @Unsafe(post.Content) +
+
+ Tags: + +
+
+ } +} diff --git a/templates/tags.templ b/templates/tags.templ new file mode 100644 index 0000000..7218ca1 --- /dev/null +++ b/templates/tags.templ @@ -0,0 +1,23 @@ +package templates + +import "website/internal/config" + +templ tagLink(tag string, attrs templ.Attributes) { + #{ tag } +} + +templ TagsPage(config config.Config, title string, tags []string, path string) { + @Page(config, PageSettings{ + Title: title, + Path: path, + }) { +

Tags

+ + } +} -- cgit 1.4.1