pre.hn/lib/pre_dot_hn/frontmatter.ex

54 lines
1.1 KiB
Elixir
Raw Normal View History

2023-09-22 12:58:31 +00:00
defmodule PreDotHn.Frontmatter do
@frontmatter_pattern ~r/---\r?\n/
def make_frontmatter(path, frontmatter_text) do
case YamlElixir.read_from_string(frontmatter_text) do
{:ok, fm} ->
fm
_other ->
%{}
end
|> merge_frontmatter_defaults(path)
end
def merge_frontmatter_defaults(fm, path) do
{date, slug} = path_parts(path)
fm
|> Map.put_new_lazy("slug", fn ->
slug
end)
|> Map.put_new_lazy("date", fn ->
date
end)
|> Map.put_new_lazy("title", fn ->
""
end)
end
@path_parts ~r/([0-9]{4}-[0-9]{2}-[0-9]{2})?-?(.*)?/
def path_parts(path) do
filename = Path.basename(path)
[basename | _] = String.split(filename, ".")
[_, date_part, slug_part] = Regex.run(@path_parts, basename)
date_part = if date_part == "", do: nil, else: date_part
slug_part = if slug_part == "", do: date_part, else: slug_part
{date_part, slug_part}
end
def front_matter_split(body) do
case String.split(body, @frontmatter_pattern, parts: 3) do
["", frontmatter, body] ->
{frontmatter, body}
_other ->
{"", body}
end
end
end