diff --git a/AUDIT.md b/AUDIT.md
index 3b9b0e1..110b288 100644
--- a/AUDIT.md
+++ b/AUDIT.md
@@ -25,6 +25,7 @@ after each item.
- [x] `generation/sitemap.ex`
- [x] `generation/data.ex`
- [x] `generation/paths.ex`
+- [x] `generation/renderers.ex`
---
diff --git a/lib/bds/generation/renderers.ex b/lib/bds/generation/renderers.ex
index dc9a869..1b2df68 100644
--- a/lib/bds/generation/renderers.ex
+++ b/lib/bds/generation/renderers.ex
@@ -47,25 +47,7 @@ defmodule BDS.Generation.Renderers do
@spec render_archive_page(map(), String.t(), [map()], String.t() | nil, String.t(), map()) ::
String.t()
def render_archive_page(plan, title, posts, language, kind, pagination) do
- fallback = fn ->
- items =
- posts
- |> Enum.map(fn post -> ["
", post.title, ""] end)
- |> IO.iodata_to_binary()
-
- [
- "",
- title,
- "
"
- ]
- |> IO.iodata_to_binary()
- end
+ fallback = fn -> render_inline_list_page(title, posts, language, kind) end
render_list_output(
plan,
@@ -92,23 +74,7 @@ defmodule BDS.Generation.Renderers do
@spec render_date_archive_page(map(), String.t(), map(), [map()], String.t() | nil, map()) ::
String.t()
def render_date_archive_page(plan, label, archive_context, posts, language, pagination) do
- fallback = fn ->
- items =
- posts
- |> Enum.map(fn post -> ["", post.title, ""] end)
- |> IO.iodata_to_binary()
-
- [
- "",
- label,
- "
"
- ]
- |> IO.iodata_to_binary()
- end
+ fallback = fn -> render_inline_list_page(label, posts, language, "date") end
render_list_output(
plan,
@@ -124,10 +90,7 @@ defmodule BDS.Generation.Renderers do
@doc "Try the project's post template; on error, fall back to the inline `fallback` thunk."
@spec render_post_output(String.t(), String.t() | nil, map(), (-> String.t())) :: String.t()
def render_post_output(project_id, template_slug, assigns, fallback) do
- case Rendering.render_post_page(project_id, template_slug, assigns) do
- {:ok, rendered} -> rendered
- {:error, _reason} -> fallback.()
- end
+ render_with_fallback(fn -> Rendering.render_post_page(project_id, template_slug, assigns) end, fallback)
end
@doc "Render a list/archive page through the project template, falling back to inline."
@@ -151,30 +114,34 @@ defmodule BDS.Generation.Renderers do
fallback
)
when is_binary(project_id) do
- case Rendering.render_list_page(project_id, %{
- language: language,
- language_prefix: Paths.language_prefix(language, main_language),
- page_title: page_title,
- posts: posts,
- archive_context: archive_context,
- pagination: pagination
- }) do
- {:ok, rendered} -> rendered
- {:error, _reason} -> fallback.()
- end
+ render_with_fallback(
+ fn ->
+ Rendering.render_list_page(project_id, %{
+ language: language,
+ language_prefix: Paths.language_prefix(language, main_language),
+ page_title: page_title,
+ posts: posts,
+ archive_context: archive_context,
+ pagination: pagination
+ })
+ end,
+ fallback
+ )
end
@doc "Render the project's 404 page via its template, falling back to a static page."
@spec render_not_found_output(map(), String.t() | nil) :: String.t()
def render_not_found_output(%{project_id: project_id, language: main_language}, language)
when is_binary(project_id) do
- case Rendering.render_not_found_page(project_id, %{
- language: language,
- language_prefix: Paths.language_prefix(language, main_language)
- }) do
- {:ok, rendered} -> rendered
- {:error, _reason} -> render_not_found_page(language)
- end
+ render_with_fallback(
+ fn ->
+ Rendering.render_not_found_page(project_id, %{
+ language: language,
+ language_prefix: Paths.language_prefix(language, main_language)
+ })
+ end,
+ fn -> render_not_found_page(language) end
+ )
end
@doc "Static fallback HTML for a 404 page."
@@ -227,6 +194,33 @@ defmodule BDS.Generation.Renderers do
end
end
+ defp render_with_fallback(render_fun, fallback) do
+ case render_fun.() do
+ {:ok, rendered} -> rendered
+ {:error, _reason} -> fallback.()
+ end
+ end
+
+ defp render_inline_list_page(title, posts, language, kind) do
+ items =
+ posts
+ |> Enum.map(fn post -> ["", post.title, ""] end)
+ |> IO.iodata_to_binary()
+
+ [
+ "",
+ title,
+ "
"
+ ]
+ |> IO.iodata_to_binary()
+ end
+
defp parse_frontmatter_body(contents) do
case String.split(contents, "\n---\n", parts: 2) do
[_frontmatter, body] -> String.trim_trailing(body, "\n")