defmodule PreDotHn do @moduledoc """ Documentation for `PreDotHn`. """ use Phoenix.Component require Logger import Phoenix.LiveViewTest, only: [rendered_to_string: 1] alias PreDotHn.Frontmatter alias PreDotHn.Markdown def read(path) do path |> File.read!() |> Frontmatter.front_matter_split() |> then(fn {frontmatter_text, body_text} -> {Frontmatter.make_frontmatter(path, frontmatter_text), body_text} end) |> then(fn {frontmatter, body_text} -> body = Markdown.render(body_text) Map.merge(frontmatter, %{"body" => body, "path" => path}) end) end def validate(%{"slug" => nil, "path" => path}) do {:error, "slug missing from #{path}"} end def validate(%{"slug" => "", "path" => path}) do {:error, "slug missing from #{path}"} end def validate(other), do: {:ok, other} def run() do "site/**/*.md" |> Path.wildcard() |> Enum.map(&read/1) |> Enum.map(&validate/1) |> Enum.filter(fn {:error, error} -> Logger.warn(error) false {:ok, _other} -> true end) |> Enum.map(fn {:ok, page} -> page = page |> Enum.map(fn {key, value} -> {String.to_atom(key), value} end) |> Enum.into(%{}) write_page(page) end) end slot(:inner_block, required: true) def layout(assigns) do ~H""" A Basic HTML5 Template <%= render_slot(@inner_block) %> """ end def write_page(%{slug: slug} = assigns) do filename = "#{slug}.html" path = Path.join(["priv", "static", filename]) ~H""" <.layout>
<%= {:safe, @body} %>
""" |> rendered_to_string() |> then(&File.write!(path, &1)) end end